PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pgo8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+CjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj48aGVhZD4KPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KPCEtLQogICAgICAgIFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYCiAgICAgICAgICAgICAgVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIHhtbCBzb3VyY2U6IERPIE5PVCBFRElUCiAgICAgICAgWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgKICAgICAgLS0+Cjx0aXRsZT5Vc2luZyBBcGFjaGUgSFRUUCBTZXJ2ZXIgb24gTWljcm9zb2Z0IFdpbmRvd3MgLSBBcGFjaGUgSFRUUCBTZXJ2ZXIgVmVyc2lvbiAyLjQ8L3RpdGxlPgo8bGluayBocmVmPSIuLi9zdHlsZS9jc3MvbWFudWFsLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyIgdGl0bGU9Ik1haW4gc3R5bGVzaGVldCIgLz4KPGxpbmsgaHJlZj0iLi4vc3R5bGUvY3NzL21hbnVhbC1sb29zZS0xMDBwYy5jc3MiIHJlbD0iYWx0ZXJuYXRlIHN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIHR5cGU9InRleHQvY3NzIiB0aXRsZT0iTm8gU2lkZWJhciAtIERlZmF1bHQgZm9udCBzaXplIiAvPgo8bGluayBocmVmPSIuLi9zdHlsZS9jc3MvbWFudWFsLXByaW50LmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0icHJpbnQiIHR5cGU9InRleHQvY3NzIiAvPjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlL2Nzcy9wcmV0dGlmeS5jc3MiIC8+CjxzY3JpcHQgc3JjPSIuLi9zdHlsZS9zY3JpcHRzL3ByZXR0aWZ5Lm1pbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPC9zY3JpcHQ+Cgo8bGluayBocmVmPSIuLi9pbWFnZXMvZmF2aWNvbi5pY28iIHJlbD0ic2hvcnRjdXQgaWNvbiIgLz48L2hlYWQ+Cjxib2R5IGlkPSJtYW51YWwtcGFnZSI+PGRpdiBpZD0icGFnZS1oZWFkZXIiPgo8cCBjbGFzcz0ibWVudSI+PGEgaHJlZj0iLi4vbW9kLyI+TW9kdWxlczwvYT4gfCA8YSBocmVmPSIuLi9tb2QvZGlyZWN0aXZlcy5odG1sIj5EaXJlY3RpdmVzPC9hPiB8IDxhIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvaHR0cGQvRkFRIj5GQVE8L2E+IHwgPGEgaHJlZj0iLi4vZ2xvc3NhcnkuaHRtbCI+R2xvc3Nhcnk8L2E+IHwgPGEgaHJlZj0iLi4vc2l0ZW1hcC5odG1sIj5TaXRlbWFwPC9hPjwvcD4KPHAgY2xhc3M9ImFwYWNoZSI+QXBhY2hlIEhUVFAgU2VydmVyIFZlcnNpb24gMi40PC9wPgo8aW1nIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9mZWF0aGVyLnBuZyIgLz48L2Rpdj4KPGRpdiBjbGFzcz0idXAiPjxhIGhyZWY9Ii4vIj48aW1nIHRpdGxlPSImbHQ7LSIgYWx0PSImbHQ7LSIgc3JjPSIuLi9pbWFnZXMvbGVmdC5naWYiIC8+PC9hPjwvZGl2Pgo8ZGl2IGlkPSJwYXRoIj4KPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+QXBhY2hlPC9hPiAmZ3Q7IDxhIGhyZWY9Imh0dHA6Ly9odHRwZC5hcGFjaGUub3JnLyI+SFRUUCBTZXJ2ZXI8L2E+ICZndDsgPGEgaHJlZj0iaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvZG9jcy8iPkRvY3VtZW50YXRpb248L2E+ICZndDsgPGEgaHJlZj0iLi4vIj5WZXJzaW9uIDIuNDwvYT4gJmd0OyA8YSBocmVmPSIuLyI+UGxhdGZvcm0gU3BlY2lmaWMgTm90ZXM8L2E+PC9kaXY+PGRpdiBpZD0icGFnZS1jb250ZW50Ij48ZGl2IGlkPSJwcmVhbWJsZSI+PGgxPlVzaW5nIEFwYWNoZSBIVFRQIFNlcnZlciBvbiBNaWNyb3NvZnQgV2luZG93czwvaDE+CjxkaXYgY2xhc3M9InRvcGxhbmciPgo8cD48c3Bhbj5BdmFpbGFibGUgTGFuZ3VhZ2VzOiA8L3NwYW4+PGEgaHJlZj0iLi4vZW4vcGxhdGZvcm0vd2luZG93cy5odG1sIiB0aXRsZT0iRW5nbGlzaCI+Jm5ic3A7ZW4mbmJzcDs8L2E+IHwKPGEgaHJlZj0iLi4vZnIvcGxhdGZvcm0vd2luZG93cy5odG1sIiBocmVmbGFuZz0iZnIiIHJlbD0iYWx0ZXJuYXRlIiB0aXRsZT0iRnJhbudhaXMiPiZuYnNwO2ZyJm5ic3A7PC9hPiB8CjxhIGhyZWY9Ii4uL2tvL3BsYXRmb3JtL3dpbmRvd3MuaHRtbCIgaHJlZmxhbmc9ImtvIiByZWw9ImFsdGVybmF0ZSIgdGl0bGU9IktvcmVhbiI+Jm5ic3A7a28mbmJzcDs8L2E+PC9wPgo8L2Rpdj4KCiAgICA8cD5UaGlzIGRvY3VtZW50IGV4cGxhaW5zIGhvdyB0byBpbnN0YWxsLCBjb25maWd1cmUgYW5kIHJ1bgogICAgQXBhY2hlIDIuNCB1bmRlciBNaWNyb3NvZnQgV2luZG93cy4gIElmIHlvdSBoYXZlIHF1ZXN0aW9ucyBhZnRlcgogICAgcmV2aWV3aW5nIHRoZSBkb2N1bWVudGF0aW9uIChhbmQgYW55IGV2ZW50IGFuZCBlcnJvciBsb2dzKSwgeW91CiAgICBzaG91bGQgY29uc3VsdCB0aGUgcGVlci1zdXBwb3J0ZWQKICAgIDxhIGhyZWY9Imh0dHA6Ly9odHRwZC5hcGFjaGUub3JnL3VzZXJzbGlzdC5odG1sIj51c2VycycgbWFpbGluZwogICAgbGlzdDwvYT4uPC9wPgoKICAgIDxwPlRoaXMgZG9jdW1lbnQgYXNzdW1lcyB0aGF0IHlvdSBhcmUgaW5zdGFsbGluZyBhIGJpbmFyeQogICAgZGlzdHJpYnV0aW9uIG9mIEFwYWNoZS4gSWYgeW91IHdhbnQgdG8gY29tcGlsZSBBcGFjaGUgeW91cnNlbGYKICAgIChwb3NzaWJseSB0byBoZWxwIHdpdGggZGV2ZWxvcG1lbnQgb3IgdHJhY2tpbmcgZG93biBidWdzKSwKICAgIHNlZSA8YSBocmVmPSJ3aW5fY29tcGlsaW5nLmh0bWwiPkNvbXBpbGluZyBBcGFjaGUgZm9yIE1pY3Jvc29mdAogICAgV2luZG93czwvYT4uPC9wPgogIDwvZGl2Pgo8ZGl2IGlkPSJxdWlja3ZpZXciPjx1bCBpZD0idG9jIj48bGk+PGltZyBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvZG93bi5naWYiIC8+IDxhIGhyZWY9IiNyZXEiPk9wZXJhdGluZyBTeXN0ZW0gUmVxdWlyZW1lbnRzPC9hPjwvbGk+CjxsaT48aW1nIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9kb3duLmdpZiIgLz4gPGEgaHJlZj0iI2Rvd24iPkRvd25sb2FkaW5nIEFwYWNoZSBmb3IgV2luZG93czwvYT48L2xpPgo8bGk+PGltZyBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvZG93bi5naWYiIC8+IDxhIGhyZWY9IiNjdXN0Ij5DdXN0b21pemluZyBBcGFjaGUgZm9yIFdpbmRvd3M8L2E+PC9saT4KPGxpPjxpbWcgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL2Rvd24uZ2lmIiAvPiA8YSBocmVmPSIjd2luc3ZjIj5SdW5uaW5nIEFwYWNoZSBhcyBhIFNlcnZpY2U8L2E+PC9saT4KPGxpPjxpbWcgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL2Rvd24uZ2lmIiAvPiA8YSBocmVmPSIjd2luY29ucyI+UnVubmluZyBBcGFjaGUgYXMgYSBDb25zb2xlIEFwcGxpY2F0aW9uPC9hPjwvbGk+CjxsaT48aW1nIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9kb3duLmdpZiIgLz4gPGEgaHJlZj0iI3Rlc3QiPlRlc3RpbmcgdGhlIEluc3RhbGxhdGlvbjwvYT48L2xpPgo8bGk+PGltZyBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvZG93bi5naWYiIC8+IDxhIGhyZWY9IiN3aW5kcml2ZW1hcCI+Q29uZmlndXJpbmcgQWNjZXNzIHRvIE5ldHdvcmsgUmVzb3VyY2VzPC9hPjwvbGk+CjxsaT48aW1nIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9kb3duLmdpZiIgLz4gPGEgaHJlZj0iI3R1bmluZyI+V2luZG93cyBUdW5pbmc8L2E+PC9saT4KPC91bD48aDM+U2VlIGFsc288L2gzPjx1bCBjbGFzcz0ic2VlYWxzbyI+PGxpPjxhIGhyZWY9IiNjb21tZW50c19zZWN0aW9uIj5Db21tZW50czwvYT48L2xpPjwvdWw+PC9kaXY+CjxkaXYgY2xhc3M9InRvcCI+PGEgaHJlZj0iI3BhZ2UtaGVhZGVyIj48aW1nIGFsdD0idG9wIiBzcmM9Ii4uL2ltYWdlcy91cC5naWYiIC8+PC9hPjwvZGl2Pgo8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KPGgyPjxhIG5hbWU9InJlcSIgaWQ9InJlcSI+T3BlcmF0aW5nIFN5c3RlbSBSZXF1aXJlbWVudHM8L2E+PC9oMj4KICAgIAoKICAgIDxwPlRoZSBwcmltYXJ5IFdpbmRvd3MgcGxhdGZvcm0gZm9yIHJ1bm5pbmcgQXBhY2hlIDIuNCBpcyBXaW5kb3dzCiAgICAyMDAwIG9yIGxhdGVyLiBBbHdheXMgb2J0YWluIGFuZAogICAgaW5zdGFsbCB0aGUgY3VycmVudCBzZXJ2aWNlIHBhY2sgdG8gYXZvaWQgb3BlcmF0aW5nIHN5c3RlbSBidWdzLjwvcD4KCiAgICA8ZGl2IGNsYXNzPSJub3RlIj5BcGFjaGUgSFRUUCBTZXJ2ZXIgdmVyc2lvbnMgbGF0ZXIgdGhhbiAyLjIgd2lsbCBub3QgcnVuIG9uIGFueQogICAgb3BlcmF0aW5nIHN5c3RlbSBlYXJsaWVyIHRoYW4gV2luZG93cyAyMDAwLjwvZGl2PgogIDwvZGl2PjxkaXYgY2xhc3M9InRvcCI+PGEgaHJlZj0iI3BhZ2UtaGVhZGVyIj48aW1nIGFsdD0idG9wIiBzcmM9Ii4uL2ltYWdlcy91cC5naWYiIC8+PC9hPjwvZGl2Pgo8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KPGgyPjxhIG5hbWU9ImRvd24iIGlkPSJkb3duIj5Eb3dubG9hZGluZyBBcGFjaGUgZm9yIFdpbmRvd3M8L2E+PC9oMj4KICAgIAoKICAgIDxwPlRoZSBBcGFjaGUgSFRUUCBTZXJ2ZXIgUHJvamVjdCBpdHNlbGYgZG9lcyBub3QgcHJvdmlkZSBiaW5hcnkgcmVsZWFzZXMgb2YKICAgIHNvZnR3YXJlLCBvbmx5IHNvdXJjZSBjb2RlLiBJbmRpdmlkdWFsIGNvbW1pdHRlcnMgPGVtPm1heTwvZW0+IHByb3ZpZGUgCiAgICBiaW5hcnkgcGFja2FnZXMgYXMgYSBjb252ZW5pZW5jZSwgYnV0IGl0IGlzIG5vdCBhIHJlbGVhc2UgZGVsaXZlcmFibGUuPC9wPgogICAgPHA+SWYgeW91IGNhbm5vdCBjb21waWxlIHRoZSBBcGFjaGUgSFRUUCBTZXJ2ZXIKICAgIHlvdXJzZWxmLCB5b3UgY2FuIG9idGFpbiBhIGJpbmFyeSBwYWNrYWdlIGZyb20gbnVtZXJvdXMgYmluYXJ5IGRpc3RyaWJ1dGlvbnMKICAgIGF2YWlsYWJsZSBvbiB0aGUgSW50ZXJuZXQuPC9wPgoKICAgIDxwPlBvcHVsYXIgb3B0aW9ucyBmb3IgZGVwbG95aW5nIEFwYWNoZSBodHRwZCwgYW5kLCBvcHRpb25hbGx5LCBQSFAKICAgIGFuZCBNeVNRTCwgb24gTWljcm9zb2Z0IFdpbmRvd3MsIGluY2x1ZGU6PC9wPgogICAgPHVsPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlaGF1cy5jb20vY2dpLWJpbi9kb3dubG9hZC5wbHgiPkFwYWNoZUhhdXM8L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZWxvdW5nZS5jb20vZG93bmxvYWQvIj5BcGFjaGUgTG91bmdlPC9hPjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2JpdG5hbWkuY29tL3N0YWNrL3dhbXAiPkJpdE5hbWkgV0FNUCBTdGFjazwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cud2FtcHNlcnZlci5jb20vIj5XYW1wU2VydmVyPC9hPjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGVmcmllbmRzLm9yZy9lbi94YW1wcC5odG1sIj5YQU1QUDwvYT48L2xpPgogICAgPC91bD4KICA8L2Rpdj48ZGl2IGNsYXNzPSJ0b3AiPjxhIGhyZWY9IiNwYWdlLWhlYWRlciI+PGltZyBhbHQ9InRvcCIgc3JjPSIuLi9pbWFnZXMvdXAuZ2lmIiAvPjwvYT48L2Rpdj4KPGRpdiBjbGFzcz0ic2VjdGlvbiI+CjxoMj48YSBuYW1lPSJjdXN0IiBpZD0iY3VzdCI+Q3VzdG9taXppbmcgQXBhY2hlIGZvciBXaW5kb3dzPC9hPjwvaDI+CiAgICAKCiAgICA8cD5BcGFjaGUgaXMgY29uZmlndXJlZCBieSB0aGUgZmlsZXMgaW4gdGhlIDxjb2RlPmNvbmY8L2NvZGU+CiAgICBzdWJkaXJlY3RvcnkuIFRoZXNlIGFyZSB0aGUgc2FtZSBmaWxlcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgVW5peAogICAgdmVyc2lvbiwgYnV0IHRoZXJlIGFyZSBhIGZldyBkaWZmZXJlbnQgZGlyZWN0aXZlcyBmb3IgQXBhY2hlIG9uCiAgICBXaW5kb3dzLiBTZWUgdGhlIDxhIGhyZWY9Ii4uL21vZC9kaXJlY3RpdmVzLmh0bWwiPmRpcmVjdGl2ZSBpbmRleDwvYT4KICAgIGZvciBhbGwgdGhlIGF2YWlsYWJsZSBkaXJlY3RpdmVzLjwvcD4KCiAgICA8cD5UaGUgbWFpbiBkaWZmZXJlbmNlcyBpbiBBcGFjaGUgZm9yIFdpbmRvd3MgYXJlOjwvcD4KICAgIDx1bD4KICAgICAgPGxpPjxwPkJlY2F1c2UgQXBhY2hlIGZvciBXaW5kb3dzIGlzIG11bHRpdGhyZWFkZWQsIGl0IGRvZXMgbm90CiAgICAgIHVzZSBhIHNlcGFyYXRlIHByb2Nlc3MgZm9yIGVhY2ggcmVxdWVzdCwgYXMgQXBhY2hlIGNhbiBvbiBVbml4LgogICAgICBJbnN0ZWFkIHRoZXJlIGFyZSB1c3VhbGx5IG9ubHkgdHdvIEFwYWNoZSBwcm9jZXNzZXMgcnVubmluZzogYQogICAgICBwYXJlbnQgcHJvY2VzcywgYW5kIGEgY2hpbGQgd2hpY2ggaGFuZGxlcyB0aGUgcmVxdWVzdHMuIFdpdGhpbgogICAgICB0aGUgY2hpbGQgcHJvY2VzcyBlYWNoIHJlcXVlc3QgaXMgaGFuZGxlZCBieSBhIHNlcGFyYXRlIHRocmVhZC4KICAgICAgPC9wPgoKICAgICAgPHA+VGhlIHByb2Nlc3MgbWFuYWdlbWVudCBkaXJlY3RpdmVzIGFyZSBhbHNvIGRpZmZlcmVudDo8L3A+CgogICAgICA8cD48Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj48YSBocmVmPSIuLi9tb2QvbXBtX2NvbW1vbi5odG1sI21heGNvbm5lY3Rpb25zcGVyY2hpbGQiPk1heENvbm5lY3Rpb25zUGVyQ2hpbGQ8L2E+PC9jb2RlPjoKICAgICAgTGlrZSB0aGUgVW5peCBkaXJlY3RpdmUsIHRoaXMgY29udHJvbHMgaG93IG1hbnkgY29ubmVjdGlvbnMgYSBzaW5nbGUKICAgICAgY2hpbGQgcHJvY2VzcyB3aWxsIHNlcnZlIGJlZm9yZSBleGl0aW5nLgogICAgICBIb3dldmVyLCB1bmxpa2Ugb24gVW5peCwgYSByZXBsYWNlbWVudCBwcm9jZXNzIGlzIG5vdCBpbnN0YW50bHkKICAgICAgYXZhaWxhYmxlLiAgVXNlIHRoZSBkZWZhdWx0IDxjb2RlPk1heENvbm5lY3Rpb25zUGVyQ2hpbGQgMDwvY29kZT4sCiAgICAgIHVubGVzcyBpbnN0cnVjdGVkIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3IgdG8gb3ZlcmNvbWUgYSBtZW1vcnkgbGVhawogICAgICBpbiB0aGlyZCBwYXJ0eSBtb2R1bGVzIG9yIGluLXByb2Nlc3MgYXBwbGljYXRpb25zLjwvcD4KCiAgICAgIDxkaXYgY2xhc3M9Indhcm5pbmciPjxzdHJvbmc+V2FybmluZzogVGhlIHNlcnZlciBjb25maWd1cmF0aW9uCiAgICAgIGZpbGUgaXMgcmVyZWFkIHdoZW4gYSBuZXcgY2hpbGQgcHJvY2VzcyBpcyBzdGFydGVkLiBJZiB5b3UgaGF2ZQogICAgICBtb2RpZmllZCA8Y29kZT5odHRwZC5jb25mPC9jb2RlPiwgdGhlIG5ldyBjaGlsZCBtYXkgbm90IHN0YXJ0IG9yCiAgICAgIHlvdSBtYXkgcmVjZWl2ZSB1bmV4cGVjdGVkIHJlc3VsdHMuPC9zdHJvbmc+PC9kaXY+CgogICAgICA8cD48Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj48YSBocmVmPSIuLi9tb2QvbXBtX2NvbW1vbi5odG1sI3RocmVhZHNwZXJjaGlsZCI+VGhyZWFkc1BlckNoaWxkPC9hPjwvY29kZT46CiAgICAgIFRoaXMgZGlyZWN0aXZlIGlzIG5ldy4gSXQgdGVsbHMgdGhlIHNlcnZlciBob3cgbWFueSB0aHJlYWRzIGl0CiAgICAgIHNob3VsZCB1c2UuIFRoaXMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoZSBzZXJ2ZXIKICAgICAgY2FuIGhhbmRsZSBhdCBvbmNlLCBzbyBiZSBzdXJlIHRvIHNldCB0aGlzIG51bWJlciBoaWdoIGVub3VnaCBmb3IKICAgICAgeW91ciBzaXRlIGlmIHlvdSBnZXQgYSBsb3Qgb2YgaGl0cy4gVGhlIHJlY29tbWVuZGVkIGRlZmF1bHQgaXMKICAgICAgPGNvZGU+VGhyZWFkc1BlckNoaWxkIDE1MDwvY29kZT4sIGJ1dCB0aGlzIG11c3QgYmUgYWRqdXN0ZWQgdG8KICAgICAgcmVmbGVjdCB0aGUgZ3JlYXRlc3QgYW50aWNpcGF0ZWQgbnVtYmVyIG9mIHNpbXVsdGFuZW91cwogICAgICBjb25uZWN0aW9ucyB0byBhY2NlcHQuPC9wPjwvbGk+CgogICAgICA8bGk+PHA+VGhlIGRpcmVjdGl2ZXMgdGhhdCBhY2NlcHQgZmlsZW5hbWVzIGFzIGFyZ3VtZW50cyBtdXN0IHVzZQogICAgICBXaW5kb3dzIGZpbGVuYW1lcyBpbnN0ZWFkIG9mIFVuaXggb25lcy4gSG93ZXZlciwgYmVjYXVzZSBBcGFjaGUKICAgICAgbWF5IGludGVycHJldCBiYWNrc2xhc2hlcyBhcyBhbiAiZXNjYXBlIGNoYXJhY3RlciIgc2VxdWVuY2UsIHlvdQogICAgICBzaG91bGQgY29uc2lzdGVudGx5IHVzZSBmb3J3YXJkIHNsYXNoZXMgaW4gcGF0aCBuYW1lcywgbm90CiAgICAgIGJhY2tzbGFzaGVzLjwvcD48L2xpPgoKICAgICAgPGxpPjxwPldoaWxlIGZpbGVuYW1lcyBhcmUgZ2VuZXJhbGx5IGNhc2UtaW5zZW5zaXRpdmUgb24KICAgICAgV2luZG93cywgVVJMcyBhcmUgc3RpbGwgdHJlYXRlZCBpbnRlcm5hbGx5IGFzIGNhc2Utc2Vuc2l0aXZlCiAgICAgIGJlZm9yZSB0aGV5IGFyZSBtYXBwZWQgdG8gdGhlIGZpbGVzeXN0ZW0uICBGb3IgZXhhbXBsZSwgdGhlCiAgICAgIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4uL21vZC9jb3JlLmh0bWwjbG9jYXRpb24iPiZsdDtMb2NhdGlvbiZndDs8L2E+PC9jb2RlPiwKICAgICAgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iLi4vbW9kL21vZF9hbGlhcy5odG1sI2FsaWFzIj5BbGlhczwvYT48L2NvZGU+LCBhbmQgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iLi4vbW9kL21vZF9wcm94eS5odG1sI3Byb3h5cGFzcyI+UHJveHlQYXNzPC9hPjwvY29kZT4gZGlyZWN0aXZlcyBhbGwgdXNlCiAgICAgIGNhc2Utc2Vuc2l0aXZlIGFyZ3VtZW50cy4gIEZvciB0aGlzIHJlYXNvbiwgaXQgaXMgcGFydGljdWxhcmx5CiAgICAgIGltcG9ydGFudCB0byB1c2UgdGhlIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4uL21vZC9jb3JlLmh0bWwjZGlyZWN0b3J5Ij4mbHQ7RGlyZWN0b3J5Jmd0OzwvYT48L2NvZGU+IGRpcmVjdGl2ZSB3aGVuIGF0dGVtcHRpbmcKICAgICAgdG8gbGltaXQgYWNjZXNzIHRvIGNvbnRlbnQgaW4gdGhlIGZpbGVzeXN0ZW0sIHNpbmNlIHRoaXMKICAgICAgZGlyZWN0aXZlIGFwcGxpZXMgdG8gYW55IGNvbnRlbnQgaW4gYSBkaXJlY3RvcnksIHJlZ2FyZGxlc3Mgb2YKICAgICAgaG93IGl0IGlzIGFjY2Vzc2VkLiAgSWYgeW91IHdpc2ggdG8gYXNzdXJlIHRoYXQgb25seSBsb3dlcmNhc2UKICAgICAgaXMgdXNlZCBpbiBVUkxzLCB5b3UgY2FuIHVzZSBzb21ldGhpbmcgbGlrZTo8L3A+CgogICAgICA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCBsYW5nLWNvbmZpZyI+UmV3cml0ZUVuZ2luZSBPbgpSZXdyaXRlTWFwIGxvd2VyY2FzZSBpbnQ6dG9sb3dlcgpSZXdyaXRlQ29uZCAiJXtSRVFVRVNUX1VSSX0iICJbQS1aXSIKUmV3cml0ZVJ1bGUgIiguKikiICIke2xvd2VyY2FzZTokMX0iIFtSLExdPC9wcmU+CjwvbGk+CgogICAgICA8bGk+PHA+V2hlbiBydW5uaW5nLCBBcGFjaGUgbmVlZHMgd3JpdGUgYWNjZXNzIG9ubHkgdG8gdGhlIGxvZ3MKICAgICAgZGlyZWN0b3J5IGFuZCBhbnkgY29uZmlndXJlZCBjYWNoZSBkaXJlY3RvcnkgdHJlZS4gIER1ZSB0byB0aGUKICAgICAgaXNzdWUgb2YgY2FzZSBpbnNlbnNpdGl2ZSBhbmQgc2hvcnQgOC4zIGZvcm1hdCBuYW1lcywgQXBhY2hlIG11c3QKICAgICAgdmFsaWRhdGUgYWxsIHBhdGggbmFtZXMgZ2l2ZW4uICBUaGlzIG1lYW5zIHRoYXQgZWFjaCBkaXJlY3RvcnkKICAgICAgd2hpY2ggQXBhY2hlIGV2YWx1YXRlcywgZnJvbSB0aGUgZHJpdmUgcm9vdCB1cCB0byB0aGUgZGlyZWN0b3J5CiAgICAgIGxlYWYsIG11c3QgaGF2ZSByZWFkLCBsaXN0IGFuZCB0cmF2ZXJzZSBkaXJlY3RvcnkgcGVybWlzc2lvbnMuCiAgICAgIElmIEFwYWNoZTIuNCBpcyBpbnN0YWxsZWQgYXQgQzpcUHJvZ3JhbSBGaWxlcywgdGhlbiB0aGUgcm9vdAogICAgICBkaXJlY3RvcnksIFByb2dyYW0gRmlsZXMgYW5kIEFwYWNoZTIuNCBtdXN0IGFsbCBiZSB2aXNpYmxlCiAgICAgIHRvIEFwYWNoZS48L3A+PC9saT4KCiAgICAgIDxsaT48cD5BcGFjaGUgZm9yIFdpbmRvd3MgY29udGFpbnMgdGhlIGFiaWxpdHkgdG8gbG9hZCBtb2R1bGVzIGF0CiAgICAgIHJ1bnRpbWUsIHdpdGhvdXQgcmVjb21waWxpbmcgdGhlIHNlcnZlci4gSWYgQXBhY2hlIGlzIGNvbXBpbGVkCiAgICAgIG5vcm1hbGx5LCBpdCB3aWxsIGluc3RhbGwgYSBudW1iZXIgb2Ygb3B0aW9uYWwgbW9kdWxlcyBpbiB0aGUKICAgICAgPGNvZGU+XEFwYWNoZTIuNFxtb2R1bGVzPC9jb2RlPiBkaXJlY3RvcnkuIFRvIGFjdGl2YXRlIHRoZXNlIG9yCiAgICAgIG90aGVyIG1vZHVsZXMsIHRoZSA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj48YSBocmVmPSIuLi9tb2QvbW9kX3NvLmh0bWwjbG9hZG1vZHVsZSI+TG9hZE1vZHVsZTwvYT48L2NvZGU+CiAgICAgIGRpcmVjdGl2ZSBtdXN0IGJlIHVzZWQuIEZvciBleGFtcGxlLCB0byBhY3RpdmF0ZSB0aGUgc3RhdHVzCiAgICAgIG1vZHVsZSwgdXNlIHRoZSBmb2xsb3dpbmcgKGluIGFkZGl0aW9uIHRvIHRoZSBzdGF0dXMtYWN0aXZhdGluZwogICAgICBkaXJlY3RpdmVzIGluIDxjb2RlPmFjY2Vzcy5jb25mPC9jb2RlPik6PC9wPgoKICAgICAgPHByZSBjbGFzcz0icHJldHR5cHJpbnQgbGFuZy1jb25maWciPkxvYWRNb2R1bGUgc3RhdHVzX21vZHVsZSBtb2R1bGVzL21vZF9zdGF0dXMuc288L3ByZT4KCgogICAgICA8cD5JbmZvcm1hdGlvbiBvbiA8YSBocmVmPSIuLi9tb2QvbW9kX3NvLmh0bWwjY3JlYXRpbmciPmNyZWF0aW5nCiAgICAgIGxvYWRhYmxlIG1vZHVsZXM8L2E+IGlzIGFsc28gYXZhaWxhYmxlLjwvcD48L2xpPgoKICAgICAgPGxpPjxwPkFwYWNoZSBjYW4gYWxzbyBsb2FkIElTQVBJIChJbnRlcm5ldCBTZXJ2ZXIgQXBwbGljYXRpb24KICAgICAgUHJvZ3JhbW1pbmcgSW50ZXJmYWNlKSBleHRlbnNpb25zIHN1Y2ggYXMgdGhvc2UgdXNlZCBieSBNaWNyb3NvZnQKICAgICAgSUlTIGFuZCBvdGhlciBXaW5kb3dzIHNlcnZlcnMuIDxhIGhyZWY9Ii4uL21vZC9tb2RfaXNhcGkuaHRtbCI+TW9yZQogICAgICBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGU8L2E+LiBOb3RlIHRoYXQgQXBhY2hlIDxzdHJvbmc+Y2Fubm90PC9zdHJvbmc+CiAgICAgIGxvYWQgSVNBUEkgRmlsdGVycywgYW5kIElTQVBJIEhhbmRsZXJzIHdpdGggc29tZSBNaWNyb3NvZnQgZmVhdHVyZQogICAgICBleHRlbnNpb25zIHdpbGwgbm90IHdvcmsuPC9wPjwvbGk+CgogICAgICA8bGk+PHA+V2hlbiBydW5uaW5nIENHSSBzY3JpcHRzLCB0aGUgbWV0aG9kIEFwYWNoZSB1c2VzIHRvIGZpbmQKICAgICAgdGhlIGludGVycHJldGVyIGZvciB0aGUgc2NyaXB0IGlzIGNvbmZpZ3VyYWJsZSB1c2luZyB0aGUKICAgICAgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iLi4vbW9kL2NvcmUuaHRtbCNzY3JpcHRpbnRlcnByZXRlcnNvdXJjZSI+U2NyaXB0SW50ZXJwcmV0ZXJTb3VyY2U8L2E+PC9jb2RlPgogICAgICBkaXJlY3RpdmUuPC9wPjwvbGk+CgogICAgICA8bGk+PHA+U2luY2UgaXQgaXMgb2Z0ZW4gZGlmZmljdWx0IHRvIG1hbmFnZSBmaWxlcyB3aXRoIG5hbWVzCiAgICAgIGxpa2UgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBpbiBXaW5kb3dzLCB5b3UgbWF5IGZpbmQgaXQgdXNlZnVsIHRvCiAgICAgIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGlzIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiBmaWxlIHVzaW5nCiAgICAgIHRoZSA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj48YSBocmVmPSIuLi9tb2QvY29yZS5odG1sI2FjY2Vzc2ZpbGVuYW1lIj5BY2Nlc3NGaWxlbmFtZTwvYT48L2NvZGU+CiAgICAgIGRpcmVjdGl2ZS48L3A+PC9saT4KCiAgICAgIDxsaT48cD5BbnkgZXJyb3JzIGR1cmluZyBBcGFjaGUgc3RhcnR1cCBhcmUgbG9nZ2VkIGludG8gdGhlCiAgICAgIFdpbmRvd3MgZXZlbnQgbG9nIHdoZW4gcnVubmluZyBvbiBXaW5kb3dzIE5ULiBUaGlzIG1lY2hhbmlzbQogICAgICBhY3RzIGFzIGEgYmFja3VwIGZvciB0aG9zZSBzaXR1YXRpb25zIHdoZXJlIEFwYWNoZSBpcyBub3QgeWV0CiAgICAgIHByZXBhcmVkIHRvIHVzZSB0aGUgPGNvZGU+ZXJyb3IubG9nPC9jb2RlPiBmaWxlLiBZb3UgY2FuCiAgICAgIHJldmlldyB0aGUgV2luZG93cyBBcHBsaWNhdGlvbiBFdmVudCBMb2cgYnkgdXNpbmcgdGhlIEV2ZW50IFZpZXdlciwKICAgICAgZS5nLiBTdGFydCAtIFNldHRpbmdzIC0gQ29udHJvbCBQYW5lbCAtIEFkbWluaXN0cmF0aXZlIFRvb2xzCiAgICAgIC0gRXZlbnQgVmlld2VyLjwvcD48L2xpPgogICAgPC91bD4KCiAgPC9kaXY+PGRpdiBjbGFzcz0idG9wIj48YSBocmVmPSIjcGFnZS1oZWFkZXIiPjxpbWcgYWx0PSJ0b3AiIHNyYz0iLi4vaW1hZ2VzL3VwLmdpZiIgLz48L2E+PC9kaXY+CjxkaXYgY2xhc3M9InNlY3Rpb24iPgo8aDI+PGEgbmFtZT0id2luc3ZjIiBpZD0id2luc3ZjIj5SdW5uaW5nIEFwYWNoZSBhcyBhIFNlcnZpY2U8L2E+PC9oMj4KICAgIAoKICAgIDxwPkFwYWNoZSBjb21lcyB3aXRoIGEgdXRpbGl0eSBjYWxsZWQgdGhlIEFwYWNoZSBTZXJ2aWNlIE1vbml0b3IuCiAgICBXaXRoIGl0IHlvdSBjYW4gc2VlIGFuZCBtYW5hZ2UgdGhlIHN0YXRlIG9mIGFsbCBpbnN0YWxsZWQgQXBhY2hlCiAgICBzZXJ2aWNlcyBvbiBhbnkgbWFjaGluZSBvbiB5b3VyIG5ldHdvcmsuIFRvIGJlIGFibGUgdG8gbWFuYWdlIGFuCiAgICBBcGFjaGUgc2VydmljZSB3aXRoIHRoZSBtb25pdG9yLCB5b3UgaGF2ZSB0byBmaXJzdCBpbnN0YWxsIHRoZQogICAgc2VydmljZSAoZWl0aGVyIGF1dG9tYXRpY2FsbHkgdmlhIHRoZSBpbnN0YWxsYXRpb24gb3IgbWFudWFsbHkpLgogICAgPC9wPgoKICAgIDxwPllvdSBjYW4gaW5zdGFsbCBBcGFjaGUgYXMgYSBXaW5kb3dzIE5UIHNlcnZpY2UgYXMgZm9sbG93cyBmcm9tCiAgICB0aGUgY29tbWFuZCBwcm9tcHQgYXQgdGhlIEFwYWNoZSA8Y29kZT5iaW48L2NvZGU+IHN1YmRpcmVjdG9yeTo8L3A+CgogICAgPGRpdiBjbGFzcz0iZXhhbXBsZSI+PHA+PGNvZGU+CiAgICAgIGh0dHBkLmV4ZSAtayBpbnN0YWxsCiAgICA8L2NvZGU+PC9wPjwvZGl2PgoKICAgIDxwPklmIHlvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgeW91IHdhbnQgdG8KICAgIGluc3RhbGwsIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQuIFlvdSBoYXZlIHRvIGRvIHRoaXMgaWYgeW91CiAgICBoYXZlIHNldmVyYWwgZGlmZmVyZW50IHNlcnZpY2UgaW5zdGFsbGF0aW9ucyBvZiBBcGFjaGUgb24geW91cgogICAgY29tcHV0ZXIuIElmIHlvdSBzcGVjaWZ5IGEgbmFtZSBkdXJpbmcgdGhlIGluc3RhbGwsIHlvdSBoYXZlIHRvCiAgICBhbHNvIHNwZWNpZnkgaXQgZHVyaW5nIGFueSBvdGhlciAtayBvcGVyYXRpb24uPC9wPgoKICAgIDxkaXYgY2xhc3M9ImV4YW1wbGUiPjxwPjxjb2RlPgogICAgICBodHRwZC5leGUgLWsgaW5zdGFsbCAtbiAiTXlTZXJ2aWNlTmFtZSIKICAgIDwvY29kZT48L3A+PC9kaXY+CgogICAgPHA+SWYgeW91IG5lZWQgdG8gaGF2ZSBzcGVjaWZpY2FsbHkgbmFtZWQgY29uZmlndXJhdGlvbiBmaWxlcyBmb3IKICAgIGRpZmZlcmVudCBzZXJ2aWNlcywgeW91IG11c3QgdXNlIHRoaXM6PC9wPgoKICAgIDxkaXYgY2xhc3M9ImV4YW1wbGUiPjxwPjxjb2RlPgogICAgICBodHRwZC5leGUgLWsgaW5zdGFsbCAtbiAiTXlTZXJ2aWNlTmFtZSIgLWYgImM6XGZpbGVzXG15LmNvbmYiCiAgICA8L2NvZGU+PC9wPjwvZGl2PgoKICAgIDxwPklmIHlvdSB1c2UgdGhlIGZpcnN0IGNvbW1hbmQgd2l0aG91dCBhbnkgc3BlY2lhbCBwYXJhbWV0ZXJzIGV4Y2VwdAogICAgPGNvZGU+LWsgaW5zdGFsbDwvY29kZT4sIHRoZSBzZXJ2aWNlIHdpbGwgYmUgY2FsbGVkIDxjb2RlPkFwYWNoZTIuNDwvY29kZT4KICAgIGFuZCB0aGUgY29uZmlndXJhdGlvbiB3aWxsIGJlIGFzc3VtZWQgdG8gYmUgPGNvZGU+Y29uZlxodHRwZC5jb25mPC9jb2RlPi4KICAgIDwvcD4KCiAgICA8cD5SZW1vdmluZyBhbiBBcGFjaGUgc2VydmljZSBpcyBlYXN5LiBKdXN0IHVzZTo8L3A+CgogICAgPGRpdiBjbGFzcz0iZXhhbXBsZSI+PHA+PGNvZGU+CiAgICAgIGh0dHBkLmV4ZSAtayB1bmluc3RhbGwKICAgIDwvY29kZT48L3A+PC9kaXY+CgogICAgPHA+VGhlIHNwZWNpZmljIEFwYWNoZSBzZXJ2aWNlIHRvIGJlIHVuaW5zdGFsbGVkIGNhbiBiZSBzcGVjaWZpZWQgYnkgdXNpbmc6PC9wPgoKICAgIDxkaXYgY2xhc3M9ImV4YW1wbGUiPjxwPjxjb2RlPgogICAgICBodHRwZC5leGUgLWsgdW5pbnN0YWxsIC1uICJNeVNlcnZpY2VOYW1lIgogICAgPC9jb2RlPjwvcD48L2Rpdj4KCiAgICA8cD5Ob3JtYWwgc3RhcnRpbmcsIHJlc3RhcnRpbmcgYW5kIHNodXR0aW5nIGRvd24gb2YgYW4gQXBhY2hlCiAgICBzZXJ2aWNlIGlzIHVzdWFsbHkgZG9uZSB2aWEgdGhlIEFwYWNoZSBTZXJ2aWNlIE1vbml0b3IsIGJ5IHVzaW5nCiAgICBjb21tYW5kcyBsaWtlIDxjb2RlPk5FVCBTVEFSVCBBcGFjaGUyLjQ8L2NvZGU+IGFuZCA8Y29kZT5ORVQgU1RPUAogICAgQXBhY2hlMi40PC9jb2RlPiBvciB2aWEgbm9ybWFsIFdpbmRvd3Mgc2VydmljZSBtYW5hZ2VtZW50LiBCZWZvcmUKICAgIHN0YXJ0aW5nIEFwYWNoZSBhcyBhIHNlcnZpY2UgYnkgYW55IG1lYW5zLCB5b3Ugc2hvdWxkIHRlc3QgdGhlCiAgICBzZXJ2aWNlJ3MgY29uZmlndXJhdGlvbiBmaWxlIGJ5IHVzaW5nOjwvcD4KCiAgICA8ZGl2IGNsYXNzPSJleGFtcGxlIj48cD48Y29kZT4KICAgICAgaHR0cGQuZXhlIC1uICJNeVNlcnZpY2VOYW1lIiAtdAogICAgPC9jb2RlPjwvcD48L2Rpdj4KCiAgICA8cD5Zb3UgY2FuIGNvbnRyb2wgYW4gQXBhY2hlIHNlcnZpY2UgYnkgaXRzIGNvbW1hbmQgbGluZSBzd2l0Y2hlcywKICAgIHRvby4gVG8gc3RhcnQgYW4gaW5zdGFsbGVkIEFwYWNoZSBzZXJ2aWNlIHlvdSdsbCB1c2UgdGhpczo8L3A+CgogICAgPGRpdiBjbGFzcz0iZXhhbXBsZSI+PHA+PGNvZGU+CiAgICAgIGh0dHBkLmV4ZSAtayBzdGFydCAtbiAiTXlTZXJ2aWNlTmFtZSIKICAgIDwvY29kZT48L3A+PC9kaXY+CgogICAgPHA+VG8gc3RvcCBhbiBBcGFjaGUgc2VydmljZSB2aWEgdGhlIGNvbW1hbmQgbGluZSBzd2l0Y2hlcywgdXNlCiAgICB0aGlzOjwvcD4KCiAgICA8ZGl2IGNsYXNzPSJleGFtcGxlIj48cD48Y29kZT4KICAgICAgaHR0cGQuZXhlIC1rIHN0b3AgLW4gIk15U2VydmljZU5hbWUiCiAgICA8L2NvZGU+PC9wPjwvZGl2PgoKICAgIDxwPm9yPC9wPgoKICAgIDxkaXYgY2xhc3M9ImV4YW1wbGUiPjxwPjxjb2RlPgogICAgICBodHRwZC5leGUgLWsgc2h1dGRvd24gLW4gIk15U2VydmljZU5hbWUiCiAgICA8L2NvZGU+PC9wPjwvZGl2PgoKICAgIDxwPllvdSBjYW4gYWxzbyByZXN0YXJ0IGEgcnVubmluZyBzZXJ2aWNlIGFuZCBmb3JjZSBpdCB0byByZXJlYWQKICAgIGl0cyBjb25maWd1cmF0aW9uIGZpbGUgYnkgdXNpbmc6PC9wPgoKICAgIDxkaXYgY2xhc3M9ImV4YW1wbGUiPjxwPjxjb2RlPgogICAgICBodHRwZC5leGUgLWsgcmVzdGFydCAtbiAiTXlTZXJ2aWNlTmFtZSIKICAgIDwvY29kZT48L3A+PC9kaXY+CgogICAgPHA+QnkgZGVmYXVsdCwgYWxsIEFwYWNoZSBzZXJ2aWNlcyBhcmUgcmVnaXN0ZXJlZCB0byBydW4gYXMgdGhlCiAgICBzeXN0ZW0gdXNlciAodGhlIDxjb2RlPkxvY2FsU3lzdGVtPC9jb2RlPiBhY2NvdW50KS4gVGhlCiAgICA8Y29kZT5Mb2NhbFN5c3RlbTwvY29kZT4gYWNjb3VudCBoYXMgbm8gcHJpdmlsZWdlcyB0byB5b3VyIG5ldHdvcmsKICAgIHZpYSBhbnkgV2luZG93cy1zZWN1cmVkIG1lY2hhbmlzbSwgaW5jbHVkaW5nIHRoZSBmaWxlIHN5c3RlbSwgbmFtZWQKICAgIHBpcGVzLCBEQ09NLCBvciBzZWN1cmUgUlBDLiBJdCBoYXMsIGhvd2V2ZXIsIHdpZGUgcHJpdmlsZWdlcyBsb2NhbGx5LgogICAgPC9wPgoKICAgIDxkaXYgY2xhc3M9Indhcm5pbmciPjxzdHJvbmc+TmV2ZXIgZ3JhbnQgYW55IG5ldHdvcmsgcHJpdmlsZWdlcyB0bwogICAgdGhlIDxjb2RlPkxvY2FsU3lzdGVtPC9jb2RlPiBhY2NvdW50ISBJZiB5b3UgbmVlZCBBcGFjaGUgdG8gYmUgYWJsZQogICAgdG8gYWNjZXNzIG5ldHdvcmsgcmVzb3VyY2VzLCBjcmVhdGUgYSBzZXBhcmF0ZSBhY2NvdW50IGZvciBBcGFjaGUgYXMKICAgIG5vdGVkIGJlbG93Ljwvc3Ryb25nPjwvZGl2PgoKICAgIDxwPkl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdXNlcnMgY3JlYXRlIGEgc2VwYXJhdGUgYWNjb3VudCBmb3IgcnVubmluZwogICAgQXBhY2hlIHNlcnZpY2UocykuIElmIHlvdSBoYXZlIHRvIGFjY2VzcyBuZXR3b3JrIHJlc291cmNlcyB2aWEgQXBhY2hlLAogICAgdGhpcyBpcyByZXF1aXJlZC48L3A+CgogICAgPG9sPgogICAgICA8bGk+Q3JlYXRlIGEgbm9ybWFsIGRvbWFpbiB1c2VyIGFjY291bnQsIGFuZCBiZSBzdXJlIHRvCiAgICAgIG1lbW9yaXplIGl0cyBwYXNzd29yZC48L2xpPgoKICAgICAgPGxpPkdyYW50IHRoZSBuZXdseS1jcmVhdGVkIHVzZXIgYSBwcml2aWxlZ2Ugb2YgPGNvZGU+TG9nIG9uCiAgICAgIGFzIGEgc2VydmljZTwvY29kZT4gYW5kIDxjb2RlPkFjdCBhcyBwYXJ0IG9mIHRoZSBvcGVyYXRpbmcKICAgICAgc3lzdGVtPC9jb2RlPi4gT24gV2luZG93cyBOVCA0LjAgdGhlc2UgcHJpdmlsZWdlcyBhcmUgZ3JhbnRlZCB2aWEKICAgICAgVXNlciBNYW5hZ2VyIGZvciBEb21haW5zLCBidXQgb24gV2luZG93cyAyMDAwIGFuZCBYUCB5b3UgcHJvYmFibHkKICAgICAgd2FudCB0byB1c2UgR3JvdXAgUG9saWN5IGZvciBwcm9wYWdhdGluZyB0aGVzZSBzZXR0aW5ncy4gWW91IGNhbgogICAgICBhbHNvIG1hbnVhbGx5IHNldCB0aGVzZSB2aWEgdGhlIExvY2FsIFNlY3VyaXR5IFBvbGljeSBNTUMgc25hcC1pbi4KICAgICAgPC9saT4KCiAgICAgIDxsaT5Db25maXJtIHRoYXQgdGhlIGNyZWF0ZWQgYWNjb3VudCBpcyBhIG1lbWJlciBvZiB0aGUgVXNlcnMKICAgICAgZ3JvdXAuPC9saT4KCiAgICAgIDxsaT5HcmFudCB0aGUgYWNjb3VudCByZWFkIGFuZCBleGVjdXRlIChSWCkgcmlnaHRzIHRvIGFsbCBkb2N1bWVudAogICAgICBhbmQgc2NyaXB0IGZvbGRlcnMgKDxjb2RlPmh0ZG9jczwvY29kZT4gYW5kIDxjb2RlPmNnaS1iaW48L2NvZGU+CiAgICAgIGZvciBleGFtcGxlKS48L2xpPgoKICAgICAgPGxpPkdyYW50IHRoZSBhY2NvdW50IGNoYW5nZSAoUldYRCkgcmlnaHRzIHRvIHRoZQogICAgICBBcGFjaGUgPGNvZGU+bG9nczwvY29kZT4gZGlyZWN0b3J5LjwvbGk+CgogICAgICA8bGk+R3JhbnQgdGhlIGFjY291bnQgcmVhZCBhbmQgZXhlY3V0ZSAoUlgpIHJpZ2h0cyB0byB0aGUKICAgICAgPGNvZGU+aHR0cGQuZXhlPC9jb2RlPiBiaW5hcnkgZXhlY3V0YWJsZS48L2xpPgogICAgPC9vbD4KCiAgICA8ZGl2IGNsYXNzPSJub3RlIj5JdCBpcyB1c3VhbGx5IGEgZ29vZCBwcmFjdGljZSB0byBncmFudCB0aGUgdXNlciB0aGUgQXBhY2hlCiAgICBzZXJ2aWNlIHJ1bnMgYXMgcmVhZCBhbmQgZXhlY3V0ZSAoUlgpIGFjY2VzcyB0byB0aGUgd2hvbGUgQXBhY2hlMi40CiAgICBkaXJlY3RvcnksIGV4Y2VwdCB0aGUgPGNvZGU+bG9nczwvY29kZT4gc3ViZGlyZWN0b3J5LCB3aGVyZSB0aGUKICAgIHVzZXIgaGFzIHRvIGhhdmUgYXQgbGVhc3QgY2hhbmdlIChSV1hEKSByaWdodHMuPC9kaXY+CgogICAgPHA+SWYgeW91IGFsbG93IHRoZSBhY2NvdW50IHRvIGxvZyBpbiBhcyBhIHVzZXIgYW5kIGFzIGEgc2VydmljZSwKICAgIHRoZW4geW91IGNhbiBsb2cgb24gd2l0aCB0aGF0IGFjY291bnQgYW5kIHRlc3QgdGhhdCB0aGUgYWNjb3VudCBoYXMKICAgIHRoZSBwcml2aWxlZ2VzIHRvIGV4ZWN1dGUgdGhlIHNjcmlwdHMsIHJlYWQgdGhlIHdlYiBwYWdlcywgYW5kIHRoYXQKICAgIHlvdSBjYW4gc3RhcnQgQXBhY2hlIGluIGEgY29uc29sZSB3aW5kb3cuIElmIHRoaXMgd29ya3MsIGFuZCB5b3UKICAgIGhhdmUgZm9sbG93ZWQgdGhlIHN0ZXBzIGFib3ZlLCBBcGFjaGUgc2hvdWxkIGV4ZWN1dGUgYXMgYSBzZXJ2aWNlCiAgICB3aXRoIG5vIHByb2JsZW1zLjwvcD4KCiAgICA8ZGl2IGNsYXNzPSJub3RlIj48c3Ryb25nPkVycm9yIGNvZGUgMjE4Njwvc3Ryb25nPiBpcyBhIGdvb2QgaW5kaWNhdGlvbiB0aGF0CiAgICB5b3UgbmVlZCB0byByZXZpZXcgdGhlICJMb2cgT24gQXMiIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzZXJ2aWNlLAogICAgc2luY2UgQXBhY2hlIGNhbm5vdCBhY2Nlc3MgYSByZXF1aXJlZCBuZXR3b3JrIHJlc291cmNlLiBBbHNvLCBwYXkKICAgIGNsb3NlIGF0dGVudGlvbiB0byB0aGUgcHJpdmlsZWdlcyBvZiB0aGUgdXNlciBBcGFjaGUgaXMKICAgIGNvbmZpZ3VyZWQgdG8gcnVuIGFzLjwvZGl2PgoKICAgIDxwPldoZW4gc3RhcnRpbmcgQXBhY2hlIGFzIGEgc2VydmljZSB5b3UgbWF5IGVuY291bnRlciBhbiBlcnJvcgogICAgbWVzc2FnZSBmcm9tIHRoZSBXaW5kb3dzIFNlcnZpY2UgQ29udHJvbCBNYW5hZ2VyLiBGb3IgZXhhbXBsZSwKICAgIGlmIHlvdSB0cnkgdG8gc3RhcnQgQXBhY2hlIGJ5IHVzaW5nIHRoZSBTZXJ2aWNlcyBhcHBsZXQgaW4gdGhlCiAgICBXaW5kb3dzIENvbnRyb2wgUGFuZWwsIHlvdSBtYXkgZ2V0IHRoZSBmb2xsb3dpbmcgbWVzc2FnZTo8L3A+CgogICAgPGRpdiBjbGFzcz0iZXhhbXBsZSI+PHA+PGNvZGU+CiAgICAgIENvdWxkIG5vdCBzdGFydCB0aGUgQXBhY2hlMi40IHNlcnZpY2Ugb24gXFxDT01QVVRFUiA8YnIgLz4KICAgICAgRXJyb3IgMTA2NzsgVGhlIHByb2Nlc3MgdGVybWluYXRlZCB1bmV4cGVjdGVkbHkuCiAgICA8L2NvZGU+PC9wPjwvZGl2PgoKICAgIDxwPllvdSB3aWxsIGdldCB0aGlzIGdlbmVyaWMgZXJyb3IgaWYgdGhlcmUgaXMgYW55IHByb2JsZW0gd2l0aAogICAgc3RhcnRpbmcgdGhlIEFwYWNoZSBzZXJ2aWNlLiBJbiBvcmRlciB0byBzZWUgd2hhdCBpcyByZWFsbHkgY2F1c2luZwogICAgdGhlIHByb2JsZW0geW91IHNob3VsZCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBmb3IgUnVubmluZyBBcGFjaGUKICAgIGZvciBXaW5kb3dzIGZyb20gdGhlIENvbW1hbmQgUHJvbXB0LjwvcD4KCiAgICA8cD5JZiB5b3UgYXJlIGhhdmluZyBwcm9ibGVtcyB3aXRoIHRoZSBzZXJ2aWNlLCBpdCBpcyBzdWdnZXN0ZWQKICAgIHlvdSBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBiZWxvdyB0byB0cnkgc3RhcnRpbmcgaHR0cGQuZXhlIGZyb20KICAgIGEgY29uc29sZSB3aW5kb3csIGFuZCB3b3JrIG91dCB0aGUgZXJyb3JzIGJlZm9yZSBzdHJ1Z2dsaW5nIHRvCiAgICBzdGFydCBpdCBhcyBhIHNlcnZpY2UgYWdhaW4uPC9wPgogIDwvZGl2PjxkaXYgY2xhc3M9InRvcCI+PGEgaHJlZj0iI3BhZ2UtaGVhZGVyIj48aW1nIGFsdD0idG9wIiBzcmM9Ii4uL2ltYWdlcy91cC5naWYiIC8+PC9hPjwvZGl2Pgo8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KPGgyPjxhIG5hbWU9IndpbmNvbnMiIGlkPSJ3aW5jb25zIj5SdW5uaW5nIEFwYWNoZSBhcyBhIENvbnNvbGUgQXBwbGljYXRpb248L2E+PC9oMj4KICAgIAoKICAgIDxwPlJ1bm5pbmcgQXBhY2hlIGFzIGEgc2VydmljZSBpcyB1c3VhbGx5IHRoZSByZWNvbW1lbmRlZCB3YXkgdG8KICAgIHVzZSBpdCwgYnV0IGl0IGlzIHNvbWV0aW1lcyBlYXNpZXIgdG8gd29yayBmcm9tIHRoZSBjb21tYW5kIGxpbmUsCiAgICBlc3BlY2lhbGx5IGR1cmluZyBpbml0aWFsIGNvbmZpZ3VyYXRpb24gYW5kIHRlc3RpbmcuPC9wPgoKICAgIDxwPlRvIHJ1biBBcGFjaGUgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGFzIGEgY29uc29sZSBhcHBsaWNhdGlvbiwKICAgIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6PC9wPgoKICAgIDxkaXYgY2xhc3M9ImV4YW1wbGUiPjxwPjxjb2RlPgogICAgICBodHRwZC5leGUKICAgIDwvY29kZT48L3A+PC9kaXY+CgogICAgPHA+QXBhY2hlIHdpbGwgZXhlY3V0ZSwgYW5kIHdpbGwgcmVtYWluIHJ1bm5pbmcgdW50aWwgaXQgaXMgc3RvcHBlZAogICAgYnkgcHJlc3NpbmcgQ29udHJvbC1DLjwvcD4KCiAgICA8cD5Zb3UgY2FuIGFsc28gcnVuIEFwYWNoZSB2aWEgdGhlIHNob3J0Y3V0IFN0YXJ0IEFwYWNoZSBpbiBDb25zb2xlCiAgICBwbGFjZWQgdG8gPGNvZGU+U3RhcnQgTWVudSAtLSZndDsgUHJvZ3JhbXMgLS0mZ3Q7IEFwYWNoZSBIVFRQIFNlcnZlcgogICAgMi40Lnh4IC0tJmd0OyBDb250cm9sIEFwYWNoZSBTZXJ2ZXI8L2NvZGU+IGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uLgogICAgVGhpcyB3aWxsIG9wZW4gYSBjb25zb2xlIHdpbmRvdyBhbmQgc3RhcnQgQXBhY2hlIGluc2lkZSBpdC4gSWYgeW91CiAgICBkb24ndCBoYXZlIEFwYWNoZSBpbnN0YWxsZWQgYXMgYSBzZXJ2aWNlLCB0aGUgd2luZG93IHdpbGwgcmVtYWluCiAgICB2aXNpYmxlIHVudGlsIHlvdSBzdG9wIEFwYWNoZSBieSBwcmVzc2luZyBDb250cm9sLUMgaW4gdGhlIGNvbnNvbGUKICAgIHdpbmRvdyB3aGVyZSBBcGFjaGUgaXMgcnVubmluZyBpbi4gVGhlIHNlcnZlciB3aWxsIGV4aXQgaW4gYSBmZXcKICAgIHNlY29uZHMuIEhvd2V2ZXIsIGlmIHlvdSBkbyBoYXZlIEFwYWNoZSBpbnN0YWxsZWQgYXMgYSBzZXJ2aWNlLCB0aGUKICAgIHNob3J0Y3V0IHN0YXJ0cyB0aGUgc2VydmljZS4gSWYgdGhlIEFwYWNoZSBzZXJ2aWNlIGlzIHJ1bm5pbmcKICAgIGFscmVhZHksIHRoZSBzaG9ydGN1dCBkb2Vzbid0IGRvIGFueXRoaW5nLjwvcD4KCiAgICA8cD5JZiBBcGFjaGUgaXMgcnVubmluZyBhcyBhIHNlcnZpY2UsIHlvdSBjYW4gdGVsbCBpdCB0byBzdG9wIGJ5IG9wZW5pbmcgYW5vdGhlciBjb25zb2xlCiAgICB3aW5kb3cgYW5kIGVudGVyaW5nOjwvcD4KCiAgICA8ZGl2IGNsYXNzPSJleGFtcGxlIj48cD48Y29kZT4KICAgICAgaHR0cGQuZXhlIC1rIHNodXRkb3duCiAgICA8L2NvZGU+PC9wPjwvZGl2PgoKICAgIDxwPlJ1bm5pbmcgYXMgYSBzZXJ2aWNlIHNob3VsZCBiZSBwcmVmZXJyZWQgb3ZlciBydW5uaW5nIGluIGEKICAgIGNvbnNvbGUgd2luZG93IGJlY2F1c2UgdGhpcyBsZXRzIEFwYWNoZSBlbmQgYW55IGN1cnJlbnQgb3BlcmF0aW9ucwogICAgYW5kIGNsZWFuIHVwIGdyYWNlZnVsbHkuPC9wPgoKICAgIDxwPkJ1dCBpZiB0aGUgc2VydmVyIGlzIHJ1bm5pbmcgaW4gYSBjb25zb2xlIHdpbmRvdywgeW91IGNhbgogICAgb25seSBzdG9wIGl0IGJ5IHByZXNzaW5nIENvbnRyb2wtQyBpbiB0aGUgc2FtZSB3aW5kb3cuPC9wPgoKICAgIDxwPllvdSBjYW4gYWxzbyB0ZWxsIEFwYWNoZSB0byByZXN0YXJ0LiBUaGlzIGZvcmNlcyBpdCB0byByZXJlYWQKICAgIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuIEFueSBvcGVyYXRpb25zIGluIHByb2dyZXNzIGFyZSBhbGxvd2VkIHRvCiAgICBjb21wbGV0ZSB3aXRob3V0IGludGVycnVwdGlvbi4gVG8gcmVzdGFydCBBcGFjaGUsIGVpdGhlciBwcmVzcwogICAgQ29udHJvbC1CcmVhayBpbiB0aGUgY29uc29sZSB3aW5kb3cgeW91IHVzZWQgZm9yIHN0YXJ0aW5nIEFwYWNoZSwKICAgIG9yIGVudGVyPC9wPgoKICAgIDxkaXYgY2xhc3M9ImV4YW1wbGUiPjxwPjxjb2RlPgogICAgICBodHRwZC5leGUgLWsgcmVzdGFydAogICAgPC9jb2RlPjwvcD48L2Rpdj4KCiAgICA8cD5pZiB0aGUgc2VydmVyIGlzIHJ1bm5pbmcgYXMgYSBzZXJ2aWNlLjwvcD4KCiAgICA8ZGl2IGNsYXNzPSJub3RlIj5Ob3RlIGZvciBwZW9wbGUgZmFtaWxpYXIgd2l0aCB0aGUgVW5peCB2ZXJzaW9uIG9mIEFwYWNoZToKICAgIHRoZXNlIGNvbW1hbmRzIHByb3ZpZGUgYSBXaW5kb3dzIGVxdWl2YWxlbnQgdG8gPGNvZGU+a2lsbCAtVEVSTQogICAgPGVtPnBpZDwvZW0+PC9jb2RlPiBhbmQgPGNvZGU+a2lsbCAtVVNSMSA8ZW0+cGlkPC9lbT48L2NvZGU+LiBUaGUKICAgIGNvbW1hbmQgbGluZSBvcHRpb24gdXNlZCwgPGNvZGU+LWs8L2NvZGU+LCB3YXMgY2hvc2VuIGFzIGEgcmVtaW5kZXIKICAgIG9mIHRoZSA8Y29kZT5raWxsPC9jb2RlPiBjb21tYW5kIHVzZWQgb24gVW5peC48L2Rpdj4KCiAgICA8cD5JZiB0aGUgQXBhY2hlIGNvbnNvbGUgd2luZG93IGNsb3NlcyBpbW1lZGlhdGVseSBvciB1bmV4cGVjdGVkbHkKICAgIGFmdGVyIHN0YXJ0dXAsIG9wZW4gdGhlIENvbW1hbmQgUHJvbXB0IGZyb20gdGhlIFN0YXJ0IE1lbnUgLS0mZ3Q7CiAgICBQcm9ncmFtcy4gQ2hhbmdlIHRvIHRoZSBmb2xkZXIgdG8gd2hpY2ggeW91IGluc3RhbGxlZCBBcGFjaGUsIHR5cGUKICAgIHRoZSBjb21tYW5kIDxjb2RlPmh0dHBkLmV4ZTwvY29kZT4sIGFuZCByZWFkIHRoZSBlcnJvciBtZXNzYWdlLiBUaGVuCiAgICBjaGFuZ2UgdG8gdGhlIGxvZ3MgZm9sZGVyLCBhbmQgcmV2aWV3IHRoZSA8Y29kZT5lcnJvci5sb2c8L2NvZGU+CiAgICBmaWxlIGZvciBjb25maWd1cmF0aW9uIG1pc3Rha2VzLiBBc3N1bWluZyBodHRwZCB3YXMgaW5zdGFsbGVkIGludG8KICAgIDxjb2RlPkM6XFByb2dyYW0gRmlsZXNcQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb25cQXBhY2hlMi40XDwvY29kZT4sCiAgICB5b3UgY2FuIGRvIHRoZSBmb2xsb3dpbmc6PC9wPgoKICAgIDxkaXYgY2xhc3M9ImV4YW1wbGUiPjxwPjxjb2RlPgogICAgICBjOiA8YnIgLz4KICAgICAgY2QgIlxQcm9ncmFtIEZpbGVzXEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uXEFwYWNoZTIuNFxiaW4iIDxiciAvPgogICAgICBodHRwZC5leGUKICAgIDwvY29kZT48L3A+PC9kaXY+CgogICAgPHA+VGhlbiB3YWl0IGZvciBBcGFjaGUgdG8gc3RvcCwgb3IgcHJlc3MgQ29udHJvbC1DLiBUaGVuIGVudGVyIHRoZQogICAgZm9sbG93aW5nOjwvcD4KCiAgICA8ZGl2IGNsYXNzPSJleGFtcGxlIj48cD48Y29kZT4KICAgICAgY2QgLi5cbG9ncyA8YnIgLz4KICAgICAgbW9yZSAmbHQ7IGVycm9yLmxvZwogICAgPC9jb2RlPjwvcD48L2Rpdj4KCiAgICA8cD5XaGVuIHdvcmtpbmcgd2l0aCBBcGFjaGUgaXQgaXMgaW1wb3J0YW50IHRvIGtub3cgaG93IGl0IHdpbGwKICAgIGZpbmQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4gWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiBmaWxlCiAgICBvbiB0aGUgY29tbWFuZCBsaW5lIGluIHR3byB3YXlzOjwvcD4KCiAgICA8dWw+CiAgICAgIDxsaT48cD48Y29kZT4tZjwvY29kZT4gc3BlY2lmaWVzIGFuIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGggdG8KICAgICAgYSBwYXJ0aWN1bGFyIGNvbmZpZ3VyYXRpb24gZmlsZTo8L3A+CgogICAgICA8ZGl2IGNsYXNzPSJleGFtcGxlIj48cD48Y29kZT4KICAgICAgICBodHRwZC5leGUgLWYgImM6XG15IHNlcnZlciBmaWxlc1xhbm90aGVyY29uZmlnLmNvbmYiCiAgICAgIDwvY29kZT48L3A+PC9kaXY+CgogICAgICA8cD5vcjwvcD4KCiAgICAgIDxkaXYgY2xhc3M9ImV4YW1wbGUiPjxwPjxjb2RlPgogICAgICAgIGh0dHBkLmV4ZSAtZiBmaWxlc1xhbm90aGVyY29uZmlnLmNvbmYKICAgICAgPC9jb2RlPjwvcD48L2Rpdj48L2xpPgoKICAgICAgPGxpPjxwPjxjb2RlPi1uPC9jb2RlPiBzcGVjaWZpZXMgdGhlIGluc3RhbGxlZCBBcGFjaGUgc2VydmljZQogICAgICB3aG9zZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgdG8gYmUgdXNlZDo8L3A+CgogICAgICA8ZGl2IGNsYXNzPSJleGFtcGxlIj48cD48Y29kZT4KICAgICAgICBodHRwZC5leGUgLW4gIk15U2VydmljZU5hbWUiCiAgICAgIDwvY29kZT48L3A+PC9kaXY+CiAgICAgIDwvbGk+CiAgICA8L3VsPgoKICAgIDxwPkluIGJvdGggb2YgdGhlc2UgY2FzZXMsIHRoZSBwcm9wZXIKICAgIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvYT48L2NvZGU+IHNob3VsZCBiZSBzZXQgaW4KICAgIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuPC9wPgoKICAgIDxwPklmIHlvdSBkb24ndCBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiBmaWxlIHdpdGggPGNvZGU+LWY8L2NvZGU+CiAgICBvciA8Y29kZT4tbjwvY29kZT4sIEFwYWNoZSB3aWxsIHVzZSB0aGUgZmlsZSBuYW1lIGNvbXBpbGVkIGludG8gdGhlCiAgICBzZXJ2ZXIsIHN1Y2ggYXMgPGNvZGU+Y29uZlxodHRwZC5jb25mPC9jb2RlPi4gVGhpcyBidWlsdC1pbiBwYXRoCiAgICBpcyByZWxhdGl2ZSB0byB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4gWW91IGNhbiB2ZXJpZnkgdGhlIGNvbXBpbGVkCiAgICBmaWxlIG5hbWUgZnJvbSBhIHZhbHVlIGxhYmVsbGVkIGFzIDxjb2RlPlNFUlZFUl9DT05GSUdfRklMRTwvY29kZT4gd2hlbgogICAgaW52b2tpbmcgQXBhY2hlIHdpdGggdGhlIDxjb2RlPi1WPC9jb2RlPiBzd2l0Y2gsIGxpa2UgdGhpczo8L3A+CgogICAgPGRpdiBjbGFzcz0iZXhhbXBsZSI+PHA+PGNvZGU+CiAgICAgIGh0dHBkLmV4ZSAtVgogICAgPC9jb2RlPjwvcD48L2Rpdj4KCiAgICA8cD5BcGFjaGUgd2lsbCB0aGVuIHRyeSB0byBkZXRlcm1pbmUgaXRzIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvYT48L2NvZGU+IGJ5IHRyeWluZyB0aGUgZm9sbG93aW5nLCBpbiB0aGlzIG9yZGVyOjwvcD4KCiAgICA8b2w+CiAgICAgIDxsaT5BIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvYT48L2NvZGU+IGRpcmVjdGl2ZQogICAgICB2aWEgdGhlIDxjb2RlPi1DPC9jb2RlPiBjb21tYW5kIGxpbmUgc3dpdGNoLjwvbGk+CgogICAgICA8bGk+VGhlIDxjb2RlPi1kPC9jb2RlPiBzd2l0Y2ggb24gdGhlIGNvbW1hbmQgbGluZS48L2xpPgoKICAgICAgPGxpPkN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuPC9saT4KCiAgICAgIDxsaT5BIHJlZ2lzdHJ5IGVudHJ5IHdoaWNoIHdhcyBjcmVhdGVkIGlmIHlvdSBkaWQgYSBiaW5hcnkKICAgICAgaW5zdGFsbGF0aW9uLjwvbGk+CgogICAgICA8bGk+VGhlIHNlcnZlciByb290IGNvbXBpbGVkIGludG8gdGhlIHNlcnZlci4gVGhpcyBpcyA8Y29kZT4KICAgICAgL2FwYWNoZTwvY29kZT4gYnkgZGVmYXVsdCwgeW91IGNhbiB2ZXJpZnkgaXQgYnkgdXNpbmcgPGNvZGU+CiAgICAgIGh0dHBkLmV4ZSAtVjwvY29kZT4gYW5kIGxvb2tpbmcgZm9yIGEgdmFsdWUgbGFiZWxsZWQgYXMKICAgICAgPGNvZGU+SFRUUERfUk9PVDwvY29kZT4uPC9saT4KICAgIDwvb2w+CgogICAgPHA+SWYgeW91IGRpZCBub3QgZG8gYSBiaW5hcnkgaW5zdGFsbCwgQXBhY2hlIHdpbGwgaW4gc29tZQogICAgc2NlbmFyaW9zIGNvbXBsYWluIGFib3V0IHRoZSBtaXNzaW5nIHJlZ2lzdHJ5IGtleS4gVGhpcyB3YXJuaW5nIGNhbgogICAgYmUgaWdub3JlZCBpZiB0aGUgc2VydmVyIHdhcyBvdGhlcndpc2UgYWJsZSB0byBmaW5kIGl0cwogICAgY29uZmlndXJhdGlvbiBmaWxlLjwvcD4KCiAgICA8cD5UaGUgdmFsdWUgb2YgdGhpcyBrZXkgaXMgdGhlCiAgICA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj48YSBocmVmPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcnJvb3QiPlNlcnZlclJvb3Q8L2E+PC9jb2RlPiBkaXJlY3Rvcnkgd2hpY2gKICAgIGNvbnRhaW5zIHRoZSA8Y29kZT5jb25mPC9jb2RlPiBzdWJkaXJlY3RvcnkuIFdoZW4gQXBhY2hlIHN0YXJ0cyBpdAogICAgcmVhZHMgdGhlIDxjb2RlPmh0dHBkLmNvbmY8L2NvZGU+IGZpbGUgZnJvbSB0aGF0IGRpcmVjdG9yeS4gSWYKICAgIHRoaXMgZmlsZSBjb250YWlucyBhIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvYT48L2NvZGU+CiAgICBkaXJlY3RpdmUgd2hpY2ggY29udGFpbnMgYSBkaWZmZXJlbnQgZGlyZWN0b3J5IGZyb20gdGhlIG9uZQogICAgb2J0YWluZWQgZnJvbSB0aGUgcmVnaXN0cnkga2V5IGFib3ZlLCBBcGFjaGUgd2lsbCBmb3JnZXQgdGhlCiAgICByZWdpc3RyeSBrZXkgYW5kIHVzZSB0aGUgZGlyZWN0b3J5IGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4gSWYKICAgIHlvdSBjb3B5IHRoZSBBcGFjaGUgZGlyZWN0b3J5IG9yIGNvbmZpZ3VyYXRpb24gZmlsZXMgdG8gYSBuZXcKICAgIGxvY2F0aW9uIGl0IGlzIHZpdGFsIHRoYXQgeW91IHVwZGF0ZSB0aGUKICAgIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvYT48L2NvZGU+IGRpcmVjdGl2ZSBpbiB0aGUKICAgIDxjb2RlPmh0dHBkLmNvbmY8L2NvZGU+IGZpbGUgdG8gcmVmbGVjdCB0aGUgbmV3IGxvY2F0aW9uLjwvcD4KICA8L2Rpdj48ZGl2IGNsYXNzPSJ0b3AiPjxhIGhyZWY9IiNwYWdlLWhlYWRlciI+PGltZyBhbHQ9InRvcCIgc3JjPSIuLi9pbWFnZXMvdXAuZ2lmIiAvPjwvYT48L2Rpdj4KPGRpdiBjbGFzcz0ic2VjdGlvbiI+CjxoMj48YSBuYW1lPSJ0ZXN0IiBpZD0idGVzdCI+VGVzdGluZyB0aGUgSW5zdGFsbGF0aW9uPC9hPjwvaDI+CiAgICAKCiAgICA8cD5BZnRlciBzdGFydGluZyBBcGFjaGUgKGVpdGhlciBpbiBhIGNvbnNvbGUgd2luZG93IG9yIGFzIGEKICAgIHNlcnZpY2UpIGl0IHdpbGwgYmUgbGlzdGVuaW5nIG9uIHBvcnQgODAgKHVubGVzcyB5b3UgY2hhbmdlZCB0aGUKICAgIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4uL21vZC9tcG1fY29tbW9uLmh0bWwjbGlzdGVuIj5MaXN0ZW48L2E+PC9jb2RlPiBkaXJlY3RpdmUgaW4gdGhlCiAgICBjb25maWd1cmF0aW9uIGZpbGVzIG9yIGluc3RhbGxlZCBBcGFjaGUgb25seSBmb3IgdGhlIGN1cnJlbnQgdXNlcikuCiAgICBUbyBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIgYW5kIGFjY2VzcyB0aGUgZGVmYXVsdCBwYWdlLCBsYXVuY2ggYQogICAgYnJvd3NlciBhbmQgZW50ZXIgdGhpcyBVUkw6PC9wPgoKICAgIDxkaXYgY2xhc3M9ImV4YW1wbGUiPjxwPjxjb2RlPgogICAgICBodHRwOi8vbG9jYWxob3N0LwogICAgPC9jb2RlPjwvcD48L2Rpdj4KCiAgICA8cD5BcGFjaGUgc2hvdWxkIHJlc3BvbmQgd2l0aCBhIHdlbGNvbWUgcGFnZSBhbmQgeW91IHNob3VsZCBzZWUKICAgICJJdCBXb3JrcyEiLiBJZiBub3RoaW5nIGhhcHBlbnMgb3IgeW91IGdldCBhbiBlcnJvciwgbG9vayBpbiB0aGUKICAgIDxjb2RlPmVycm9yLmxvZzwvY29kZT4gZmlsZSBpbiB0aGUgPGNvZGU+bG9nczwvY29kZT4gc3ViZGlyZWN0b3J5LgogICAgSWYgeW91ciBob3N0IGlzIG5vdCBjb25uZWN0ZWQgdG8gdGhlIG5ldCwgb3IgaWYgeW91IGhhdmUgc2VyaW91cwogICAgcHJvYmxlbXMgd2l0aCB5b3VyIEROUyAoRG9tYWluIE5hbWUgU2VydmljZSkgY29uZmlndXJhdGlvbiwgeW91CiAgICBtYXkgaGF2ZSB0byB1c2UgdGhpcyBVUkw6PC9wPgoKICAgIDxkaXYgY2xhc3M9ImV4YW1wbGUiPjxwPjxjb2RlPgogICAgICBodHRwOi8vMTI3LjAuMC4xLwogICAgPC9jb2RlPjwvcD48L2Rpdj4KCiAgICA8cD5JZiB5b3UgaGFwcGVuIHRvIGJlIHJ1bm5pbmcgQXBhY2hlIG9uIGFuIGFsdGVybmF0ZSBwb3J0LCB5b3UKICAgIG5lZWQgdG8gZXhwbGljaXRseSBwdXQgdGhhdCBpbiB0aGUgVVJMOjwvcD4KCiAgICA8ZGl2IGNsYXNzPSJleGFtcGxlIj48cD48Y29kZT4KICAgICAgaHR0cDovLzEyNy4wLjAuMTo4MDgwLwogICAgPC9jb2RlPjwvcD48L2Rpdj4KCiAgICA8cD5PbmNlIHlvdXIgYmFzaWMgaW5zdGFsbGF0aW9uIGlzIHdvcmtpbmcsIHlvdSBzaG91bGQgY29uZmlndXJlIGl0CiAgICBwcm9wZXJseSBieSBlZGl0aW5nIHRoZSBmaWxlcyBpbiB0aGUgPGNvZGU+Y29uZjwvY29kZT4gc3ViZGlyZWN0b3J5LgogICAgQWdhaW4sIGlmIHlvdSBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIFdpbmRvd3MgTlQgc2VydmljZQogICAgZm9yIEFwYWNoZSwgZmlyc3QgYXR0ZW1wdCB0byBzdGFydCBpdCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgdG8KICAgIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZXJ2aWNlIHN0YXJ0cyB3aXRoIG5vIGVycm9ycy48L3A+CgogICAgPHA+QmVjYXVzZSBBcGFjaGUgPHN0cm9uZz5jYW5ub3Q8L3N0cm9uZz4gc2hhcmUgdGhlIHNhbWUgcG9ydCB3aXRoCiAgICBhbm90aGVyIFRDUC9JUCBhcHBsaWNhdGlvbiwgeW91IG1heSBuZWVkIHRvIHN0b3AsIHVuaW5zdGFsbCBvciByZWNvbmZpZ3VyZQogICAgY2VydGFpbiBvdGhlciBzZXJ2aWNlcyBiZWZvcmUgcnVubmluZyBBcGFjaGUuIFRoZXNlIGNvbmZsaWN0aW5nCiAgICBzZXJ2aWNlcyBpbmNsdWRlIG90aGVyIFdXVyBzZXJ2ZXJzLCBzb21lIGZpcmV3YWxsIGltcGxlbWVudGF0aW9ucywKICAgIGFuZCBldmVuIHNvbWUgY2xpZW50IGFwcGxpY2F0aW9ucyAoc3VjaCBhcyBTa3lwZSkgd2hpY2ggd2lsbCB1c2UgcG9ydAogICAgODAgdG8gYXR0ZW1wdCB0byBieXBhc3MgZmlyZXdhbGwgaXNzdWVzLjwvcD4KICA8L2Rpdj48ZGl2IGNsYXNzPSJ0b3AiPjxhIGhyZWY9IiNwYWdlLWhlYWRlciI+PGltZyBhbHQ9InRvcCIgc3JjPSIuLi9pbWFnZXMvdXAuZ2lmIiAvPjwvYT48L2Rpdj4KPGRpdiBjbGFzcz0ic2VjdGlvbiI+CjxoMj48YSBuYW1lPSJ3aW5kcml2ZW1hcCIgaWQ9IndpbmRyaXZlbWFwIj5Db25maWd1cmluZyBBY2Nlc3MgdG8gTmV0d29yayBSZXNvdXJjZXM8L2E+PC9oMj4KICAgIAoKICA8cD5BY2Nlc3MgdG8gZmlsZXMgb3ZlciB0aGUgbmV0d29yayBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIHR3bwogIG1lY2hhbmlzbXMgcHJvdmlkZWQgYnkgV2luZG93czo8L3A+CgogIDxkbD4KICAgIDxkdD5NYXBwZWQgZHJpdmUgbGV0dGVyczwvZHQ+CiAgICA8ZGQ+ZS5nLiwgPGNvZGU+QWxpYXMgIi9pbWFnZXMvIiAiWjovIjwvY29kZT48L2RkPgoKICAgIDxkdD5VTkMgcGF0aHM8L2R0PgogICAgPGRkPmUuZy4sIDxjb2RlPkFsaWFzICIvaW1hZ2VzLyIgIi8vaW1hZ2Vob3N0L3d3dy9pbWFnZXMvIjwvY29kZT48L2RkPgogIDwvZGw+CgogIDxwPk1hcHBlZCBkcml2ZSBsZXR0ZXJzIGFsbG93IHRoZSBhZG1pbmlzdHJhdG9yIHRvIG1haW50YWluIHRoZQogIG1hcHBpbmcgdG8gYSBzcGVjaWZpYyBtYWNoaW5lIGFuZCBwYXRoIG91dHNpZGUgb2YgdGhlIEFwYWNoZSBodHRwZAogIGNvbmZpZ3VyYXRpb24uICBIb3dldmVyLCB0aGVzZSBtYXBwaW5ncyBhcmUgYXNzb2NpYXRlZCBvbmx5IHdpdGgKICBpbnRlcmFjdGl2ZSBzZXNzaW9ucyBhbmQgYXJlIG5vdCBkaXJlY3RseSBhdmFpbGFibGUgdG8gQXBhY2hlIGh0dHBkCiAgd2hlbiBpdCBpcyBzdGFydGVkIGFzIGEgc2VydmljZS4gIDxzdHJvbmc+VXNlIG9ubHkgVU5DIHBhdGhzIGZvcgogIG5ldHdvcmsgcmVzb3VyY2VzIGluIGh0dHBkLmNvbmY8L3N0cm9uZz4gc28gdGhhdCB0aGUgcmVzb3VyY2VzIGNhbgogIGJlIGFjY2Vzc2VkIGNvbnNpc3RlbnRseSByZWdhcmRsZXNzIG9mIGhvdyBBcGFjaGUgaHR0cGQgaXMgc3RhcnRlZC4KICAoQXJjYW5lIGFuZCBlcnJvciBwcm9uZSBwcm9jZWR1cmVzIG1heSB3b3JrIGFyb3VuZCB0aGUgcmVzdHJpY3Rpb24KICBvbiBtYXBwZWQgZHJpdmUgbGV0dGVycywgYnV0IHRoaXMgaXMgbm90IHJlY29tbWVuZGVkLik8L3A+CgogIDxkaXYgY2xhc3M9ImV4YW1wbGUiPjxoMz5FeGFtcGxlIERvY3VtZW50Um9vdCB3aXRoIFVOQyBwYXRoPC9oMz48cHJlIGNsYXNzPSJwcmV0dHlwcmludCBsYW5nLWNvbmZpZyI+RG9jdW1lbnRSb290ICIvL2RvY2hvc3Qvd3d3L2h0bWwvIjwvcHJlPgo8L2Rpdj4KCiAgPGRpdiBjbGFzcz0iZXhhbXBsZSI+PGgzPkV4YW1wbGUgRG9jdW1lbnRSb290IHdpdGggSVAgYWRkcmVzcyBpbiBVTkMgcGF0aDwvaDM+PHByZSBjbGFzcz0icHJldHR5cHJpbnQgbGFuZy1jb25maWciPkRvY3VtZW50Um9vdCAiLy8xOTIuMTY4LjEuNTAvZG9jcy8iPC9wcmU+CjwvZGl2PgoKICA8ZGl2IGNsYXNzPSJleGFtcGxlIj48aDM+RXhhbXBsZSBBbGlhcyBhbmQgY29ycmVzcG9uZGluZyBEaXJlY3Rvcnkgd2l0aCBVTkMgcGF0aDwvaDM+PHByZSBjbGFzcz0icHJldHR5cHJpbnQgbGFuZy1jb25maWciPkFsaWFzICIvaW1hZ2VzLyIgIi8vaW1hZ2Vob3N0L3d3dy9pbWFnZXMvIgoKJmx0O0RpcmVjdG9yeSAiLy9pbWFnZWhvc3Qvd3d3L2ltYWdlcy8iJmd0OwojLi4uCiZsdDtEaXJlY3RvcnkmZ3Q7PC9wcmU+CjwvZGl2PgoKICA8cD5XaGVuIHJ1bm5pbmcgQXBhY2hlIGh0dHBkIGFzIGEgc2VydmljZSwgeW91IG11c3QgY3JlYXRlIGEKICBzZXBhcmF0ZSBhY2NvdW50IGluIG9yZGVyIHRvIGFjY2VzcyBuZXR3b3JrIHJlc291cmNlcywgYXMgZGVzY3JpYmVkCiAgYWJvdmUuPC9wPgogIDwvZGl2PjxkaXYgY2xhc3M9InRvcCI+PGEgaHJlZj0iI3BhZ2UtaGVhZGVyIj48aW1nIGFsdD0idG9wIiBzcmM9Ii4uL2ltYWdlcy91cC5naWYiIC8+PC9hPjwvZGl2Pgo8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KPGgyPjxhIG5hbWU9InR1bmluZyIgaWQ9InR1bmluZyI+V2luZG93cyBUdW5pbmc8L2E+PC9oMj4KICAgIAogICAgPHVsPgogICAgICA8bGk+PHA+SWYgbW9yZSB0aGFuIGEgZmV3IGRvemVuIHBpcGVkIGxvZ2dlcnMgYXJlIHVzZWQgb24gYW4gb3BlcmF0aW5nIHN5c3RlbSAKICAgICAgaW5zdGFuY2UsIHNjYWxpbmcgdXAgdGhlICJkZXNrdG9wIGhlYXAiIGlzIG9mdGVuIG5lY2Vzc2FyeS4gRm9yCiAgICAgIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSA8YSBocmVmPSIuLi9sb2dzLmh0bWwjcGlwZWQiPnBpcGVkIGxvZ2dpbmc8L2E+IGRvY3VtZW50YXRpb24uPC9wPjwvbGk+CiAgICA8L3VsPgogIDwvZGl2PjwvZGl2Pgo8ZGl2IGNsYXNzPSJib3R0b21sYW5nIj4KPHA+PHNwYW4+QXZhaWxhYmxlIExhbmd1YWdlczogPC9zcGFuPjxhIGhyZWY9Ii4uL2VuL3BsYXRmb3JtL3dpbmRvd3MuaHRtbCIgdGl0bGU9IkVuZ2xpc2giPiZuYnNwO2VuJm5ic3A7PC9hPiB8CjxhIGhyZWY9Ii4uL2ZyL3BsYXRmb3JtL3dpbmRvd3MuaHRtbCIgaHJlZmxhbmc9ImZyIiByZWw9ImFsdGVybmF0ZSIgdGl0bGU9IkZyYW7nYWlzIj4mbmJzcDtmciZuYnNwOzwvYT4gfAo8YSBocmVmPSIuLi9rby9wbGF0Zm9ybS93aW5kb3dzLmh0bWwiIGhyZWZsYW5nPSJrbyIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJLb3JlYW4iPiZuYnNwO2tvJm5ic3A7PC9hPjwvcD4KPC9kaXY+PGRpdiBjbGFzcz0idG9wIj48YSBocmVmPSIjcGFnZS1oZWFkZXIiPjxpbWcgc3JjPSIuLi9pbWFnZXMvdXAuZ2lmIiBhbHQ9InRvcCIgLz48L2E+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdGlvbiI+PGgyPjxhIGlkPSJjb21tZW50c19zZWN0aW9uIiBuYW1lPSJjb21tZW50c19zZWN0aW9uIj5Db21tZW50czwvYT48L2gyPjxkaXYgY2xhc3M9Indhcm5pbmciPjxzdHJvbmc+Tm90aWNlOjwvc3Ryb25nPjxiciAvPlRoaXMgaXMgbm90IGEgUSZhbXA7QSBzZWN0aW9uLiBDb21tZW50cyBwbGFjZWQgaGVyZSBzaG91bGQgYmUgcG9pbnRlZCB0b3dhcmRzIHN1Z2dlc3Rpb25zIG9uIGltcHJvdmluZyB0aGUgZG9jdW1lbnRhdGlvbiBvciBzZXJ2ZXIsIGFuZCBtYXkgYmUgcmVtb3ZlZCBhZ2FpbiBieSBvdXIgbW9kZXJhdG9ycyBpZiB0aGV5IGFyZSBlaXRoZXIgaW1wbGVtZW50ZWQgb3IgY29uc2lkZXJlZCBpbnZhbGlkL29mZi10b3BpYy4gUXVlc3Rpb25zIG9uIGhvdyB0byBtYW5hZ2UgdGhlIEFwYWNoZSBIVFRQIFNlcnZlciBzaG91bGQgYmUgZGlyZWN0ZWQgYXQgZWl0aGVyIG91ciBJUkMgY2hhbm5lbCwgI2h0dHBkLCBvbiBGcmVlbm9kZSwgb3Igc2VudCB0byBvdXIgPGEgaHJlZj0iaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvbGlzdHMuaHRtbCI+bWFpbGluZyBsaXN0czwvYT4uPC9kaXY+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tLy8tLT48IVtDREFUQVsvLz48IS0tCnZhciBjb21tZW50c19zaG9ydG5hbWUgPSAnaHR0cGQnOwp2YXIgY29tbWVudHNfaWRlbnRpZmllciA9ICdodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy9kb2NzLzIuNC9wbGF0Zm9ybS93aW5kb3dzLmh0bWwnOwooZnVuY3Rpb24odywgZCkgewogICAgaWYgKHcubG9jYXRpb24uaG9zdG5hbWUudG9Mb3dlckNhc2UoKSA9PSAiaHR0cGQuYXBhY2hlLm9yZyIpIHsKICAgICAgICBkLndyaXRlKCc8ZGl2IGlkPSJjb21tZW50c190aHJlYWQiPjxcL2Rpdj4nKTsKICAgICAgICB2YXIgcyA9IGQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgICAgcy50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7CiAgICAgICAgcy5hc3luYyA9IHRydWU7CiAgICAgICAgcy5zcmMgPSAnaHR0cHM6Ly9jb21tZW50cy5hcGFjaGUub3JnL3Nob3dfY29tbWVudHMubHVhP3NpdGU9JyArIGNvbW1lbnRzX3Nob3J0bmFtZSArICcmcGFnZT0nICsgY29tbWVudHNfaWRlbnRpZmllcjsKICAgICAgICAoZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdIHx8IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXSkuYXBwZW5kQ2hpbGQocyk7CiAgICB9CiAgICBlbHNlIHsgCiAgICAgICAgZC53cml0ZSgnPGRpdiBpZD0iY29tbWVudHNfdGhyZWFkIj5Db21tZW50cyBhcmUgZGlzYWJsZWQgZm9yIHRoaXMgcGFnZSBhdCB0aGUgbW9tZW50LjxcL2Rpdj4nKTsKICAgIH0KfSkod2luZG93LCBkb2N1bWVudCk7Ci8vLS0+PCFdXT48L3NjcmlwdD48L2Rpdj48ZGl2IGlkPSJmb290ZXIiPgo8cCBjbGFzcz0iYXBhY2hlIj5Db3B5cmlnaHQgMjAxNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uPGJyIC8+TGljZW5zZWQgdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+QXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9hPi48L3A+CjxwIGNsYXNzPSJtZW51Ij48YSBocmVmPSIuLi9tb2QvIj5Nb2R1bGVzPC9hPiB8IDxhIGhyZWY9Ii4uL21vZC9kaXJlY3RpdmVzLmh0bWwiPkRpcmVjdGl2ZXM8L2E+IHwgPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9odHRwZC9GQVEiPkZBUTwvYT4gfCA8YSBocmVmPSIuLi9nbG9zc2FyeS5odG1sIj5HbG9zc2FyeTwvYT4gfCA8YSBocmVmPSIuLi9zaXRlbWFwLmh0bWwiPlNpdGVtYXA8L2E+PC9wPjwvZGl2PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tLy8tLT48IVtDREFUQVsvLz48IS0tCmlmICh0eXBlb2YocHJldHR5UHJpbnQpICE9PSAndW5kZWZpbmVkJykgewogICAgcHJldHR5UHJpbnQoKTsKfQovLy0tPjwhXV0+PC9zY3JpcHQ+CjwvYm9keT48L2h0bWw+