PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pgo8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+CjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj48aGVhZD4KPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KPCEtLQogICAgICAgIFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYCiAgICAgICAgICAgICAgVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIHhtbCBzb3VyY2U6IERPIE5PVCBFRElUCiAgICAgICAgWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgKICAgICAgLS0+Cjx0aXRsZT5tb2RfZGlyIC0gQXBhY2hlIEhUVFAgU2VydmVyIFZlcnNpb24gMi40PC90aXRsZT4KPGxpbmsgaHJlZj0iLi4vc3R5bGUvY3NzL21hbnVhbC5jc3MiIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiIHRpdGxlPSJNYWluIHN0eWxlc2hlZXQiIC8+CjxsaW5rIGhyZWY9Ii4uL3N0eWxlL2Nzcy9tYW51YWwtbG9vc2UtMTAwcGMuY3NzIiByZWw9ImFsdGVybmF0ZSBzdHlsZXNoZWV0IiBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyIgdGl0bGU9Ik5vIFNpZGViYXIgLSBEZWZhdWx0IGZvbnQgc2l6ZSIgLz4KPGxpbmsgaHJlZj0iLi4vc3R5bGUvY3NzL21hbnVhbC1wcmludC5jc3MiIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9InByaW50IiB0eXBlPSJ0ZXh0L2NzcyIgLz48bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZS9jc3MvcHJldHRpZnkuY3NzIiAvPgo8c2NyaXB0IHNyYz0iLi4vc3R5bGUvc2NyaXB0cy9wcmV0dGlmeS5taW4uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cjwvc2NyaXB0PgoKPGxpbmsgaHJlZj0iLi4vaW1hZ2VzL2Zhdmljb24uaWNvIiByZWw9InNob3J0Y3V0IGljb24iIC8+PC9oZWFkPgo8Ym9keT4KPGRpdiBpZD0icGFnZS1oZWFkZXIiPgo8cCBjbGFzcz0ibWVudSI+PGEgaHJlZj0iLi4vbW9kLyI+TW9kdWxlczwvYT4gfCA8YSBocmVmPSIuLi9tb2QvZGlyZWN0aXZlcy5odG1sIj5EaXJlY3RpdmVzPC9hPiB8IDxhIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvaHR0cGQvRkFRIj5GQVE8L2E+IHwgPGEgaHJlZj0iLi4vZ2xvc3NhcnkuaHRtbCI+R2xvc3Nhcnk8L2E+IHwgPGEgaHJlZj0iLi4vc2l0ZW1hcC5odG1sIj5TaXRlbWFwPC9hPjwvcD4KPHAgY2xhc3M9ImFwYWNoZSI+QXBhY2hlIEhUVFAgU2VydmVyIFZlcnNpb24gMi40PC9wPgo8aW1nIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9mZWF0aGVyLnBuZyIgLz48L2Rpdj4KPGRpdiBjbGFzcz0idXAiPjxhIGhyZWY9Ii4vIj48aW1nIHRpdGxlPSImbHQ7LSIgYWx0PSImbHQ7LSIgc3JjPSIuLi9pbWFnZXMvbGVmdC5naWYiIC8+PC9hPjwvZGl2Pgo8ZGl2IGlkPSJwYXRoIj4KPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+QXBhY2hlPC9hPiAmZ3Q7IDxhIGhyZWY9Imh0dHA6Ly9odHRwZC5hcGFjaGUub3JnLyI+SFRUUCBTZXJ2ZXI8L2E+ICZndDsgPGEgaHJlZj0iaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvZG9jcy8iPkRvY3VtZW50YXRpb248L2E+ICZndDsgPGEgaHJlZj0iLi4vIj5WZXJzaW9uIDIuNDwvYT4gJmd0OyA8YSBocmVmPSIuLyI+TW9kdWxlczwvYT48L2Rpdj4KPGRpdiBpZD0icGFnZS1jb250ZW50Ij4KPGRpdiBpZD0icHJlYW1ibGUiPjxoMT5BcGFjaGUgTW9kdWxlIG1vZF9kaXI8L2gxPgo8ZGl2IGNsYXNzPSJ0b3BsYW5nIj4KPHA+PHNwYW4+QXZhaWxhYmxlIExhbmd1YWdlczogPC9zcGFuPjxhIGhyZWY9Ii4uL2VuL21vZC9tb2RfZGlyLmh0bWwiIHRpdGxlPSJFbmdsaXNoIj4mbmJzcDtlbiZuYnNwOzwvYT4gfAo8YSBocmVmPSIuLi9mci9tb2QvbW9kX2Rpci5odG1sIiBocmVmbGFuZz0iZnIiIHJlbD0iYWx0ZXJuYXRlIiB0aXRsZT0iRnJhbudhaXMiPiZuYnNwO2ZyJm5ic3A7PC9hPiB8CjxhIGhyZWY9Ii4uL2phL21vZC9tb2RfZGlyLmh0bWwiIGhyZWZsYW5nPSJqYSIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJKYXBhbmVzZSI+Jm5ic3A7amEmbmJzcDs8L2E+IHwKPGEgaHJlZj0iLi4va28vbW9kL21vZF9kaXIuaHRtbCIgaHJlZmxhbmc9ImtvIiByZWw9ImFsdGVybmF0ZSIgdGl0bGU9IktvcmVhbiI+Jm5ic3A7a28mbmJzcDs8L2E+IHwKPGEgaHJlZj0iLi4vdHIvbW9kL21vZF9kaXIuaHRtbCIgaHJlZmxhbmc9InRyIiByZWw9ImFsdGVybmF0ZSIgdGl0bGU9IlT8cmvnZSI+Jm5ic3A7dHImbmJzcDs8L2E+PC9wPgo8L2Rpdj4KPHRhYmxlIGNsYXNzPSJtb2R1bGUiPjx0cj48dGg+PGEgaHJlZj0ibW9kdWxlLWRpY3QuaHRtbCNEZXNjcmlwdGlvbiI+RGVzY3JpcHRpb246PC9hPjwvdGg+PHRkPlByb3ZpZGVzIGZvciAidHJhaWxpbmcgc2xhc2giIHJlZGlyZWN0cyBhbmQKICAgIHNlcnZpbmcgZGlyZWN0b3J5IGluZGV4IGZpbGVzPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9Im1vZHVsZS1kaWN0Lmh0bWwjU3RhdHVzIj5TdGF0dXM6PC9hPjwvdGg+PHRkPkJhc2U8L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0ibW9kdWxlLWRpY3QuaHRtbCNNb2R1bGVJZGVudGlmaWVyIj5Nb2R1bGWgSWRlbnRpZmllcjo8L2E+PC90aD48dGQ+ZGlyX21vZHVsZTwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJtb2R1bGUtZGljdC5odG1sI1NvdXJjZUZpbGUiPlNvdXJjZaBGaWxlOjwvYT48L3RoPjx0ZD5tb2RfZGlyLmM8L3RkPjwvdHI+PC90YWJsZT4KPGgzPlN1bW1hcnk8L2gzPgoKICAgIDxwPlRoZSBpbmRleCBvZiBhIGRpcmVjdG9yeSBjYW4gY29tZSBmcm9tIG9uZSBvZiB0d28gc291cmNlczo8L3A+CgogICAgPHVsPgogICAgICA8bGk+QSBmaWxlIHdyaXR0ZW4gYnkgdGhlIHVzZXIsIHR5cGljYWxseSBjYWxsZWQKICAgICAgPGNvZGU+aW5kZXguaHRtbDwvY29kZT4uIFRoZSA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj48YSBocmVmPSIjZGlyZWN0b3J5aW5kZXgiPkRpcmVjdG9yeUluZGV4PC9hPjwvY29kZT4gZGlyZWN0aXZlIHNldHMgdGhlCiAgICAgIG5hbWUgb2YgdGhpcyBmaWxlLiBUaGlzIGlzIGNvbnRyb2xsZWQgYnkKICAgICAgPGNvZGUgY2xhc3M9Im1vZHVsZSI+PGEgaHJlZj0iLi4vbW9kL21vZF9kaXIuaHRtbCI+bW9kX2RpcjwvYT48L2NvZGU+LjwvbGk+CgogICAgICA8bGk+T3RoZXJ3aXNlLCBhIGxpc3RpbmcgZ2VuZXJhdGVkIGJ5IHRoZSBzZXJ2ZXIuIFRoaXMgaXMKICAgICAgcHJvdmlkZWQgYnkgPGNvZGUgY2xhc3M9Im1vZHVsZSI+PGEgaHJlZj0iLi4vbW9kL21vZF9hdXRvaW5kZXguaHRtbCI+bW9kX2F1dG9pbmRleDwvYT48L2NvZGU+LjwvbGk+CiAgICA8L3VsPgogICAgPHA+VGhlIHR3byBmdW5jdGlvbnMgYXJlIHNlcGFyYXRlZCBzbyB0aGF0IHlvdSBjYW4gY29tcGxldGVseQogICAgcmVtb3ZlIChvciByZXBsYWNlKSBhdXRvbWF0aWMgaW5kZXggZ2VuZXJhdGlvbiBzaG91bGQgeW91IHdhbnQKICAgIHRvLjwvcD4KCiAgICA8cD5BICJ0cmFpbGluZyBzbGFzaCIgcmVkaXJlY3QgaXMgaXNzdWVkIHdoZW4gdGhlIHNlcnZlcgogICAgcmVjZWl2ZXMgYSByZXF1ZXN0IGZvciBhIFVSTAogICAgPGNvZGU+aHR0cDovL3NlcnZlcm5hbWUvZm9vL2Rpcm5hbWU8L2NvZGU+IHdoZXJlCiAgICA8Y29kZT5kaXJuYW1lPC9jb2RlPiBpcyBhIGRpcmVjdG9yeS4gRGlyZWN0b3JpZXMgcmVxdWlyZSBhCiAgICB0cmFpbGluZyBzbGFzaCwgc28gPGNvZGUgY2xhc3M9Im1vZHVsZSI+PGEgaHJlZj0iLi4vbW9kL21vZF9kaXIuaHRtbCI+bW9kX2RpcjwvYT48L2NvZGU+IGlzc3VlcyBhIHJlZGlyZWN0IHRvCiAgICA8Y29kZT5odHRwOi8vc2VydmVybmFtZS9mb28vZGlybmFtZS88L2NvZGU+LjwvcD4KPC9kaXY+CjxkaXYgaWQ9InF1aWNrdmlldyI+PGgzIGNsYXNzPSJkaXJlY3RpdmVzIj5EaXJlY3RpdmVzPC9oMz4KPHVsIGlkPSJ0b2MiPgo8bGk+PGltZyBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvZG93bi5naWYiIC8+IDxhIGhyZWY9IiNkaXJlY3RvcnljaGVja2hhbmRsZXIiPkRpcmVjdG9yeUNoZWNrSGFuZGxlcjwvYT48L2xpPgo8bGk+PGltZyBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvZG93bi5naWYiIC8+IDxhIGhyZWY9IiNkaXJlY3RvcnlpbmRleCI+RGlyZWN0b3J5SW5kZXg8L2E+PC9saT4KPGxpPjxpbWcgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL2Rvd24uZ2lmIiAvPiA8YSBocmVmPSIjZGlyZWN0b3J5aW5kZXhyZWRpcmVjdCI+RGlyZWN0b3J5SW5kZXhSZWRpcmVjdDwvYT48L2xpPgo8bGk+PGltZyBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvZG93bi5naWYiIC8+IDxhIGhyZWY9IiNkaXJlY3RvcnlzbGFzaCI+RGlyZWN0b3J5U2xhc2g8L2E+PC9saT4KPGxpPjxpbWcgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL2Rvd24uZ2lmIiAvPiA8YSBocmVmPSIjZmFsbGJhY2tyZXNvdXJjZSI+RmFsbGJhY2tSZXNvdXJjZTwvYT48L2xpPgo8L3VsPgo8aDM+QnVnZml4IGNoZWNrbGlzdDwvaDM+PHVsIGNsYXNzPSJzZWVhbHNvIj48bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2h0dHBkL0NIQU5HRVNfMi40Ij5odHRwZCBjaGFuZ2Vsb2c8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9iei5hcGFjaGUub3JnL2J1Z3ppbGxhL2J1Z2xpc3QuY2dpP2J1Z19zdGF0dXM9X19vcGVuX18mYW1wO2xpc3RfaWQ9MTQ0NTMyJmFtcDtwcm9kdWN0PUFwYWNoZSUyMGh0dHBkLTImYW1wO3F1ZXJ5X2Zvcm1hdD1zcGVjaWZpYyZhbXA7b3JkZXI9Y2hhbmdlZGRhdGUlMjBERVNDJTJDcHJpb3JpdHklMkNidWdfc2V2ZXJpdHkmYW1wO2NvbXBvbmVudD1tb2RfZGlyIj5Lbm93biBpc3N1ZXM8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9iei5hcGFjaGUub3JnL2J1Z3ppbGxhL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1BcGFjaGUlMjBodHRwZC0yJmFtcDtjb21wb25lbnQ9bW9kX2RpciI+UmVwb3J0IGEgYnVnPC9hPjwvbGk+PC91bD48aDM+U2VlIGFsc288L2gzPgo8dWwgY2xhc3M9InNlZWFsc28iPgo8bGk+PGEgaHJlZj0iI2NvbW1lbnRzX3NlY3Rpb24iPkNvbW1lbnRzPC9hPjwvbGk+PC91bD48L2Rpdj4KCjxkaXYgY2xhc3M9InRvcCI+PGEgaHJlZj0iI3BhZ2UtaGVhZGVyIj48aW1nIGFsdD0idG9wIiBzcmM9Ii4uL2ltYWdlcy91cC5naWYiIC8+PC9hPjwvZGl2Pgo8ZGl2IGNsYXNzPSJkaXJlY3RpdmUtc2VjdGlvbiI+PGgyPjxhIG5hbWU9IkRpcmVjdG9yeUNoZWNrSGFuZGxlciIgaWQ9IkRpcmVjdG9yeUNoZWNrSGFuZGxlciI+RGlyZWN0b3J5Q2hlY2tIYW5kbGVyPC9hPiA8YSBuYW1lPSJkaXJlY3RvcnljaGVja2hhbmRsZXIiIGlkPSJkaXJlY3RvcnljaGVja2hhbmRsZXIiPkRpcmVjdGl2ZTwvYT48L2gyPgo8dGFibGUgY2xhc3M9ImRpcmVjdGl2ZSI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZXNjcmlwdGlvbiI+RGVzY3JpcHRpb246PC9hPjwvdGg+PHRkPlRvZ2dsZSBob3cgdGhpcyBtb2R1bGUgcmVzcG9uZHMgd2hlbiBhbm90aGVyIGhhbmRsZXIgaXMgY29uZmlndXJlZDwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCI+U3ludGF4OjwvYT48L3RoPjx0ZD48Y29kZT5EaXJlY3RvcnlDaGVja0hhbmRsZXIgT258T2ZmPC9jb2RlPjwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiPkRlZmF1bHQ6PC9hPjwvdGg+PHRkPjxjb2RlPkRpcmVjdG9yeUNoZWNrSGFuZGxlciBPZmY8L2NvZGU+PC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCI+Q29udGV4dDo8L2E+PC90aD48dGQ+c2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2VzczwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIj5PdmVycmlkZTo8L2E+PC90aD48dGQ+SW5kZXhlczwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyI+U3RhdHVzOjwvYT48L3RoPjx0ZD5CYXNlPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIj5Nb2R1bGU6PC9hPjwvdGg+PHRkPm1vZF9kaXI8L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5Ij5Db21wYXRpYmlsaXR5OjwvYT48L3RoPjx0ZD5BdmFpbGFibGUgaW4gMi40LjggYW5kIGxhdGVyLiAgUmVsZWFzZXMgcHJpb3IgdG8gMi40IGltcGxpY2l0bHkKYWN0IGFzIGlmICJEaXJlY3RvcnlDaGVja0hhbmRsZXIgT04iIHdhcyBzcGVjaWZpZWQuPC90ZD48L3RyPgo8L3RhYmxlPgogICAgPHA+VGhlIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPkRpcmVjdG9yeUNoZWNrSGFuZGxlcjwvY29kZT4gZGlyZWN0aXZlIGRldGVybWluZXMgCiAgICB3aGV0aGVyIDxjb2RlIGNsYXNzPSJtb2R1bGUiPjxhIGhyZWY9Ii4uL21vZC9tb2RfZGlyLmh0bWwiPm1vZF9kaXI8L2E+PC9jb2RlPiBzaG91bGQgY2hlY2sgZm9yIGRpcmVjdG9yeSBpbmRleGVzIG9yCiAgICBhZGQgdHJhaWxpbmcgc2xhc2hlcyB3aGVuIHNvbWUgb3RoZXIgaGFuZGxlciBoYXMgYmVlbiBjb25maWd1cmVkIGZvcgogICAgdGhlIGN1cnJlbnQgVVJMLiAgSGFuZGxlcnMgY2FuIGJlIHNldCBieSBkaXJlY3RpdmVzIHN1Y2ggYXMgCiAgICA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj48YSBocmVmPSIuLi9tb2QvY29yZS5odG1sI3NldGhhbmRsZXIiPlNldEhhbmRsZXI8L2E+PC9jb2RlPiBvciBieSBvdGhlciBtb2R1bGVzLAogICAgc3VjaCBhcyA8Y29kZSBjbGFzcz0ibW9kdWxlIj48YSBocmVmPSIuLi9tb2QvbW9kX3Jld3JpdGUuaHRtbCI+bW9kX3Jld3JpdGU8L2E+PC9jb2RlPiBkdXJpbmcgcGVyLWRpcmVjdG9yeSBzdWJzdGl0dXRpb25zLgogICAgPC9wPgoKICAgIDxwPiBJbiByZWxlYXNlcyBwcmlvciB0byAyLjQsIHRoaXMgbW9kdWxlIGRpZCBub3QgdGFrZSBhbnkgYWN0aW9uIGlmIGFueQogICAgb3RoZXIgaGFuZGxlciB3YXMgY29uZmlndXJlZCBmb3IgYSBVUkwuIFRoaXMgYWxsb3dzIGRpcmVjdG9yeSBpbmRleGVzIHRvIAogICAgYmUgc2VydmVkIGV2ZW4gd2hlbiBhIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPlNldEhhbmRsZXI8L2NvZGU+IGRpcmVjdGl2ZSBpcyAKICAgIHNwZWNpZmllZCBmb3IgYW4gZW50aXJlIGRpcmVjdG9yeSwgYnV0IGl0IGNhbiBhbHNvIHJlc3VsdCBpbiBzb21lIGNvbmZsaWN0cwogICAgd2l0aCBtb2R1bGVzIHN1Y2ggYXMgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+bW9kX3Jld3JpdGU8L2NvZGU+LjwvcD4KCjwvZGl2Pgo8ZGl2IGNsYXNzPSJ0b3AiPjxhIGhyZWY9IiNwYWdlLWhlYWRlciI+PGltZyBhbHQ9InRvcCIgc3JjPSIuLi9pbWFnZXMvdXAuZ2lmIiAvPjwvYT48L2Rpdj4KPGRpdiBjbGFzcz0iZGlyZWN0aXZlLXNlY3Rpb24iPjxoMj48YSBuYW1lPSJEaXJlY3RvcnlJbmRleCIgaWQ9IkRpcmVjdG9yeUluZGV4Ij5EaXJlY3RvcnlJbmRleDwvYT4gPGEgbmFtZT0iZGlyZWN0b3J5aW5kZXgiIGlkPSJkaXJlY3RvcnlpbmRleCI+RGlyZWN0aXZlPC9hPjwvaDI+Cjx0YWJsZSBjbGFzcz0iZGlyZWN0aXZlIj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI0Rlc2NyaXB0aW9uIj5EZXNjcmlwdGlvbjo8L2E+PC90aD48dGQ+TGlzdCBvZiByZXNvdXJjZXMgdG8gbG9vayBmb3Igd2hlbiB0aGUgY2xpZW50IHJlcXVlc3RzCmEgZGlyZWN0b3J5PC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4Ij5TeW50YXg6PC9hPjwvdGg+PHRkPjxjb2RlPkRpcmVjdG9yeUluZGV4CiAgICBkaXNhYmxlZCB8IDx2YXI+bG9jYWwtdXJsPC92YXI+IFs8dmFyPmxvY2FsLXVybDwvdmFyPl0gLi4uPC9jb2RlPjwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiPkRlZmF1bHQ6PC9hPjwvdGg+PHRkPjxjb2RlPkRpcmVjdG9yeUluZGV4IGluZGV4Lmh0bWw8L2NvZGU+PC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCI+Q29udGV4dDo8L2E+PC90aD48dGQ+c2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2VzczwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIj5PdmVycmlkZTo8L2E+PC90aD48dGQ+SW5kZXhlczwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyI+U3RhdHVzOjwvYT48L3RoPjx0ZD5CYXNlPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIj5Nb2R1bGU6PC9hPjwvdGg+PHRkPm1vZF9kaXI8L3RkPjwvdHI+CjwvdGFibGU+CiAgICA8cD5UaGUgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+RGlyZWN0b3J5SW5kZXg8L2NvZGU+IGRpcmVjdGl2ZSBzZXRzIHRoZQogICAgbGlzdCBvZiByZXNvdXJjZXMgdG8gbG9vayBmb3IsIHdoZW4gdGhlIGNsaWVudCByZXF1ZXN0cyBhbiBpbmRleAogICAgb2YgdGhlIGRpcmVjdG9yeSBieSBzcGVjaWZ5aW5nIGEgLyBhdCB0aGUgZW5kIG9mIHRoZSBkaXJlY3RvcnkKICAgIG5hbWUuICA8dmFyPkxvY2FsLXVybDwvdmFyPiBpcyB0aGUgKCUtZW5jb2RlZCkgVVJMIG9mIGEgZG9jdW1lbnQgb24KICAgIHRoZSBzZXJ2ZXIgcmVsYXRpdmUgdG8gdGhlIHJlcXVlc3RlZCBkaXJlY3Rvcnk7IGl0IGlzIHVzdWFsbHkgdGhlCiAgICBuYW1lIG9mIGEgZmlsZSBpbiB0aGUgZGlyZWN0b3J5LiBTZXZlcmFsIFVSTHMgbWF5IGJlIGdpdmVuLCBpbgogICAgd2hpY2ggY2FzZSB0aGUgc2VydmVyIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCBvbmUgdGhhdCBpdCBmaW5kcy4gIElmCiAgICBub25lIG9mIHRoZSByZXNvdXJjZXMgZXhpc3QgYW5kIHRoZSA8Y29kZT5JbmRleGVzPC9jb2RlPiBvcHRpb24gaXMKICAgIHNldCwgdGhlIHNlcnZlciB3aWxsIGdlbmVyYXRlIGl0cyBvd24gbGlzdGluZyBvZiB0aGUKICAgIGRpcmVjdG9yeS48L3A+CgogICAgPGRpdiBjbGFzcz0iZXhhbXBsZSI+PGgzPkV4YW1wbGU8L2gzPjxwcmUgY2xhc3M9InByZXR0eXByaW50IGxhbmctY29uZmlnIj5EaXJlY3RvcnlJbmRleCBpbmRleC5odG1sPC9wcmU+CjwvZGl2PgoKICAgIDxwPnRoZW4gYSByZXF1ZXN0IGZvciA8Y29kZT5odHRwOi8vZXhhbXBsZS5jb20vZG9jcy88L2NvZGU+IHdvdWxkCiAgICByZXR1cm4gPGNvZGU+aHR0cDovL2V4YW1wbGUuY29tL2RvY3MvaW5kZXguaHRtbDwvY29kZT4gaWYgaXQKICAgIGV4aXN0cywgb3Igd291bGQgbGlzdCB0aGUgZGlyZWN0b3J5IGlmIGl0IGRpZCBub3QuPC9wPgoKICAgIDxwPk5vdGUgdGhhdCB0aGUgZG9jdW1lbnRzIGRvIG5vdCBuZWVkIHRvIGJlIHJlbGF0aXZlIHRvIHRoZQogICAgZGlyZWN0b3J5OzwvcD4KCiAgICA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCBsYW5nLWNvbmZpZyI+RGlyZWN0b3J5SW5kZXggaW5kZXguaHRtbCBpbmRleC50eHQgIC9jZ2ktYmluL2luZGV4LnBsPC9wcmU+CgoKICAgIDxwPndvdWxkIGNhdXNlIHRoZSBDR0kgc2NyaXB0IDxjb2RlPi9jZ2ktYmluL2luZGV4LnBsPC9jb2RlPiB0byBiZQogICAgZXhlY3V0ZWQgaWYgbmVpdGhlciA8Y29kZT5pbmRleC5odG1sPC9jb2RlPiBvciA8Y29kZT5pbmRleC50eHQ8L2NvZGU+CiAgICBleGlzdGVkIGluIGEgZGlyZWN0b3J5LjwvcD4KCiAgICA8cD5BIHNpbmdsZSBhcmd1bWVudCBvZiAiZGlzYWJsZWQiIHByZXZlbnRzIDxjb2RlIGNsYXNzPSJtb2R1bGUiPjxhIGhyZWY9Ii4uL21vZC9tb2RfZGlyLmh0bWwiPm1vZF9kaXI8L2E+PC9jb2RlPiBmcm9tCiAgICBzZWFyY2hpbmcgZm9yIGFuIGluZGV4LiAgQW4gYXJndW1lbnQgb2YgImRpc2FibGVkIiB3aWxsIGJlIGludGVycHJldGVkCiAgICBsaXRlcmFsbHkgaWYgaXQgaGFzIGFueSBhcmd1bWVudHMgYmVmb3JlIG9yIGFmdGVyIGl0LCBldmVuIGlmIHRoZXkgYXJlICJkaXNhYmxlZCIKICAgIGFzIHdlbGwuPC9wPgoKICAgIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gTXVsdGlwbGUgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+RGlyZWN0b3J5SW5kZXg8L2NvZGU+CiAgICBkaXJlY3RpdmVzIHdpdGhpbiB0aGUgPGEgaHJlZj0iLi4vc2VjdGlvbnMuaHRtbCI+PGVtPnNhbWUgY29udGV4dDwvZW0+PC9hPiB3aWxsIGFkZAogICAgdG8gdGhlIGxpc3Qgb2YgcmVzb3VyY2VzIHRvIGxvb2sgZm9yIHJhdGhlciB0aGFuIHJlcGxhY2U6CiAgICA8L3A+CiAgICA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCBsYW5nLWNvbmZpZyI+IyBFeGFtcGxlIEE6IFNldCBpbmRleC5odG1sIGFzIGFuIGluZGV4IHBhZ2UsIHRoZW4gYWRkIGluZGV4LnBocCB0byB0aGF0IGxpc3QgYXMgd2VsbC4KJmx0O0RpcmVjdG9yeSAiL2ZvbyImZ3Q7CiAgICBEaXJlY3RvcnlJbmRleCBpbmRleC5odG1sCiAgICBEaXJlY3RvcnlJbmRleCBpbmRleC5waHAKJmx0Oy9EaXJlY3RvcnkmZ3Q7CgojIEV4YW1wbGUgQjogVGhpcyBpcyBpZGVudGljYWwgdG8gZXhhbXBsZSBBLCBleGNlcHQgaXQncyBkb25lIHdpdGggYSBzaW5nbGUgZGlyZWN0aXZlLgombHQ7RGlyZWN0b3J5ICIvZm9vIiZndDsKICAgIERpcmVjdG9yeUluZGV4IGluZGV4Lmh0bWwgaW5kZXgucGhwCiZsdDsvRGlyZWN0b3J5Jmd0OwoKIyBFeGFtcGxlIEM6IFRvIHJlcGxhY2UgdGhlIGxpc3QsIHlvdSBtdXN0IGV4cGxpY2l0bHkgcmVzZXQgaXQgZmlyc3Q6CiMgSW4gdGhpcyBleGFtcGxlLCBvbmx5IGluZGV4LnBocCB3aWxsIHJlbWFpbiBhcyBhbiBpbmRleCByZXNvdXJjZS4KJmx0O0RpcmVjdG9yeSAiL2ZvbyImZ3Q7CiAgICBEaXJlY3RvcnlJbmRleCBpbmRleC5odG1sCiAgICBEaXJlY3RvcnlJbmRleCBkaXNhYmxlZAogICAgRGlyZWN0b3J5SW5kZXggaW5kZXgucGhwCiZsdDsvRGlyZWN0b3J5Jmd0OzwvcHJlPgoKCgo8L2Rpdj4KPGRpdiBjbGFzcz0idG9wIj48YSBocmVmPSIjcGFnZS1oZWFkZXIiPjxpbWcgYWx0PSJ0b3AiIHNyYz0iLi4vaW1hZ2VzL3VwLmdpZiIgLz48L2E+PC9kaXY+CjxkaXYgY2xhc3M9ImRpcmVjdGl2ZS1zZWN0aW9uIj48aDI+PGEgbmFtZT0iRGlyZWN0b3J5SW5kZXhSZWRpcmVjdCIgaWQ9IkRpcmVjdG9yeUluZGV4UmVkaXJlY3QiPkRpcmVjdG9yeUluZGV4UmVkaXJlY3Q8L2E+IDxhIG5hbWU9ImRpcmVjdG9yeWluZGV4cmVkaXJlY3QiIGlkPSJkaXJlY3RvcnlpbmRleHJlZGlyZWN0Ij5EaXJlY3RpdmU8L2E+PC9oMj4KPHRhYmxlIGNsYXNzPSJkaXJlY3RpdmUiPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVzY3JpcHRpb24iPkRlc2NyaXB0aW9uOjwvYT48L3RoPjx0ZD5Db25maWd1cmVzIGFuIGV4dGVybmFsIHJlZGlyZWN0IGZvciBkaXJlY3RvcnkgaW5kZXhlcy4KPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4Ij5TeW50YXg6PC9hPjwvdGg+PHRkPjxjb2RlPkRpcmVjdG9yeUluZGV4UmVkaXJlY3Qgb24gfCBvZmYgfCBwZXJtYW5lbnQgfCB0ZW1wIHwgc2Vlb3RoZXIgfAo8dmFyPjN4eC1jb2RlPC92YXI+CjwvY29kZT48L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0Ij5EZWZhdWx0OjwvYT48L3RoPjx0ZD48Y29kZT5EaXJlY3RvcnlJbmRleFJlZGlyZWN0IG9mZjwvY29kZT48L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0Ij5Db250ZXh0OjwvYT48L3RoPjx0ZD5zZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiPk92ZXJyaWRlOjwvYT48L3RoPjx0ZD5JbmRleGVzPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIj5TdGF0dXM6PC9hPjwvdGg+PHRkPkJhc2U8L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiPk1vZHVsZTo8L2E+PC90aD48dGQ+bW9kX2RpcjwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiPkNvbXBhdGliaWxpdHk6PC9hPjwvdGg+PHRkPkF2YWlsYWJsZSBpbiB2ZXJzaW9uIDIuMy4xNCBhbmQgbGF0ZXI8L3RkPjwvdHI+CjwvdGFibGU+CiAgICA8cD5CeSBkZWZhdWx0LCB0aGUgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+RGlyZWN0b3J5SW5kZXg8L2NvZGU+IGlzIHNlbGVjdGVkCiAgICBhbmQgcmV0dXJuZWQgdHJhbnNwYXJlbnRseSB0byB0aGUgY2xpZW50LiAgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+RGlyZWN0b3J5SW5kZXhSZWRpcmVjdDwvY29kZT4gY2F1c2VzIGFuIGV4dGVybmFsIHJlZGlyZWN0CiAgICB0byBpbnN0ZWFkIGJlIGlzc3VlZC48L3A+CgogICAgPHA+VGhlIGFyZ3VtZW50IGNhbiBiZTo8L3A+CiAgICA8dWw+CiAgICAgPGxpPjxjb2RlPm9uPC9jb2RlPjogaXNzdWVzIGEgMzAyIHJlZGlyZWN0aW9uIHRvIHRoZSBpbmRleCByZXNvdXJjZS48L2xpPgogICAgIDxsaT48Y29kZT5vZmY8L2NvZGU+OiBkb2VzIG5vdCBpc3N1ZSBhIHJlZGlyZWN0aW9uLiBUaGlzIGlzIHRoZSBsZWdhY3kgYmVoYXZpb3VyIG9mIG1vZF9kaXIuPC9saT4KICAgICA8bGk+PGNvZGU+cGVybWFuZW50PC9jb2RlPjogaXNzdWVzIGEgMzAxIChwZXJtYW5lbnQpIHJlZGlyZWN0aW9uIHRvIHRoZSBpbmRleCByZXNvdXJjZS48L2xpPgogICAgIDxsaT48Y29kZT50ZW1wPC9jb2RlPjogdGhpcyBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIDxjb2RlPm9uPC9jb2RlPjwvbGk+CiAgICAgPGxpPjxjb2RlPnNlZW90aGVyPC9jb2RlPjogaXNzdWVzIGEgMzAzIHJlZGlyZWN0aW9uIChhbHNvIGtub3duIGFzICJTZWUgT3RoZXIiKSB0byB0aGUgaW5kZXggcmVzb3VyY2UuPC9saT4KICAgICA8bGk+PHZhcj4zeHgtY29kZTwvdmFyPjogaXNzdWVzIGEgcmVkaXJlY3Rpb24gbWFya2VkIGJ5IHRoZSBjaG9zZW4gM3h4IGNvZGUuPC9saT4KICAgIDwvdWw+CgoKICAgIDxkaXYgY2xhc3M9ImV4YW1wbGUiPjxoMz5FeGFtcGxlPC9oMz48cHJlIGNsYXNzPSJwcmV0dHlwcmludCBsYW5nLWNvbmZpZyI+RGlyZWN0b3J5SW5kZXhSZWRpcmVjdCBvbjwvcHJlPgo8L2Rpdj4KCiAgICA8cD5BIHJlcXVlc3QgZm9yIDxjb2RlPmh0dHA6Ly9leGFtcGxlLmNvbS9kb2NzLzwvY29kZT4gd291bGQKICAgIHJldHVybiBhIHRlbXBvcmFyeSByZWRpcmVjdCB0byA8Y29kZT5odHRwOi8vZXhhbXBsZS5jb20vZG9jcy9pbmRleC5odG1sPC9jb2RlPgogICAgaWYgaXQgZXhpc3RzLjwvcD4KCgo8L2Rpdj4KPGRpdiBjbGFzcz0idG9wIj48YSBocmVmPSIjcGFnZS1oZWFkZXIiPjxpbWcgYWx0PSJ0b3AiIHNyYz0iLi4vaW1hZ2VzL3VwLmdpZiIgLz48L2E+PC9kaXY+CjxkaXYgY2xhc3M9ImRpcmVjdGl2ZS1zZWN0aW9uIj48aDI+PGEgbmFtZT0iRGlyZWN0b3J5U2xhc2giIGlkPSJEaXJlY3RvcnlTbGFzaCI+RGlyZWN0b3J5U2xhc2g8L2E+IDxhIG5hbWU9ImRpcmVjdG9yeXNsYXNoIiBpZD0iZGlyZWN0b3J5c2xhc2giPkRpcmVjdGl2ZTwvYT48L2gyPgo8dGFibGUgY2xhc3M9ImRpcmVjdGl2ZSI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZXNjcmlwdGlvbiI+RGVzY3JpcHRpb246PC9hPjwvdGg+PHRkPlRvZ2dsZSB0cmFpbGluZyBzbGFzaCByZWRpcmVjdHMgb24gb3Igb2ZmPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4Ij5TeW50YXg6PC9hPjwvdGg+PHRkPjxjb2RlPkRpcmVjdG9yeVNsYXNoIE9ufE9mZjwvY29kZT48L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0Ij5EZWZhdWx0OjwvYT48L3RoPjx0ZD48Y29kZT5EaXJlY3RvcnlTbGFzaCBPbjwvY29kZT48L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0Ij5Db250ZXh0OjwvYT48L3RoPjx0ZD5zZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiPk92ZXJyaWRlOjwvYT48L3RoPjx0ZD5JbmRleGVzPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIj5TdGF0dXM6PC9hPjwvdGg+PHRkPkJhc2U8L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiPk1vZHVsZTo8L2E+PC90aD48dGQ+bW9kX2RpcjwvdGQ+PC90cj4KPC90YWJsZT4KICAgIDxwPlRoZSA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj5EaXJlY3RvcnlTbGFzaDwvY29kZT4gZGlyZWN0aXZlIGRldGVybWluZXMgd2hldGhlcgogICAgPGNvZGUgY2xhc3M9Im1vZHVsZSI+PGEgaHJlZj0iLi4vbW9kL21vZF9kaXIuaHRtbCI+bW9kX2RpcjwvYT48L2NvZGU+IHNob3VsZCBmaXh1cCBVUkxzIHBvaW50aW5nIHRvIGEgZGlyZWN0b3J5IG9yCiAgICBub3QuPC9wPgoKICAgIDxwPlR5cGljYWxseSBpZiBhIHVzZXIgcmVxdWVzdHMgYSByZXNvdXJjZSB3aXRob3V0IGEgdHJhaWxpbmcgc2xhc2gsIHdoaWNoCiAgICBwb2ludHMgdG8gYSBkaXJlY3RvcnksIDxjb2RlIGNsYXNzPSJtb2R1bGUiPjxhIGhyZWY9Ii4uL21vZC9tb2RfZGlyLmh0bWwiPm1vZF9kaXI8L2E+PC9jb2RlPiByZWRpcmVjdHMgaGltIHRvIHRoZSBzYW1lCiAgICByZXNvdXJjZSwgYnV0IDxlbT53aXRoPC9lbT4gdHJhaWxpbmcgc2xhc2ggZm9yIHNvbWUgZ29vZCByZWFzb25zOjwvcD4KCiAgICA8dWw+CiAgICA8bGk+VGhlIHVzZXIgaXMgZmluYWxseSByZXF1ZXN0aW5nIHRoZSBjYW5vbmljYWwgVVJMIG9mIHRoZSByZXNvdXJjZTwvbGk+CiAgICA8bGk+PGNvZGUgY2xhc3M9Im1vZHVsZSI+PGEgaHJlZj0iLi4vbW9kL21vZF9hdXRvaW5kZXguaHRtbCI+bW9kX2F1dG9pbmRleDwvYT48L2NvZGU+IHdvcmtzIGNvcnJlY3RseS4gU2luY2UgaXQgZG9lc24ndCBlbWl0CiAgICB0aGUgcGF0aCBpbiB0aGUgbGluaywgaXQgd291bGQgcG9pbnQgdG8gdGhlIHdyb25nIHBhdGguPC9saT4KICAgIDxsaT48Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj48YSBocmVmPSIjZGlyZWN0b3J5aW5kZXgiPkRpcmVjdG9yeUluZGV4PC9hPjwvY29kZT4gd2lsbCBiZSBldmFsdWF0ZWQKICAgIDxlbT5vbmx5PC9lbT4gZm9yIGRpcmVjdG9yaWVzIHJlcXVlc3RlZCB3aXRoIHRyYWlsaW5nIHNsYXNoLjwvbGk+CiAgICA8bGk+UmVsYXRpdmUgVVJMIHJlZmVyZW5jZXMgaW5zaWRlIGh0bWwgcGFnZXMgd2lsbCB3b3JrIGNvcnJlY3RseS48L2xpPgogICAgPC91bD4KCiAgICA8cD5JZiB5b3UgZG9uJ3Qgd2FudCB0aGlzIGVmZmVjdCA8ZW0+YW5kPC9lbT4gdGhlIHJlYXNvbnMgYWJvdmUgZG9uJ3QKICAgIGFwcGx5IHRvIHlvdSwgeW91IGNhbiB0dXJuIG9mZiB0aGUgcmVkaXJlY3QgYXMgc2hvd24gYmVsb3cuIEhvd2V2ZXIsCiAgICBiZSBhd2FyZSB0aGF0IHRoZXJlIGFyZSBwb3NzaWJsZSBzZWN1cml0eSBpbXBsaWNhdGlvbnMgdG8gZG9pbmcKICAgIHRoaXMuPC9wPgoKICAgIDxwcmUgY2xhc3M9InByZXR0eXByaW50IGxhbmctY29uZmlnIj4jIHNlZSBzZWN1cml0eSB3YXJuaW5nIGJlbG93IQombHQ7TG9jYXRpb24gIi9zb21lL3BhdGgiJmd0OwogICAgRGlyZWN0b3J5U2xhc2ggT2ZmCiAgICBTZXRIYW5kbGVyIHNvbWUtaGFuZGxlcgombHQ7L0xvY2F0aW9uJmd0OzwvcHJlPgoKCiAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nIj48aDM+U2VjdXJpdHkgV2FybmluZzwvaDM+CiAgICA8cD5UdXJuaW5nIG9mZiB0aGUgdHJhaWxpbmcgc2xhc2ggcmVkaXJlY3QgbWF5IHJlc3VsdCBpbiBhbiBpbmZvcm1hdGlvbgogICAgZGlzY2xvc3VyZS4gQ29uc2lkZXIgYSBzaXR1YXRpb24gd2hlcmUgPGNvZGUgY2xhc3M9Im1vZHVsZSI+PGEgaHJlZj0iLi4vbW9kL21vZF9hdXRvaW5kZXguaHRtbCI+bW9kX2F1dG9pbmRleDwvYT48L2NvZGU+IGlzCiAgICBhY3RpdmUgKDxjb2RlPk9wdGlvbnMgK0luZGV4ZXM8L2NvZGU+KSBhbmQgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iI2RpcmVjdG9yeWluZGV4Ij5EaXJlY3RvcnlJbmRleDwvYT48L2NvZGU+IGlzIHNldCB0byBhIHZhbGlkIHJlc291cmNlIChzYXksCiAgICA8Y29kZT5pbmRleC5odG1sPC9jb2RlPikgYW5kIHRoZXJlJ3Mgbm8gb3RoZXIgc3BlY2lhbCBoYW5kbGVyIGRlZmluZWQgZm9yCiAgICB0aGF0IFVSTC4gSW4gdGhpcyBjYXNlIGEgcmVxdWVzdCB3aXRoIGEgdHJhaWxpbmcgc2xhc2ggd291bGQgc2hvdyB0aGUKICAgIDxjb2RlPmluZGV4Lmh0bWw8L2NvZGU+IGZpbGUuIDxzdHJvbmc+QnV0IGEgcmVxdWVzdCB3aXRob3V0IHRyYWlsaW5nIHNsYXNoCiAgICB3b3VsZCBsaXN0IHRoZSBkaXJlY3RvcnkgY29udGVudHM8L3N0cm9uZz4uPC9wPgogICAgPC9kaXY+Cgk8cD5BbHNvIG5vdGUgdGhhdCBzb21lIGJyb3dzZXJzIG1heSBlcnJvbmVvdXNseSBjaGFuZ2UgUE9TVCByZXF1ZXN0cyBpbnRvIEdFVAoJKHRodXMgZGlzY2FyZGluZyBQT1NUIGRhdGEpIHdoZW4gYSByZWRpcmVjdCBpcyBpc3N1ZWQuPC9wPgoKPC9kaXY+CjxkaXYgY2xhc3M9InRvcCI+PGEgaHJlZj0iI3BhZ2UtaGVhZGVyIj48aW1nIGFsdD0idG9wIiBzcmM9Ii4uL2ltYWdlcy91cC5naWYiIC8+PC9hPjwvZGl2Pgo8ZGl2IGNsYXNzPSJkaXJlY3RpdmUtc2VjdGlvbiI+PGgyPjxhIG5hbWU9IkZhbGxiYWNrUmVzb3VyY2UiIGlkPSJGYWxsYmFja1Jlc291cmNlIj5GYWxsYmFja1Jlc291cmNlPC9hPiA8YSBuYW1lPSJmYWxsYmFja3Jlc291cmNlIiBpZD0iZmFsbGJhY2tyZXNvdXJjZSI+RGlyZWN0aXZlPC9hPjwvaDI+Cjx0YWJsZSBjbGFzcz0iZGlyZWN0aXZlIj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI0Rlc2NyaXB0aW9uIj5EZXNjcmlwdGlvbjo8L2E+PC90aD48dGQ+RGVmaW5lIGEgZGVmYXVsdCBVUkwgZm9yIHJlcXVlc3RzIHRoYXQgZG9uJ3QgbWFwIHRvIGEgZmlsZTwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCI+U3ludGF4OjwvYT48L3RoPjx0ZD48Y29kZT5GYWxsYmFja1Jlc291cmNlIGRpc2FibGVkIHwgPHZhcj5sb2NhbC11cmw8L3Zhcj48L2NvZGU+PC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCI+RGVmYXVsdDo8L2E+PC90aD48dGQ+PGNvZGU+ZGlzYWJsZWQgLSBodHRwZCB3aWxsIHJldHVybiA0MDQgKE5vdCBGb3VuZCk8L2NvZGU+PC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCI+Q29udGV4dDo8L2E+PC90aD48dGQ+c2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2VzczwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIj5PdmVycmlkZTo8L2E+PC90aD48dGQ+SW5kZXhlczwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyI+U3RhdHVzOjwvYT48L3RoPjx0ZD5CYXNlPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIj5Nb2R1bGU6PC9hPjwvdGg+PHRkPm1vZF9kaXI8L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5Ij5Db21wYXRpYmlsaXR5OjwvYT48L3RoPjx0ZD5UaGUgPGNvZGU+ZGlzYWJsZWQ8L2NvZGU+IGFyZ3VtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDIuNC40IGFuZApsYXRlcjwvdGQ+PC90cj4KPC90YWJsZT4KICAgIDxwPlVzZSB0aGlzIHRvIHNldCBhIGhhbmRsZXIgZm9yIGFueSBVUkwgdGhhdCBkb2Vzbid0IG1hcCB0byBhbnl0aGluZwogICAgaW4geW91ciBmaWxlc3lzdGVtLCBhbmQgd291bGQgb3RoZXJ3aXNlIHJldHVybiBIVFRQIDQwNCAoTm90IEZvdW5kKS4KICAgIEZvciBleGFtcGxlPC9wPgogICAgPHByZSBjbGFzcz0icHJldHR5cHJpbnQgbGFuZy1jb25maWciPkZhbGxiYWNrUmVzb3VyY2UgL25vdC00MDQucGhwPC9wcmU+CgogICAgPHA+d2lsbCBjYXVzZSByZXF1ZXN0cyBmb3Igbm9uLWV4aXN0ZW50IGZpbGVzIHRvIGJlIGhhbmRsZWQgYnkKICAgIDxjb2RlPm5vdC00MDQucGhwPC9jb2RlPiwgd2hpbGUgcmVxdWVzdHMgZm9yIGZpbGVzIHRoYXQgZXhpc3QKICAgIGFyZSB1bmFmZmVjdGVkLjwvcD4KICAgIDxwPkl0IGlzIGZyZXF1ZW50bHkgZGVzaXJhYmxlIHRvIGhhdmUgYSBzaW5nbGUgZmlsZSBvciByZXNvdXJjZQogICAgaGFuZGxlIGFsbCByZXF1ZXN0cyB0byBhIHBhcnRpY3VsYXIgZGlyZWN0b3J5LCBleGNlcHQgdGhvc2UgcmVxdWVzdHMKICAgIHRoYXQgY29ycmVzcG9uZCB0byBhbiBleGlzdGluZyBmaWxlIG9yIHNjcmlwdC4gVGhpcyBpcyBvZnRlbgogICAgcmVmZXJyZWQgdG8gYXMgYSAnZnJvbnQgY29udHJvbGxlci4nPC9wPgogICAgPHA+SW4gZWFybGllciB2ZXJzaW9ucyBvZiBodHRwZCwgdGhpcyBlZmZlY3QgdHlwaWNhbGx5IHJlcXVpcmVkCiAgICA8Y29kZSBjbGFzcz0ibW9kdWxlIj48YSBocmVmPSIuLi9tb2QvbW9kX3Jld3JpdGUuaHRtbCI+bW9kX3Jld3JpdGU8L2E+PC9jb2RlPiwgYW5kIHRoZSB1c2Ugb2YgdGhlIDxjb2RlPi1mPC9jb2RlPiBhbmQKICAgIDxjb2RlPi1kPC9jb2RlPiB0ZXN0cyBmb3IgZmlsZSBhbmQgZGlyZWN0b3J5IGV4aXN0ZW5jZS4gVGhpcyBub3cKICAgIHJlcXVpcmVzIG9ubHkgb25lIGxpbmUgb2YgY29uZmlndXJhdGlvbi48L3A+CiAgICA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCBsYW5nLWNvbmZpZyI+RmFsbGJhY2tSZXNvdXJjZSAvaW5kZXgucGhwPC9wcmU+CgogICAgPHA+RXhpc3RpbmcgZmlsZXMsIHN1Y2ggYXMgaW1hZ2VzLCBjc3MgZmlsZXMsIGFuZCBzbyBvbiwgd2lsbCBiZQogICAgc2VydmVkIG5vcm1hbGx5LjwvcD4KICAgIDxwPlVzZSB0aGUgPGNvZGU+ZGlzYWJsZWQ8L2NvZGU+IGFyZ3VtZW50IHRvIGRpc2FibGUgdGhhdCBmZWF0dXJlCiAgICBpZiBpbmhlcml0YW5jZSBmcm9tIGEgcGFyZW50IGRpcmVjdG9yeSBpcyBub3QgZGVzaXJlZC48L3A+CiAgICA8cD5JbiBhIHN1Yi1VUkksIHN1Y2ggYXMgPGVtPmh0dHA6Ly9leGFtcGxlLmNvbS9ibG9nLzwvZW0+IHRoaXMKICAgIDxlbT5zdWItVVJJPC9lbT4gaGFzIHRvIGJlIHN1cHBsaWVkIGFzIDx2YXI+bG9jYWwtdXJsPC92YXI+OjwvcD4KICAgIDxwcmUgY2xhc3M9InByZXR0eXByaW50IGxhbmctY29uZmlnIj4mbHQ7RGlyZWN0b3J5ICIvd2ViL2V4YW1wbGUuY29tL2h0ZG9jcy9ibG9nIiZndDsKICAgIEZhbGxiYWNrUmVzb3VyY2UgL2Jsb2cvaW5kZXgucGhwCiZsdDsvRGlyZWN0b3J5Jmd0OwombHQ7RGlyZWN0b3J5ICIvd2ViL2V4YW1wbGUuY29tL2h0ZG9jcy9ibG9nL2ltYWdlcyImZ3Q7CiAgICBGYWxsYmFja1Jlc291cmNlIGRpc2FibGVkCiZsdDsvRGlyZWN0b3J5Jmd0OzwvcHJlPgoKCjwvZGl2Pgo8L2Rpdj4KPGRpdiBjbGFzcz0iYm90dG9tbGFuZyI+CjxwPjxzcGFuPkF2YWlsYWJsZSBMYW5ndWFnZXM6IDwvc3Bhbj48YSBocmVmPSIuLi9lbi9tb2QvbW9kX2Rpci5odG1sIiB0aXRsZT0iRW5nbGlzaCI+Jm5ic3A7ZW4mbmJzcDs8L2E+IHwKPGEgaHJlZj0iLi4vZnIvbW9kL21vZF9kaXIuaHRtbCIgaHJlZmxhbmc9ImZyIiByZWw9ImFsdGVybmF0ZSIgdGl0bGU9IkZyYW7nYWlzIj4mbmJzcDtmciZuYnNwOzwvYT4gfAo8YSBocmVmPSIuLi9qYS9tb2QvbW9kX2Rpci5odG1sIiBocmVmbGFuZz0iamEiIHJlbD0iYWx0ZXJuYXRlIiB0aXRsZT0iSmFwYW5lc2UiPiZuYnNwO2phJm5ic3A7PC9hPiB8CjxhIGhyZWY9Ii4uL2tvL21vZC9tb2RfZGlyLmh0bWwiIGhyZWZsYW5nPSJrbyIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJLb3JlYW4iPiZuYnNwO2tvJm5ic3A7PC9hPiB8CjxhIGhyZWY9Ii4uL3RyL21vZC9tb2RfZGlyLmh0bWwiIGhyZWZsYW5nPSJ0ciIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJU/HJr52UiPiZuYnNwO3RyJm5ic3A7PC9hPjwvcD4KPC9kaXY+PGRpdiBjbGFzcz0idG9wIj48YSBocmVmPSIjcGFnZS1oZWFkZXIiPjxpbWcgc3JjPSIuLi9pbWFnZXMvdXAuZ2lmIiBhbHQ9InRvcCIgLz48L2E+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdGlvbiI+PGgyPjxhIGlkPSJjb21tZW50c19zZWN0aW9uIiBuYW1lPSJjb21tZW50c19zZWN0aW9uIj5Db21tZW50czwvYT48L2gyPjxkaXYgY2xhc3M9Indhcm5pbmciPjxzdHJvbmc+Tm90aWNlOjwvc3Ryb25nPjxiciAvPlRoaXMgaXMgbm90IGEgUSZhbXA7QSBzZWN0aW9uLiBDb21tZW50cyBwbGFjZWQgaGVyZSBzaG91bGQgYmUgcG9pbnRlZCB0b3dhcmRzIHN1Z2dlc3Rpb25zIG9uIGltcHJvdmluZyB0aGUgZG9jdW1lbnRhdGlvbiBvciBzZXJ2ZXIsIGFuZCBtYXkgYmUgcmVtb3ZlZCBhZ2FpbiBieSBvdXIgbW9kZXJhdG9ycyBpZiB0aGV5IGFyZSBlaXRoZXIgaW1wbGVtZW50ZWQgb3IgY29uc2lkZXJlZCBpbnZhbGlkL29mZi10b3BpYy4gUXVlc3Rpb25zIG9uIGhvdyB0byBtYW5hZ2UgdGhlIEFwYWNoZSBIVFRQIFNlcnZlciBzaG91bGQgYmUgZGlyZWN0ZWQgYXQgZWl0aGVyIG91ciBJUkMgY2hhbm5lbCwgI2h0dHBkLCBvbiBGcmVlbm9kZSwgb3Igc2VudCB0byBvdXIgPGEgaHJlZj0iaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvbGlzdHMuaHRtbCI+bWFpbGluZyBsaXN0czwvYT4uPC9kaXY+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tLy8tLT48IVtDREFUQVsvLz48IS0tCnZhciBjb21tZW50c19zaG9ydG5hbWUgPSAnaHR0cGQnOwp2YXIgY29tbWVudHNfaWRlbnRpZmllciA9ICdodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy9kb2NzLzIuNC9tb2QvbW9kX2Rpci5odG1sJzsKKGZ1bmN0aW9uKHcsIGQpIHsKICAgIGlmICh3LmxvY2F0aW9uLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCkgPT0gImh0dHBkLmFwYWNoZS5vcmciKSB7CiAgICAgICAgZC53cml0ZSgnPGRpdiBpZD0iY29tbWVudHNfdGhyZWFkIj48XC9kaXY+Jyk7CiAgICAgICAgdmFyIHMgPSBkLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICAgIHMudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnOwogICAgICAgIHMuYXN5bmMgPSB0cnVlOwogICAgICAgIHMuc3JjID0gJ2h0dHBzOi8vY29tbWVudHMuYXBhY2hlLm9yZy9zaG93X2NvbW1lbnRzLmx1YT9zaXRlPScgKyBjb21tZW50c19zaG9ydG5hbWUgKyAnJnBhZ2U9JyArIGNvbW1lbnRzX2lkZW50aWZpZXI7CiAgICAgICAgKGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXSB8fCBkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF0pLmFwcGVuZENoaWxkKHMpOwogICAgfQogICAgZWxzZSB7IAogICAgICAgIGQud3JpdGUoJzxkaXYgaWQ9ImNvbW1lbnRzX3RocmVhZCI+Q29tbWVudHMgYXJlIGRpc2FibGVkIGZvciB0aGlzIHBhZ2UgYXQgdGhlIG1vbWVudC48XC9kaXY+Jyk7CiAgICB9Cn0pKHdpbmRvdywgZG9jdW1lbnQpOwovLy0tPjwhXV0+PC9zY3JpcHQ+PC9kaXY+PGRpdiBpZD0iZm9vdGVyIj4KPHAgY2xhc3M9ImFwYWNoZSI+Q29weXJpZ2h0IDIwMTYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLjxiciAvPkxpY2Vuc2VkIHVuZGVyIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPkFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvYT4uPC9wPgo8cCBjbGFzcz0ibWVudSI+PGEgaHJlZj0iLi4vbW9kLyI+TW9kdWxlczwvYT4gfCA8YSBocmVmPSIuLi9tb2QvZGlyZWN0aXZlcy5odG1sIj5EaXJlY3RpdmVzPC9hPiB8IDxhIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvaHR0cGQvRkFRIj5GQVE8L2E+IHwgPGEgaHJlZj0iLi4vZ2xvc3NhcnkuaHRtbCI+R2xvc3Nhcnk8L2E+IHwgPGEgaHJlZj0iLi4vc2l0ZW1hcC5odG1sIj5TaXRlbWFwPC9hPjwvcD48L2Rpdj48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+PCEtLS8vLS0+PCFbQ0RBVEFbLy8+PCEtLQppZiAodHlwZW9mKHByZXR0eVByaW50KSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgIHByZXR0eVByaW50KCk7Cn0KLy8tLT48IV1dPjwvc2NyaXB0Pgo8L2JvZHk+PC9odG1sPg==