PGh0bWw+CjxoZWFkPgogIDx0aXRsZT5UdXRvcmlhbDogV3JpdGluZyBUYXNrczwvdGl0bGU+CiAgPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSJKYW4gTWF06HJuZSI+CiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICA8IS0tCiAgLmNvZGUgeyBiYWNrZ3JvdW5kOiAjRUZFRkVGOyBtYXJnaW4tdG9wOiB9CiAgLm91dHB1dCB7IGNvbG9yOiAjRkZGRkZGOyBiYWNrZ3JvdW5kOiAjODM3QTY3OyB9CiAgLS0+CiAgPC9zdHlsZT4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldHMvYW50bWFudWFsLmNzcyI+CjwvaGVhZD4KPGJvZHk+CjxoMT5UdXRvcmlhbDogV3JpdGluZyBUYXNrczwvaDE+Cgo8cD5UaGlzIGRvY3VtZW50IHByb3ZpZGVzIGEgc3RlcCBieSBzdGVwIHR1dG9yaWFsIGZvciB3cml0aW5nCnRhc2tzLjwvcD4KPGgyPkNvbnRlbnQ8L2gyPgo8cD48dWw+CjxsaT48YSBocmVmPSIjYnVpbGRlbnZpcm9ubWVudCI+U2V0IHVwIHRoZSBidWlsZCBlbnZpcm9ubWVudDwvYT48L2xpPgo8bGk+PGEgaHJlZj0iI3dyaXRlMSI+V3JpdGUgdGhlIFRhc2s8L2E+PC9saT4KPGxpPjxhIGhyZWY9IiN1c2UxIj5Vc2UgdGhlIFRhc2s8L2E+PC9saT4KPGxpPjxhIGhyZWY9IiNUYXNrQWRhcHRlciI+SW50ZWdyYXRpb24gd2l0aCBUYXNrQWRhcHRlcjwvYT48L2xpPgo8bGk+PGEgaHJlZj0iI2Rlcml2aW5nRnJvbVRhc2siPkRlcml2aW5nIGZyb20gQW50J3MgVGFzazwvYT48L2xpPgo8bGk+PGEgaHJlZj0iI2F0dHJpYnV0ZXMiPkF0dHJpYnV0ZXM8L2E+PC9saT4KPGxpPjxhIGhyZWY9IiNOZXN0ZWRUZXh0Ij5OZXN0ZWQgVGV4dDwvYT48L2xpPgo8bGk+PGEgaHJlZj0iI05lc3RlZEVsZW1lbnRzIj5OZXN0ZWQgRWxlbWVudHM8L2E+PC9saT4KPGxpPjxhIGhyZWY9IiNjb21wbGV4Ij5PdXIgdGFzayBpbiBhIGxpdHRsZSBtb3JlIGNvbXBsZXggdmVyc2lvbjwvYT48L2xpPgo8bGk+PGEgaHJlZj0iI1Rlc3RpbmdUYXNrcyI+VGVzdCB0aGUgVGFzazwvYT48L2xpPgo8bGk+PGEgaHJlZj0iI3Jlc291cmNlcyI+UmVzb3VyY2VzPC9hPjwvbGk+CjwvdWw+PC9wPgoKPGEgbmFtZT0iYnVpbGRlbnZpcm9ubWVudCI+PC9hPgo8aDI+U2V0IHVwIHRoZSBidWlsZCBlbnZpcm9ubWVudDwvaDI+CjxwPkFudCBidWlsZHMgaXRzZWxmLCB3ZSBhcmUgdXNpbmcgQW50IHRvbyAod2h5IHdlIHdvdWxkIHdyaXRlCmEgdGFzayBpZiBub3Q/IDotKSB0aGVyZWZvcmUgd2Ugc2hvdWxkIHVzZSBBbnQgZm9yIG91ciBidWlsZC48cD4KPHA+V2UgY2hvb3NlIGEgZGlyZWN0b3J5IGFzIHJvb3QgZGlyZWN0b3J5LiBBbGwgdGhpbmdzIHdpbGwgYmUgZG9uZQpoZXJlIGlmIEkgc2F5IG5vdGhpbmcgZGlmZmVyZW50LiBJIHdpbGwgcmVmZXJlbmNlIHRoaXMgZGlyZWN0b3J5CmFzIDxpPnJvb3QtZGlyZWN0b3J5PC9pPiBvZiBvdXIgcHJvamVjdC4gSW4gdGhpcyByb290LWRpcmVjdG9yeSB3ZQpjcmVhdGUgYSB0ZXh0IGZpbGUgbmFtZXMgPGk+YnVpbGQueG1sPC9pPi4gV2hhdCBzaG91bGQgQW50IGRvIGZvciB1cz8KPHVsPgo8bGk+Y29tcGlsZXMgbXkgc3R1ZmY8L2xpPgo8bGk+bWFrZSB0aGUgamFyLCBzbyB0aGF0IEkgY2FuIGRlcGxveSBpdDwvbGk+CjxsaT5jbGVhbiB1cCBldmVyeXRoaW5nPC9saT4KPC91bD4KU28gdGhlIGJ1aWxkZmlsZSBjb250YWlucyB0aHJlZSB0YXJnZXRzLgo8cHJlIGNsYXNzPSJjb2RlIj4KJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Jmd0OwombHQ7cHJvamVjdCBuYW1lPSJNeVRhc2siIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImphciImZ3Q7CgogICAgJmx0O3RhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249IkRlbGV0ZSBhbGwgZ2VuZXJhdGVkIGZpbGVzIiZndDsKICAgICAgICAmbHQ7ZGVsZXRlIGRpcj0iY2xhc3NlcyIvJmd0OwogICAgICAgICZsdDtkZWxldGUgZmlsZT0iTXlUYXNrcy5qYXIiLyZndDsKICAgICZsdDsvdGFyZ2V0Jmd0OwoKICAgICZsdDt0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249IkNvbXBpbGVzIHRoZSBUYXNrIiZndDsKICAgICAgICAmbHQ7amF2YWMgc3JjZGlyPSJzcmMiIGRlc3RkaXI9ImNsYXNzZXMiLyZndDsKICAgICZsdDsvdGFyZ2V0Jmd0OwoKICAgICZsdDt0YXJnZXQgbmFtZT0iamFyIiBkZXNjcmlwdGlvbj0iSkFScyB0aGUgVGFzayImZ3Q7CiAgICAgICAgJmx0O2phciBkZXN0ZmlsZT0iTXlUYXNrLmphciIgYmFzZWRpcj0iY2xhc3NlcyIvJmd0OwogICAgJmx0Oy90YXJnZXQmZ3Q7CgombHQ7L3Byb2plY3QmZ3Q7CjwvcHJlPgoKVGhpcyBidWlsZGZpbGUgdXNlcyBvZnRlbiB0aGUgc2FtZSB2YWx1ZSAoc3JjLCBjbGFzc2VzLCBNeVRhc2suamFyKSwgc28gd2Ugc2hvdWxkIHJld3JpdGUgdGhhdAp1c2luZyA8Y29kZT4mbHQ7cHJvcGVydHkmZ3Q7PC9jb2RlPnMuIE9uIHNlY29uZCB0aGVyZSBhcmUgc29tZSBoYW5kaWNhcHM6IDxjb2RlPiZsdDtqYXZhYyZndDs8L2NvZGU+IHJlcXVpcmVzIHRoYXQgdGhlIGRlc3RpbmF0aW9uCmRpcmVjdG9yeSBleGlzdHM7IGEgY2FsbCBvZiAiY2xlYW4iIHdpdGggYSBub24gZXhpc3RpbmcgY2xhc3NlcyBkaXJlY3Rvcnkgd2lsbCBmYWlsOyAiamFyIiByZXF1aXJlcwp0aGUgZXhlY3V0aW9uIG9mIHNvbWUgc3RlcHMgYm9mb3JlLiBTbyB0aGUgcmVmYWN0b3JlZCBjb2RlIGlzOgoKPHByZSBjbGFzcz0iY29kZSI+CiZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPyZndDsKJmx0O3Byb2plY3QgbmFtZT0iTXlUYXNrIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJqYXIiJmd0OwoKICAgIDxiPiZsdDtwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0ic3JjIi8mZ3Q7PC9iPgogICAgPGI+Jmx0O3Byb3BlcnR5IG5hbWU9ImNsYXNzZXMuZGlyIiB2YWx1ZT0iY2xhc3NlcyIvJmd0OzwvYj4KCiAgICAmbHQ7dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0iRGVsZXRlIGFsbCBnZW5lcmF0ZWQgZmlsZXMiJmd0OwogICAgICAgICZsdDtkZWxldGUgZGlyPSI8Yj4ke2NsYXNzZXMuZGlyfTwvYj4iIDxiPmZhaWxvbmVycm9yPSJmYWxzZSI8L2I+LyZndDsKICAgICAgICAmbHQ7ZGVsZXRlIGZpbGU9IjxiPiR7YW50LnByb2plY3QubmFtZX0uamFyPC9iPiIvJmd0OwogICAgJmx0Oy90YXJnZXQmZ3Q7CgogICAgJmx0O3RhcmdldCBuYW1lPSJjb21waWxlIiBkZXNjcmlwdGlvbj0iQ29tcGlsZXMgdGhlIFRhc2siJmd0OwogICAgICAgIDxiPiZsdDtta2RpciBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8mZ3Q7PC9iPgogICAgICAgICZsdDtqYXZhYyBzcmNkaXI9IjxiPiR7c3JjLmRpcn08L2I+IiBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIvJmd0OwogICAgJmx0Oy90YXJnZXQmZ3Q7CgogICAgJmx0O3RhcmdldCBuYW1lPSJqYXIiIGRlc2NyaXB0aW9uPSJKQVJzIHRoZSBUYXNrIiA8Yj5kZXBlbmRzPSJjb21waWxlIjwvYj4mZ3Q7CiAgICAgICAgJmx0O2phciBkZXN0ZmlsZT0iJHthbnQucHJvamVjdC5uYW1lfS5qYXIiIGJhc2VkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8mZ3Q7CiAgICAmbHQ7L3RhcmdldCZndDsKCiZsdDsvcHJvamVjdCZndDsKPC9wcmU+CjxpPmFudC5wcm9qZWN0Lm5hbWU8L2k+IGlzIG9uZSBvZiB0aGUKPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2J1aWx0LWluLXByb3BzIiB0YXJnZXQ9Il9ibGFuayI+CmJ1aWxkLWluIHByb3BlcnRpZXMgWzFdPC9hPiBvZiBBbnQuCgoKPGEgbmFtZT0id3JpdGUxIj48L2E+CjxoMj5Xcml0ZSB0aGUgVGFzazwvaDI+CgpOb3cgd2Ugd3JpdGUgdGhlIHNpbXBsZXN0IFRhc2sgLSBhIEhlbGxvV29ybGQtVGFzayAod2hhdCBlbHNlPykuIENyZWF0ZSBhIHRleHQgZmlsZQo8aT5IZWxsb1dvcmxkLmphdmE8L2k+IGluIHRoZSBzcmMtZGlyZWN0b3J5IHdpdGg6CjxwcmUgY2xhc3M9ImNvZGUiPgpwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZCB7CiAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSGVsbG8gV29ybGQiKTsKICAgIH0KfQo8L3ByZT4KYW5kIHdlIGNhbiBjb21waWxlIGFuZCBqYXIgaXQgd2l0aCA8dHQ+YW50PC90dD4gKGRlZmF1bHQgdGFyZ2V0IGlzICJqYXIiIGFuZCB2aWEKaXRzIDxpPmRlcGVuZHM8L2k+LWNsYXVzZSB0aGUgImNvbXBpbGUiIGlzIGV4ZWN1dGVkIGJlZm9yZSkuCgoKCjxhIG5hbWU9InVzZTEiPjwvYT4KPGgyPlVzZSB0aGUgVGFzazwvaDI+CjxwPkJ1dCBhZnRlciBjcmVhdGluZyB0aGUgamFyIHdlIHdhbnQgdG8gdXNlIG91ciBuZXcgVGFzay4gVGhlcmVmb3JlIHdlIG5lZWQgYQpuZXcgdGFyZ2V0ICJ1c2UiLiBCZWZvcmUgd2UgY2FuIHVzZSBvdXIgbmV3IHRhc2sgd2UgaGF2ZSB0byBkZWNsYXJlIGl0IHdpdGgKPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9Db3JlVGFza3MvdGFza2RlZi5odG1sIiB0YXJnZXQ9Il9ibGFuayI+Cjxjb2RlPiZsdDt0YXNrZGVmJmd0OzwvY29kZT4gWzJdPC9hPi4gQW5kIGZvciBlYXNpZXIgcHJvY2VzcyB3ZSBjaGFuZ2UgdGhlIGRlZmF1bHQgY2xhdXNlOgo8cHJlIGNsYXNzPSJjb2RlIj4KJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Jmd0OwombHQ7cHJvamVjdCBuYW1lPSJNeVRhc2siIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9IjxiPnVzZTwvYj4iJmd0OwoKICAgIC4uLgoKICAgIDxiPiZsdDt0YXJnZXQgbmFtZT0idXNlIiBkZXNjcmlwdGlvbj0iVXNlIHRoZSBUYXNrIiBkZXBlbmRzPSJqYXIiJmd0OwogICAgICAgICZsdDt0YXNrZGVmIG5hbWU9ImhlbGxvd29ybGQiIGNsYXNzbmFtZT0iSGVsbG9Xb3JsZCIgY2xhc3NwYXRoPSIke2FudC5wcm9qZWN0Lm5hbWV9LmphciIvJmd0OwogICAgICAgICZsdDtoZWxsb3dvcmxkLyZndDsKICAgICZsdDsvdGFyZ2V0Jmd0OzwvYj4KCiZsdDsvcHJvamVjdCZndDsKPC9wcmU+CgpJbXBvcnRhbnQgaXMgdGhlIDxpPmNsYXNzcGF0aDwvaT4tYXR0cmlidXRlLiBBbnQgc2VhcmNoZXMgaW4gaXRzIC9saWIgZGlyZWN0b3J5IGZvcgp0YXNrcyBhbmQgb3VyIHRhc2sgaXNuJ3QgdGhlcmUuIFNvIHdlIGhhdmUgdG8gcHJvdmlkZSB0aGUgcmlnaHQgbG9jYXRpb24uIDwvcD4KCjxwPk5vdyB3ZSBjYW4gdHlwZSBpbiA8dHQ+YW50PC90dD4gYW5kIGFsbCBzaG91bGQgd29yayAuLi4KPHByZSBjbGFzcz0ib3V0cHV0Ij4KQnVpbGRmaWxlOiBidWlsZC54bWwKCmNvbXBpbGU6CiAgICBbbWtkaXJdIENyZWF0ZWQgZGlyOiBDOlx0bXBcYW50dGVzdHNcTXlGaXJzdFRhc2tcY2xhc3NlcwogICAgW2phdmFjXSBDb21waWxpbmcgMSBzb3VyY2UgZmlsZSB0byBDOlx0bXBcYW50dGVzdHNcTXlGaXJzdFRhc2tcY2xhc3NlcwoKamFyOgogICAgICBbamFyXSBCdWlsZGluZyBqYXI6IEM6XHRtcFxhbnR0ZXN0c1xNeUZpcnN0VGFza1xNeVRhc2suamFyCgp1c2U6CltoZWxsb3dvcmxkXSBIZWxsbyBXb3JsZAoKQlVJTEQgU1VDQ0VTU0ZVTApUb3RhbCB0aW1lOiAzIHNlY29uZHMKPC9wcmU+CgoKCjxhIG5hbWU9IlRhc2tBZGFwdGVyIj48L2E+CjxoMj5JbnRlZ3JhdGlvbiB3aXRoIFRhc2tBZGFwdGVyPC9oMj4KPHA+T3VyIGNsYXNzIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggQW50LiBJdCBleHRlbmRzIG5vIHN1cGVyY2xhc3MgYW5kIGltcGxlbWVudHMKbm8gaW50ZXJmYWNlLiBIb3cgZG9lcyBBbnQga25vdyB0byBpbnRlZ3JhdGU/IFZpYSBuYW1lIGNvbnZlbnRpb246IG91ciBjbGFzcyBwcm92aWRlcwphIG1ldGhvZCB3aXRoIHNpZ25hdHVyZSA8dHQ+cHVibGljIHZvaWQgZXhlY3V0ZSgpPC90dD4uIFRoaXMgY2xhc3MgaXMgd3JhcHBlZCBieSBBbnQncwo8dHQ+b3JnLmFwYWNoZS50b29scy5hbnQuVGFza0FkYXB0ZXI8L3R0PiB3aGljaCBpcyBhIHRhc2sgYW5kIHVzZXMgcmVmbGVjdGlvbiBmb3IKc2V0dGluZyBhIHJlZmVyZW5jZSB0byB0aGUgcHJvamVjdCBhbmQgY2FsbGluZyB0aGUgPGk+ZXhlY3V0ZSgpPC9pPiBtZXRob2QuPC9wPgoKPHA+PGk+U2V0dGluZyBhIHJlZmVyZW5jZSB0byB0aGUgcHJvamVjdDwvaT4/IENvdWxkIGJlIGludGVyZXN0aW5nLiBUaGUgUHJvamVjdCBjbGFzcwpnaXZlcyB1cyBzb21lIG5pY2UgYWJpbGl0aWVzOiBhY2Nlc3MgdG8gQW50J3MgbG9nZ2luZyBmYWNpbGl0aWVzIGdldHRpbmcgYW5kIHNldHRpbmcKcHJvcGVydGllcyBhbmQgbXVjaCBtb3JlLiBTbyB3ZSB0cnkgdG8gdXNlIHRoYXQgY2xhc3M6CjxwcmUgY2xhc3M9ImNvZGUiPgppbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKCnB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkIHsKCiAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKCiAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgcHJvaikgewogICAgICAgIHByb2plY3QgPSBwcm9qOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CiAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBwcm9qZWN0LmdldFByb3BlcnR5KCJhbnQucHJvamVjdC5uYW1lIik7CiAgICAgICAgcHJvamVjdC5sb2coIkhlcmUgaXMgcHJvamVjdCAnIiArIG1lc3NhZ2UgKyAiJy4iLCBQcm9qZWN0Lk1TR19JTkZPKTsKICAgIH0KfQo8L3ByZT4KYW5kIHRoZSBleGVjdXRpb24gd2l0aCA8dHQ+YW50PC90dD4gd2lsbCBzaG93IHVzIHRoZSBleHBlY3RlZAo8cHJlIGNsYXNzPSJvdXRwdXQiPgp1c2U6CkhlcmUgaXMgcHJvamVjdCAnTXlUYXNrJy4KPC9wcmU+PC9wPgoKCjxhIG5hbWU9ImRlcml2aW5nRnJvbVRhc2siPjwvYT4KPGgyPkRlcml2aW5nIGZyb20gQW50J3MgVGFzazwvaDI+CjxwPk9rLCB0aGF0IHdvcmtzIC4uLiBCdXQgdXN1YWxseSB5b3Ugd2lsbCBleHRlbmQgPHR0Pm9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s8L3R0Pi4KVGhhdCBjbGFzcyBpcyBpbnRlZ3JhdGVkIGluIEFudCwgZ2V0J3MgdGhlIHByb2plY3QtcmVmZXJlbmNlLCBwcm92aWRlcyBkb2N1bWVudGF0aW9uCmZpZWxzLCBwcm92aWRlcyBlYXNpZXIgYWNjZXNzIHRvIHRoZSBsb2dnaW5nIGZhY2lsaXR5IGFuZCAodmVyeSB1c2VmdWwpIGdpdmVzIHlvdQp0aGUgZXhhY3QgbG9jYXRpb24gd2hlcmUgPGk+aW4gdGhlIGJ1aWxkZmlsZTwvaT4gdGhpcyB0YXNrIGluc3RhbmNlIGlzIHVzZWQuPC9wPgoKPHA+T2tpLWRva2kgLSBsZXQncyB1cyB1c2Ugc29tZSBvZiB0aGVzZToKPHByZSBjbGFzcz0iY29kZSI+CmltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwoKcHVibGljIGNsYXNzIEhlbGxvV29ybGQgZXh0ZW5kcyBUYXNrIHsKICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CiAgICAgICAgLy8gdXNlIG9mIHRoZSByZWZlcmVuY2UgdG8gUHJvamVjdC1pbnN0YW5jZQogICAgICAgIFN0cmluZyBtZXNzYWdlID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQucHJvamVjdC5uYW1lIik7CgogICAgICAgIC8vIFRhc2sncyBsb2cgbWV0aG9kCiAgICAgICAgbG9nKCJIZXJlIGlzIHByb2plY3QgJyIgKyBtZXNzYWdlICsgIicuIik7CgogICAgICAgIC8vIHdoZXJlIHRoaXMgdGFzayBpcyB1c2VkPwogICAgICAgIGxvZygiSSBhbSB1c2VkIGluOiAiICsgIGdldExvY2F0aW9uKCkgKTsKICAgIH0KfQo8L3ByZT4Kd2hpY2ggZ2l2ZXMgdXMgd2hlbiBydW5uaW5nCjxwcmUgY2xhc3M9Im91dHB1dCI+CnVzZToKW2hlbGxvd29ybGRdIEhlcmUgaXMgcHJvamVjdCAnTXlUYXNrJy4KW2hlbGxvd29ybGRdIEkgYW0gdXNlZCBpbjogQzpcdG1wXGFudHRlc3RzXE15Rmlyc3RUYXNrXGJ1aWxkLnhtbDoyMzoKPC9wcmU+CgoKPGEgbmFtZT0iYXR0cmlidXRlcyI+CjxoMj5BdHRyaWJ1dGVzPC9oMj4KPHA+Tm93IHdlIHdhbnQgdG8gc3BlY2lmeSB0aGUgdGV4dCBvZiBvdXIgbWVzc2FnZSAoaXQgc2VlbXMgdGhhdCB3ZSBhcmUKcmV3cml0aW5nIHRoZSA8Y29kZT4mbHQ7ZWNoby8mZ3Q7PC9jb2RlPiB0YXNrIDotKS4gRmlyc3Qgd2Ugd2VsbCBkbyB0aGF0IHdpdGggYW4gYXR0cmlidXRlLgpJdCBpcyB2ZXJ5IGVhc3kgLSBmb3IgZWFjaCBhdHRyaWJ1dGUgcHJvdmlkZSBhIDx0dD5wdWJsaWMgdm9pZCBzZXQ8Y29kZT4mbHQ7YXR0cmlidXRlbmFtZSZndDs8L2NvZGU+KDxjb2RlPiZsdDt0eXBlJmd0OzwvY29kZT4KbmV3VmFsdWUpPC90dD4gbWV0aG9kIGFuZCBBbnQgd2lsbCBkbyB0aGUgcmVzdCB2aWEgcmVmbGVjdGlvbi48L3A+CjxwcmUgY2xhc3M9ImNvZGUiPgppbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwoKcHVibGljIGNsYXNzIEhlbGxvV29ybGQgZXh0ZW5kcyBUYXNrIHsKCiAgICBTdHJpbmcgbWVzc2FnZTsKICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1zZykgewogICAgICAgIG1lc3NhZ2UgPSBtc2c7CiAgICB9CgogICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKICAgICAgICBpZiAobWVzc2FnZT09bnVsbCkgewogICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIG1lc3NhZ2Ugc2V0LiIpOwogICAgICAgIH0KICAgICAgICBsb2cobWVzc2FnZSk7CiAgICB9Cgp9CjwvcHJlPgo8cD5PaCwgd2hhdCdzIHRoYXQgaW4gZXhlY3V0ZSgpPyBUaHJvdyBhIDxpPkJ1aWxkRXhjZXB0aW9uPC9pPj8gWWVzLCB0aGF0J3MgdGhlIHVzdWFsCndheSB0byBzaG93IEFudCB0aGF0IHNvbWV0aGluZyBpbXBvcnRhbnQgaXMgbWlzc2VkIGFuZCBjb21wbGV0ZSBidWlsZCBzaG91bGQgZmFpbC4gVGhlCnN0cmluZyBwcm92aWRlZCB0aGVyZSBpcyB3cml0dGVuIGFzIGJ1aWxkLWZhaWxlcy1tZXNzYWdlLiBIZXJlIGl0J3MgbmVjZXNzYXJ5IGJlY2F1c2UKdGhlIGxvZygpIG1ldGhvZCBjYW4ndCBoYW5kbGUgYSA8aT5udWxsPC9pPiB2YWx1ZSBhcyBwYXJhbWV0ZXIgYW5kIHRocm93cyBhIE51bGxQb2ludGVyRXhjZXB0aW9uLgooT2YgY291cnNlIHlvdSBjYW4gaW5pdGlhbGl6ZSB0aGUgPGk+bWVzc2FnZTwvaT4gd2l0aCBhIGRlZmF1bHQgc3RyaW5nLik8L3A+Cgo8cD5BZnRlciB0aGF0IHdlIGhhdmUgdG8gbW9kaWZ5IG91ciBidWlsZGZpbGU6CjxwcmUgY2xhc3M9ImNvZGUiPgogICAgJmx0O3RhcmdldCBuYW1lPSJ1c2UiIGRlc2NyaXB0aW9uPSJVc2UgdGhlIFRhc2siIGRlcGVuZHM9ImphciImZ3Q7CiAgICAgICAgJmx0O3Rhc2tkZWYgbmFtZT0iaGVsbG93b3JsZCIKICAgICAgICAgICAgICAgICBjbGFzc25hbWU9IkhlbGxvV29ybGQiCiAgICAgICAgICAgICAgICAgY2xhc3NwYXRoPSIke2FudC5wcm9qZWN0Lm5hbWV9LmphciIvJmd0OwogICAgICAgICZsdDtoZWxsb3dvcmxkIDxiPm1lc3NhZ2U9IkhlbGxvIFdvcmxkIjwvYj4vJmd0OwogICAgJmx0Oy90YXJnZXQmZ3Q7CjwvcHJlPgpUaGF0J3MgYWxsLjwvcD4KCjxwPlNvbWUgYmFja2dyb3VuZCBmb3Igd29ya2luZyB3aXRoIGF0dHJpYnV0ZXM6IEFudCBzdXBwb3J0cyBhbnkgb2YgdGhlc2UgZGF0YXR5cGVzIGFzCmFyZ3VtZW50cyBvZiB0aGUgc2V0LW1ldGhvZDo8dWw+CjxsaT5lbGVtZW50YXJ5IGRhdGEgdHlwZSBsaWtlIDxpPmludDwvaT4sIDxpPmxvbmc8L2k+LCAuLi48L2xpPgo8bGk+aXRzIHdyYXBwZXIgY2xhc3NlcyBsaWtlIDxpPmphdmEubGFuZy5JbnRlZ2VyPC9pPiwgPGk+amF2YS5sYW5nLkxvbmc8L2k+LCAuLi48L2xpPgo8bGk+PGk+amF2YS5sYW5nLlN0cmluZzwvaT48L2xpPgo8bGk+c29tZSBtb3JlIGNsYXNzZXMgKGUuZy4gPGk+amF2YS5pby5GaWxlPC9pPjsgc2VlCiAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL2RldmVsb3AuaHRtbCNzZXQtbWFnaWMiPk1hbnVhbAogICAgJ1dyaXRpbmcgWW91ciBPd24gVGFzaycgWzNdPC9hPik8L2xpPgo8L3VsPgpCZWZvcmUgY2FsbGluZyB0aGUgc2V0LW1ldGhvZCBhbGwgcHJvcGVydGllcyBhcmUgcmVzb2x2ZWQuIFNvIGEgPHR0PiZsdDtoZWxsb3dvcmxkIG1lc3NhZ2U9IiR7bXNnfSIvJmd0OzwvdHQ+CndvdWxkIG5vdCBzZXQgdGhlIG1lc3NhZ2Ugc3RyaW5nIHRvICIke21zZ30iIGlmIHRoZXJlIGlzIGEgcHJvcGVydHkgIm1zZyIgd2l0aCBhIHNldCB2YWx1ZS4KCgo8YSBuYW1lPSJOZXN0ZWRUZXh0Ij48L2E+CjxoMj5OZXN0ZWQgVGV4dDwvaDI+CjxwPk1heWJlIHlvdSBoYXZlIHVzZWQgdGhlIDxjb2RlPiZsdDtlY2hvJmd0OzwvY29kZT4gdGFzayBpbiBhIHdheSBsaWtlIDx0dD4mbHQ7ZWNobyZndDtIZWxsbyBXb3JsZCZsdDsvZWNobyZndDs8L3R0Pi4KRm9yIHRoYXQgeW91IGhhdmUgdG8gcHJvdmlkZSBhIDx0dD5wdWJsaWMgdm9pZCBhZGRUZXh0KFN0cmluZyB0ZXh0KTwvdHQ+IG1ldGhvZC4KPHByZSBjbGFzcz0iY29kZSI+Ci4uLgpwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZCBleHRlbmRzIFRhc2sgewogICAgLi4uCiAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFN0cmluZyB0ZXh0KSB7CiAgICAgICAgbWVzc2FnZSA9IHRleHQ7CiAgICB9CiAgICAuLi4KfQo8L3ByZT4KQnV0IGhlcmUgcHJvcGVydGllcyBhcmUgPGI+bm90PC9iPiByZXNvbHZlZCEgRm9yIHJlc29sdmluZyBwcm9wZXJ0aWVzIHdlIGhhdmUgdG8gdXNlClByb2plY3QncyA8dHQ+cmVwbGFjZVByb3BlcnRpZXMoU3RyaW5nIHByb3BuYW1lKSA6IFN0cmluZzwvdHQ+IG1ldGhvZCB3aGljaCB0YWtlcyB0aGUKcHJvcGVydHkgbmFtZSBhcyBhcmd1bWVudCBhbmQgcmV0dXJucyBpdHMgdmFsdWUgKG9yICR7cHJvcG5hbWV9IGlmIG5vdCBzZXQpLjwvcD4KCgo8YSBuYW1lPSJOZXN0ZWRFbGVtZW50cyI+PC9hPgo8aDI+TmVzdGVkIEVsZW1lbnRzPC9oMj4KPHA+VGhlcmUgYXJlIHNldmVyYWwgd2F5cyBmb3IgaW5zZXJ0aW5nIHRoZSBhYmlsaXR5IG9mIGhhbmRsaW5nIG5lc3RlZCBlbGVtZW50cy4gU2VlCnRoZSA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL2RldmVsb3AuaHRtbCNuZXN0ZWQtZWxlbWVudHMiPk1hbnVhbCBbNF08L2E+IGZvciBvdGhlci4KV2UgdXNlIHRoZSBmaXJzdCB3YXkgb2YgdGhlIHRocmVlIGRlc2NyaWJlZCB3YXlzLiBUaGVyZSBhcmUgc2V2ZXJhbCBzdGVwcyBmb3IgdGhhdDo8b2w+CjxsaT5XZSBjcmVhdGUgYSBjbGFzcyBmb3IgY29sbGVjdGluZyBhbGwgdGhlIGluZm9zIHRoZSBuZXN0ZWQgZWxlbWVudCBzaG91bGQgY29udGFpbi4KICBUaGlzIGNsYXNzIGlzIGNyZWF0ZWQgYnkgdGhlIHNhbWUgcnVsZXMgZm9yIGF0dHJpYnV0ZXMgYW5kIG5lc3RlZCBlbGVtZW50cwogIGFzIGZvciB0aGUgdGFzayAoPGNvZGU+c2V0Jmx0O2F0dHJpYnV0ZW5hbWUmZ3Q7PC9jb2RlPigpIG1ldGhvZHMpLiA8L2xpPgo8bGk+VGhlIHRhc2sgaG9sZHMgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgaW4gYSBsaXN0LjwvbGk+CjxsaT5BIGZhY3RvcnkgbWV0aG9kIGluc3RhbnRpYXRlcyBhbiBvYmplY3QsIHNhdmVzIHRoZSByZWZlcmVuY2UgaW4gdGhlIGxpc3QKICBhbmQgcmV0dXJucyBpdCB0byBBbnQgQ29yZS48L2xpPgo8bGk+VGhlIGV4ZWN1dGUoKSBtZXRob2QgaXRlcmF0ZXMgb3ZlciB0aGUgbGlzdCBhbmQgZXZhbHVhdGVzIGl0cyB2YWx1ZXMuPC9saT4KPC9saT48L3A+CjxwcmUgY2xhc3M9ImNvZGUiPgppbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLi4uCiAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewogICAgICAgIGlmIChtZXNzYWdlIT1udWxsKSBsb2cobWVzc2FnZSk7CiAgICAgICAgZm9yIChJdGVyYXRvciBpdD1tZXNzYWdlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgeyAgICAgIDxiPi8vIDQ8L2I+CiAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gKE1lc3NhZ2UpaXQubmV4dCgpOwogICAgICAgICAgICBsb2cobXNnLmdldE1zZygpKTsKICAgICAgICB9CiAgICB9CgoKICAgIFZlY3RvciBtZXNzYWdlcyA9IG5ldyBWZWN0b3IoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+Ly8gMjwvYj4KCiAgICBwdWJsaWMgTWVzc2FnZSBjcmVhdGVNZXNzYWdlKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPi8vIDM8L2I+CiAgICAgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSgpOwogICAgICAgIG1lc3NhZ2VzLmFkZChtc2cpOwogICAgICAgIHJldHVybiBtc2c7CiAgICB9CgogICAgcHVibGljIGNsYXNzIE1lc3NhZ2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj4vLyAxPC9iPgogICAgICAgIHB1YmxpYyBNZXNzYWdlKCkge30KCiAgICAgICAgU3RyaW5nIG1zZzsKICAgICAgICBwdWJsaWMgdm9pZCBzZXRNc2coU3RyaW5nIG1zZykgeyB0aGlzLm1zZyA9IG1zZzsgfQogICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TXNnKCkgeyByZXR1cm4gbXNnOyB9CiAgICB9Ci4uLgo8L3ByZT4KPHA+VGhlbiB3ZSBjYW4gdXNlIHRoZSBuZXcgbmVzdGVkIGVsZW1lbnQuIEJ1dCB3aGVyZSBpcyB4bWwtbmFtZSBmb3IgdGhhdCBkZWZpbmVkPwpUaGUgbWFwcGluZyBYTUwtbmFtZSA6IGNsYXNzbmFtZSBpcyBkZWZpbmVkIGluIHRoZSBmYWN0b3J5IG1ldGhvZDoKPHR0PnB1YmxpYyA8aT5jbGFzc25hbWU8L2k+IGNyZWF0ZTxpPlhNTC1uYW1lPC9pPigpPC90dD4uIFRoZXJlZm9yZSB3ZSB3cml0ZSBpbgp0aGUgYnVpbGRmaWxlCjxwcmUgY2xhc3M9ImNvZGUiPgogICAgICAgICZsdDtoZWxsb3dvcmxkJmd0OwogICAgICAgICAgICAmbHQ7bWVzc2FnZSBtc2c9Ik5lc3RlZCBFbGVtZW50IDEiLyZndDsKICAgICAgICAgICAgJmx0O21lc3NhZ2UgbXNnPSJOZXN0ZWQgRWxlbWVudCAyIi8mZ3Q7CiAgICAgICAgJmx0Oy9oZWxsb3dvcmxkJmd0Owo8L3ByZT4KCgo8YSBuYW1lPSJjb21wbGV4Ij48L2E+CjxoMj5PdXIgdGFzayBpbiBhIGxpdHRsZSBtb3JlIGNvbXBsZXggdmVyc2lvbjwvaDI+CjxwPkZvciByZWNhcGl0dWxhdGlvbiBub3cgYSBsaXR0bGUgcmVmYWN0b3JlZCBidWlsZGZpbGU6CjxwcmUgY2xhc3M9ImNvZGUiPgombHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8mZ3Q7CiZsdDtwcm9qZWN0IG5hbWU9Ik15VGFzayIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idXNlIiZndDsKCiAgICAmbHQ7cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9InNyYyIvJmd0OwogICAgJmx0O3Byb3BlcnR5IG5hbWU9ImNsYXNzZXMuZGlyIiB2YWx1ZT0iY2xhc3NlcyIvJmd0OwoKICAgICZsdDt0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJEZWxldGUgYWxsIGdlbmVyYXRlZCBmaWxlcyImZ3Q7CiAgICAgICAgJmx0O2RlbGV0ZSBkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiBmYWlsb25lcnJvcj0iZmFsc2UiLyZndDsKICAgICAgICAmbHQ7ZGVsZXRlIGZpbGU9IiR7YW50LnByb2plY3QubmFtZX0uamFyIi8mZ3Q7CiAgICAmbHQ7L3RhcmdldCZndDsKCiAgICAmbHQ7dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJDb21waWxlcyB0aGUgVGFzayImZ3Q7CiAgICAgICAgJmx0O21rZGlyIGRpcj0iJHtjbGFzc2VzLmRpcn0iLyZndDsKICAgICAgICAmbHQ7amF2YWMgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIvJmd0OwogICAgJmx0Oy90YXJnZXQmZ3Q7CgogICAgJmx0O3RhcmdldCBuYW1lPSJqYXIiIGRlc2NyaXB0aW9uPSJKQVJzIHRoZSBUYXNrIiBkZXBlbmRzPSJjb21waWxlIiZndDsKICAgICAgICAmbHQ7amFyIGRlc3RmaWxlPSIke2FudC5wcm9qZWN0Lm5hbWV9LmphciIgYmFzZWRpcj0iJHtjbGFzc2VzLmRpcn0iLyZndDsKICAgICZsdDsvdGFyZ2V0Jmd0OwoKCiAgICAmbHQ7dGFyZ2V0IG5hbWU9InVzZS5pbml0IgogICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGFza2RlZiB0aGUgSGVsbG9Xb3JsZC1UYXNrIgogICAgICAgICAgICBkZXBlbmRzPSJqYXIiJmd0OwogICAgICAgICZsdDt0YXNrZGVmIG5hbWU9ImhlbGxvd29ybGQiCiAgICAgICAgICAgICAgICAgY2xhc3NuYW1lPSJIZWxsb1dvcmxkIgogICAgICAgICAgICAgICAgIGNsYXNzcGF0aD0iJHthbnQucHJvamVjdC5uYW1lfS5qYXIiLyZndDsKICAgICZsdDsvdGFyZ2V0Jmd0OwoKCiAgICAmbHQ7dGFyZ2V0IG5hbWU9InVzZS53aXRob3V0IgogICAgICAgICAgICBkZXNjcmlwdGlvbj0iVXNlIHdpdGhvdXQgYW55IgogICAgICAgICAgICBkZXBlbmRzPSJ1c2UuaW5pdCImZ3Q7CiAgICAgICAgJmx0O2hlbGxvd29ybGQvJmd0OwogICAgJmx0Oy90YXJnZXQmZ3Q7CgogICAgJmx0O3RhcmdldCBuYW1lPSJ1c2UubWVzc2FnZSIKICAgICAgICAgICAgZGVzY3JpcHRpb249IlVzZSB3aXRoIGF0dHJpYnV0ZSAnbWVzc2FnZSciCiAgICAgICAgICAgIGRlcGVuZHM9InVzZS5pbml0IiZndDsKICAgICAgICAmbHQ7aGVsbG93b3JsZCBtZXNzYWdlPSJhdHRyaWJ1dGUtdGV4dCIvJmd0OwogICAgJmx0Oy90YXJnZXQmZ3Q7CgogICAgJmx0O3RhcmdldCBuYW1lPSJ1c2UuZmFpbCIKICAgICAgICAgICAgZGVzY3JpcHRpb249IlVzZSB3aXRoIGF0dHJpYnV0ZSAnZmFpbCciCiAgICAgICAgICAgIGRlcGVuZHM9InVzZS5pbml0IiZndDsKICAgICAgICAmbHQ7aGVsbG93b3JsZCBmYWlsPSJ0cnVlIi8mZ3Q7CiAgICAmbHQ7L3RhcmdldCZndDsKCiAgICAmbHQ7dGFyZ2V0IG5hbWU9InVzZS5uZXN0ZWRUZXh0IgogICAgICAgICAgICBkZXNjcmlwdGlvbj0iVXNlIHdpdGggbmVzdGVkIHRleHQiCiAgICAgICAgICAgIGRlcGVuZHM9InVzZS5pbml0IiZndDsKICAgICAgICAmbHQ7aGVsbG93b3JsZCZndDtuZXN0ZWQtdGV4dCZsdDsvaGVsbG93b3JsZCZndDsKICAgICZsdDsvdGFyZ2V0Jmd0OwoKICAgICZsdDt0YXJnZXQgbmFtZT0idXNlLm5lc3RlZEVsZW1lbnQiCiAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJVc2Ugd2l0aCBuZXN0ZWQgJ21lc3NhZ2UnIgogICAgICAgICAgICBkZXBlbmRzPSJ1c2UuaW5pdCImZ3Q7CiAgICAgICAgJmx0O2hlbGxvd29ybGQmZ3Q7CiAgICAgICAgICAgICZsdDttZXNzYWdlIG1zZz0iTmVzdGVkIEVsZW1lbnQgMSIvJmd0OwogICAgICAgICAgICAmbHQ7bWVzc2FnZSBtc2c9Ik5lc3RlZCBFbGVtZW50IDIiLyZndDsKICAgICAgICAmbHQ7L2hlbGxvd29ybGQmZ3Q7CiAgICAmbHQ7L3RhcmdldCZndDsKCgogICAgJmx0O3RhcmdldCBuYW1lPSJ1c2UiCiAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUcnkgYWxsICh3L291dCB1c2UuZmFpbCkiCiAgICAgICAgICAgIGRlcGVuZHM9InVzZS53aXRob3V0LHVzZS5tZXNzYWdlLHVzZS5uZXN0ZWRUZXh0LHVzZS5uZXN0ZWRFbGVtZW50IgogICAgLyZndDsKCiZsdDsvcHJvamVjdCZndDsKPC9wcmU+CgpBbmQgdGhlIGNvZGUgb2YgdGhlIHRhc2s6CjxwcmUgY2xhc3M9ImNvZGUiPgppbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwppbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKCi8qKgogKiBUaGUgdGFzayBvZiB0aGUgdHV0b3JpYWwuCiAqIFByaW50IGEgbWVzc2FnZSBvciBsZXQgdGhlIGJ1aWxkIGZhaWwuCiAqIEBhdXRob3IgSmFuIE1hdOhybmUKICogQHNpbmNlIDIwMDMtMDgtMTkKICovCnB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkIGV4dGVuZHMgVGFzayB7CgoKICAgIC8qKiBUaGUgbWVzc2FnZSB0byBwcmludC4gQXMgYXR0cmlidXRlLiAqLwogICAgU3RyaW5nIG1lc3NhZ2U7CiAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtc2cpIHsKICAgICAgICBtZXNzYWdlID0gbXNnOwogICAgfQoKICAgIC8qKiBTaG91bGQgdGhlIGJ1aWxkIGZhaWw/IERlZmF1bHRzIHRvIDxpPmZhbHNlPC9pPi4gQXMgYXR0cmlidXRlLiAqLwogICAgYm9vbGVhbiBmYWlsID0gZmFsc2U7CiAgICBwdWJsaWMgdm9pZCBzZXRGYWlsKGJvb2xlYW4gYikgewogICAgICAgIGZhaWwgPSBiOwogICAgfQoKICAgIC8qKiBTdXBwb3J0IGZvciBuZXN0ZWQgdGV4dC4gKi8KICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIHRleHQpIHsKICAgICAgICBtZXNzYWdlID0gdGV4dDsKICAgIH0KCgogICAgLyoqIERvIHRoZSB3b3JrLiAqLwogICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKICAgICAgICAvLyBoYW5kbGUgYXR0cmlidXRlICdmYWlsJwogICAgICAgIGlmIChmYWlsKSB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWwgcmVxdWVzdGVkLiIpOwoKICAgICAgICAvLyBoYW5kbGUgYXR0cmlidXRlICdtZXNzYWdlJyBhbmQgbmVzdGVkIHRleHQKICAgICAgICBpZiAobWVzc2FnZSE9bnVsbCkgbG9nKG1lc3NhZ2UpOwoKICAgICAgICAvLyBoYW5kbGUgbmVzdGVkIGVsZW1lbnRzCiAgICAgICAgZm9yIChJdGVyYXRvciBpdD1tZXNzYWdlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewogICAgICAgICAgICBNZXNzYWdlIG1zZyA9IChNZXNzYWdlKWl0Lm5leHQoKTsKICAgICAgICAgICAgbG9nKG1zZy5nZXRNc2coKSk7CiAgICAgICAgfQogICAgfQoKCiAgICAvKiogU3RvcmUgbmVzdGVkICdtZXNzYWdlJ3MuICovCiAgICBWZWN0b3IgbWVzc2FnZXMgPSBuZXcgVmVjdG9yKCk7CgogICAgLyoqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBuZXN0ZWQgJ21lc3NhZ2Uncy4gKi8KICAgIHB1YmxpYyBNZXNzYWdlIGNyZWF0ZU1lc3NhZ2UoKSB7CiAgICAgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSgpOwogICAgICAgIG1lc3NhZ2VzLmFkZChtc2cpOwogICAgICAgIHJldHVybiBtc2c7CiAgICB9CgogICAgLyoqIEEgbmVzdGVkICdtZXNzYWdlJy4gKi8KICAgIHB1YmxpYyBjbGFzcyBNZXNzYWdlIHsKICAgICAgICAvLyBCZWFuIGNvbnN0cnVjdG9yCiAgICAgICAgcHVibGljIE1lc3NhZ2UoKSB7fQoKICAgICAgICAvKiogTWVzc2FnZSB0byBwcmludC4gKi8KICAgICAgICBTdHJpbmcgbXNnOwogICAgICAgIHB1YmxpYyB2b2lkIHNldE1zZyhTdHJpbmcgbXNnKSB7IHRoaXMubXNnID0gbXNnOyB9CiAgICAgICAgcHVibGljIFN0cmluZyBnZXRNc2coKSB7IHJldHVybiBtc2c7IH0KICAgIH0KCn0KPC9wcmU+CgpBbmQgaXQgd29ya3M6CjxwcmUgY2xhc3M9Im91dHB1dCI+CkM6XHRtcFxhbnR0ZXN0c1xNeUZpcnN0VGFzayZndDthbnQKQnVpbGRmaWxlOiBidWlsZC54bWwKCmNvbXBpbGU6CiAgICBbbWtkaXJdIENyZWF0ZWQgZGlyOiBDOlx0bXBcYW50dGVzdHNcTXlGaXJzdFRhc2tcY2xhc3NlcwogICAgW2phdmFjXSBDb21waWxpbmcgMSBzb3VyY2UgZmlsZSB0byBDOlx0bXBcYW50dGVzdHNcTXlGaXJzdFRhc2tcY2xhc3NlcwoKamFyOgogICAgICBbamFyXSBCdWlsZGluZyBqYXI6IEM6XHRtcFxhbnR0ZXN0c1xNeUZpcnN0VGFza1xNeVRhc2suamFyCgp1c2UuaW5pdDoKCnVzZS53aXRob3V0OgoKdXNlLm1lc3NhZ2U6CltoZWxsb3dvcmxkXSBhdHRyaWJ1dGUtdGV4dAoKdXNlLm5lc3RlZFRleHQ6CltoZWxsb3dvcmxkXSBuZXN0ZWQtdGV4dAoKdXNlLm5lc3RlZEVsZW1lbnQ6CltoZWxsb3dvcmxkXQpbaGVsbG93b3JsZF0KW2hlbGxvd29ybGRdCltoZWxsb3dvcmxkXQpbaGVsbG93b3JsZF0gTmVzdGVkIEVsZW1lbnQgMQpbaGVsbG93b3JsZF0gTmVzdGVkIEVsZW1lbnQgMgoKdXNlOgoKQlVJTEQgU1VDQ0VTU0ZVTApUb3RhbCB0aW1lOiAzIHNlY29uZHMKQzpcdG1wXGFudHRlc3RzXE15Rmlyc3RUYXNrJmd0O2FudCB1c2UuZmFpbApCdWlsZGZpbGU6IGJ1aWxkLnhtbAoKY29tcGlsZToKCmphcjoKCnVzZS5pbml0OgoKdXNlLmZhaWw6CgpCVUlMRCBGQUlMRUQKQzpcdG1wXGFudHRlc3RzXE15Rmlyc3RUYXNrXGJ1aWxkLnhtbDozNjogRmFpbCByZXF1ZXN0ZWQuCgpUb3RhbCB0aW1lOiAxIHNlY29uZApDOlx0bXBcYW50dGVzdHNcTXlGaXJzdFRhc2smZ3Q7CjwvcHJlPgpOZXh0IHN0ZXA6IHRlc3QgLi4uCgoKCjxhIG5hbWU9IlRlc3RpbmdUYXNrcyI+PC9hPgo8aDI+VGVzdCB0aGUgVGFzazwvaDI+CjxwPldlIGhhdmUgd3JpdHRlbiBhIHRlc3QgYWxyZWFkeTogdGhlIHVzZS4qIHRhc2tzIGluIHRoZSBidWlsZGZpbGUuIEJ1dCBpdHMKZGlmZmljdWx0IHRvIHRlc3QgdGhhdCBhdXRvbWF0aWNhbGx5LiBDb21tb24gKGFuZCBpbiBBbnQpIHVzZWQgaXMgSlVuaXQgZm9yCnRoYXQuIEZvciB0ZXN0aW5nIHRhc2tzIEFudCBwcm92aWRlcyBhIGJhc2VjbGFzcyA8dHQ+b3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDwvdHQ+LgpUaGlzIGNsYXNzIGV4dGVuZHMgPHR0Pmp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTwvdHQ+IGFuZCBjYW4gdGhlcmVmb3JlIGJlIGludGVncmF0ZWQKaW50byB0aGUgdW5pdCB0ZXN0cy4gQnV0IHRoaXMgY2xhc3MgcHJvdmlkZXMgc29tZSBmb3IgdGVzdGluZyB0YXNrcyB1c2VmdWwgbWV0aG9kczoKaW5pdGlhbGl6ZSBBbnQsIGxvYWQgYSBidWlsZGZpbGUsIGV4ZWN1dGUgdGFyZ2V0cywKZXhwZWN0aW5nIEJ1aWxkRXhjZXB0aW9ucyB3aXRoIGEgc3BlY2lmaWVkIHRleHQsIGV4cGVjdCBhIHNwZWNpYWwgdGV4dAppbiB0aGUgb3V0cHV0IGxvZyAuLi4gPC9wPgoKPHA+SW4gQW50IGl0IGlzIHVzdWFsIHRoYXQgdGhlIHRlc3RjYXNlIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSB0YXNrIHdpdGggYSBwcmVwZW5kaW5nCjxpPlRlc3Q8L2k+LCB0aGVyZWZvcmUgd2Ugd2lsbCBjcmVhdGUgYSBmaWxlIDxpPkhlbGxvV29ybGRUZXN0LmphdmE8L2k+LiBCZWNhdXNlIHdlCmhhdmUgYSB2ZXJ5IHNtYWxsIHByb2plY3Qgd2UgY2FuIHB1dCB0aGlzIGZpbGUgaW50byA8aT5zcmM8L2k+IGRpcmVjdG9yeSAoQW50J3Mgb3duCnRlc3RjbGFzc2VzIGFyZSBpbiAvc3JjL3Rlc3RjYXNlcy8uLi4pLiBCZWNhdXNlIHdlIGhhdmUgYWxyZWFkeSB3cml0dGVuIG91ciB0ZXN0cwpmb3IgImhhbmQtdGVzdCIgd2UgY2FuIHVzZSB0aGF0IGZvciBhdXRvbWF0aWMgdGVzdHMsIHRvby4gQnV0IHRoZXJlIGlzIG9uZSBsaXR0bGUKcHJvYmxlbSB3ZSBoYXZlIHRvIHNvbHZlOiBhbGwgdGVzdCBzdXBwb3J0aW5nIGNsYXNzZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBiaW5hcnkKZGlzdHJpYnV0aW9uIG9mIEFudC4gU28geW91IGNhbiBidWlsZCB0aGUgc3BlY2lhbCBqYXIgZmlsZSBmcm9tIHNvdXJjZSBkaXN0cm8gd2l0aAp0YXJnZXQgInRlc3QtamFyIiBvciB5b3UgY2FuIGRvd25sb2FkIGEgbmlnaHRseSBidWlsZCBmcm9tCjxhIGhyZWY9Imh0dHA6Ly9ndW1wLmNvdmFsZW50Lm5ldC9qYXJzL2xhdGVzdC9hbnQvYW50LXRlc3R1dGlsLmphciI+Cmh0dHA6Ly9ndW1wLmNvdmFsZW50Lm5ldC9qYXJzL2xhdGVzdC9hbnQvYW50LXRlc3R1dGlsLmphciBbNV08L2E+LjwvcD4KCjxwPkZvciBleGVjdXRpbmcgdGhlIHRlc3QgYW5kIGNyZWF0aW5nIGEgcmVwb3J0IHdlIG5lZWQgdGhlIG9wdGlvbmFsIHRhc2tzIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+CmFuZCA8Y29kZT4mbHQ7anVuaXRyZXBvcnQmZ3Q7PC9jb2RlPi4gU28gd2UgYWRkIHRvIHRoZSBidWlsZGZpbGU6CjxwcmUgY2xhc3M9ImNvZGUiPgouLi4KPGZvbnQgY29sb3I9IiM5RjlGOUYiPiZsdDtwcm9qZWN0IG5hbWU9Ik15VGFzayIgYmFzZWRpcj0iLiIgPC9mb250PmRlZmF1bHQ9InRlc3QiPGZvbnQgY29sb3I9IiM5RjlGOUYiPiZndDs8L2ZvbnQ+Ci4uLgogICAgJmx0O3Byb3BlcnR5IG5hbWU9ImFudC50ZXN0LmxpYiIgdmFsdWU9ImFudC10ZXN0dXRpbC5qYXIiLyZndDsKICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJyZXBvcnQuZGlyIiAgIHZhbHVlPSJyZXBvcnQiLyZndDsKICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJqdW5pdC5vdXQuZGlyLnhtbCIgIHZhbHVlPSIke3JlcG9ydC5kaXJ9L2p1bml0L3htbCIvJmd0OwogICAgJmx0O3Byb3BlcnR5IG5hbWU9Imp1bml0Lm91dC5kaXIuaHRtbCIgdmFsdWU9IiR7cmVwb3J0LmRpcn0vanVuaXQvaHRtbCIvJmd0OwoKICAgICZsdDtwYXRoIGlkPSJjbGFzc3BhdGgucnVuIiZndDsKICAgICAgICAmbHQ7cGF0aCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLyZndDsKICAgICAgICAmbHQ7cGF0aCBsb2NhdGlvbj0iJHthbnQucHJvamVjdC5uYW1lfS5qYXIiLyZndDsKICAgICZsdDsvcGF0aCZndDsKCiAgICAmbHQ7cGF0aCBpZD0iY2xhc3NwYXRoLnRlc3QiJmd0OwogICAgICAgICZsdDtwYXRoIHJlZmlkPSJjbGFzc3BhdGgucnVuIi8mZ3Q7CiAgICAgICAgJmx0O3BhdGggbG9jYXRpb249IiR7YW50LnRlc3QubGlifSIvJmd0OwogICAgJmx0Oy9wYXRoJmd0OwoKICAgICZsdDt0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJEZWxldGUgYWxsIGdlbmVyYXRlZCBmaWxlcyImZ3Q7CiAgICAgICAgJmx0O2RlbGV0ZSBmYWlsb25lcnJvcj0iZmFsc2UiIGluY2x1ZGVFbXB0eURpcnM9InRydWUiJmd0OwogICAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSIke2FudC5wcm9qZWN0Lm5hbWV9LmphciIvJmd0OwogICAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8mZ3Q7CiAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHtyZXBvcnQuZGlyfSIvJmd0OwogICAgICAgICZsdDsvZGVsZXRlJmd0OwogICAgJmx0Oy90YXJnZXQmZ3Q7CgogICAgPGZvbnQgY29sb3I9IiM5RjlGOUYiPiZsdDt0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249IkNvbXBpbGVzIHRoZSBUYXNrIiZndDsKICAgICAgICAmbHQ7bWtkaXIgZGlyPSIke2NsYXNzZXMuZGlyfSIvJmd0OwogICAgICAgICZsdDtqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiA8L2ZvbnQ+Y2xhc3NwYXRoPSIke2FudC50ZXN0LmxpYn0iPGZvbnQgY29sb3I9IiM5RjlGOUYiPi8mZ3Q7CiAgICAmbHQ7L3RhcmdldCZndDs8L2ZvbnQ+Ci4uLgogICAgJmx0O3RhcmdldCBuYW1lPSJqdW5pdCIgZGVzY3JpcHRpb249IlJ1bnMgdGhlIHVuaXQgdGVzdHMiIGRlcGVuZHM9ImphciImZ3Q7CiAgICAgICAgJmx0O2RlbGV0ZSBkaXI9IiR7anVuaXQub3V0LmRpci54bWx9Ii8mZ3Q7CiAgICAgICAgJmx0O21rZGlyICBkaXI9IiR7anVuaXQub3V0LmRpci54bWx9Ii8mZ3Q7CiAgICAgICAgJmx0O2p1bml0IHByaW50c3VtbWFyeT0ieWVzIiBoYWx0b25mYWlsdXJlPSJubyImZ3Q7CiAgICAgICAgICAgICZsdDtjbGFzc3BhdGggcmVmaWQ9ImNsYXNzcGF0aC50ZXN0Ii8mZ3Q7CiAgICAgICAgICAgICZsdDtmb3JtYXR0ZXIgdHlwZT0ieG1sIi8mZ3Q7CiAgICAgICAgICAgICZsdDtiYXRjaHRlc3QgZm9yaz0ieWVzIiB0b2Rpcj0iJHtqdW5pdC5vdXQuZGlyLnhtbH0iJmd0OwogICAgICAgICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9IiBpbmNsdWRlcz0iKiovKlRlc3QuamF2YSIvJmd0OwogICAgICAgICAgICAmbHQ7L2JhdGNodGVzdCZndDsKICAgICAgICAmbHQ7L2p1bml0Jmd0OwogICAgJmx0Oy90YXJnZXQmZ3Q7CgogICAgJmx0O3RhcmdldCBuYW1lPSJqdW5pdHJlcG9ydCIgZGVzY3JpcHRpb249IkNyZWF0ZSBhIHJlcG9ydCBmb3IgdGhlIHJlc3QgcmVzdWx0IiZndDsKICAgICAgICAmbHQ7bWtkaXIgZGlyPSIke2p1bml0Lm91dC5kaXIuaHRtbH0iLyZndDsKICAgICAgICAmbHQ7anVuaXRyZXBvcnQgdG9kaXI9IiR7anVuaXQub3V0LmRpci5odG1sfSImZ3Q7CiAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHtqdW5pdC5vdXQuZGlyLnhtbH0iJmd0OwogICAgICAgICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKi54bWwiLyZndDsKICAgICAgICAgICAgJmx0Oy9maWxlc2V0Jmd0OwogICAgICAgICAgICAmbHQ7cmVwb3J0IGZvcm1hdD0iZnJhbWVzIiB0b2Rpcj0iJHtqdW5pdC5vdXQuZGlyLmh0bWx9Ii8mZ3Q7CiAgICAgICAgJmx0Oy9qdW5pdHJlcG9ydCZndDsKICAgICZsdDsvdGFyZ2V0Jmd0OwoKICAgICZsdDt0YXJnZXQgbmFtZT0idGVzdCIKICAgICAgICAgICAgZGVwZW5kcz0ianVuaXQsanVuaXRyZXBvcnQiCiAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSdW5zIHVuaXQgdGVzdHMgYW5kIGNyZWF0ZXMgYSByZXBvcnQiCiAgICAvJmd0OwouLi4KPC9wcmU+PC9wPgoKPHA+QmFjayB0byB0aGUgPGk+c3JjL0hlbGxvV29ybGRUZXN0LmphdmE8L2k+LiBXZSBjcmVhdGUgYSBjbGFzcyBleHRlbmRpbmcKPGk+QnVpbGRGaWxlVGVzdDwvaT4gd2l0aCBTdHJpbmctY29uc3RydWN0b3IgKEpVbml0LXN0YW5kYXJkKSwgYSA8aT5zZXRVcCgpPC9pPgptZXRob2QgaW5pdGlhbGl6aW5nIEFudCBhbmQgZm9yIGVhY2ggdGVzdGNhc2UgKHRhcmdldHMgdXNlLiopIGEgPGk+dGVzdFhYKCk8L2k+Cm1ldGhvZCBpbnZva2luZyB0aGF0IHRhcmdldC4KPHByZSBjbGFzcz0iY29kZSI+CmltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OwoKcHVibGljIGNsYXNzIEhlbGxvV29ybGRUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CgogICAgcHVibGljIEhlbGxvV29ybGRUZXN0KFN0cmluZyBzKSB7CiAgICAgICAgc3VwZXIocyk7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgLy8gaW5pdGlhbGl6ZSBBbnQKICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJidWlsZC54bWwiKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aG91dCgpIHsKICAgICAgICBleGVjdXRlVGFyZ2V0KCJ1c2Uud2l0aG91dCIpOwogICAgICAgIGFzc2VydEVxdWFscygiTWVzc2FnZSB3YXMgbG9nZ2VkIGJ1dCBzaG91bGQgbm90LiIsIGdldExvZygpLCAiIik7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2UoKSB7CiAgICAgICAgLy8gZXhlY3V0ZSB0YXJnZXQgJ3VzZS5uZXN0ZWRUZXh0JyBhbmQgZXhwZWN0IGEgbWVzc2FnZQogICAgICAgIC8vICdhdHRyaWJ1dGUtdGV4dCcgaW4gdGhlIGxvZwogICAgICAgIGV4cGVjdExvZygidXNlLm1lc3NhZ2UiLCAiYXR0cmlidXRlLXRleHQiKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbCgpIHsKICAgICAgICAvLyBleGVjdXRlIHRhcmdldCAndXNlLmZhaWwnIGFuZCBleHBlY3QgYSBCdWlsZEV4Y2VwdGlvbgogICAgICAgIC8vIHdpdGggdGV4dCAnRmFpbCByZXF1ZXN0ZWQuJwogICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ1c2UuZmFpbCIsICJGYWlsIHJlcXVlc3RlZC4iKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVGV4dCgpIHsKICAgICAgICBleHBlY3RMb2coInVzZS5uZXN0ZWRUZXh0IiwgIm5lc3RlZC10ZXh0Iik7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZEVsZW1lbnQoKSB7CiAgICAgICAgZXhlY3V0ZVRhcmdldCgidXNlLm5lc3RlZEVsZW1lbnQiKTsKICAgICAgICBhc3NlcnRMb2dDb250YWluaW5nKCJOZXN0ZWQgRWxlbWVudCAxIik7CiAgICAgICAgYXNzZXJ0TG9nQ29udGFpbmluZygiTmVzdGVkIEVsZW1lbnQgMiIpOwogICAgfQp9CjwvcHJlPjwvcD4KCjxwPldoZW4gc3RhcnRpbmcgPHR0PmFudDwvdHQ+IHdlJ2xsIGdldCBhIHNob3J0IG1lc3NhZ2UgdG8gU1RET1VUIGFuZAphIG5pY2UgSFRNTC1yZXBvcnQuCjxwcmUgY2xhc3M9Im91dHB1dCI+CkM6XHRtcFxhbnR0ZXN0c1xNeUZpcnN0VGFzayZndDthbnQKQnVpbGRmaWxlOiBidWlsZC54bWwKCmNvbXBpbGU6CiAgICBbbWtkaXJdIENyZWF0ZWQgZGlyOiBDOlx0bXBcYW50dGVzdHNcTXlGaXJzdFRhc2tcY2xhc3NlcwogICAgW2phdmFjXSBDb21waWxpbmcgMiBzb3VyY2UgZmlsZXMgdG8gQzpcdG1wXGFudHRlc3RzXE15Rmlyc3RUYXNrXGNsYXNzZXMKCmphcjoKICAgICAgW2phcl0gQnVpbGRpbmcgamFyOiBDOlx0bXBcYW50dGVzdHNcTXlGaXJzdFRhc2tcTXlUYXNrLmphcgoKanVuaXQ6CiAgICBbbWtkaXJdIENyZWF0ZWQgZGlyOiBDOlx0bXBcYW50dGVzdHNcTXlGaXJzdFRhc2tccmVwb3J0XGp1bml0XHhtbAogICAgW2p1bml0XSBSdW5uaW5nIEhlbGxvV29ybGRUZXN0CiAgICBbanVuaXRdIFRlc3RzIHJ1bjogNSwgRmFpbHVyZXM6IDAsIEVycm9yczogMCwgVGltZSBlbGFwc2VkOiAyLDMzNCBzZWMKCgoKanVuaXRyZXBvcnQ6CiAgICBbbWtkaXJdIENyZWF0ZWQgZGlyOiBDOlx0bXBcYW50dGVzdHNcTXlGaXJzdFRhc2tccmVwb3J0XGp1bml0XGh0bWwKW2p1bml0cmVwb3J0XSBVc2luZyBYYWxhbiB2ZXJzaW9uOiBYYWxhbiBKYXZhIDIuNC4xCltqdW5pdHJlcG9ydF0gVHJhbnNmb3JtIHRpbWU6IDY2MW1zCgp0ZXN0OgoKQlVJTEQgU1VDQ0VTU0ZVTApUb3RhbCB0aW1lOiA3IHNlY29uZHMKQzpcdG1wXGFudHRlc3RzXE15Rmlyc3RUYXNrJmd0Owo8L3ByZT48L3A+CgoKPGEgbmFtZT0icmVzb3VyY2VzIj48L2E+CjxoMj5SZXNvdXJjZXM8L2gyPgo8cD5UaGlzIHR1dG9yaWFsIGFuZCBpdHMgcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUgdmlhCjxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MjI1NzAiPkJ1Z1ppbGxhIFs2XTwvYT4uClRoZSBaSVAgcHJvdmlkZWQgdGhlcmUgY29udGFpbnM8dWw+CjxsaT50aGlzIHR1dG9yaWFsPC9saT4KPGxpPnRoZSBidWlsZGZpbGUgKGxhc3QgdmVyc2lvbik8L2xpPgo8bGk+dGhlIHNvdXJjZSBvZiB0aGUgdGFzayAobGFzdCB2ZXJzaW9uKTwvbGk+CjxsaT50aGUgc291cmNlIG9mIHRoZSB1bml0IHRlc3QgKGxhc3QgdmVyc2lvbik8L2xpPgo8bGk+dGhlIGFudC10ZXN0dXRpbC5qYXIgKG5pZ2h0bHkgYnVpbGQgb2YgMjAwMy0wOC0xOCk8L2xpPgo8bGk+Z2VuZXJhdGVkIGNsYXNzZXM8L2xpPgo8bGk+Z2VuZXJhdGVkIGphcjwvbGk+CjxsaT5nZW5lcmF0ZWQgcmVwb3J0czwvbGk+CjwvdWw+ClRoZSBsYXN0IHNvdXJjZXMgYW5kIHRoZSBidWlsZGZpbGUgYXJlIGFsc28gYXZhaWxhYmxlCjxhIGhyZWY9InR1dG9yaWFsLXdyaXRpbmctdGFza3Mtc3JjLnppcCI+aGVyZSBbN108L2E+IGluc2lkZSB0aGUgbWFudWFsLgo8L3A+CgoKVXNlZCBMaW5rczo8YnIvPgombmJzcDsmbmJzcDtbMV0gPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2J1aWx0LWluLXByb3BzIj5odHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYnVpbHQtaW4tcHJvcHM8L2E+PGJyPgombmJzcDsmbmJzcDtbMl0gPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9Db3JlVGFza3MvdGFza2RlZi5odG1sIj5odHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL0NvcmVUYXNrcy90YXNrZGVmLmh0bWw8L2E+PGJyPgombmJzcDsmbmJzcDtbM10gPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9kZXZlbG9wLmh0bWwjc2V0LW1hZ2ljIj5odHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL2RldmVsb3AuaHRtbCNzZXQtbWFnaWM8L2E+PGJyPgombmJzcDsmbmJzcDtbNF0gPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9kZXZlbG9wLmh0bWwjbmVzdGVkLWVsZW1lbnRzIj5odHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL2RldmVsb3AuaHRtbCNuZXN0ZWQtZWxlbWVudHM8L2E+PGJyPgombmJzcDsmbmJzcDtbNV0gPGEgaHJlZj0iaHR0cDovL2d1bXAuY292YWxlbnQubmV0L2phcnMvbGF0ZXN0L2FudC9hbnQtdGVzdHV0aWwuamFyIj5odHRwOi8vZ3VtcC5jb3ZhbGVudC5uZXQvamFycy9sYXRlc3QvYW50L2FudC10ZXN0dXRpbC5qYXI8L2E+PGJyPgombmJzcDsmbmJzcDtbNl0gPGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0yMjU3MCI+aHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0yMjU3MDwvYT48YnI+CiZuYnNwOyZuYnNwO1s3XSA8YSBocmVmPSJ0dXRvcmlhbC13cml0aW5nLXRhc2tzLXNyYy56aXAiPnR1dG9yaWFsLXdyaXRpbmctdGFza3Mtc3JjLnppcDwvYT48YnI+Cgo8aHI+CjxwIGFsaWduPSJjZW50ZXIiPkNvcHlyaWdodCAmY29weTsgMjAwMy0yMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cwpSZXNlcnZlZC48L3A+Cgo8L2JvZHk+CjwvaHRtbD4K