PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pgo8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+CjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj48aGVhZD4KPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KPCEtLQogICAgICAgIFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYCiAgICAgICAgICAgICAgVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIHhtbCBzb3VyY2U6IERPIE5PVCBFRElUCiAgICAgICAgWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgKICAgICAgLS0+Cjx0aXRsZT5Db250ZW50IE5lZ290aWF0aW9uIC0gQXBhY2hlIEhUVFAgU2VydmVyIFZlcnNpb24gMi41PC90aXRsZT4KPGxpbmsgaHJlZj0iLi9zdHlsZS9jc3MvbWFudWFsLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyIgdGl0bGU9Ik1haW4gc3R5bGVzaGVldCIgLz4KPGxpbmsgaHJlZj0iLi9zdHlsZS9jc3MvbWFudWFsLWxvb3NlLTEwMHBjLmNzcyIgcmVsPSJhbHRlcm5hdGUgc3R5bGVzaGVldCIgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiIHRpdGxlPSJObyBTaWRlYmFyIC0gRGVmYXVsdCBmb250IHNpemUiIC8+CjxsaW5rIGhyZWY9Ii4vc3R5bGUvY3NzL21hbnVhbC1wcmludC5jc3MiIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9InByaW50IiB0eXBlPSJ0ZXh0L2NzcyIgLz48bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL3N0eWxlL2Nzcy9wcmV0dGlmeS5jc3MiIC8+CjxzY3JpcHQgc3JjPSIuL3N0eWxlL3NjcmlwdHMvcHJldHRpZnkubWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8L3NjcmlwdD4KCjxsaW5rIGhyZWY9Ii4vaW1hZ2VzL2Zhdmljb24uaWNvIiByZWw9InNob3J0Y3V0IGljb24iIC8+PC9oZWFkPgo8Ym9keSBpZD0ibWFudWFsLXBhZ2UiPjxkaXYgaWQ9InBhZ2UtaGVhZGVyIj4KPHAgY2xhc3M9Im1lbnUiPjxhIGhyZWY9Ii4vbW9kLyI+TW9kdWxlczwvYT4gfCA8YSBocmVmPSIuL21vZC9xdWlja3JlZmVyZW5jZS5odG1sIj5EaXJlY3RpdmVzPC9hPiB8IDxhIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvaHR0cGQvRkFRIj5GQVE8L2E+IHwgPGEgaHJlZj0iLi9nbG9zc2FyeS5odG1sIj5HbG9zc2FyeTwvYT4gfCA8YSBocmVmPSIuL3NpdGVtYXAuaHRtbCI+U2l0ZW1hcDwvYT48L3A+CjxwIGNsYXNzPSJhcGFjaGUiPkFwYWNoZSBIVFRQIFNlcnZlciBWZXJzaW9uIDIuNTwvcD4KPGltZyBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9mZWF0aGVyLnBuZyIgLz48L2Rpdj4KPGRpdiBjbGFzcz0idXAiPjxhIGhyZWY9Ii4vIj48aW1nIHRpdGxlPSImbHQ7LSIgYWx0PSImbHQ7LSIgc3JjPSIuL2ltYWdlcy9sZWZ0LmdpZiIgLz48L2E+PC9kaXY+CjxkaXYgaWQ9InBhdGgiPgo8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIj5BcGFjaGU8L2E+ICZndDsgPGEgaHJlZj0iaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvIj5IVFRQIFNlcnZlcjwvYT4gJmd0OyA8YSBocmVmPSJodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy9kb2NzLyI+RG9jdW1lbnRhdGlvbjwvYT4gJmd0OyA8YSBocmVmPSIuLyI+VmVyc2lvbiAyLjU8L2E+PC9kaXY+PGRpdiBpZD0icGFnZS1jb250ZW50Ij48ZGl2IGlkPSJwcmVhbWJsZSI+PGgxPkNvbnRlbnQgTmVnb3RpYXRpb248L2gxPgo8ZGl2IGNsYXNzPSJ0b3BsYW5nIj4KPHA+PHNwYW4+QXZhaWxhYmxlIExhbmd1YWdlczogPC9zcGFuPjxhIGhyZWY9Ii4vZW4vY29udGVudC1uZWdvdGlhdGlvbi5odG1sIiB0aXRsZT0iRW5nbGlzaCI+Jm5ic3A7ZW4mbmJzcDs8L2E+IHwKPGEgaHJlZj0iLi9mci9jb250ZW50LW5lZ290aWF0aW9uLmh0bWwiIGhyZWZsYW5nPSJmciIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJGcmFu52FpcyI+Jm5ic3A7ZnImbmJzcDs8L2E+IHwKPGEgaHJlZj0iLi9qYS9jb250ZW50LW5lZ290aWF0aW9uLmh0bWwiIGhyZWZsYW5nPSJqYSIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJKYXBhbmVzZSI+Jm5ic3A7amEmbmJzcDs8L2E+IHwKPGEgaHJlZj0iLi9rby9jb250ZW50LW5lZ290aWF0aW9uLmh0bWwiIGhyZWZsYW5nPSJrbyIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJLb3JlYW4iPiZuYnNwO2tvJm5ic3A7PC9hPiB8CjxhIGhyZWY9Ii4vdHIvY29udGVudC1uZWdvdGlhdGlvbi5odG1sIiBocmVmbGFuZz0idHIiIHJlbD0iYWx0ZXJuYXRlIiB0aXRsZT0iVPxya+dlIj4mbmJzcDt0ciZuYnNwOzwvYT48L3A+CjwvZGl2PgoKCiAgICA8cD5BcGFjaGUgSFRUUEQgc3VwcG9ydHMgY29udGVudCBuZWdvdGlhdGlvbiBhcyBkZXNjcmliZWQgaW4KICAgIHRoZSBIVFRQLzEuMSBzcGVjaWZpY2F0aW9uLiBJdCBjYW4gY2hvb3NlIHRoZSBiZXN0CiAgICByZXByZXNlbnRhdGlvbiBvZiBhIHJlc291cmNlIGJhc2VkIG9uIHRoZSBicm93c2VyLXN1cHBsaWVkCiAgICBwcmVmZXJlbmNlcyBmb3IgbWVkaWEgdHlwZSwgbGFuZ3VhZ2VzLCBjaGFyYWN0ZXIgc2V0IGFuZAogICAgZW5jb2RpbmcuIEl0IGFsc28gaW1wbGVtZW50cyBhIGNvdXBsZSBvZiBmZWF0dXJlcyB0byBnaXZlCiAgICBtb3JlIGludGVsbGlnZW50IGhhbmRsaW5nIG9mIHJlcXVlc3RzIGZyb20gYnJvd3NlcnMgdGhhdCBzZW5kCiAgICBpbmNvbXBsZXRlIG5lZ290aWF0aW9uIGluZm9ybWF0aW9uLjwvcD4KCiAgICA8cD5Db250ZW50IG5lZ290aWF0aW9uIGlzIHByb3ZpZGVkIGJ5IHRoZQogICAgPGNvZGUgY2xhc3M9Im1vZHVsZSI+PGEgaHJlZj0iLi9tb2QvbW9kX25lZ290aWF0aW9uLmh0bWwiPm1vZF9uZWdvdGlhdGlvbjwvYT48L2NvZGU+IG1vZHVsZSwgd2hpY2ggaXMgY29tcGlsZWQgaW4KICAgIGJ5IGRlZmF1bHQuPC9wPgo8L2Rpdj4KPGRpdiBpZD0icXVpY2t2aWV3Ij48dWwgaWQ9InRvYyI+PGxpPjxpbWcgYWx0PSIiIHNyYz0iLi9pbWFnZXMvZG93bi5naWYiIC8+IDxhIGhyZWY9IiNhYm91dCI+QWJvdXQgQ29udGVudCBOZWdvdGlhdGlvbjwvYT48L2xpPgo8bGk+PGltZyBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9kb3duLmdpZiIgLz4gPGEgaHJlZj0iI25lZ290aWF0aW9uIj5OZWdvdGlhdGlvbiBpbiBodHRwZDwvYT48L2xpPgo8bGk+PGltZyBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9kb3duLmdpZiIgLz4gPGEgaHJlZj0iI21ldGhvZHMiPlRoZSBOZWdvdGlhdGlvbiBNZXRob2RzPC9hPjwvbGk+CjxsaT48aW1nIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL2Rvd24uZ2lmIiAvPiA8YSBocmVmPSIjYmV0dGVyIj5GaWRkbGluZyB3aXRoIFF1YWxpdHkKICAgIFZhbHVlczwvYT48L2xpPgo8bGk+PGltZyBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9kb3duLmdpZiIgLz4gPGEgaHJlZj0iI2V4dGVuc2lvbnMiPkV4dGVuc2lvbnMgdG8gVHJhbnNwYXJlbnQgQ29udGVudApOZWdvdGlhdGlvbjwvYT48L2xpPgo8bGk+PGltZyBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9kb3duLmdpZiIgLz4gPGEgaHJlZj0iI25hbWluZyI+Tm90ZSBvbiBoeXBlcmxpbmtzIGFuZCBuYW1pbmcgY29udmVudGlvbnM8L2E+PC9saT4KPGxpPjxpbWcgYWx0PSIiIHNyYz0iLi9pbWFnZXMvZG93bi5naWYiIC8+IDxhIGhyZWY9IiNjYWNoaW5nIj5Ob3RlIG9uIENhY2hpbmc8L2E+PC9saT4KPC91bD48aDM+U2VlIGFsc288L2gzPjx1bCBjbGFzcz0ic2VlYWxzbyI+PGxpPjxhIGhyZWY9IiNjb21tZW50c19zZWN0aW9uIj5Db21tZW50czwvYT48L2xpPjwvdWw+PC9kaXY+CjxkaXYgY2xhc3M9InRvcCI+PGEgaHJlZj0iI3BhZ2UtaGVhZGVyIj48aW1nIGFsdD0idG9wIiBzcmM9Ii4vaW1hZ2VzL3VwLmdpZiIgLz48L2E+PC9kaXY+CjxkaXYgY2xhc3M9InNlY3Rpb24iPgo8aDI+PGEgbmFtZT0iYWJvdXQiIGlkPSJhYm91dCI+QWJvdXQgQ29udGVudCBOZWdvdGlhdGlvbjwvYT4gPGEgdGl0bGU9IlBlcm1hbmVudCBsaW5rIiBocmVmPSIjYWJvdXQiIGNsYXNzPSJwZXJtYWxpbmsiPiZwYXJhOzwvYT48L2gyPgoKICAgIDxwPkEgcmVzb3VyY2UgbWF5IGJlIGF2YWlsYWJsZSBpbiBzZXZlcmFsIGRpZmZlcmVudAogICAgcmVwcmVzZW50YXRpb25zLiBGb3IgZXhhbXBsZSwgaXQgbWlnaHQgYmUgYXZhaWxhYmxlIGluCiAgICBkaWZmZXJlbnQgbGFuZ3VhZ2VzIG9yIGRpZmZlcmVudCBtZWRpYSB0eXBlcywgb3IgYSBjb21iaW5hdGlvbi4KICAgIE9uZSB3YXkgb2Ygc2VsZWN0aW5nIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGNob2ljZSBpcyB0byBnaXZlIHRoZQogICAgdXNlciBhbiBpbmRleCBwYWdlLCBhbmQgbGV0IHRoZW0gc2VsZWN0LiBIb3dldmVyIGl0IGlzIG9mdGVuCiAgICBwb3NzaWJsZSBmb3IgdGhlIHNlcnZlciB0byBjaG9vc2UgYXV0b21hdGljYWxseS4gVGhpcyB3b3JrcwogICAgYmVjYXVzZSBicm93c2VycyBjYW4gc2VuZCwgYXMgcGFydCBvZiBlYWNoIHJlcXVlc3QsIGluZm9ybWF0aW9uCiAgICBhYm91dCB3aGF0IHJlcHJlc2VudGF0aW9ucyB0aGV5IHByZWZlci4gRm9yIGV4YW1wbGUsIGEgYnJvd3NlcgogICAgY291bGQgaW5kaWNhdGUgdGhhdCBpdCB3b3VsZCBsaWtlIHRvIHNlZSBpbmZvcm1hdGlvbiBpbiBGcmVuY2gsCiAgICBpZiBwb3NzaWJsZSwgZWxzZSBFbmdsaXNoIHdpbGwgZG8uIEJyb3dzZXJzIGluZGljYXRlIHRoZWlyCiAgICBwcmVmZXJlbmNlcyBieSBoZWFkZXJzIGluIHRoZSByZXF1ZXN0LiBUbyByZXF1ZXN0IG9ubHkgRnJlbmNoCiAgICByZXByZXNlbnRhdGlvbnMsIHRoZSBicm93c2VyIHdvdWxkIHNlbmQ8L3A+Cgo8ZGl2IGNsYXNzPSJleGFtcGxlIj48cD48Y29kZT5BY2NlcHQtTGFuZ3VhZ2U6IGZyPC9jb2RlPjwvcD48L2Rpdj4KCiAgICA8cD5Ob3RlIHRoYXQgdGhpcyBwcmVmZXJlbmNlIHdpbGwgb25seSBiZSBhcHBsaWVkIHdoZW4gdGhlcmUgaXMKICAgIGEgY2hvaWNlIG9mIHJlcHJlc2VudGF0aW9ucyBhbmQgdGhleSB2YXJ5IGJ5IGxhbmd1YWdlLjwvcD4KCiAgICA8cD5BcyBhbiBleGFtcGxlIG9mIGEgbW9yZSBjb21wbGV4IHJlcXVlc3QsIHRoaXMgYnJvd3NlciBoYXMKICAgIGJlZW4gY29uZmlndXJlZCB0byBhY2NlcHQgRnJlbmNoIGFuZCBFbmdsaXNoLCBidXQgcHJlZmVyCiAgICBGcmVuY2gsIGFuZCB0byBhY2NlcHQgdmFyaW91cyBtZWRpYSB0eXBlcywgcHJlZmVycmluZyBIVE1MIG92ZXIKICAgIHBsYWluIHRleHQgb3Igb3RoZXIgdGV4dCB0eXBlcywgYW5kIHByZWZlcnJpbmcgR0lGIG9yIEpQRUcgb3ZlcgogICAgb3RoZXIgbWVkaWEgdHlwZXMsIGJ1dCBhbHNvIGFsbG93aW5nIGFueSBvdGhlciBtZWRpYSB0eXBlIGFzIGEKICAgIGxhc3QgcmVzb3J0OjwvcD4KCjxkaXYgY2xhc3M9ImV4YW1wbGUiPjxwPjxjb2RlPgogIEFjY2VwdC1MYW5ndWFnZTogZnI7IHE9MS4wLCBlbjsgcT0wLjU8YnIgLz4KICBBY2NlcHQ6IHRleHQvaHRtbDsgcT0xLjAsIHRleHQvKjsgcT0wLjgsIGltYWdlL2dpZjsgcT0wLjYsIGltYWdlL2pwZWc7IHE9MC42LCBpbWFnZS8qOyBxPTAuNSwgKi8qOyBxPTAuMQo8L2NvZGU+PC9wPjwvZGl2PgoKICAgIDxwPmh0dHBkIHN1cHBvcnRzICdzZXJ2ZXIgZHJpdmVuJyBjb250ZW50IG5lZ290aWF0aW9uLCBhcwogICAgZGVmaW5lZCBpbiB0aGUgSFRUUC8xLjEgc3BlY2lmaWNhdGlvbi4gSXQgZnVsbHkgc3VwcG9ydHMgdGhlCiAgICA8Y29kZT5BY2NlcHQ8L2NvZGU+LCA8Y29kZT5BY2NlcHQtTGFuZ3VhZ2U8L2NvZGU+LAogICAgPGNvZGU+QWNjZXB0LUNoYXJzZXQ8L2NvZGU+IGFuZCA8Y29kZT5BY2NlcHQtRW5jb2Rpbmc8L2NvZGU+CiAgICByZXF1ZXN0IGhlYWRlcnMuIGh0dHBkIGFsc28gc3VwcG9ydHMgJ3RyYW5zcGFyZW50JwogICAgY29udGVudCBuZWdvdGlhdGlvbiwgd2hpY2ggaXMgYW4gZXhwZXJpbWVudGFsIG5lZ290aWF0aW9uCiAgICBwcm90b2NvbCBkZWZpbmVkIGluIFJGQyAyMjk1IGFuZCBSRkMgMjI5Ni4gSXQgZG9lcyBub3Qgb2ZmZXIKICAgIHN1cHBvcnQgZm9yICdmZWF0dXJlIG5lZ290aWF0aW9uJyBhcyBkZWZpbmVkIGluIHRoZXNlIFJGQ3MuPC9wPgoKICAgIDxwPkEgPHN0cm9uZz5yZXNvdXJjZTwvc3Ryb25nPiBpcyBhIGNvbmNlcHR1YWwgZW50aXR5CiAgICBpZGVudGlmaWVkIGJ5IGEgVVJJIChSRkMgMjM5NikuIEFuIEhUVFAgc2VydmVyIGxpa2UgQXBhY2hlIEhUVFAgU2VydmVyCiAgICBwcm92aWRlcyBhY2Nlc3MgdG8gPHN0cm9uZz5yZXByZXNlbnRhdGlvbnM8L3N0cm9uZz4gb2YgdGhlCiAgICByZXNvdXJjZShzKSB3aXRoaW4gaXRzIG5hbWVzcGFjZSwgd2l0aCBlYWNoIHJlcHJlc2VudGF0aW9uIGluCiAgICB0aGUgZm9ybSBvZiBhIHNlcXVlbmNlIG9mIGJ5dGVzIHdpdGggYSBkZWZpbmVkIG1lZGlhIHR5cGUsCiAgICBjaGFyYWN0ZXIgc2V0LCBlbmNvZGluZywgZXRjLiBFYWNoIHJlc291cmNlIG1heSBiZSBhc3NvY2lhdGVkCiAgICB3aXRoIHplcm8sIG9uZSwgb3IgbW9yZSB0aGFuIG9uZSByZXByZXNlbnRhdGlvbiBhdCBhbnkgZ2l2ZW4KICAgIHRpbWUuIElmIG11bHRpcGxlIHJlcHJlc2VudGF0aW9ucyBhcmUgYXZhaWxhYmxlLCB0aGUgcmVzb3VyY2UKICAgIGlzIHJlZmVycmVkIHRvIGFzIDxzdHJvbmc+bmVnb3RpYWJsZTwvc3Ryb25nPiBhbmQgZWFjaCBvZiBpdHMKICAgIHJlcHJlc2VudGF0aW9ucyBpcyB0ZXJtZWQgYSA8c3Ryb25nPnZhcmlhbnQ8L3N0cm9uZz4uIFRoZSB3YXlzCiAgICBpbiB3aGljaCB0aGUgdmFyaWFudHMgZm9yIGEgbmVnb3RpYWJsZSByZXNvdXJjZSB2YXJ5IGFyZSBjYWxsZWQKICAgIHRoZSA8c3Ryb25nPmRpbWVuc2lvbnM8L3N0cm9uZz4gb2YgbmVnb3RpYXRpb24uPC9wPgo8L2Rpdj48ZGl2IGNsYXNzPSJ0b3AiPjxhIGhyZWY9IiNwYWdlLWhlYWRlciI+PGltZyBhbHQ9InRvcCIgc3JjPSIuL2ltYWdlcy91cC5naWYiIC8+PC9hPjwvZGl2Pgo8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KPGgyPjxhIG5hbWU9Im5lZ290aWF0aW9uIiBpZD0ibmVnb3RpYXRpb24iPk5lZ290aWF0aW9uIGluIGh0dHBkPC9hPiA8YSB0aXRsZT0iUGVybWFuZW50IGxpbmsiIGhyZWY9IiNuZWdvdGlhdGlvbiIgY2xhc3M9InBlcm1hbGluayI+JnBhcmE7PC9hPjwvaDI+CgogICAgPHA+SW4gb3JkZXIgdG8gbmVnb3RpYXRlIGEgcmVzb3VyY2UsIHRoZSBzZXJ2ZXIgbmVlZHMgdG8gYmUKICAgIGdpdmVuIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggb2YgdGhlIHZhcmlhbnRzLiBUaGlzIGlzIGRvbmUgaW4KICAgIG9uZSBvZiB0d28gd2F5czo8L3A+CgogICAgPHVsPgogICAgICA8bGk+VXNpbmcgYSB0eXBlIG1hcCAoPGVtPmkuZS48L2VtPiwgYSA8Y29kZT4qLnZhcjwvY29kZT4KICAgICAgZmlsZSkgd2hpY2ggbmFtZXMgdGhlIGZpbGVzIGNvbnRhaW5pbmcgdGhlIHZhcmlhbnRzCiAgICAgIGV4cGxpY2l0bHksIG9yPC9saT4KCiAgICAgIDxsaT5Vc2luZyBhICdNdWx0aVZpZXdzJyBzZWFyY2gsIHdoZXJlIHRoZSBzZXJ2ZXIgZG9lcyBhbgogICAgICBpbXBsaWNpdCBmaWxlbmFtZSBwYXR0ZXJuIG1hdGNoIGFuZCBjaG9vc2VzIGZyb20gYW1vbmcgdGhlCiAgICAgIHJlc3VsdHMuPC9saT4KICAgIDwvdWw+CgogICA8aDM+PGEgbmFtZT0idHlwZS1tYXAiIGlkPSJ0eXBlLW1hcCI+VXNpbmcgYSB0eXBlLW1hcCBmaWxlPC9hPjwvaDM+CgogICAgPHA+QSB0eXBlIG1hcCBpcyBhIGRvY3VtZW50IHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFuZGxlcgogICAgbmFtZWQgPGNvZGU+dHlwZS1tYXA8L2NvZGU+IChvciwgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHdpdGgKICAgIG9sZGVyIGh0dHBkIGNvbmZpZ3VyYXRpb25zLCB0aGUgPGEgY2xhc3M9Imdsb3NzYXJ5bGluayIgaHJlZj0iLi9nbG9zc2FyeS5odG1sI21pbWUtdHlwZSIgdGl0bGU9InNlZSBnbG9zc2FyeSI+TUlNRS10eXBlPC9hPgogICAgPGNvZGU+YXBwbGljYXRpb24veC10eXBlLW1hcDwvY29kZT4pLiBOb3RlIHRoYXQgdG8gdXNlIHRoaXMKICAgIGZlYXR1cmUsIHlvdSBtdXN0IGhhdmUgYSBoYW5kbGVyIHNldCBpbiB0aGUgY29uZmlndXJhdGlvbiB0aGF0CiAgICBkZWZpbmVzIGEgZmlsZSBzdWZmaXggYXMgPGNvZGU+dHlwZS1tYXA8L2NvZGU+OyB0aGlzIGlzIGJlc3QgZG9uZQogICAgd2l0aDwvcD4KCiAgICA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCBsYW5nLWNvbmZpZyI+QWRkSGFuZGxlciB0eXBlLW1hcCAudmFyPC9wcmU+CgoKICAgIDxwPmluIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlLjwvcD4KCiAgICA8cD5UeXBlIG1hcCBmaWxlcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIHRoZSByZXNvdXJjZQogICAgd2hpY2ggdGhleSBhcmUgZGVzY3JpYmluZywgZm9sbG93ZWQgYnkgdGhlIGV4dGVuc2lvbgogICAgPGNvZGU+LnZhcjwvY29kZT4uIEluIHRoZSBleGFtcGxlcyBzaG93biBiZWxvdywgdGhlIHJlc291cmNlIGlzCiAgICBuYW1lZCA8Y29kZT5mb288L2NvZGU+LCBzbyB0aGUgdHlwZSBtYXAgZmlsZSBpcyBuYW1lZAogICAgPGNvZGU+Zm9vLnZhcjwvY29kZT4uPC9wPgoKICAgIDxwPlRoaXMgZmlsZSBzaG91bGQgaGF2ZSBhbiBlbnRyeSBmb3IgZWFjaCBhdmFpbGFibGUKICAgIHZhcmlhbnQ7IHRoZXNlIGVudHJpZXMgY29uc2lzdCBvZiBjb250aWd1b3VzIEhUVFAtZm9ybWF0IGhlYWRlcgogICAgbGluZXMuIEVudHJpZXMgZm9yIGRpZmZlcmVudCB2YXJpYW50cyBhcmUgc2VwYXJhdGVkIGJ5IGJsYW5rCiAgICBsaW5lcy4gQmxhbmsgbGluZXMgYXJlIGlsbGVnYWwgd2l0aGluIGFuIGVudHJ5LiBJdCBpcwogICAgY29udmVudGlvbmFsIHRvIGJlZ2luIGEgbWFwIGZpbGUgd2l0aCBhbiBlbnRyeSBmb3IgdGhlIGNvbWJpbmVkCiAgICBlbnRpdHkgYXMgYSB3aG9sZSAoYWx0aG91Z2ggdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpZgogICAgcHJlc2VudCB3aWxsIGJlIGlnbm9yZWQpLiBBbiBleGFtcGxlIG1hcCBmaWxlIGlzIHNob3duIGJlbG93LjwvcD4KCiAgICA8cD5VUklzIGluIHRoaXMgZmlsZSBhcmUgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSB0eXBlIG1hcAogICAgZmlsZS4gVXN1YWxseSwgdGhlc2UgZmlsZXMgd2lsbCBiZSBsb2NhdGVkIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcwogICAgdGhlIHR5cGUgbWFwIGZpbGUsIGJ1dCB0aGlzIGlzIG5vdCByZXF1aXJlZC4gWW91IG1heSBwcm92aWRlCiAgICBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUklzIGZvciBhbnkgZmlsZSBsb2NhdGVkIG9uIHRoZSBzYW1lIHNlcnZlciBhcwogICAgdGhlIG1hcCBmaWxlLjwvcD4KCjxkaXYgY2xhc3M9ImV4YW1wbGUiPjxwPjxjb2RlPgogIFVSSTogZm9vPGJyIC8+CjxiciAvPgogIFVSSTogZm9vLmVuLmh0bWw8YnIgLz4KICBDb250ZW50LXR5cGU6IHRleHQvaHRtbDxiciAvPgogIENvbnRlbnQtbGFuZ3VhZ2U6IGVuPGJyIC8+CjxiciAvPgogIFVSSTogZm9vLmZyLmRlLmh0bWw8YnIgLz4KICBDb250ZW50LXR5cGU6IHRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTI8YnIgLz4KICBDb250ZW50LWxhbmd1YWdlOiBmciwgZGU8YnIgLz4KPC9jb2RlPjwvcD48L2Rpdj4KCiAgICA8cD5Ob3RlIGFsc28gdGhhdCBhIHR5cGVtYXAgZmlsZSB3aWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZQogICAgZmlsZW5hbWUncyBleHRlbnNpb24sIGV2ZW4gd2hlbiBNdWx0aXZpZXdzIGlzIG9uLiBJZiB0aGUKICAgIHZhcmlhbnRzIGhhdmUgZGlmZmVyZW50IHNvdXJjZSBxdWFsaXRpZXMsIHRoYXQgbWF5IGJlIGluZGljYXRlZAogICAgYnkgdGhlICJxcyIgcGFyYW1ldGVyIHRvIHRoZSBtZWRpYSB0eXBlLCBhcyBpbiB0aGlzIHBpY3R1cmUKICAgIChhdmFpbGFibGUgYXMgSlBFRywgR0lGLCBvciBBU0NJSS1hcnQpOiA8L3A+Cgo8ZGl2IGNsYXNzPSJleGFtcGxlIj48cD48Y29kZT4KICBVUkk6IGZvbzxiciAvPgo8YnIgLz4KICBVUkk6IGZvby5qcGVnPGJyIC8+CiAgQ29udGVudC10eXBlOiBpbWFnZS9qcGVnOyBxcz0wLjg8YnIgLz4KPGJyIC8+CiAgVVJJOiBmb28uZ2lmPGJyIC8+CiAgQ29udGVudC10eXBlOiBpbWFnZS9naWY7IHFzPTAuNTxiciAvPgo8YnIgLz4KICBVUkk6IGZvby50eHQ8YnIgLz4KICBDb250ZW50LXR5cGU6IHRleHQvcGxhaW47IHFzPTAuMDE8YnIgLz4KPC9jb2RlPjwvcD48L2Rpdj4KCiAgICA8cD5xcyB2YWx1ZXMgY2FuIHZhcnkgaW4gdGhlIHJhbmdlIDAuMDAwIHRvIDEuMDAwLiBOb3RlIHRoYXQKICAgIGFueSB2YXJpYW50IHdpdGggYSBxcyB2YWx1ZSBvZiAwLjAwMCB3aWxsIG5ldmVyIGJlIGNob3Nlbi4KICAgIFZhcmlhbnRzIHdpdGggbm8gJ3FzJyBwYXJhbWV0ZXIgdmFsdWUgYXJlIGdpdmVuIGEgcXMgZmFjdG9yIG9mCiAgICAxLjAuIFRoZSBxcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSByZWxhdGl2ZSAncXVhbGl0eScgb2YgdGhpcwogICAgdmFyaWFudCBjb21wYXJlZCB0byB0aGUgb3RoZXIgYXZhaWxhYmxlIHZhcmlhbnRzLCBpbmRlcGVuZGVudAogICAgb2YgdGhlIGNsaWVudCdzIGNhcGFiaWxpdGllcy4gRm9yIGV4YW1wbGUsIGEgSlBFRyBmaWxlIGlzCiAgICB1c3VhbGx5IG9mIGhpZ2hlciBzb3VyY2UgcXVhbGl0eSB0aGFuIGFuIEFTQ0lJIGZpbGUgaWYgaXQgaXMKICAgIGF0dGVtcHRpbmcgdG8gcmVwcmVzZW50IGEgcGhvdG9ncmFwaC4gSG93ZXZlciwgaWYgdGhlIHJlc291cmNlCiAgICBiZWluZyByZXByZXNlbnRlZCBpcyBhbiBvcmlnaW5hbCBBU0NJSSBhcnQsIHRoZW4gYW4gQVNDSUkKICAgIHJlcHJlc2VudGF0aW9uIHdvdWxkIGhhdmUgYSBoaWdoZXIgc291cmNlIHF1YWxpdHkgdGhhbiBhIEpQRUcKICAgIHJlcHJlc2VudGF0aW9uLiBBIHFzIHZhbHVlIGlzIHRoZXJlZm9yZSBzcGVjaWZpYyB0byBhIGdpdmVuCiAgICB2YXJpYW50IGRlcGVuZGluZyBvbiB0aGUgbmF0dXJlIG9mIHRoZSByZXNvdXJjZSBpdAogICAgcmVwcmVzZW50cy48L3A+CgogICAgPHA+VGhlIGZ1bGwgbGlzdCBvZiBoZWFkZXJzIHJlY29nbml6ZWQgaXMgYXZhaWxhYmxlIGluIHRoZSA8YSBocmVmPSJtb2QvbW9kX25lZ290aWF0aW9uLmh0bWwjdHlwZW1hcHMiPm1vZF9uZWdvdGlhdGlvbgogICAgdHlwZW1hcDwvYT4gZG9jdW1lbnRhdGlvbi48L3A+CgoKPGgzPjxhIG5hbWU9Im11bHRpdmlld3MiIGlkPSJtdWx0aXZpZXdzIj5NdWx0aXZpZXdzPC9hPjwvaDM+CgogICAgPHA+PGNvZGU+TXVsdGlWaWV3czwvY29kZT4gaXMgYSBwZXItZGlyZWN0b3J5IG9wdGlvbiwgbWVhbmluZyBpdAogICAgY2FuIGJlIHNldCB3aXRoIGFuIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4vbW9kL2NvcmUuaHRtbCNvcHRpb25zIj5PcHRpb25zPC9hPjwvY29kZT4KICAgIGRpcmVjdGl2ZSB3aXRoaW4gYSA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj48YSBocmVmPSIuL21vZC9jb3JlLmh0bWwjZGlyZWN0b3J5Ij4mbHQ7RGlyZWN0b3J5Jmd0OzwvYT48L2NvZGU+LCA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj48YSBocmVmPSIuL21vZC9jb3JlLmh0bWwjbG9jYXRpb24iPiZsdDtMb2NhdGlvbiZndDs8L2E+PC9jb2RlPiBvciA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj48YSBocmVmPSIuL21vZC9jb3JlLmh0bWwjZmlsZXMiPiZsdDtGaWxlcyZndDs8L2E+PC9jb2RlPiBzZWN0aW9uIGluCiAgICA8Y29kZT5odHRwZC5jb25mPC9jb2RlPiwgb3IgKGlmIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4vbW9kL2NvcmUuaHRtbCNhbGxvd292ZXJyaWRlIj5BbGxvd092ZXJyaWRlPC9hPjwvY29kZT4gaXMgcHJvcGVybHkgc2V0KSBpbgogICAgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlcy4gTm90ZSB0aGF0IDxjb2RlPk9wdGlvbnMgQWxsPC9jb2RlPgogICAgZG9lcyBub3Qgc2V0IDxjb2RlPk11bHRpVmlld3M8L2NvZGU+OyB5b3UgaGF2ZSB0byBhc2sgZm9yIGl0IGJ5CiAgICBuYW1lLjwvcD4KCiAgICA8cD5UaGUgZWZmZWN0IG9mIDxjb2RlPk11bHRpVmlld3M8L2NvZGU+IGlzIGFzIGZvbGxvd3M6IGlmIHRoZQogICAgc2VydmVyIHJlY2VpdmVzIGEgcmVxdWVzdCBmb3IgPGNvZGU+L3NvbWUvZGlyL2ZvbzwvY29kZT4sIGlmCiAgICA8Y29kZT4vc29tZS9kaXI8L2NvZGU+IGhhcyA8Y29kZT5NdWx0aVZpZXdzPC9jb2RlPiBlbmFibGVkLCBhbmQKICAgIDxjb2RlPi9zb21lL2Rpci9mb288L2NvZGU+IGRvZXMgPGVtPm5vdDwvZW0+IGV4aXN0LCB0aGVuIHRoZQogICAgc2VydmVyIHJlYWRzIHRoZSBkaXJlY3RvcnkgbG9va2luZyBmb3IgZmlsZXMgbmFtZWQgZm9vLiosIGFuZAogICAgZWZmZWN0aXZlbHkgZmFrZXMgdXAgYSB0eXBlIG1hcCB3aGljaCBuYW1lcyBhbGwgdGhvc2UgZmlsZXMsCiAgICBhc3NpZ25pbmcgdGhlbSB0aGUgc2FtZSBtZWRpYSB0eXBlcyBhbmQgY29udGVudC1lbmNvZGluZ3MgaXQKICAgIHdvdWxkIGhhdmUgaWYgdGhlIGNsaWVudCBoYWQgYXNrZWQgZm9yIG9uZSBvZiB0aGVtIGJ5IG5hbWUuIEl0CiAgICB0aGVuIGNob29zZXMgdGhlIGJlc3QgbWF0Y2ggdG8gdGhlIGNsaWVudCdzIHJlcXVpcmVtZW50cy48L3A+CgogICAgPHA+PGNvZGU+TXVsdGlWaWV3czwvY29kZT4gbWF5IGFsc28gYXBwbHkgdG8gc2VhcmNoZXMgZm9yIHRoZSBmaWxlCiAgICBuYW1lZCBieSB0aGUgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iLi9tb2QvbW9kX2Rpci5odG1sI2RpcmVjdG9yeWluZGV4Ij5EaXJlY3RvcnlJbmRleDwvYT48L2NvZGU+IGRpcmVjdGl2ZSwgaWYgdGhlCiAgICBzZXJ2ZXIgaXMgdHJ5aW5nIHRvIGluZGV4IGEgZGlyZWN0b3J5LiBJZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcwogICAgc3BlY2lmeTwvcD4KICAgIDxwcmUgY2xhc3M9InByZXR0eXByaW50IGxhbmctY29uZmlnIj5EaXJlY3RvcnlJbmRleCBpbmRleDwvcHJlPgoKICAgIDxwPnRoZW4gdGhlIHNlcnZlciB3aWxsIGFyYml0cmF0ZSBiZXR3ZWVuIDxjb2RlPmluZGV4Lmh0bWw8L2NvZGU+CiAgICBhbmQgPGNvZGU+aW5kZXguaHRtbDM8L2NvZGU+IGlmIGJvdGggYXJlIHByZXNlbnQuIElmIG5laXRoZXIKICAgIGFyZSBwcmVzZW50LCBhbmQgPGNvZGU+aW5kZXguY2dpPC9jb2RlPiBpcyB0aGVyZSwgdGhlIHNlcnZlcgogICAgd2lsbCBydW4gaXQuPC9wPgoKICAgIDxwPklmIG9uZSBvZiB0aGUgZmlsZXMgZm91bmQgd2hlbiByZWFkaW5nIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QKICAgIGhhdmUgYW4gZXh0ZW5zaW9uIHJlY29nbml6ZWQgYnkgPGNvZGU+bW9kX21pbWU8L2NvZGU+IHRvIGRlc2lnbmF0ZQogICAgaXRzIENoYXJzZXQsIENvbnRlbnQtVHlwZSwgTGFuZ3VhZ2UsIG9yIEVuY29kaW5nLCB0aGVuIHRoZSByZXN1bHQKICAgIGRlcGVuZHMgb24gdGhlIHNldHRpbmcgb2YgdGhlIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4vbW9kL21vZF9taW1lLmh0bWwjbXVsdGl2aWV3c21hdGNoIj5NdWx0aVZpZXdzTWF0Y2g8L2E+PC9jb2RlPiBkaXJlY3RpdmUuICBUaGlzCiAgICBkaXJlY3RpdmUgZGV0ZXJtaW5lcyB3aGV0aGVyIGhhbmRsZXJzLCBmaWx0ZXJzLCBhbmQgb3RoZXIKICAgIGV4dGVuc2lvbiB0eXBlcyBjYW4gcGFydGljaXBhdGUgaW4gTXVsdGlWaWV3cyBuZWdvdGlhdGlvbi48L3A+Cgo8L2Rpdj48ZGl2IGNsYXNzPSJ0b3AiPjxhIGhyZWY9IiNwYWdlLWhlYWRlciI+PGltZyBhbHQ9InRvcCIgc3JjPSIuL2ltYWdlcy91cC5naWYiIC8+PC9hPjwvZGl2Pgo8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KPGgyPjxhIG5hbWU9Im1ldGhvZHMiIGlkPSJtZXRob2RzIj5UaGUgTmVnb3RpYXRpb24gTWV0aG9kczwvYT4gPGEgdGl0bGU9IlBlcm1hbmVudCBsaW5rIiBocmVmPSIjbWV0aG9kcyIgY2xhc3M9InBlcm1hbGluayI+JnBhcmE7PC9hPjwvaDI+CgogICAgPHA+QWZ0ZXIgaHR0cGQgaGFzIG9idGFpbmVkIGEgbGlzdCBvZiB0aGUgdmFyaWFudHMgZm9yIGEgZ2l2ZW4KICAgIHJlc291cmNlLCBlaXRoZXIgZnJvbSBhIHR5cGUtbWFwIGZpbGUgb3IgZnJvbSB0aGUgZmlsZW5hbWVzIGluCiAgICB0aGUgZGlyZWN0b3J5LCBpdCBpbnZva2VzIG9uZSBvZiB0d28gbWV0aG9kcyB0byBkZWNpZGUgb24gdGhlCiAgICAnYmVzdCcgdmFyaWFudCB0byByZXR1cm4sIGlmIGFueS4gSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBrbm93CiAgICBhbnkgb2YgdGhlIGRldGFpbHMgb2YgaG93IG5lZ290aWF0aW9uIGFjdHVhbGx5IHRha2VzIHBsYWNlIGluCiAgICBvcmRlciB0byB1c2UgaHR0cGQncyBjb250ZW50IG5lZ290aWF0aW9uIGZlYXR1cmVzLiBIb3dldmVyIHRoZQogICAgcmVzdCBvZiB0aGlzIGRvY3VtZW50IGV4cGxhaW5zIHRoZSBtZXRob2RzIHVzZWQgZm9yIHRob3NlCiAgICBpbnRlcmVzdGVkLiA8L3A+CgogICAgPHA+VGhlcmUgYXJlIHR3byBuZWdvdGlhdGlvbiBtZXRob2RzOjwvcD4KCiAgICA8b2w+CiAgICAgIDxsaT48c3Ryb25nPlNlcnZlciBkcml2ZW4gbmVnb3RpYXRpb24gd2l0aCB0aGUgaHR0cGQKICAgICAgYWxnb3JpdGhtPC9zdHJvbmc+IGlzIHVzZWQgaW4gdGhlIG5vcm1hbCBjYXNlLiBUaGUgaHR0cGQKICAgICAgYWxnb3JpdGhtIGlzIGV4cGxhaW5lZCBpbiBtb3JlIGRldGFpbCBiZWxvdy4gV2hlbiB0aGlzCiAgICAgIGFsZ29yaXRobSBpcyB1c2VkLCBodHRwZCBjYW4gc29tZXRpbWVzICdmaWRkbGUnIHRoZSBxdWFsaXR5CiAgICAgIGZhY3RvciBvZiBhIHBhcnRpY3VsYXIgZGltZW5zaW9uIHRvIGFjaGlldmUgYSBiZXR0ZXIgcmVzdWx0LgogICAgICBUaGUgd2F5cyBodHRwZCBjYW4gZmlkZGxlIHF1YWxpdHkgZmFjdG9ycyBpcyBleHBsYWluZWQgaW4KICAgICAgbW9yZSBkZXRhaWwgYmVsb3cuPC9saT4KCiAgICAgIDxsaT48c3Ryb25nPlRyYW5zcGFyZW50IGNvbnRlbnQgbmVnb3RpYXRpb248L3N0cm9uZz4gaXMgdXNlZAogICAgICB3aGVuIHRoZSBicm93c2VyIHNwZWNpZmljYWxseSByZXF1ZXN0cyB0aGlzIHRocm91Z2ggdGhlCiAgICAgIG1lY2hhbmlzbSBkZWZpbmVkIGluIFJGQyAyMjk1LiBUaGlzIG5lZ290aWF0aW9uIG1ldGhvZCBnaXZlcwogICAgICB0aGUgYnJvd3NlciBmdWxsIGNvbnRyb2wgb3ZlciBkZWNpZGluZyBvbiB0aGUgJ2Jlc3QnIHZhcmlhbnQsCiAgICAgIHRoZSByZXN1bHQgaXMgdGhlcmVmb3JlIGRlcGVuZGVudCBvbiB0aGUgc3BlY2lmaWMgYWxnb3JpdGhtcwogICAgICB1c2VkIGJ5IHRoZSBicm93c2VyLiBBcyBwYXJ0IG9mIHRoZSB0cmFuc3BhcmVudCBuZWdvdGlhdGlvbgogICAgICBwcm9jZXNzLCB0aGUgYnJvd3NlciBjYW4gYXNrIGh0dHBkIHRvIHJ1biB0aGUgJ3JlbW90ZQogICAgICB2YXJpYW50IHNlbGVjdGlvbiBhbGdvcml0aG0nIGRlZmluZWQgaW4gUkZDIDIyOTYuPC9saT4KICAgIDwvb2w+Cgo8aDM+PGEgbmFtZT0iZGltZW5zaW9ucyIgaWQ9ImRpbWVuc2lvbnMiPkRpbWVuc2lvbnMgb2YgTmVnb3RpYXRpb248L2E+PC9oMz4KCiAgICA8dGFibGU+CiAgICAgIAogICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgIDx0aD5EaW1lbnNpb248L3RoPgoKICAgICAgICA8dGg+Tm90ZXM8L3RoPgogICAgICA8L3RyPgoKICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICA8dGQ+TWVkaWEgVHlwZTwvdGQ+CgogICAgICAgIDx0ZD5Ccm93c2VyIGluZGljYXRlcyBwcmVmZXJlbmNlcyB3aXRoIHRoZSA8Y29kZT5BY2NlcHQ8L2NvZGU+CiAgICAgICAgaGVhZGVyIGZpZWxkLiBFYWNoIGl0ZW0gY2FuIGhhdmUgYW4gYXNzb2NpYXRlZCBxdWFsaXR5IGZhY3Rvci4KICAgICAgICBWYXJpYW50IGRlc2NyaXB0aW9uIGNhbiBhbHNvIGhhdmUgYSBxdWFsaXR5IGZhY3RvciAodGhlICJxcyIKICAgICAgICBwYXJhbWV0ZXIpLjwvdGQ+CiAgICAgIDwvdHI+CgogICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgIDx0ZD5MYW5ndWFnZTwvdGQ+CgogICAgICAgIDx0ZD5Ccm93c2VyIGluZGljYXRlcyBwcmVmZXJlbmNlcyB3aXRoIHRoZQogICAgICAgIDxjb2RlPkFjY2VwdC1MYW5ndWFnZTwvY29kZT4gaGVhZGVyIGZpZWxkLiBFYWNoIGl0ZW0gY2FuIGhhdmUKICAgICAgICBhIHF1YWxpdHkgZmFjdG9yLiBWYXJpYW50cyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIG5vbmUsIG9uZSBvcgogICAgICAgIG1vcmUgdGhhbiBvbmUgbGFuZ3VhZ2UuPC90ZD4KICAgICAgPC90cj4KCiAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgPHRkPkVuY29kaW5nPC90ZD4KCiAgICAgICAgPHRkPkJyb3dzZXIgaW5kaWNhdGVzIHByZWZlcmVuY2Ugd2l0aCB0aGUKICAgICAgICA8Y29kZT5BY2NlcHQtRW5jb2Rpbmc8L2NvZGU+IGhlYWRlciBmaWVsZC4gRWFjaCBpdGVtIGNhbiBoYXZlCiAgICAgICAgYSBxdWFsaXR5IGZhY3Rvci48L3RkPgogICAgICA8L3RyPgoKICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICA8dGQ+Q2hhcnNldDwvdGQ+CgogICAgICAgIDx0ZD5Ccm93c2VyIGluZGljYXRlcyBwcmVmZXJlbmNlIHdpdGggdGhlCiAgICAgICAgPGNvZGU+QWNjZXB0LUNoYXJzZXQ8L2NvZGU+IGhlYWRlciBmaWVsZC4gRWFjaCBpdGVtIGNhbiBoYXZlIGEKICAgICAgICBxdWFsaXR5IGZhY3Rvci4gVmFyaWFudHMgY2FuIGluZGljYXRlIGEgY2hhcnNldCBhcyBhIHBhcmFtZXRlcgogICAgICAgIG9mIHRoZSBtZWRpYSB0eXBlLjwvdGQ+CiAgICAgIDwvdHI+CiAgICA8L3RhYmxlPgoKCjxoMz48YSBuYW1lPSJhbGdvcml0aG0iIGlkPSJhbGdvcml0aG0iPmh0dHBkIE5lZ290aWF0aW9uIEFsZ29yaXRobTwvYT48L2gzPgoKICAgIDxwPmh0dHBkIGNhbiB1c2UgdGhlIGZvbGxvd2luZyBhbGdvcml0aG0gdG8gc2VsZWN0IHRoZSAnYmVzdCcKICAgIHZhcmlhbnQgKGlmIGFueSkgdG8gcmV0dXJuIHRvIHRoZSBicm93c2VyLiBUaGlzIGFsZ29yaXRobSBpcwogICAgbm90IGZ1cnRoZXIgY29uZmlndXJhYmxlLiBJdCBvcGVyYXRlcyBhcyBmb2xsb3dzOjwvcD4KCiAgICA8b2w+CiAgICAgIDxsaT5GaXJzdCwgZm9yIGVhY2ggZGltZW5zaW9uIG9mIHRoZSBuZWdvdGlhdGlvbiwgY2hlY2sgdGhlCiAgICAgIGFwcHJvcHJpYXRlIDxlbT5BY2NlcHQqPC9lbT4gaGVhZGVyIGZpZWxkIGFuZCBhc3NpZ24gYQogICAgICBxdWFsaXR5IHRvIGVhY2ggdmFyaWFudC4gSWYgdGhlIDxlbT5BY2NlcHQqPC9lbT4gaGVhZGVyIGZvcgogICAgICBhbnkgZGltZW5zaW9uIGltcGxpZXMgdGhhdCB0aGlzIHZhcmlhbnQgaXMgbm90IGFjY2VwdGFibGUsCiAgICAgIGVsaW1pbmF0ZSBpdC4gSWYgbm8gdmFyaWFudHMgcmVtYWluLCBnbyB0byBzdGVwIDQuPC9saT4KCiAgICAgIDxsaT4KICAgICAgICBTZWxlY3QgdGhlICdiZXN0JyB2YXJpYW50IGJ5IGEgcHJvY2VzcyBvZiBlbGltaW5hdGlvbi4gRWFjaAogICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdGVzdHMgaXMgYXBwbGllZCBpbiBvcmRlci4gQW55IHZhcmlhbnRzCiAgICAgICAgbm90IHNlbGVjdGVkIGF0IGVhY2ggdGVzdCBhcmUgZWxpbWluYXRlZC4gQWZ0ZXIgZWFjaCB0ZXN0LAogICAgICAgIGlmIG9ubHkgb25lIHZhcmlhbnQgcmVtYWlucywgc2VsZWN0IGl0IGFzIHRoZSBiZXN0IG1hdGNoCiAgICAgICAgYW5kIHByb2NlZWQgdG8gc3RlcCAzLiBJZiBtb3JlIHRoYW4gb25lIHZhcmlhbnQgcmVtYWlucywKICAgICAgICBtb3ZlIG9uIHRvIHRoZSBuZXh0IHRlc3QuCgogICAgICAgIDxvbD4KICAgICAgICAgIDxsaT5NdWx0aXBseSB0aGUgcXVhbGl0eSBmYWN0b3IgZnJvbSB0aGUgPGNvZGU+QWNjZXB0PC9jb2RlPgogICAgICAgICAgaGVhZGVyIHdpdGggdGhlIHF1YWxpdHktb2Ytc291cmNlIGZhY3RvciBmb3IgdGhpcyB2YXJpYW50cwogICAgICAgICAgbWVkaWEgdHlwZSwgYW5kIHNlbGVjdCB0aGUgdmFyaWFudHMgd2l0aCB0aGUgaGlnaGVzdAogICAgICAgICAgdmFsdWUuPC9saT4KCiAgICAgICAgICA8bGk+U2VsZWN0IHRoZSB2YXJpYW50cyB3aXRoIHRoZSBoaWdoZXN0IGxhbmd1YWdlIHF1YWxpdHkKICAgICAgICAgIGZhY3Rvci48L2xpPgoKICAgICAgICAgIDxsaT5TZWxlY3QgdGhlIHZhcmlhbnRzIHdpdGggdGhlIGJlc3QgbGFuZ3VhZ2UgbWF0Y2gsCiAgICAgICAgICB1c2luZyBlaXRoZXIgdGhlIG9yZGVyIG9mIGxhbmd1YWdlcyBpbiB0aGUKICAgICAgICAgIDxjb2RlPkFjY2VwdC1MYW5ndWFnZTwvY29kZT4gaGVhZGVyIChpZiBwcmVzZW50KSwgb3IgZWxzZQogICAgICAgICAgdGhlIG9yZGVyIG9mIGxhbmd1YWdlcyBpbiB0aGUgPGNvZGU+TGFuZ3VhZ2VQcmlvcml0eTwvY29kZT4KICAgICAgICAgIGRpcmVjdGl2ZSAoaWYgcHJlc2VudCkuPC9saT4KCiAgICAgICAgICA8bGk+U2VsZWN0IHRoZSB2YXJpYW50cyB3aXRoIHRoZSBoaWdoZXN0ICdsZXZlbCcgbWVkaWEKICAgICAgICAgIHBhcmFtZXRlciAodXNlZCB0byBnaXZlIHRoZSB2ZXJzaW9uIG9mIHRleHQvaHRtbCBtZWRpYQogICAgICAgICAgdHlwZXMpLjwvbGk+CgogICAgICAgICAgPGxpPlNlbGVjdCB2YXJpYW50cyB3aXRoIHRoZSBiZXN0IGNoYXJzZXQgbWVkaWEKICAgICAgICAgIHBhcmFtZXRlcnMsIGFzIGdpdmVuIG9uIHRoZSA8Y29kZT5BY2NlcHQtQ2hhcnNldDwvY29kZT4KICAgICAgICAgIGhlYWRlciBsaW5lLiAgQ2hhcnNldCBJU08tODg1OS0xIGlzIGFjY2VwdGFibGUgdW5sZXNzCiAgICAgICAgICBleHBsaWNpdGx5IGV4Y2x1ZGVkLiBWYXJpYW50cyB3aXRoIGEgPGNvZGU+dGV4dC8qPC9jb2RlPgogICAgICAgICAgbWVkaWEgdHlwZSBidXQgbm90IGV4cGxpY2l0bHkgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhcgogICAgICAgICAgY2hhcnNldCBhcmUgYXNzdW1lZCB0byBiZSBpbiBJU08tODg1OS0xLjwvbGk+CgogICAgICAgICAgPGxpPlNlbGVjdCB0aG9zZSB2YXJpYW50cyB3aGljaCBoYXZlIGFzc29jaWF0ZWQgY2hhcnNldAogICAgICAgICAgbWVkaWEgcGFyYW1ldGVycyB0aGF0IGFyZSA8ZW0+bm90PC9lbT4gSVNPLTg4NTktMS4gSWYKICAgICAgICAgIHRoZXJlIGFyZSBubyBzdWNoIHZhcmlhbnRzLCBzZWxlY3QgYWxsIHZhcmlhbnRzCiAgICAgICAgICBpbnN0ZWFkLjwvbGk+CgogICAgICAgICAgPGxpPlNlbGVjdCB0aGUgdmFyaWFudHMgd2l0aCB0aGUgYmVzdCBlbmNvZGluZy4gSWYgdGhlcmUKICAgICAgICAgIGFyZSB2YXJpYW50cyB3aXRoIGFuIGVuY29kaW5nIHRoYXQgaXMgYWNjZXB0YWJsZSB0byB0aGUKICAgICAgICAgIHVzZXItYWdlbnQsIHNlbGVjdCBvbmx5IHRoZXNlIHZhcmlhbnRzLiBPdGhlcndpc2UgaWYKICAgICAgICAgIHRoZXJlIGlzIGEgbWl4IG9mIGVuY29kZWQgYW5kIG5vbi1lbmNvZGVkIHZhcmlhbnRzLAogICAgICAgICAgc2VsZWN0IG9ubHkgdGhlIHVuZW5jb2RlZCB2YXJpYW50cy4gSWYgZWl0aGVyIGFsbAogICAgICAgICAgdmFyaWFudHMgYXJlIGVuY29kZWQgb3IgYWxsIHZhcmlhbnRzIGFyZSBub3QgZW5jb2RlZCwKICAgICAgICAgIHNlbGVjdCBhbGwgdmFyaWFudHMuPC9saT4KCiAgICAgICAgICA8bGk+U2VsZWN0IHRoZSB2YXJpYW50cyB3aXRoIHRoZSBzbWFsbGVzdCBjb250ZW50CiAgICAgICAgICBsZW5ndGguPC9saT4KCiAgICAgICAgICA8bGk+U2VsZWN0IHRoZSBmaXJzdCB2YXJpYW50IG9mIHRob3NlIHJlbWFpbmluZy4gVGhpcwogICAgICAgICAgd2lsbCBiZSBlaXRoZXIgdGhlIGZpcnN0IGxpc3RlZCBpbiB0aGUgdHlwZS1tYXAgZmlsZSwgb3IKICAgICAgICAgIHdoZW4gdmFyaWFudHMgYXJlIHJlYWQgZnJvbSB0aGUgZGlyZWN0b3J5LCB0aGUgb25lIHdob3NlCiAgICAgICAgICBmaWxlIG5hbWUgY29tZXMgZmlyc3Qgd2hlbiBzb3J0ZWQgdXNpbmcgQVNDSUkgY29kZQogICAgICAgICAgb3JkZXIuPC9saT4KICAgICAgICA8L29sPgogICAgICA8L2xpPgoKICAgICAgPGxpPlRoZSBhbGdvcml0aG0gaGFzIG5vdyBzZWxlY3RlZCBvbmUgJ2Jlc3QnIHZhcmlhbnQsIHNvCiAgICAgIHJldHVybiBpdCBhcyB0aGUgcmVzcG9uc2UuIFRoZSBIVFRQIHJlc3BvbnNlIGhlYWRlcgogICAgICA8Y29kZT5WYXJ5PC9jb2RlPiBpcyBzZXQgdG8gaW5kaWNhdGUgdGhlIGRpbWVuc2lvbnMgb2YKICAgICAgbmVnb3RpYXRpb24gKGJyb3dzZXJzIGFuZCBjYWNoZXMgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHdoZW4KICAgICAgY2FjaGluZyB0aGUgcmVzb3VyY2UpLiAgRW5kLjwvbGk+CgogICAgICA8bGk+VG8gZ2V0IGhlcmUgbWVhbnMgbm8gdmFyaWFudCB3YXMgc2VsZWN0ZWQgKGJlY2F1c2Ugbm9uZQogICAgICBhcmUgYWNjZXB0YWJsZSB0byB0aGUgYnJvd3NlcikuIFJldHVybiBhIDQwNiBzdGF0dXMgKG1lYW5pbmcKICAgICAgIk5vIGFjY2VwdGFibGUgcmVwcmVzZW50YXRpb24iKSB3aXRoIGEgcmVzcG9uc2UgYm9keQogICAgICBjb25zaXN0aW5nIG9mIGFuIEhUTUwgZG9jdW1lbnQgbGlzdGluZyB0aGUgYXZhaWxhYmxlCiAgICAgIHZhcmlhbnRzLiBBbHNvIHNldCB0aGUgSFRUUCA8Y29kZT5WYXJ5PC9jb2RlPiBoZWFkZXIgdG8KICAgICAgaW5kaWNhdGUgdGhlIGRpbWVuc2lvbnMgb2YgdmFyaWFuY2UuPC9saT4KICAgIDwvb2w+Cgo8L2Rpdj48ZGl2IGNsYXNzPSJ0b3AiPjxhIGhyZWY9IiNwYWdlLWhlYWRlciI+PGltZyBhbHQ9InRvcCIgc3JjPSIuL2ltYWdlcy91cC5naWYiIC8+PC9hPjwvZGl2Pgo8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KPGgyPjxhIG5hbWU9ImJldHRlciIgaWQ9ImJldHRlciI+RmlkZGxpbmcgd2l0aCBRdWFsaXR5CiAgICBWYWx1ZXM8L2E+IDxhIHRpdGxlPSJQZXJtYW5lbnQgbGluayIgaHJlZj0iI2JldHRlciIgY2xhc3M9InBlcm1hbGluayI+JnBhcmE7PC9hPjwvaDI+CgogICAgPHA+aHR0cGQgc29tZXRpbWVzIGNoYW5nZXMgdGhlIHF1YWxpdHkgdmFsdWVzIGZyb20gd2hhdCB3b3VsZAogICAgYmUgZXhwZWN0ZWQgYnkgYSBzdHJpY3QgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGh0dHBkCiAgICBuZWdvdGlhdGlvbiBhbGdvcml0aG0gYWJvdmUuIFRoaXMgaXMgdG8gZ2V0IGEgYmV0dGVyIHJlc3VsdAogICAgZnJvbSB0aGUgYWxnb3JpdGhtIGZvciBicm93c2VycyB3aGljaCBkbyBub3Qgc2VuZCBmdWxsIG9yCiAgICBhY2N1cmF0ZSBpbmZvcm1hdGlvbi4gU29tZSBvZiB0aGUgbW9zdCBwb3B1bGFyIGJyb3dzZXJzIHNlbmQKICAgIDxjb2RlPkFjY2VwdDwvY29kZT4gaGVhZGVyIGluZm9ybWF0aW9uIHdoaWNoIHdvdWxkIG90aGVyd2lzZQogICAgcmVzdWx0IGluIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHdyb25nIHZhcmlhbnQgaW4gbWFueSBjYXNlcy4gSWYgYQogICAgYnJvd3NlciBzZW5kcyBmdWxsIGFuZCBjb3JyZWN0IGluZm9ybWF0aW9uIHRoZXNlIGZpZGRsZXMgd2lsbCBub3QKICAgIGJlIGFwcGxpZWQuPC9wPgoKPGgzPjxhIG5hbWU9IndpbGRjYXJkcyIgaWQ9IndpbGRjYXJkcyI+TWVkaWEgVHlwZXMgYW5kIFdpbGRjYXJkczwvYT48L2gzPgoKICAgIDxwPlRoZSA8Y29kZT5BY2NlcHQ6PC9jb2RlPiByZXF1ZXN0IGhlYWRlciBpbmRpY2F0ZXMgcHJlZmVyZW5jZXMKICAgIGZvciBtZWRpYSB0eXBlcy4gSXQgY2FuIGFsc28gaW5jbHVkZSAnd2lsZGNhcmQnIG1lZGlhIHR5cGVzLCBzdWNoCiAgICBhcyAiaW1hZ2UvKiIgb3IgIiovKiIgd2hlcmUgdGhlICogbWF0Y2hlcyBhbnkgc3RyaW5nLiBTbyBhIHJlcXVlc3QKICAgIGluY2x1ZGluZzo8L3A+Cgo8ZGl2IGNsYXNzPSJleGFtcGxlIj48cD48Y29kZT5BY2NlcHQ6IGltYWdlLyosICovKjwvY29kZT48L3A+PC9kaXY+CgogICAgPHA+d291bGQgaW5kaWNhdGUgdGhhdCBhbnkgdHlwZSBzdGFydGluZyAiaW1hZ2UvIiBpcyBhY2NlcHRhYmxlLAogICAgYXMgaXMgYW55IG90aGVyIHR5cGUuCiAgICBTb21lIGJyb3dzZXJzIHJvdXRpbmVseSBzZW5kIHdpbGRjYXJkcyBpbiBhZGRpdGlvbiB0byBleHBsaWNpdAogICAgdHlwZXMgdGhleSBjYW4gaGFuZGxlLiBGb3IgZXhhbXBsZTo8L3A+Cgo8ZGl2IGNsYXNzPSJleGFtcGxlIj48cD48Y29kZT4KICBBY2NlcHQ6IHRleHQvaHRtbCwgdGV4dC9wbGFpbiwgaW1hZ2UvZ2lmLCBpbWFnZS9qcGVnLCAqLyoKPC9jb2RlPjwvcD48L2Rpdj4KICAgIDxwPlRoZSBpbnRlbnRpb24gb2YgdGhpcyBpcyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBleHBsaWNpdGx5IGxpc3RlZAogICAgdHlwZXMgYXJlIHByZWZlcnJlZCwgYnV0IGlmIGEgZGlmZmVyZW50IHJlcHJlc2VudGF0aW9uIGlzCiAgICBhdmFpbGFibGUsIHRoYXQgaXMgb2sgdG9vLiAgVXNpbmcgZXhwbGljaXQgcXVhbGl0eSB2YWx1ZXMsCiAgICB3aGF0IHRoZSBicm93c2VyIHJlYWxseSB3YW50cyBpcyBzb21ldGhpbmcgbGlrZTo8L3A+CjxkaXYgY2xhc3M9ImV4YW1wbGUiPjxwPjxjb2RlPgogIEFjY2VwdDogdGV4dC9odG1sLCB0ZXh0L3BsYWluLCBpbWFnZS9naWYsIGltYWdlL2pwZWcsICovKjsgcT0wLjAxCjwvY29kZT48L3A+PC9kaXY+CiAgICA8cD5UaGUgZXhwbGljaXQgdHlwZXMgaGF2ZSBubyBxdWFsaXR5IGZhY3Rvciwgc28gdGhleSBkZWZhdWx0IHRvIGEKICAgIHByZWZlcmVuY2Ugb2YgMS4wICh0aGUgaGlnaGVzdCkuIFRoZSB3aWxkY2FyZCAqLyogaXMgZ2l2ZW4gYQogICAgbG93IHByZWZlcmVuY2Ugb2YgMC4wMSwgc28gb3RoZXIgdHlwZXMgd2lsbCBvbmx5IGJlIHJldHVybmVkIGlmCiAgICBubyB2YXJpYW50IG1hdGNoZXMgYW4gZXhwbGljaXRseSBsaXN0ZWQgdHlwZS48L3A+CgogICAgPHA+SWYgdGhlIDxjb2RlPkFjY2VwdDo8L2NvZGU+IGhlYWRlciBjb250YWlucyA8ZW0+bm88L2VtPiBxCiAgICBmYWN0b3JzIGF0IGFsbCwgaHR0cGQgc2V0cyB0aGUgcSB2YWx1ZSBvZiAiKi8qIiwgaWYgcHJlc2VudCwgdG8KICAgIDAuMDEgdG8gZW11bGF0ZSB0aGUgZGVzaXJlZCBiZWhhdmlvci4gSXQgYWxzbyBzZXRzIHRoZSBxIHZhbHVlIG9mCiAgICB3aWxkY2FyZHMgb2YgdGhlIGZvcm1hdCAidHlwZS8qIiB0byAwLjAyIChzbyB0aGVzZSBhcmUgcHJlZmVycmVkCiAgICBvdmVyIG1hdGNoZXMgYWdhaW5zdCAiKi8qIi4gSWYgYW55IG1lZGlhIHR5cGUgb24gdGhlCiAgICA8Y29kZT5BY2NlcHQ6PC9jb2RlPiBoZWFkZXIgY29udGFpbnMgYSBxIGZhY3RvciwgdGhlc2Ugc3BlY2lhbAogICAgdmFsdWVzIGFyZSA8ZW0+bm90PC9lbT4gYXBwbGllZCwgc28gcmVxdWVzdHMgZnJvbSBicm93c2VycyB3aGljaAogICAgc2VuZCB0aGUgZXhwbGljaXQgaW5mb3JtYXRpb24gdG8gc3RhcnQgd2l0aCB3b3JrIGFzIGV4cGVjdGVkLjwvcD4KCgo8aDM+PGEgbmFtZT0iZXhjZXB0aW9ucyIgaWQ9ImV4Y2VwdGlvbnMiPkxhbmd1YWdlIE5lZ290aWF0aW9uIEV4Y2VwdGlvbnM8L2E+PC9oMz4KCiAgICA8cD5OZXcgaW4gaHR0cGQgMi4wLCBzb21lIGV4Y2VwdGlvbnMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZQogICAgbmVnb3RpYXRpb24gYWxnb3JpdGhtIHRvIGFsbG93IGdyYWNlZnVsIGZhbGxiYWNrIHdoZW4gbGFuZ3VhZ2UKICAgIG5lZ290aWF0aW9uIGZhaWxzIHRvIGZpbmQgYSBtYXRjaC48L3A+CgogICAgPHA+V2hlbiBhIGNsaWVudCByZXF1ZXN0cyBhIHBhZ2Ugb24geW91ciBzZXJ2ZXIsIGJ1dCB0aGUgc2VydmVyCiAgICBjYW5ub3QgZmluZCBhIHNpbmdsZSBwYWdlIHRoYXQgbWF0Y2hlcyB0aGUKICAgIDxjb2RlPkFjY2VwdC1sYW5ndWFnZTwvY29kZT4gc2VudCBieQogICAgdGhlIGJyb3dzZXIsIHRoZSBzZXJ2ZXIgd2lsbCByZXR1cm4gZWl0aGVyIGEgIk5vIEFjY2VwdGFibGUKICAgIFZhcmlhbnQiIG9yICJNdWx0aXBsZSBDaG9pY2VzIiByZXNwb25zZSB0byB0aGUgY2xpZW50LiAgVG8gYXZvaWQKICAgIHRoZXNlIGVycm9yIG1lc3NhZ2VzLCBpdCBpcyBwb3NzaWJsZSB0byBjb25maWd1cmUgaHR0cGQgdG8gaWdub3JlCiAgICB0aGUgPGNvZGU+QWNjZXB0LWxhbmd1YWdlPC9jb2RlPiBpbiB0aGVzZSBjYXNlcyBhbmQgcHJvdmlkZSBhCiAgICBkb2N1bWVudCB0aGF0IGRvZXMgbm90IGV4cGxpY2l0bHkgbWF0Y2ggdGhlIGNsaWVudCdzIHJlcXVlc3QuICBUaGUKICAgIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4vbW9kL21vZF9uZWdvdGlhdGlvbi5odG1sI2ZvcmNlbGFuZ3VhZ2Vwcmlvcml0eSI+Rm9yY2VMYW5ndWFnZVByaW9yaXR5PC9hPjwvY29kZT4KICAgIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSBvbmUgb3IgYm90aCBvZiB0aGVzZSBlcnJvcgogICAgbWVzc2FnZXMgYW5kIHN1YnN0aXR1dGUgdGhlIHNlcnZlcnMganVkZ2VtZW50IGluIHRoZSBmb3JtIG9mIHRoZQogICAgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iLi9tb2QvbW9kX25lZ290aWF0aW9uLmh0bWwjbGFuZ3VhZ2Vwcmlvcml0eSI+TGFuZ3VhZ2VQcmlvcml0eTwvYT48L2NvZGU+CiAgICBkaXJlY3RpdmUuPC9wPgoKICAgIDxwPlRoZSBzZXJ2ZXIgd2lsbCBhbHNvIGF0dGVtcHQgdG8gbWF0Y2ggbGFuZ3VhZ2Utc3Vic2V0cyB3aGVuIG5vCiAgICBvdGhlciBtYXRjaCBjYW4gYmUgZm91bmQuICBGb3IgZXhhbXBsZSwgaWYgYSBjbGllbnQgcmVxdWVzdHMKICAgIGRvY3VtZW50cyB3aXRoIHRoZSBsYW5ndWFnZSA8Y29kZT5lbi1HQjwvY29kZT4gZm9yIEJyaXRpc2gKICAgIEVuZ2xpc2gsIHRoZSBzZXJ2ZXIgaXMgbm90IG5vcm1hbGx5IGFsbG93ZWQgYnkgdGhlIEhUVFAvMS4xCiAgICBzdGFuZGFyZCB0byBtYXRjaCB0aGF0IGFnYWluc3QgYSBkb2N1bWVudCB0aGF0IGlzIG1hcmtlZCBhcyBzaW1wbHkKICAgIDxjb2RlPmVuPC9jb2RlPi4gIChOb3RlIHRoYXQgaXQgaXMgYWxtb3N0IHN1cmVseSBhIGNvbmZpZ3VyYXRpb24KICAgIGVycm9yIHRvIGluY2x1ZGUgPGNvZGU+ZW4tR0I8L2NvZGU+IGFuZCBub3QgPGNvZGU+ZW48L2NvZGU+IGluIHRoZQogICAgPGNvZGU+QWNjZXB0LUxhbmd1YWdlPC9jb2RlPiBoZWFkZXIsIHNpbmNlIGl0IGlzIHZlcnkgdW5saWtlbHkKICAgIHRoYXQgYSByZWFkZXIgdW5kZXJzdGFuZHMgQnJpdGlzaCBFbmdsaXNoLCBidXQgZG9lc24ndCB1bmRlcnN0YW5kCiAgICBFbmdsaXNoIGluIGdlbmVyYWwuICBVbmZvcnR1bmF0ZWx5LCBtYW55IGN1cnJlbnQgY2xpZW50cyBoYXZlCiAgICBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zIHRoYXQgcmVzZW1ibGUgdGhpcy4pICBIb3dldmVyLCBpZiBubyBvdGhlcgogICAgbGFuZ3VhZ2UgbWF0Y2ggaXMgcG9zc2libGUgYW5kIHRoZSBzZXJ2ZXIgaXMgYWJvdXQgdG8gcmV0dXJuIGEgIk5vCiAgICBBY2NlcHRhYmxlIFZhcmlhbnRzIiBlcnJvciBvciBmYWxsYmFjayB0byB0aGUgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iLi9tb2QvbW9kX25lZ290aWF0aW9uLmh0bWwjbGFuZ3VhZ2Vwcmlvcml0eSI+TGFuZ3VhZ2VQcmlvcml0eTwvYT48L2NvZGU+LCB0aGUgc2VydmVyCiAgICB3aWxsIGlnbm9yZSB0aGUgc3Vic2V0IHNwZWNpZmljYXRpb24gYW5kIG1hdGNoIDxjb2RlPmVuLUdCPC9jb2RlPgogICAgYWdhaW5zdCA8Y29kZT5lbjwvY29kZT4gZG9jdW1lbnRzLiAgSW1wbGljaXRseSwgaHR0cGQgd2lsbCBhZGQKICAgIHRoZSBwYXJlbnQgbGFuZ3VhZ2UgdG8gdGhlIGNsaWVudCdzIGFjY2VwdGFibGUgbGFuZ3VhZ2UgbGlzdCB3aXRoCiAgICBhIHZlcnkgbG93IHF1YWxpdHkgdmFsdWUuICBCdXQgbm90ZSB0aGF0IGlmIHRoZSBjbGllbnQgcmVxdWVzdHMKICAgICJlbi1HQjsgcT0wLjksIGZyOyBxPTAuOCIsIGFuZCB0aGUgc2VydmVyIGhhcyBkb2N1bWVudHMKICAgIGRlc2lnbmF0ZWQgImVuIiBhbmQgImZyIiwgdGhlbiB0aGUgImZyIiBkb2N1bWVudCB3aWxsIGJlIHJldHVybmVkLgogICAgVGhpcyBpcyBuZWNlc3NhcnkgdG8gbWFpbnRhaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBIVFRQLzEuMQogICAgc3BlY2lmaWNhdGlvbiBhbmQgdG8gd29yayBlZmZlY3RpdmVseSB3aXRoIHByb3Blcmx5IGNvbmZpZ3VyZWQKICAgIGNsaWVudHMuPC9wPgoKICAgIDxwPkluIG9yZGVyIHRvIHN1cHBvcnQgYWR2YW5jZWQgdGVjaG5pcXVlcyAoc3VjaCBhcyBjb29raWVzIG9yCiAgICBzcGVjaWFsIFVSTC1wYXRocykgdG8gZGV0ZXJtaW5lIHRoZSB1c2VyJ3MgcHJlZmVycmVkIGxhbmd1YWdlLAogICAgc2luY2UgaHR0cGQgMi4wLjQ3IDxjb2RlIGNsYXNzPSJtb2R1bGUiPjxhIGhyZWY9Ii4vbW9kL21vZF9uZWdvdGlhdGlvbi5odG1sIj5tb2RfbmVnb3RpYXRpb248L2E+PC9jb2RlPiByZWNvZ25pemVzCiAgICB0aGUgPGEgaHJlZj0iZW52Lmh0bWwiPmVudmlyb25tZW50IHZhcmlhYmxlPC9hPgogICAgPGNvZGU+cHJlZmVyLWxhbmd1YWdlPC9jb2RlPi4gSWYgaXQgZXhpc3RzIGFuZCBjb250YWlucyBhbgogICAgYXBwcm9wcmlhdGUgbGFuZ3VhZ2UgdGFnLCA8Y29kZSBjbGFzcz0ibW9kdWxlIj48YSBocmVmPSIuL21vZC9tb2RfbmVnb3RpYXRpb24uaHRtbCI+bW9kX25lZ290aWF0aW9uPC9hPjwvY29kZT4gd2lsbAogICAgdHJ5IHRvIHNlbGVjdCBhIG1hdGNoaW5nIHZhcmlhbnQuIElmIHRoZXJlJ3Mgbm8gc3VjaCB2YXJpYW50LAogICAgdGhlIG5vcm1hbCBuZWdvdGlhdGlvbiBwcm9jZXNzIGFwcGxpZXMuPC9wPgoKICAgIDxkaXYgY2xhc3M9ImV4YW1wbGUiPjxoMz5FeGFtcGxlPC9oMz48cHJlIGNsYXNzPSJwcmV0dHlwcmludCBsYW5nLWNvbmZpZyI+U2V0RW52SWYgQ29va2llICJsYW5ndWFnZT0oLispIiBwcmVmZXItbGFuZ3VhZ2U9JDEKSGVhZGVyIGFwcGVuZCBWYXJ5IGNvb2tpZTwvcHJlPgo8L2Rpdj4KCjwvZGl2PjxkaXYgY2xhc3M9InRvcCI+PGEgaHJlZj0iI3BhZ2UtaGVhZGVyIj48aW1nIGFsdD0idG9wIiBzcmM9Ii4vaW1hZ2VzL3VwLmdpZiIgLz48L2E+PC9kaXY+CjxkaXYgY2xhc3M9InNlY3Rpb24iPgo8aDI+PGEgbmFtZT0iZXh0ZW5zaW9ucyIgaWQ9ImV4dGVuc2lvbnMiPkV4dGVuc2lvbnMgdG8gVHJhbnNwYXJlbnQgQ29udGVudApOZWdvdGlhdGlvbjwvYT4gPGEgdGl0bGU9IlBlcm1hbmVudCBsaW5rIiBocmVmPSIjZXh0ZW5zaW9ucyIgY2xhc3M9InBlcm1hbGluayI+JnBhcmE7PC9hPjwvaDI+Cgo8cD5odHRwZCBleHRlbmRzIHRoZSB0cmFuc3BhcmVudCBjb250ZW50IG5lZ290aWF0aW9uIHByb3RvY29sIChSRkMKMjI5NSkgYXMgZm9sbG93cy4gQSBuZXcgPGNvZGU+e2VuY29kaW5nIC4ufTwvY29kZT4gZWxlbWVudCBpcyB1c2VkIGluCnZhcmlhbnQgbGlzdHMgdG8gbGFiZWwgdmFyaWFudHMgd2hpY2ggYXJlIGF2YWlsYWJsZSB3aXRoIGEgc3BlY2lmaWMKY29udGVudC1lbmNvZGluZyBvbmx5LiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJWU0EvMS4wIGFsZ29yaXRobQooUkZDIDIyOTYpIGlzIGV4dGVuZGVkIHRvIHJlY29nbml6ZSBlbmNvZGVkIHZhcmlhbnRzIGluIHRoZSBsaXN0LCBhbmQKdG8gdXNlIHRoZW0gYXMgY2FuZGlkYXRlIHZhcmlhbnRzIHdoZW5ldmVyIHRoZWlyIGVuY29kaW5ncyBhcmUKYWNjZXB0YWJsZSBhY2NvcmRpbmcgdG8gdGhlIDxjb2RlPkFjY2VwdC1FbmNvZGluZzwvY29kZT4gcmVxdWVzdApoZWFkZXIuIFRoZSBSVlNBLzEuMCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByb3VuZCBjb21wdXRlZCBxdWFsaXR5CmZhY3RvcnMgdG8gNSBkZWNpbWFsIHBsYWNlcyBiZWZvcmUgY2hvb3NpbmcgdGhlIGJlc3QgdmFyaWFudC48L3A+CjwvZGl2PjxkaXYgY2xhc3M9InRvcCI+PGEgaHJlZj0iI3BhZ2UtaGVhZGVyIj48aW1nIGFsdD0idG9wIiBzcmM9Ii4vaW1hZ2VzL3VwLmdpZiIgLz48L2E+PC9kaXY+CjxkaXYgY2xhc3M9InNlY3Rpb24iPgo8aDI+PGEgbmFtZT0ibmFtaW5nIiBpZD0ibmFtaW5nIj5Ob3RlIG9uIGh5cGVybGlua3MgYW5kIG5hbWluZyBjb252ZW50aW9uczwvYT4gPGEgdGl0bGU9IlBlcm1hbmVudCBsaW5rIiBocmVmPSIjbmFtaW5nIiBjbGFzcz0icGVybWFsaW5rIj4mcGFyYTs8L2E+PC9oMj4KCiAgICA8cD5JZiB5b3UgYXJlIHVzaW5nIGxhbmd1YWdlIG5lZ290aWF0aW9uIHlvdSBjYW4gY2hvb3NlIGJldHdlZW4KICAgIGRpZmZlcmVudCBuYW1pbmcgY29udmVudGlvbnMsIGJlY2F1c2UgZmlsZXMgY2FuIGhhdmUgbW9yZSB0aGFuCiAgICBvbmUgZXh0ZW5zaW9uLCBhbmQgdGhlIG9yZGVyIG9mIHRoZSBleHRlbnNpb25zIGlzIG5vcm1hbGx5CiAgICBpcnJlbGV2YW50IChzZWUgdGhlIDxhIGhyZWY9Im1vZC9tb2RfbWltZS5odG1sI211bHRpcGxlZXh0Ij5tb2RfbWltZTwvYT4gZG9jdW1lbnRhdGlvbgogICAgZm9yIGRldGFpbHMpLjwvcD4KCiAgICA8cD5BIHR5cGljYWwgZmlsZSBoYXMgYSBNSU1FLXR5cGUgZXh0ZW5zaW9uICg8ZW0+ZS5nLjwvZW0+LAogICAgPGNvZGU+aHRtbDwvY29kZT4pLCBtYXliZSBhbiBlbmNvZGluZyBleHRlbnNpb24gKDxlbT5lLmcuPC9lbT4sCiAgICA8Y29kZT5nejwvY29kZT4pLCBhbmQgb2YgY291cnNlIGEgbGFuZ3VhZ2UgZXh0ZW5zaW9uCiAgICAoPGVtPmUuZy48L2VtPiwgPGNvZGU+ZW48L2NvZGU+KSB3aGVuIHdlIGhhdmUgZGlmZmVyZW50CiAgICBsYW5ndWFnZSB2YXJpYW50cyBvZiB0aGlzIGZpbGUuPC9wPgoKICAgIDxwPkV4YW1wbGVzOjwvcD4KCiAgICA8dWw+CiAgICAgIDxsaT5mb28uZW4uaHRtbDwvbGk+CgogICAgICA8bGk+Zm9vLmh0bWwuZW48L2xpPgoKICAgICAgPGxpPmZvby5lbi5odG1sLmd6PC9saT4KICAgIDwvdWw+CgogICAgPHA+SGVyZSBzb21lIG1vcmUgZXhhbXBsZXMgb2YgZmlsZW5hbWVzIHRvZ2V0aGVyIHdpdGggdmFsaWQgYW5kCiAgICBpbnZhbGlkIGh5cGVybGlua3M6PC9wPgoKICAgIDx0YWJsZSBjbGFzcz0iYm9yZGVyZWQiPgogICAgICAKICAgICAgPHRyPgogICAgICAgIDx0aD5GaWxlbmFtZTwvdGg+CgogICAgICAgIDx0aD5WYWxpZCBoeXBlcmxpbms8L3RoPgoKICAgICAgICA8dGg+SW52YWxpZCBoeXBlcmxpbms8L3RoPgogICAgICA8L3RyPgoKICAgICAgPHRyPgogICAgICAgIDx0ZD48ZW0+Zm9vLmh0bWwuZW48L2VtPjwvdGQ+CgogICAgICAgIDx0ZD5mb288YnIgLz4KICAgICAgICAgZm9vLmh0bWw8L3RkPgoKICAgICAgICA8dGQ+LTwvdGQ+CiAgICAgIDwvdHI+CgogICAgICA8dHI+CiAgICAgICAgPHRkPjxlbT5mb28uZW4uaHRtbDwvZW0+PC90ZD4KCiAgICAgICAgPHRkPmZvbzwvdGQ+CgogICAgICAgIDx0ZD5mb28uaHRtbDwvdGQ+CiAgICAgIDwvdHI+CgogICAgICA8dHI+CiAgICAgICAgPHRkPjxlbT5mb28uaHRtbC5lbi5nejwvZW0+PC90ZD4KCiAgICAgICAgPHRkPmZvbzxiciAvPgogICAgICAgICBmb28uaHRtbDwvdGQ+CgogICAgICAgIDx0ZD5mb28uZ3o8YnIgLz4KICAgICAgICAgZm9vLmh0bWwuZ3o8L3RkPgogICAgICA8L3RyPgoKICAgICAgPHRyPgogICAgICAgIDx0ZD48ZW0+Zm9vLmVuLmh0bWwuZ3o8L2VtPjwvdGQ+CgogICAgICAgIDx0ZD5mb288L3RkPgoKICAgICAgICA8dGQ+Zm9vLmh0bWw8YnIgLz4KICAgICAgICAgZm9vLmh0bWwuZ3o8YnIgLz4KICAgICAgICAgZm9vLmd6PC90ZD4KICAgICAgPC90cj4KCiAgICAgIDx0cj4KICAgICAgICA8dGQ+PGVtPmZvby5nei5odG1sLmVuPC9lbT48L3RkPgoKICAgICAgICA8dGQ+Zm9vPGJyIC8+CiAgICAgICAgIGZvby5nejxiciAvPgogICAgICAgICBmb28uZ3ouaHRtbDwvdGQ+CgogICAgICAgIDx0ZD5mb28uaHRtbDwvdGQ+CiAgICAgIDwvdHI+CgogICAgICA8dHI+CiAgICAgICAgPHRkPjxlbT5mb28uaHRtbC5nei5lbjwvZW0+PC90ZD4KCiAgICAgICAgPHRkPmZvbzxiciAvPgogICAgICAgICBmb28uaHRtbDxiciAvPgogICAgICAgICBmb28uaHRtbC5nejwvdGQ+CgogICAgICAgIDx0ZD5mb28uZ3o8L3RkPgogICAgICA8L3RyPgogICAgPC90YWJsZT4KCiAgICA8cD5Mb29raW5nIGF0IHRoZSB0YWJsZSBhYm92ZSwgeW91IHdpbGwgbm90aWNlIHRoYXQgaXQgaXMgYWx3YXlzCiAgICBwb3NzaWJsZSB0byB1c2UgdGhlIG5hbWUgd2l0aG91dCBhbnkgZXh0ZW5zaW9ucyBpbiBhIGh5cGVybGluawogICAgKDxlbT5lLmcuPC9lbT4sIDxjb2RlPmZvbzwvY29kZT4pLiBUaGUgYWR2YW50YWdlIGlzIHRoYXQgeW91CiAgICBjYW4gaGlkZSB0aGUgYWN0dWFsIHR5cGUgb2YgYSBkb2N1bWVudCByc3AuIGZpbGUgYW5kIGNhbiBjaGFuZ2UKICAgIGl0IGxhdGVyLCA8ZW0+ZS5nLjwvZW0+LCBmcm9tIDxjb2RlPmh0bWw8L2NvZGU+IHRvCiAgICA8Y29kZT5zaHRtbDwvY29kZT4gb3IgPGNvZGU+Y2dpPC9jb2RlPiB3aXRob3V0IGNoYW5naW5nIGFueQogICAgaHlwZXJsaW5rIHJlZmVyZW5jZXMuPC9wPgoKICAgIDxwPklmIHlvdSB3YW50IHRvIGNvbnRpbnVlIHRvIHVzZSBhIE1JTUUtdHlwZSBpbiB5b3VyCiAgICBoeXBlcmxpbmtzICg8ZW0+ZS5nLjwvZW0+IDxjb2RlPmZvby5odG1sPC9jb2RlPikgdGhlIGxhbmd1YWdlCiAgICBleHRlbnNpb24gKGluY2x1ZGluZyBhbiBlbmNvZGluZyBleHRlbnNpb24gaWYgdGhlcmUgaXMgb25lKQogICAgbXVzdCBiZSBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSBNSU1FLXR5cGUgZXh0ZW5zaW9uCiAgICAoPGVtPmUuZy48L2VtPiwgPGNvZGU+Zm9vLmh0bWwuZW48L2NvZGU+KS48L3A+CjwvZGl2PjxkaXYgY2xhc3M9InRvcCI+PGEgaHJlZj0iI3BhZ2UtaGVhZGVyIj48aW1nIGFsdD0idG9wIiBzcmM9Ii4vaW1hZ2VzL3VwLmdpZiIgLz48L2E+PC9kaXY+CjxkaXYgY2xhc3M9InNlY3Rpb24iPgo8aDI+PGEgbmFtZT0iY2FjaGluZyIgaWQ9ImNhY2hpbmciPk5vdGUgb24gQ2FjaGluZzwvYT4gPGEgdGl0bGU9IlBlcm1hbmVudCBsaW5rIiBocmVmPSIjY2FjaGluZyIgY2xhc3M9InBlcm1hbGluayI+JnBhcmE7PC9hPjwvaDI+CgogICAgPHA+V2hlbiBhIGNhY2hlIHN0b3JlcyBhIHJlcHJlc2VudGF0aW9uLCBpdCBhc3NvY2lhdGVzIGl0IHdpdGgKICAgIHRoZSByZXF1ZXN0IFVSTC4gVGhlIG5leHQgdGltZSB0aGF0IFVSTCBpcyByZXF1ZXN0ZWQsIHRoZSBjYWNoZQogICAgY2FuIHVzZSB0aGUgc3RvcmVkIHJlcHJlc2VudGF0aW9uLiBCdXQsIGlmIHRoZSByZXNvdXJjZSBpcwogICAgbmVnb3RpYWJsZSBhdCB0aGUgc2VydmVyLCB0aGlzIG1pZ2h0IHJlc3VsdCBpbiBvbmx5IHRoZSBmaXJzdAogICAgcmVxdWVzdGVkIHZhcmlhbnQgYmVpbmcgY2FjaGVkIGFuZCBzdWJzZXF1ZW50IGNhY2hlIGhpdHMgbWlnaHQKICAgIHJldHVybiB0aGUgd3JvbmcgcmVzcG9uc2UuIFRvIHByZXZlbnQgdGhpcywgaHR0cGQgbm9ybWFsbHkKICAgIG1hcmtzIGFsbCByZXNwb25zZXMgdGhhdCBhcmUgcmV0dXJuZWQgYWZ0ZXIgY29udGVudCBuZWdvdGlhdGlvbgogICAgYXMgbm9uLWNhY2hlYWJsZSBieSBIVFRQLzEuMCBjbGllbnRzLiBodHRwZCBhbHNvIHN1cHBvcnRzIHRoZQogICAgSFRUUC8xLjEgcHJvdG9jb2wgZmVhdHVyZXMgdG8gYWxsb3cgY2FjaGluZyBvZiBuZWdvdGlhdGVkCiAgICByZXNwb25zZXMuPC9wPgoKICAgIDxwPkZvciByZXF1ZXN0cyB3aGljaCBjb21lIGZyb20gYSBIVFRQLzEuMCBjb21wbGlhbnQgY2xpZW50CiAgICAoZWl0aGVyIGEgYnJvd3NlciBvciBhIGNhY2hlKSwgdGhlIGRpcmVjdGl2ZSA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj48YSBocmVmPSIuL21vZC9tb2RfbmVnb3RpYXRpb24uaHRtbCNjYWNoZW5lZ290aWF0ZWRkb2NzIj5DYWNoZU5lZ290aWF0ZWREb2NzPC9hPjwvY29kZT4gY2FuIGJlCiAgICB1c2VkIHRvIGFsbG93IGNhY2hpbmcgb2YgcmVzcG9uc2VzIHdoaWNoIHdlcmUgc3ViamVjdCB0bwogICAgbmVnb3RpYXRpb24uIFRoaXMgZGlyZWN0aXZlIGNhbiBiZSBnaXZlbiBpbiB0aGUgc2VydmVyIGNvbmZpZyBvcgogICAgdmlydHVhbCBob3N0LCBhbmQgdGFrZXMgbm8gYXJndW1lbnRzLiBJdCBoYXMgbm8gZWZmZWN0IG9uIHJlcXVlc3RzCiAgICBmcm9tIEhUVFAvMS4xIGNsaWVudHMuPC9wPgoKICAgIDxwPkZvciBIVFRQLzEuMSBjbGllbnRzLCBodHRwZCBzZW5kcyBhIDxjb2RlPlZhcnk8L2NvZGU+IEhUVFAKICAgIHJlc3BvbnNlIGhlYWRlciB0byBpbmRpY2F0ZSB0aGUgbmVnb3RpYXRpb24gZGltZW5zaW9ucyBmb3IgdGhlCiAgICByZXNwb25zZS4gIENhY2hlcyBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYQogICAgc3Vic2VxdWVudCByZXF1ZXN0IGNhbiBiZSBzZXJ2ZWQgZnJvbSB0aGUgbG9jYWwgY29weS4gIFRvCiAgICBlbmNvdXJhZ2UgYSBjYWNoZSB0byB1c2UgdGhlIGxvY2FsIGNvcHkgcmVnYXJkbGVzcyBvZiB0aGUKICAgIG5lZ290aWF0aW9uIGRpbWVuc2lvbnMsIHNldCB0aGUgPGNvZGU+Zm9yY2Utbm8tdmFyeTwvY29kZT4gPGEgaHJlZj0iZW52Lmh0bWwjc3BlY2lhbCI+ZW52aXJvbm1lbnQgdmFyaWFibGU8L2E+LjwvcD4KCjwvZGl2PjwvZGl2Pgo8ZGl2IGNsYXNzPSJib3R0b21sYW5nIj4KPHA+PHNwYW4+QXZhaWxhYmxlIExhbmd1YWdlczogPC9zcGFuPjxhIGhyZWY9Ii4vZW4vY29udGVudC1uZWdvdGlhdGlvbi5odG1sIiB0aXRsZT0iRW5nbGlzaCI+Jm5ic3A7ZW4mbmJzcDs8L2E+IHwKPGEgaHJlZj0iLi9mci9jb250ZW50LW5lZ290aWF0aW9uLmh0bWwiIGhyZWZsYW5nPSJmciIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJGcmFu52FpcyI+Jm5ic3A7ZnImbmJzcDs8L2E+IHwKPGEgaHJlZj0iLi9qYS9jb250ZW50LW5lZ290aWF0aW9uLmh0bWwiIGhyZWZsYW5nPSJqYSIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJKYXBhbmVzZSI+Jm5ic3A7amEmbmJzcDs8L2E+IHwKPGEgaHJlZj0iLi9rby9jb250ZW50LW5lZ290aWF0aW9uLmh0bWwiIGhyZWZsYW5nPSJrbyIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJLb3JlYW4iPiZuYnNwO2tvJm5ic3A7PC9hPiB8CjxhIGhyZWY9Ii4vdHIvY29udGVudC1uZWdvdGlhdGlvbi5odG1sIiBocmVmbGFuZz0idHIiIHJlbD0iYWx0ZXJuYXRlIiB0aXRsZT0iVPxya+dlIj4mbmJzcDt0ciZuYnNwOzwvYT48L3A+CjwvZGl2PjxkaXYgY2xhc3M9InRvcCI+PGEgaHJlZj0iI3BhZ2UtaGVhZGVyIj48aW1nIHNyYz0iLi9pbWFnZXMvdXAuZ2lmIiBhbHQ9InRvcCIgLz48L2E+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdGlvbiI+PGgyPjxhIGlkPSJjb21tZW50c19zZWN0aW9uIiBuYW1lPSJjb21tZW50c19zZWN0aW9uIj5Db21tZW50czwvYT48L2gyPjxkaXYgY2xhc3M9Indhcm5pbmciPjxzdHJvbmc+Tm90aWNlOjwvc3Ryb25nPjxiciAvPlRoaXMgaXMgbm90IGEgUSZhbXA7QSBzZWN0aW9uLiBDb21tZW50cyBwbGFjZWQgaGVyZSBzaG91bGQgYmUgcG9pbnRlZCB0b3dhcmRzIHN1Z2dlc3Rpb25zIG9uIGltcHJvdmluZyB0aGUgZG9jdW1lbnRhdGlvbiBvciBzZXJ2ZXIsIGFuZCBtYXkgYmUgcmVtb3ZlZCBhZ2FpbiBieSBvdXIgbW9kZXJhdG9ycyBpZiB0aGV5IGFyZSBlaXRoZXIgaW1wbGVtZW50ZWQgb3IgY29uc2lkZXJlZCBpbnZhbGlkL29mZi10b3BpYy4gUXVlc3Rpb25zIG9uIGhvdyB0byBtYW5hZ2UgdGhlIEFwYWNoZSBIVFRQIFNlcnZlciBzaG91bGQgYmUgZGlyZWN0ZWQgYXQgZWl0aGVyIG91ciBJUkMgY2hhbm5lbCwgI2h0dHBkLCBvbiBGcmVlbm9kZSwgb3Igc2VudCB0byBvdXIgPGEgaHJlZj0iaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvbGlzdHMuaHRtbCI+bWFpbGluZyBsaXN0czwvYT4uPC9kaXY+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tLy8tLT48IVtDREFUQVsvLz48IS0tCnZhciBjb21tZW50c19zaG9ydG5hbWUgPSAnaHR0cGQnOwp2YXIgY29tbWVudHNfaWRlbnRpZmllciA9ICdodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy9kb2NzL3RydW5rL2NvbnRlbnQtbmVnb3RpYXRpb24uaHRtbCc7CihmdW5jdGlvbih3LCBkKSB7CiAgICBpZiAody5sb2NhdGlvbi5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpID09ICJodHRwZC5hcGFjaGUub3JnIikgewogICAgICAgIGQud3JpdGUoJzxkaXYgaWQ9ImNvbW1lbnRzX3RocmVhZCI+PFwvZGl2PicpOwogICAgICAgIHZhciBzID0gZC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICBzLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKICAgICAgICBzLmFzeW5jID0gdHJ1ZTsKICAgICAgICBzLnNyYyA9ICdodHRwczovL2NvbW1lbnRzLmFwYWNoZS5vcmcvc2hvd19jb21tZW50cy5sdWE/c2l0ZT0nICsgY29tbWVudHNfc2hvcnRuYW1lICsgJyZwYWdlPScgKyBjb21tZW50c19pZGVudGlmaWVyOwogICAgICAgIChkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0gfHwgZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdKS5hcHBlbmRDaGlsZChzKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGQud3JpdGUoJzxkaXYgaWQ9ImNvbW1lbnRzX3RocmVhZCI+Q29tbWVudHMgYXJlIGRpc2FibGVkIGZvciB0aGlzIHBhZ2UgYXQgdGhlIG1vbWVudC48XC9kaXY+Jyk7CiAgICB9Cn0pKHdpbmRvdywgZG9jdW1lbnQpOwovLy0tPjwhXV0+PC9zY3JpcHQ+PC9kaXY+PGRpdiBpZD0iZm9vdGVyIj4KPHAgY2xhc3M9ImFwYWNoZSI+Q29weXJpZ2h0IDIwMTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLjxiciAvPkxpY2Vuc2VkIHVuZGVyIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPkFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvYT4uPC9wPgo8cCBjbGFzcz0ibWVudSI+PGEgaHJlZj0iLi9tb2QvIj5Nb2R1bGVzPC9hPiB8IDxhIGhyZWY9Ii4vbW9kL3F1aWNrcmVmZXJlbmNlLmh0bWwiPkRpcmVjdGl2ZXM8L2E+IHwgPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9odHRwZC9GQVEiPkZBUTwvYT4gfCA8YSBocmVmPSIuL2dsb3NzYXJ5Lmh0bWwiPkdsb3NzYXJ5PC9hPiB8IDxhIGhyZWY9Ii4vc2l0ZW1hcC5odG1sIj5TaXRlbWFwPC9hPjwvcD48L2Rpdj48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+PCEtLS8vLS0+PCFbQ0RBVEFbLy8+PCEtLQppZiAodHlwZW9mKHByZXR0eVByaW50KSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgIHByZXR0eVByaW50KCk7Cn0KLy8tLT48IV1dPjwvc2NyaXB0Pgo8L2JvZHk+PC9odG1sPg==