PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pgo8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+CjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj48aGVhZD48IS0tCiAgICAgICAgWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgKICAgICAgICAgICAgICBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20geG1sIHNvdXJjZTogRE8gTk9UIEVESVQKICAgICAgICBYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWAogICAgICAtLT4KPHRpdGxlPm1vZF9sb2dfZGVidWcgLSBBcGFjaGUgSFRUUCBTZXJ2ZXI8L3RpdGxlPgo8bGluayBocmVmPSIuLi9zdHlsZS9jc3MvbWFudWFsLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyIgdGl0bGU9Ik1haW4gc3R5bGVzaGVldCIgLz4KPGxpbmsgaHJlZj0iLi4vc3R5bGUvY3NzL21hbnVhbC1sb29zZS0xMDBwYy5jc3MiIHJlbD0iYWx0ZXJuYXRlIHN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIHR5cGU9InRleHQvY3NzIiB0aXRsZT0iTm8gU2lkZWJhciAtIERlZmF1bHQgZm9udCBzaXplIiAvPgo8bGluayBocmVmPSIuLi9zdHlsZS9jc3MvbWFudWFsLXByaW50LmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0icHJpbnQiIHR5cGU9InRleHQvY3NzIiAvPjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlL2Nzcy9wcmV0dGlmeS5jc3MiIC8+CjxzY3JpcHQgc3JjPSIuLi9zdHlsZS9zY3JpcHRzL3ByZXR0aWZ5Lm1pbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPC9zY3JpcHQ+Cgo8bGluayBocmVmPSIuLi9pbWFnZXMvZmF2aWNvbi5pY28iIHJlbD0ic2hvcnRjdXQgaWNvbiIgLz48L2hlYWQ+Cjxib2R5Pgo8ZGl2IGlkPSJwYWdlLWhlYWRlciI+CjxwIGNsYXNzPSJtZW51Ij48YSBocmVmPSIuLi9tb2QvIj5Nb2R1bGVzPC9hPiB8IDxhIGhyZWY9Ii4uL21vZC9kaXJlY3RpdmVzLmh0bWwiPkRpcmVjdGl2ZXM8L2E+IHwgPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9odHRwZC9GQVEiPkZBUTwvYT4gfCA8YSBocmVmPSIuLi9nbG9zc2FyeS5odG1sIj5HbG9zc2FyeTwvYT4gfCA8YSBocmVmPSIuLi9zaXRlbWFwLmh0bWwiPlNpdGVtYXA8L2E+PC9wPgo8cCBjbGFzcz0iYXBhY2hlIj5BcGFjaGUgSFRUUCBTZXJ2ZXIgVmVyc2lvbiAyLjQ8L3A+CjxpbWcgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL2ZlYXRoZXIuZ2lmIiAvPjwvZGl2Pgo8ZGl2IGNsYXNzPSJ1cCI+PGEgaHJlZj0iLi8iPjxpbWcgdGl0bGU9IiZsdDstIiBhbHQ9IiZsdDstIiBzcmM9Ii4uL2ltYWdlcy9sZWZ0LmdpZiIgLz48L2E+PC9kaXY+CjxkaXYgaWQ9InBhdGgiPgo8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIj5BcGFjaGU8L2E+ICZndDsgPGEgaHJlZj0iaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvIj5IVFRQIFNlcnZlcjwvYT4gJmd0OyA8YSBocmVmPSJodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy9kb2NzLyI+RG9jdW1lbnRhdGlvbjwvYT4gJmd0OyA8YSBocmVmPSIuLi8iPlZlcnNpb24gMi40PC9hPiAmZ3Q7IDxhIGhyZWY9Ii4vIj5Nb2R1bGVzPC9hPjwvZGl2Pgo8ZGl2IGlkPSJwYWdlLWNvbnRlbnQiPgo8ZGl2IGlkPSJwcmVhbWJsZSI+PGgxPkFwYWNoZSBNb2R1bGUgbW9kX2xvZ19kZWJ1ZzwvaDE+CjxkaXYgY2xhc3M9InRvcGxhbmciPgo8cD48c3Bhbj5BdmFpbGFibGUgTGFuZ3VhZ2VzOiA8L3NwYW4+PGEgaHJlZj0iLi4vZW4vbW9kL21vZF9sb2dfZGVidWcuaHRtbCIgdGl0bGU9IkVuZ2xpc2giPiZuYnNwO2VuJm5ic3A7PC9hPiB8CjxhIGhyZWY9Ii4uL2ZyL21vZC9tb2RfbG9nX2RlYnVnLmh0bWwiIGhyZWZsYW5nPSJmciIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJGcmFu52FpcyI+Jm5ic3A7ZnImbmJzcDs8L2E+PC9wPgo8L2Rpdj4KPHRhYmxlIGNsYXNzPSJtb2R1bGUiPjx0cj48dGg+PGEgaHJlZj0ibW9kdWxlLWRpY3QuaHRtbCNEZXNjcmlwdGlvbiI+RGVzY3JpcHRpb246PC9hPjwvdGg+PHRkPkFkZGl0aW9uYWwgY29uZmlndXJhYmxlIGRlYnVnIGxvZ2dpbmc8L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0ibW9kdWxlLWRpY3QuaHRtbCNTdGF0dXMiPlN0YXR1czo8L2E+PC90aD48dGQ+RXhwZXJpbWVudGFsPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9Im1vZHVsZS1kaWN0Lmh0bWwjTW9kdWxlSWRlbnRpZmllciI+TW9kdWxloElkZW50aWZpZXI6PC9hPjwvdGg+PHRkPmxvZ19kZWJ1Z19tb2R1bGU8L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0ibW9kdWxlLWRpY3QuaHRtbCNTb3VyY2VGaWxlIj5Tb3VyY2WgRmlsZTo8L2E+PC90aD48dGQ+bW9kX2xvZ19kZWJ1Zy5jPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9Im1vZHVsZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSI+Q29tcGF0aWJpbGl0eTo8L2E+PC90aD48dGQ+QXZhaWxhYmxlIGluIEFwYWNoZSAyLjMuMTQgYW5kIGxhdGVyPC90ZD48L3RyPjwvdGFibGU+CjwvZGl2Pgo8ZGl2IGlkPSJxdWlja3ZpZXciPjxoMyBjbGFzcz0iZGlyZWN0aXZlcyI+RGlyZWN0aXZlczwvaDM+Cjx1bCBpZD0idG9jIj4KPGxpPjxpbWcgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL2Rvd24uZ2lmIiAvPiA8YSBocmVmPSIjbG9nbWVzc2FnZSI+TG9nTWVzc2FnZTwvYT48L2xpPgo8L3VsPgo8aDM+VG9waWNzPC9oMz4KPHVsIGlkPSJ0b3BpY3MiPgo8bGk+PGltZyBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvZG93bi5naWYiIC8+IDxhIGhyZWY9IiNleGFtcGxlcyI+RXhhbXBsZXM8L2E+PC9saT4KPC91bD48dWwgY2xhc3M9InNlZWFsc28iPjxsaT48YSBocmVmPSIjY29tbWVudHNfc2VjdGlvbiI+Q29tbWVudHM8L2E+PC9saT48L3VsPjwvZGl2Pgo8ZGl2IGNsYXNzPSJ0b3AiPjxhIGhyZWY9IiNwYWdlLWhlYWRlciI+PGltZyBhbHQ9InRvcCIgc3JjPSIuLi9pbWFnZXMvdXAuZ2lmIiAvPjwvYT48L2Rpdj4KPGRpdiBjbGFzcz0ic2VjdGlvbiI+CjxoMj48YSBuYW1lPSJleGFtcGxlcyIgaWQ9ImV4YW1wbGVzIj5FeGFtcGxlczwvYT48L2gyPgoKICAgIDxvbD4KICAgICAgPGxpPgogICAgICAgIExvZyBtZXNzYWdlIGFmdGVyIHJlcXVlc3QgdG8gL2Zvby8qIGlzIHByb2Nlc3NlZDoKCiAgICAgICAgPHByZSBjbGFzcz0icHJldHR5cHJpbnQgbGFuZy1jb25maWciPiZsdDtMb2NhdGlvbiAvZm9vLyZndDsKoKBMb2dNZXNzYWdlICIvZm9vLyBoYXMgYmVlbiByZXF1ZXN0ZWQiCiZsdDsvTG9jYXRpb24mZ3Q7PC9wcmU+CgogICAgICA8L2xpPgoKICAgICAgPGxpPgogICAgICAgIExvZyBtZXNzYWdlIGlmIHJlcXVlc3QgdG8gL2Zvby8qIGlzIHByb2Nlc3NlZCBpbiBhIHN1Yi1yZXF1ZXN0OgogICAgICAgIDxwcmUgY2xhc3M9InByZXR0eXByaW50IGxhbmctY29uZmlnIj4mbHQ7TG9jYXRpb24gL2Zvby8mZ3Q7CqCgTG9nTWVzc2FnZSAic3VicmVxdWVzdCB0byAvZm9vLyIgaG9vaz10eXBlX2NoZWNrZXIgZXhwcj0le0lTX1NVQlJFUX0KJmx0Oy9Mb2NhdGlvbiZndDs8L3ByZT4KCgogICAgICAgIFRoZSBkZWZhdWx0IGxvZ190cmFuc2FjdGlvbiBob29rIGlzIG5vdCBleGVjdXRlZCBmb3Igc3ViLXJlcXVlc3RzLAogICAgICAgIHRoZXJlZm9yZSB3ZSBoYXZlIHRvIHVzZSBhIGRpZmZlcmVudCBob29rLgogICAgICA8L2xpPgoKCiAgICAgIDxsaT4KICAgICAgICBMb2cgbWVzc2FnZSBpZiBhbiBJUHY2IGNsaWVudCBjYXVzZXMgYSByZXF1ZXN0IHRpbWVvdXQ6CiAgICAgICAgPHByZSBjbGFzcz0icHJldHR5cHJpbnQgbGFuZy1jb25maWciPkxvZ01lc3NhZ2UgIklQdjYgdGltZW91dCBmcm9tICV7UkVNT1RFX0FERFJ9IiAiZXhwcj0tVCAle0lQVjZ9ICZhbXA7JmFtcDsgJXtSRVFVRVNUX1NUQVRVU30gPSA0MDgiPC9wcmU+CgogICAgICAgIE5vdGUgdGhlIHBsYWNpbmcgb2YgdGhlIGRvdWJsZSBxdW90ZXMgZm9yIHRoZSA8Y29kZT5leHByPTwvY29kZT4gYXJndW1lbnQuCiAgICAgIDwvbGk+CgogICAgICA8bGk+CiAgICAgICAgTG9nIHRoZSB2YWx1ZSBvZiB0aGUgIlgtRm9vIiByZXF1ZXN0IGVudmlyb25tZW50IHZhcmlhYmxlIGluIGVhY2gKICAgICAgICBzdGFnZSBvZiB0aGUgcmVxdWVzdDoKICAgICAgICA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCBsYW5nLWNvbmZpZyI+Jmx0O0xvY2F0aW9uIC8mZ3Q7CqCgTG9nTWVzc2FnZSAiJXtyZXFlbnY6WC1Gb299IiBob29rPWFsbAombHQ7L0xvY2F0aW9uJmd0OzwvcHJlPgoKICAgICAgICBUb2dldGhlciB3aXRoIG1pY3Jvc2Vjb25kIHRpbWUgc3RhbXBzIGluIHRoZSBlcnJvciBsb2csCiAgICAgICAgPGNvZGU+aG9vaz1hbGw8L2NvZGU+IGFsc28gbGV0cyB5b3UgZGV0ZXJtaW5lIHRoZSB0aW1lcyBzcGVudAogICAgICAgIGluIHRoZSBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZy4KICAgICAgPC9saT4KCiAgICA8L29sPgo8L2Rpdj4KPGRpdiBjbGFzcz0idG9wIj48YSBocmVmPSIjcGFnZS1oZWFkZXIiPjxpbWcgYWx0PSJ0b3AiIHNyYz0iLi4vaW1hZ2VzL3VwLmdpZiIgLz48L2E+PC9kaXY+CjxkaXYgY2xhc3M9ImRpcmVjdGl2ZS1zZWN0aW9uIj48aDI+PGEgbmFtZT0iTG9nTWVzc2FnZSIgaWQ9IkxvZ01lc3NhZ2UiPkxvZ01lc3NhZ2U8L2E+IDxhIG5hbWU9ImxvZ21lc3NhZ2UiIGlkPSJsb2dtZXNzYWdlIj5EaXJlY3RpdmU8L2E+PC9oMj4KPHRhYmxlIGNsYXNzPSJkaXJlY3RpdmUiPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVzY3JpcHRpb24iPkRlc2NyaXB0aW9uOjwvYT48L3RoPjx0ZD5Mb2cgdXNlci1kZWZpbmVkIG1lc3NhZ2UgdG8gZXJyb3IgbG9nCjwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCI+U3ludGF4OjwvYT48L3RoPjx0ZD48Y29kZT5Mb2dNZXNzYWdlIDx2YXI+bWVzc2FnZTwvdmFyPgpbaG9vaz08dmFyPmhvb2s8L3Zhcj5dIFtleHByPTx2YXI+ZXhwcmVzc2lvbjwvdmFyPl0KPC9jb2RlPjwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiPkRlZmF1bHQ6PC9hPjwvdGg+PHRkPjxjb2RlPlVuc2V0PC9jb2RlPjwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiPkNvbnRleHQ6PC9hPjwvdGg+PHRkPmRpcmVjdG9yeTwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyI+U3RhdHVzOjwvYT48L3RoPjx0ZD5FeHBlcmltZW50YWw8L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiPk1vZHVsZTo8L2E+PC90aD48dGQ+bW9kX2xvZ19kZWJ1ZzwvdGQ+PC90cj4KPC90YWJsZT4KICAgIDxwPlRoaXMgZGlyZWN0aXZlIGNhdXNlcyBhIHVzZXIgZGVmaW5lZCBtZXNzYWdlIHRvIGJlIGxvZ2dlZCB0byB0aGUKICAgIGVycm9yIGxvZy4gVGhlIG1lc3NhZ2UgY2FuIHVzZSB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBmcm9tIHRoZQogICAgPGEgaHJlZj0iLi4vZXhwci5odG1sIj5hcF9leHByIHN5bnRheDwvYT4uIFJlZmVyZW5jZXMgdG8gSFRUUCBoZWFkZXJzCiAgICB3aWxsIG5vdCBjYXVzZSBoZWFkZXIgbmFtZXMgdG8gYmUgYWRkZWQgdG8gdGhlIFZhcnkgaGVhZGVyLiBUaGUKICAgIG1lc3NhZ2VzIGFyZSBsb2dnZWQgYXQgbG9nbGV2ZWwgaW5mby48L3A+CgogICAgPHA+VGhlIGhvb2sgc3BlY2lmaWVzIGJlZm9yZSB3aGljaCBwaGFzZSBvZiByZXF1ZXN0IHByb2Nlc3NpbmcgdGhlIG1lc3NhZ2UKICAgIHdpbGwgYmUgbG9nZ2VkLiBUaGUgZm9sbG93aW5nIGhvb2tzIGFyZSBzdXBwb3J0ZWQ6PC9wPgoKICAgIDx0YWJsZSBjbGFzcz0iYm9yZGVyZWQiPjx0ciBjbGFzcz0iaGVhZGVyIj48dGg+TmFtZTwvdGg+PC90cj4KPHRyPjx0ZD48Y29kZT50cmFuc2xhdGVfbmFtZTwvY29kZT48L3RkPjwvdHI+Cjx0ciBjbGFzcz0ib2RkIj48dGQ+PGNvZGU+dHlwZV9jaGVja2VyPC9jb2RlPjwvdGQ+PC90cj4KPHRyPjx0ZD48Y29kZT5xdWlja19oYW5kbGVyPC9jb2RlPjwvdGQ+PC90cj4KPHRyIGNsYXNzPSJvZGQiPjx0ZD48Y29kZT5tYXBfdG9fc3RvcmFnZTwvY29kZT48L3RkPjwvdHI+Cjx0cj48dGQ+PGNvZGU+Y2hlY2tfYWNjZXNzPC9jb2RlPjwvdGQ+PC90cj4KPHRyIGNsYXNzPSJvZGQiPjx0ZD48Y29kZT5jaGVja19hY2Nlc3NfZXg8L2NvZGU+PC90ZD48L3RyPgo8dHI+PHRkPjxjb2RlPmluc2VydF9maWx0ZXI8L2NvZGU+PC90ZD48L3RyPgo8dHIgY2xhc3M9Im9kZCI+PHRkPjxjb2RlPmNoZWNrX2F1dGhuPC9jb2RlPjwvdGQ+PC90cj4KPHRyPjx0ZD48Y29kZT5jaGVja19hdXRoejwvY29kZT48L3RkPjwvdHI+Cjx0ciBjbGFzcz0ib2RkIj48dGQ+PGNvZGU+Zml4dXBzPC9jb2RlPjwvdGQ+PC90cj4KPHRyPjx0ZD48Y29kZT5oYW5kbGVyPC9jb2RlPjwvdGQ+PC90cj4KPHRyIGNsYXNzPSJvZGQiPjx0ZD48Y29kZT5sb2dfdHJhbnNhY3Rpb248L2NvZGU+PC90ZD48L3RyPgo8L3RhYmxlPgoKICAgIDxwPlRoZSBkZWZhdWx0IGlzIDxjb2RlPmxvZ190cmFuc2FjdGlvbjwvY29kZT4uIFRoZSBzcGVjaWFsIHZhbHVlCiAgICA8Y29kZT5hbGw8L2NvZGU+IGlzIGFsc28gc3VwcG9ydGVkLCBjYXVzaW5nIGEgbWVzc2FnZSB0byBiZSBsb2dnZWQgYXQgZWFjaAogICAgcGhhc2UuIE5vdCBhbGwgaG9va3MgYXJlIGV4ZWN1dGVkIGZvciBldmVyeSByZXF1ZXN0LjwvcD4KCiAgICA8cD5UaGUgb3B0aW9uYWwgZXhwcmVzc2lvbiBhbGxvd3MgdG8gcmVzdHJpY3QgdGhlIG1lc3NhZ2UgaWYgYQogICAgY29uZGl0aW9uIGlzIG1ldC4gVGhlIGRldGFpbHMgb2YgdGhlIGV4cHJlc3Npb24gc3ludGF4IGFyZSBkZXNjcmliZWQgaW4KICAgIHRoZSA8YSBocmVmPSIuLi9leHByLmh0bWwiPmFwX2V4cHIgZG9jdW1lbnRhdGlvbjwvYT4uIFJlZmVyZW5jZXMgdG8gSFRUUAogICAgaGVhZGVycyB3aWxsIG5vdCBjYXVzZSB0aGUgaGVhZGVyIG5hbWVzIHRvIGJlIGFkZGVkIHRvIHRoZSBWYXJ5IGhlYWRlci48L3A+CgoKPC9kaXY+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJib3R0b21sYW5nIj4KPHA+PHNwYW4+QXZhaWxhYmxlIExhbmd1YWdlczogPC9zcGFuPjxhIGhyZWY9Ii4uL2VuL21vZC9tb2RfbG9nX2RlYnVnLmh0bWwiIHRpdGxlPSJFbmdsaXNoIj4mbmJzcDtlbiZuYnNwOzwvYT4gfAo8YSBocmVmPSIuLi9mci9tb2QvbW9kX2xvZ19kZWJ1Zy5odG1sIiBocmVmbGFuZz0iZnIiIHJlbD0iYWx0ZXJuYXRlIiB0aXRsZT0iRnJhbudhaXMiPiZuYnNwO2ZyJm5ic3A7PC9hPjwvcD4KPC9kaXY+PGRpdiBjbGFzcz0idG9wIj48YSBocmVmPSIjcGFnZS1oZWFkZXIiPjxpbWcgc3JjPSIuLi9pbWFnZXMvdXAuZ2lmIiBhbHQ9InRvcCIgLz48L2E+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdGlvbiI+PGgyPjxhIGlkPSJjb21tZW50c19zZWN0aW9uIiBuYW1lPSJjb21tZW50c19zZWN0aW9uIj5Db21tZW50czwvYT48L2gyPjxkaXYgY2xhc3M9Indhcm5pbmciPjxzdHJvbmc+Tm90aWNlOjwvc3Ryb25nPjxiciAvPlRoaXMgaXMgbm90IGEgUSZhbXA7QSBzZWN0aW9uLiBDb21tZW50cyBwbGFjZWQgaGVyZSBzaG91bGQgYmUgcG9pbnRlZCB0b3dhcmRzIHN1Z2dlc3Rpb25zIG9uIGltcHJvdmluZyB0aGUgZG9jdW1lbnRhdGlvbiBvciBzZXJ2ZXIsIGFuZCBtYXkgYmUgcmVtb3ZlZCBhZ2FpbiBieSBvdXIgbW9kZXJhdG9ycyBpZiB0aGV5IGFyZSBlaXRoZXIgaW1wbGVtZW50ZWQgb3IgY29uc2lkZXJlZCBpbnZhbGlkL29mZi10b3BpYy4gUXVlc3Rpb25zIG9uIGhvdyB0byBtYW5hZ2UgdGhlIEFwYWNoZSBIVFRQIFNlcnZlciBzaG91bGQgYmUgZGlyZWN0ZWQgYXQgZWl0aGVyIG91ciBJUkMgY2hhbm5lbCwgI2h0dHBkLCBvbiBGcmVlbm9kZSwgb3Igc2VudCB0byBvdXIgPGEgaHJlZj0iaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvbGlzdHMuaHRtbCI+bWFpbGluZyBsaXN0czwvYT4uPC9kaXY+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tLy8tLT48IVtDREFUQVsvLz48IS0tCnZhciBjb21tZW50c19zaG9ydG5hbWUgPSAnaHR0cGQnOwp2YXIgY29tbWVudHNfaWRlbnRpZmllciA9ICdodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy9kb2NzLzIuNC9tb2QvbW9kX2xvZ19kZWJ1Zy5odG1sJzsKKGZ1bmN0aW9uKHcsIGQpIHsKICAgIGlmICh3LmxvY2F0aW9uLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCkgPT0gImh0dHBkLmFwYWNoZS5vcmciKSB7CiAgICAgICAgZC53cml0ZSgnPGRpdiBpZD0iY29tbWVudHNfdGhyZWFkIj48XC9kaXY+Jyk7CiAgICAgICAgdmFyIHMgPSBkLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICAgIHMudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnOwogICAgICAgIHMuYXN5bmMgPSB0cnVlOwogICAgICAgIHMuc3JjID0gJ2h0dHBzOi8vY29tbWVudHMuYXBhY2hlLm9yZy9zaG93X2NvbW1lbnRzLmx1YT9zaXRlPScgKyBjb21tZW50c19zaG9ydG5hbWUgKyAnJnBhZ2U9JyArIGNvbW1lbnRzX2lkZW50aWZpZXI7CiAgICAgICAgKGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXSB8fCBkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF0pLmFwcGVuZENoaWxkKHMpOwogICAgfQogICAgZWxzZSB7IAogICAgICAgIGQud3JpdGUoJzxkaXYgaWQ9ImNvbW1lbnRzX3RocmVhZCI+Q29tbWVudHMgYXJlIGRpc2FibGVkIGZvciB0aGlzIHBhZ2UgYXQgdGhlIG1vbWVudC48XC9kaXY+Jyk7CiAgICB9Cn0pKHdpbmRvdywgZG9jdW1lbnQpOwovLy0tPjwhXV0+PC9zY3JpcHQ+PC9kaXY+PGRpdiBpZD0iZm9vdGVyIj4KPHAgY2xhc3M9ImFwYWNoZSI+Q29weXJpZ2h0IDIwMTQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLjxiciAvPkxpY2Vuc2VkIHVuZGVyIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPkFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvYT4uPC9wPgo8cCBjbGFzcz0ibWVudSI+PGEgaHJlZj0iLi4vbW9kLyI+TW9kdWxlczwvYT4gfCA8YSBocmVmPSIuLi9tb2QvZGlyZWN0aXZlcy5odG1sIj5EaXJlY3RpdmVzPC9hPiB8IDxhIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvaHR0cGQvRkFRIj5GQVE8L2E+IHwgPGEgaHJlZj0iLi4vZ2xvc3NhcnkuaHRtbCI+R2xvc3Nhcnk8L2E+IHwgPGEgaHJlZj0iLi4vc2l0ZW1hcC5odG1sIj5TaXRlbWFwPC9hPjwvcD48L2Rpdj48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+PCEtLS8vLS0+PCFbQ0RBVEFbLy8+PCEtLQppZiAodHlwZW9mKHByZXR0eVByaW50KSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgIHByZXR0eVByaW50KCk7Cn0KLy8tLT48IV1dPjwvc2NyaXB0Pgo8L2JvZHk+PC9odG1sPg==