PCFkb2N0eXBlIEhUTUwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iPgoKPGh0bWw+CjxoZWFkPgo8IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJkb2N0aXRsZSIgLS0+Cjx0aXRsZT5OYXZpZ2F0aW5nIFhNTCB3aXRoIEN1cnNvcnM8L3RpdGxlPgo8IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+IAo8IS0tKE1ldGEpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgoKPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSRDSEFSU0VUOyI+CgoKPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPgoKPG1ldGEgY29udGVudD0ieW91ciBuYW1lIiBuYW1lPSJhdXRob3IiPgo8bWV0YSBjb250ZW50PSJBIGRlc2NyaXB0aW9uIG9mIHRoZSB0b3BpYyBjb250ZW50cy4iIG5hbWU9ImRlc2NyaXB0aW9uIj4KPG1ldGEgY29udGVudD0ia2V5d29yZHMgdG8gaGVscCBpbiBzZWFyY2hlcyIgbmFtZT0ia2V5d29yZHMiPgo8bWV0YSBjb250ZW50PSIxMC8yNS8wMiIgbmFtZT0iZGF0ZSBsYXN0IG1vZGlmaWVkIj4KPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgoKPCEtLShMaW5rcyk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+IAo8bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgo8IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+CjxsaW5rIGhyZWY9Ii4uL3htbGJlYW5zLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+CjxhIGhyZWY9Ii4uLy4uLy4uL2NvcmUvaW5kZXguaHRtbCIgaWQ9ImluZGV4Ij48L2E+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS90b3BpY0luZm8uanMiPjwvc2NyaXB0Pgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvQ29va2llQ2xhc3MuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvZGlzcGxheUNvbnRlbnQuanMiPjwvc2NyaXB0Pgo8L2hlYWQ+Cgo8IS0tKEJvZHkpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgo8Ym9keT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Cgo8L3NjcmlwdD4KPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iYm9keSIgLS0+IAo8aDE+IE5hdmlnYXRpbmcgWE1MIHdpdGggQ3Vyc29ycyA8L2gxPgo8ZGl2IGlkPSJ0b3BpY3RleHQiPiAKICA8cD5YTUwgY3Vyc29ycyBhcmUgYSB3YXkgdG8gbmF2aWdhdGUgdGhyb3VnaCBhbiBYTUwgaW5zdGFuY2UgZG9jdW1lbnQuIE9uY2UgCiAgICB5b3UgbG9hZCBhbiBYTUwgZG9jdW1lbnQsIHlvdSBjYW4gY3JlYXRlIGEgY3Vyc29yIHRvIHJlcHJlc2VudCBhIHNwZWNpZmljIAogICAgcGxhY2UgaW4gdGhlIFhNTC4gQmVjYXVzZSB5b3UgY2FuIHVzZSBhIGN1cnNvciB3aXRoIG9yIHdpdGhvdXQgYSBzY2hlbWEgY29ycmVzcG9uZGluZyAKICAgIHRvIHRoZSBYTUwsIGN1cnNvcnMgYXJlIGFuIGlkZWFsIHdheSB0byBoYW5kbGUgWE1MIHdpdGhvdXQgYSBzY2hlbWEuPC9wPgogIDxwPldpdGggYW4gWE1MIGN1cnNvciwgeW91IGNhbjo8L3A+CjwvZGl2Pgo8VUw+CiAgPGxpPiAKICAgIDxkaXY+PGEgaHJlZj0iY29uVW5kZXJzdGFuZGluZ1hNTFRva2Vucy5odG1sIj5Vc2UgdGhlIHRva2VuIG1vZGVsPC9hPiB0byBtb3ZlIAogICAgICB0aHJvdWdoIFhNTCBpbiBzbWFsbCBpbmNyZW1lbnRzLCBvciBpbiBhIG1hbm5lciBzaW1pbGFyIHRvIHVzaW5nIGEgRE9NLWJhc2VkIAogICAgICBtb2RlbC48L2Rpdj4KICA8TEk+IAogICAgPERJVj5HZXQgYW5kIHNldCB2YWx1ZXMgd2l0aGluIHRoZSBYTUwuPC9ESVY+CiAgPExJPiAKICAgIDxESVY+PGEgaHJlZj0iI2FkZGluZ19lbGVtZW50c19hdHRyaWJ1dGVzIj5DaGFuZ2UgdGhlIHN0cnVjdHVyZTwvYT4gb2YgYW4gCiAgICAgIFhNTCBkb2N1bWVudCBieSBpbnNlcnRpbmcsIHJlbW92aW5nLCBhbmQgbW92aW5nIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLjwvRElWPgogIDxMST4gCiAgICA8RElWPjxhIGhyZWY9ImNvblNlbGVjdGluZ1hNTHdpdGhYUXVlcnlQYXRoWFBhdGguaHRtbCI+RXhlY3V0ZSBYUXVlcnkgZXhwcmVzc2lvbnM8L2E+IAogICAgICBhZ2FpbnN0IHRoZSBYTUwgcmVwcmVzZW50ZWQgYnkgdGhlIGN1cnNvci48L0RJVj4KICA8TEk+IAogICAgPERJVj48YSBocmVmPSJjb25Vc2luZ0Jvb2ttYXJrc1RvQW5ub3RhdGVYTUwuaHRtbCI+SW5zZXJ0IGJvb2ttYXJrczwvYT4gdG8gCiAgICAgIG1hcmsgbG9jYXRpb25zIGluIFhNTC48L0RJVj4KPC9VTD4KPFA+V2hlbiB5b3UncmUgZmluaXNoZWQgdXNpbmcgYSBjdXJzb3IsIHlvdXIgY29kZSBzaG91bGQgY2FsbCBpdHMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmRpc3Bvc2U8L3NwYW4+IAogIG1ldGhvZC48L1A+CjxoMj5DcmVhdGluZyBhbmQgTW92aW5nIGEgQ3Vyc29yPC9oMj4KPFA+V2l0aCBhbiBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgYm91bmQgdG8gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE9iamVjdC5odG1sIj5YbWxPYmplY3Q8L2E+PC9zcGFuPiAKICAob3IgYSB0eXBlIGluaGVyaXRpbmcgZnJvbSBpdCksIHlvdSBjcmVhdGUgYSBuZXcgY3Vyc29yIGJ5IGNhbGxpbmcgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5uZXdDdXJzb3I8L3NwYW4+IAogIG1ldGhvZC4gVGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDdXJzb3IuaHRtbCI+WG1sQ3Vyc29yPC9hPjwvc3Bhbj4gCiAgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBjdXJzb3IuIEZyb20gYSBjdXJzb3Igc3RhbmRwb2ludCwgYW4gWE1MIGRvY3VtZW50IGlzIAogIGEgY29sbGVjdGlvbiBvZiA8RU0+dG9rZW5zPC9FTT4gdGhhdCByZXByZXNlbnQgdGhlIGtpbmRzIG9mIHRoaW5ncyB0aGF0IGNhbiAKICBhcHBlYXIgaW4gWE1MLiBUaGVzZSBpbmNsdWRlJm5ic3A7YXR0cmlidXRlcywgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgZWxlbWVudHMsIAogIGNvbW1lbnRzLCBhbmQgc28gb24uJm5ic3A7RWFjaCBwaWVjZSBvZiBpbmZvcm1hdGlvbiBpbiBYTUwgaXMgcmVwcmVzZW50ZWQgYnkgCiAgYSA8ZW0+dG9rZW4gdHlwZTwvZW0+LjwvUD4KPFAgY2xhc3M9Im5vdGVwYXJhIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEZvciBhIG1vcmUgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgCiAgWE1MIHRva2Vucywgc2VlIDxhIGhyZWY9ImNvblVuZGVyc3RhbmRpbmdYTUxUb2tlbnMuaHRtbCI+VW5kZXJzdGFuZGluZyBYTUwgVG9rZW5zPC9hPi48L1A+CjxQPkZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgbG9hZHMgdGhlJm5ic3A7WE1MIGluc3RhbmNlIGRlc2NyaWJlZCBhYm92ZSAKICBmcm9tIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkZpbGU8L3NwYW4+IG9iamVjdCwgdGhlbiBjcmVhdGVzIGEgbmV3IGN1cnNvci4gCiAgVGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj50b0ZpcnN0Q2hpbGQ8L3NwYW4+IHRha2VzIHRoZSBjdXJzb3IgdG8gdGhlIHN0YXJ0IAogIHRhZyBvZiB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmJhdGNoV2lkZ2V0T3JkZXI8L3NwYW4+IGRvY3VtZW50IGVsZW1lbnQuIAogIFRoZSBjb2RlIHRoZW4gcHJpbnRzIHRoZSB0eXBlIGZvciB0aGUgdG9rZW4gYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLCBhbG9uZyAKICB3aXRoIHRoZSBYTUwgdGhlIGN1cnNvciByZXByZXNlbnRzl2luIG90aGVyIHdvcmRzLCA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPlRva2VuIAogIHR5cGU6IFNUQVJUIC88L3NwYW4+IGFuZCB0aGUgPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj5iYXRjaFdpZGdldE9yZGVyRWxlbWVudDwvc3Bhbj4gCiAgYW5kIGl0cyBjb250ZW50cy48L1A+CjxwcmU+cHVibGljIHN0YXRpYyB2b2lkIGluc2VydEN1cnNvcihGaWxlIG9yZGVyRmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiAKewogICAgQmF0Y2hXaWRnZXRPcmRlckRvY3VtZW50IHhtbERvYyA9IEJhdGNoV2lkZ2V0T3JkZXJEb2N1bWVudC5GYWN0b3J5LnBhcnNlKG9yZGVyRmlsZSk7CiAgICBYbWxDdXJzb3Igb3JkZXJDdXJzb3IgPSB4bWxEb2MubmV3Q3Vyc29yKCk7CiAgICBvcmRlckN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVG9rZW4gdHlwZTogIiArIG9yZGVyQ3Vyc29yLmN1cnJlbnRUb2tlblR5cGUoKSArCiAgICAgICAgIiAvICIgKyBvcmRlckN1cnNvci54bWxUZXh0KCkpOwp9CjwvcHJlPgo8cCBjbGFzcz0ibm90ZXBhcmEiPjxTVFJPTkc+Tm90ZTwvU1RST05HPjogVGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3I8L3NwYW4+IAogIGludGVyZmFjZSBwcm92aWRlcyBtYW55IG1ldGhvZHMgeW91IGNhbiB1c2UgdG8gcHV0IGEgY3Vyc29yIHdoZXJlIHlvdSB3YW50IGl0LiAKICBGb3IgYSBsaXN0IG9mIHRob3NlIG1ldGhvZHMsIHNlZSA8YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDdXJzb3IuaHRtbCI+WG1sQ3Vyc29yIAogIEludGVyZmFjZTwvYT4uPC9wPgo8aDI+PGEgbmFtZT0iYWRkaW5nX2VsZW1lbnRzX2F0dHJpYnV0ZXMiIGlkPSJhZGRpbmdfZWxlbWVudHNfYXR0cmlidXRlcyI+PC9hPkFkZGluZyAKICBFbGVtZW50cyBhbmQgQXR0cmlidXRlczwvaDI+CjxwPlRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPiBpbnRlcmZhY2UgcHJvdmlkZXMgc2V2ZXJhbCBtZXRob2RzIAogIHlvdSBjYW4gdXNlIHRvIGFkZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyB0byBYTUwuIDwvcD4KPHA+T25lIHdheSB0byBhZGQgbmV3IFhNTCBpcyB3aXRoIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+YmVnaW5FbGVtZW50PC9zcGFuPiAKICBtZXRob2QuIFRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHRvIGluc2VydCBhIG5ldyBlbGVtZW50IGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbiwgCiAgYW5kIGRvIGl0IHNvIHRoZSBjdXJzb3IgZW5kcyB1cCBiZXR3ZWVuIHRoZSBuZXcgZWxlbWVudCdzIFNUQVJUIGFuZCBFTkQgdG9rZW5zLiAKICBGcm9tIHRoaXMgcG9zaXRpb24sIHlvdSBjYW4gaW5zZXJ0IGF0dHJpYnV0ZXMgKHRoZXkncmUgYXV0b21hdGljYWxseSBwbGFjZWQgCiAgaW4gdGhlIHN0YXJ0IHRhZywgd2hlcmUgdGhleSBiZWxvbmcpIGFuZCBpbnNlcnQgYSB2YWx1ZS4gSGVyZSdzIGFuIGV4YW1wbGU6PC9wPgo8cHJlPgovLyBDcmVhdGUgYSBuZXcgY2h1bmsgb2YgWE1MLgpYbWxPYmplY3QgbmV3WG1sID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLyogCiAqIEluc2VydCBhIG5ldyBjdXJzb3IgYW5kIG1vdmUgaXQgdG8gdGhlIGZpcnN0IFNUQVJUIHRva2VuICh3aGVyZSB0aGUKICogWE1MIGFjdHVhbGx5IGJlZ2lucy4KICovClhtbEN1cnNvciBjdXJzb3IgPSBuZXdYbWwubmV3Q3Vyc29yKCk7CmN1cnNvci50b05leHRUb2tlbigpOwovLyBCZWdpbiBhIG5ldyBpdGVtIGVsZW1lbnQgd2hvc2UgbmFtZXNwYWNlIFVSSSBpcyAiaHR0cDovL29wZW51cmkub3JnIi4KY3Vyc29yLmJlZ2luRWxlbWVudCgmcXVvdDtpdGVtJnF1b3Q7LCAmcXVvdDtodHRwOi8vb3BlbnVyaS5vcmcvJnF1b3Q7KTsKLy8gSW5zZXJ0IGFuIElEIGF0dHJpYnV0ZSBvbiB0aGUgaXRlbSBlbGVtZW50LCBhbG9uZyB3aXRoIGFuIGF0dHJpYnV0ZSB2YWx1ZS4KY3Vyc29yLmluc2VydEF0dHJpYnV0ZVdpdGhWYWx1ZSgmcXVvdDtpZCZxdW90OywgJnF1b3Q7NDA1NjQwNCZxdW90Oyk7Ci8vIEluc2VydCAiYmljeWNsZSIgYXMgYW4gZWxlbWVudCB2YWx1ZS4KY3Vyc29yLmluc2VydENoYXJzKCZxdW90O2JpY3ljbGUmcXVvdDspOwpjdXJzb3IuZGlzcG9zZSgpOwo8L3ByZT4KPHA+VGhpcyBleGFtcGxlIHJlc3VsdHMgaW4gc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZzo8L3A+CjxwcmU+Jmx0O25zMTppdGVtIGlkPSZxdW90OzQwNTY0MDQmcXVvdDsgeG1sbnM6bnMxPSZxdW90O2h0dHA6Ly9vcGVudXJpLm9yZy8mcXVvdDsmZ3Q7YmljeWNsZSZsdDsvbnMxOml0ZW0mZ3Q7CjwvcHJlPgo8aDI+IFVzaW5nIFN0b3JlZCBDdXJzb3IgTG9jYXRpb25zIHdpdGggcHVzaCgpIGFuZCBwb3AoKTwvaDI+CjxkaXYgaWQ9InRvcGljdGV4dCI+IAogIDxwPldoZW4geW91IHdhbnQgdG8gbW92ZSBhIGN1cnNvciBhcm91bmQsIGJ1dCB3YW50IHRvIGtlZXAgdHJhY2sgb2YgYSBmb3JtZXIgCiAgICBsb2NhdGlvbiwgeW91IGNhbiB1c2UgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3I8L3NwYW4+IGludGVyZmFjZSdzIAogICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1c2g8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cG9wPC9zcGFuPiAKICAgIG1ldGhvZHMuIFRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4gbWV0aG9kIHB1c2hlcyB0aGUgY3Vyc29yJ3MgCiAgICBjdXJyZW50IGxvY2F0aW9uIG9udG8gYSBzdGFjayBvZiBsb2NhdGlvbnMgbWFpbnRhaW5lZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIAogICAgY3Vyc29yOyB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBvcDwvc3Bhbj4gbWV0aG9kIHJlbW92ZXMgdGhlIGxvY2F0aW9uIAogICAgZnJvbSB0aGUgdG9wIG9mIHRoZSBzdGFjayBhbmQgbW92ZXMgdGhlIGN1cnNvciB0byB0aGF0IGxvY2F0aW9uLjwvcD4KICA8cD5Gb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyAmbHQ7ZW1wbG95ZWUmZ3Q7IGVsZW1lbnQsIHVzZWQgaW4gdGhlIAogICAgZXhhbXBsZSBiZWxvdy48L3A+CiAgPHByZT4KJmx0O2VtcGxveWVlJmd0OwombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7bmFtZSZndDtHbGFkeXMgS3Jhdml0eiZsdDsvbmFtZSZndDsKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2FkZHJlc3MgbG9jYXRpb249JnF1b3Q7aG9tZSZxdW90OyZndDsKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3N0cmVldCZndDsxMzEzIE1vY2tpbmdiaXJkIExhbmUmbHQ7L3N0cmVldCZndDsKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2NpdHkmZ3Q7U2VhdHRsZSZsdDsvY2l0eSZndDsKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3N0YXRlJmd0O1dBJmx0Oy9zdGF0ZSZndDsKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3ppcCZndDs5ODExNSZsdDsvemlwJmd0OwombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L2FkZHJlc3MmZ3Q7CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDthZGRyZXNzIGxvY2F0aW9uPSZxdW90O3dvcmsmcXVvdDsmZ3Q7CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtzdHJlZXQmZ3Q7MjAxMSAxNTJuZCBBdmVudWUgTkUmbHQ7L3N0cmVldCZndDsKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2NpdHkmZ3Q7UmVkbW9uZCZsdDsvY2l0eSZndDsKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3N0YXRlJmd0O1dBJmx0Oy9zdGF0ZSZndDsKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3ppcCZndDs5ODA1MiZsdDsvemlwJmd0OwombmJzcDsmbmJzcDsgJm5ic3A7Jmx0Oy9hZGRyZXNzJmd0OwombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7cGhvbmUgbG9jYXRpb249JnF1b3Q7d29yayZxdW90OyZndDsoNDI1KSA1NTUtNjg5NyZsdDsvcGhvbmUmZ3Q7CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtwaG9uZSBsb2NhdGlvbj0mcXVvdDtob21lJnF1b3Q7Jmd0OygyMDYpIDU1NS02NTk0Jmx0Oy9waG9uZSZndDsKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3Bob25lIGxvY2F0aW9uPSZxdW90O21vYmlsZSZxdW90OyZndDsoMjA2KSA1NTUtNzg5NCZsdDsvcGhvbmUmZ3Q7CiZsdDsvZW1wbG95ZWUmZ3Q7CjwvcHJlPgogIDxwPlRoZSBmb2xsb3dpbmcgSmF2YSBjb2RlIGlsbHVzdHJhdGVzIGhvdyB5b3UgY2FuIHVzZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4gCiAgICBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBvcDwvc3Bhbj4gdG8gcHV0IHRoZSBjdXJzb3IgYmFjayB0byBhIHNhdmVkIAogICAgbG9jYXRpb24gYWZ0ZXIgYSBiaXQgb2YgdHJhdmVsaW5nLjwvcD4KICA8cHJlPgovKioKICogUGFzcyB0byB0aGUgdHJ5U2VsZWN0UGF0aCBtZXRob2QgYW4gWG1sT2JqZWN0IGluc3RhbmNlIHRoYXQgY29udGFpbnMKICogdGhlIFhNTCBhYm92ZS4KICovCnB1YmxpYyB2b2lkIHRyeVNlbGVjdFBhdGgoWG1sT2JqZWN0IHhtbCkKewogICAgLyogCiAgICAgKiBJbnNlcnRzIHRoZSBjdXJzb3IgYXQgdGhlIFNUQVJURE9DIHRva2VuICh0aGUgdmVyeSBiZWdpbm5pbmcsIAogICAgICogYmVmb3JlIGFueSBlbGVtZW50cykuCiAgICAgKi8KICAgIFhtbEN1cnNvciBjdXJzb3IgPSB4bWwubmV3Q3Vyc29yKCk7CiAgICAvLyBNb3ZlcyB0aGUgY3Vyc29yIHRvIGp1c3QgYmVmb3JlICZsdDtlbXBsb3llZSZndDsKICAgIGN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKICAgIC8vIFB1c2hlcyB0aGUgY3Vyc29yJ3MgY3VycmVudCBsb2NhdGlvbiBvbnRvIHRoZSBzdGFjay4KICAgIGN1cnNvci5wdXNoKCk7CiAgICAvLyBNb3ZlcyB0aGUgY3Vyc29yIHRvIGp1c3QgYmVmb3JlIHRoZSAmcXVvdDt3b3JrJnF1b3Q7ICZsdDtwaG9uZSZndDsgZWxlbWVudC4gICAgICAKICAgIGN1cnNvci50b0NoaWxkKDIpOwogICAgLy8gTW92ZXMgdGhlIGN1cnNvciB0byBqdXN0IGJlZm9yZSB0aGUgJnF1b3Q7aG9tZSZxdW90OyAmbHQ7cGhvbmUmZ3Q7IGVsZW1lbnQuCiAgICBjdXJzb3IudG9OZXh0U2libGluZygpOwogICAgLy8gTW92ZXMgdGhlIGN1cnNvciBiYWNrIHRvIGp1c3QgYmVmb3JlICZsdDtlbXBsb3llZSZndDsKICAgIGN1cnNvci5wb3AoKTsKfQo8L3ByZT4KICA8cD5PZiBjb3Vyc2UsIHlvdSBjYW4gY2FsbCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wb3A8L3NwYW4+IAogICAgbXVsdGlwbGUgdGltZXMuIEVhY2ggbmV3IGNhbGwgdG8gdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wdXNoPC9zcGFuPiAKICAgIG1ldGhvZCBwdXNoZXMgdGhlIGN1cnJlbnQgbG9jYXRpb24gb250byB0aGUgc3RhY2suIEFzIHlvdSBjYWxsIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cG9wPC9zcGFuPiAKICAgIG1ldGhvZCwgeW91J3JlIGFsd2F5cyBnZXR0aW5nIHdoYXQncyBvbiB0b3Agb2YgdGhlIHN0YWNrLiBTbyBpZiB5b3UgY2FsbGVkIAogICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1c2g8L3NwYW4+IHRocmVlIHRpbWVzIGJlZm9yZSBjYWxsaW5nIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wb3A8L3NwYW4+IAogICAgJiM4MjEyOyAxLCAyLCAzICYjODIxMjsgY2FsbGluZyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cG9wPC9zcGFuPiB0aHJlZSAKICAgIHRpbWVzIHdvdWxkIGdldCB0aG9zZSBsb2NhdGlvbnMgaW4gcmV2ZXJzZSBvcmRlciAmIzgyMTI7IDMsIDIsIDEuPC9wPgogIDxwPlRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wb3A8L3NwYW4+IAogICAgbWV0aG9kcyBjYW4gYmUgaGFuZHkgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gY3JlYXRpbmcgbmV3IGN1cnNvcnMgdGhhdCBhcmUgZGVzaWduZWQgCiAgICBzaW1wbHkgdG8gbWFyayBhIHBhcnRpY3VsYXIgbG9jYXRpb24gd2hpbGUgeW91IG1vdmUgYW5vdGhlciBjdXJzb3IgYXJvdW5kLiAKICAgIFRoZSByZXNvdXJjZXMgcmVxdWlyZWQgdG8gbWFpbnRhaW4gYSBsb2NhdGlvbiBzdGFjayB0aHJvdWdoIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wdXNoPC9zcGFuPiAKICAgIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cG9wPC9zcGFuPiBhcmUgZmFyIGxlc3MgdGhhbiB0aG9zZSBuZWVkZWQgYnkgCiAgICBjdXJzb3JzLiA8L3A+CiAgPEgxPkRpc3Bvc2luZyBvZiBhIEN1cnNvcjwvSDE+CiAgPHA+V2hlbiB5b3UncmUgdGhyb3VnaCB3aXRoIGEgY3Vyc29yLCB5b3VyIGNvZGUgc2hvdWxkIGNhbGwgaXRzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5kaXNwb3NlPC9zcGFuPiAKICAgIG1ldGhvZCB0byBpbmRpY2F0ZSB0aGF0IGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZC48L3A+CiAgPHAgY2xhc3M9InJlbGF0ZWR0b3BpY3MiPlJlbGF0ZWQgVG9waWNzPC9wPgogIDxwPjxhIGhyZWY9ImNvblVuZGVyc3RhbmRpbmdYTUxUb2tlbnMuaHRtbCI+VW5kZXJzdGFuZGluZyBYTUwgVG9rZW5zPC9hPjwvcD4KICA8cD48YSBocmVmPSJjb25HZXR0aW5nU3RhcnRlZHdpdGhYTUxCZWFucy5odG1sIj5HZXR0aW5nIFN0YXJ0ZWQgd2l0aCBYTUxCZWFuczwvYT48L3A+CjwvZGl2Pgo8IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+IAo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KCjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K