PCFkb2N0eXBlIEhUTUwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iPgoKPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KCiAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+CjxodG1sPgo8aGVhZD4KPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iZG9jdGl0bGUiIC0tPgo8dGl0bGU+SmF2YSBUeXBlcyBHZW5lcmF0ZWQgZnJvbSBTY2hlbWE8L3RpdGxlPgo8IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Cgo8IS0tKE1ldGEpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgo8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JENIQVJTRVQ7Ij4KCgo8IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJtZXRhdGFncyIgLS0+Cgo8bWV0YSBuYW1lPSJjb21wb25lbnQiIGNvbnRlbnQ9IiI+CjwhLS0gSW4gdGhlIGRlc2NyaXB0aW9uIG1ldGF0YWcsIHBsZWFzZSBwcm92aWRlIGEgQlJJRUYgZGVzY3JpcHRpb24gb2YgdGhlIHRvcGljIGNvbnRlbnRzLiAtLT4KPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IiI+CjwhLS0gSW4gdGhlIGNvbXBvbmVudCBtZXRhdGFnLCBwbGVhc2UgbGlzdCBrZXl3b3JkcyB0aGF0IHdpbGwgaGVscCBhIHVzZXIgc2VhcmNoIGZvciB0aGlzIHRvcGljLiAtLT4KPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+CjwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KCjwhLS0oTGlua3MpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CjwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImhlYWQiIC0tPgoKPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KCjwhLS0oTWV0YSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CgoKCjxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0ieW91ciBuYW1lIj4KPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgZGVzY3JpcHRpb24gb2YgdGhlIHRvcGljIGNvbnRlbnRzLiI+CjxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSJrZXl3b3JkcyB0byBoZWxwIGluIHNlYXJjaGVzIj4KPG1ldGEgbmFtZT0iZGF0ZSBsYXN0IG1vZGlmaWVkIiBjb250ZW50PSIxMC8yNS8wMiI+CjwhLS0oTGlua3MpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CjwhLS0oQm9keSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+PCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgo8bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgo8YSBocmVmPSIuLi8uLi8uLi9jb3JlL2luZGV4Lmh0bWwiIGlkPSJpbmRleCI+PC9hPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvdG9waWNJbmZvLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL0Nvb2tpZUNsYXNzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL2Rpc3BsYXlDb250ZW50LmpzIj48L3NjcmlwdD4KPC9oZWFkPgoKPCEtLShCb2R5KT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KPGJvZHk+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgoKPC9zY3JpcHQ+CjwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImJvZHkiIC0tPgo8aDE+IEphdmEgVHlwZXMgR2VuZXJhdGVkIGZyb20gVXNlci1EZXJpdmVkIFNjaGVtYSBUeXBlczwvaDE+CjxkaXYgaWQ9InRvcGljdGV4dCI+CiAgPHA+V2hlbiB5b3UgY29tcGlsZSBYTUwgc2NoZW1hLCB0aGUgcmVzdWx0aW5nIEFQSSBpcyBtYWRlIHVwIG9mIHR3byBjYXRlZ29yaWVzCiAgICBvZiB0eXBlczogYnVpbHQtaW4gdHlwZXMgdGhhdCBtaXJyb3IgdGhvc2UgaW4gdGhlIHNjaGVtYSBzcGVjaWZpY2F0aW9uIGFuZAogICAgb3RoZXJzIHRoYXQgYXJlIGdlbmVyYXRlZCBmcm9tIHVzZXItZGVyaXZlZCBzY2hlbWEgdHlwZXMuIFRoaXMgdG9waWMgcHJvdmlkZXMKICAgIGFuIG92ZXJ2aWV3IG9mIHRoZSBKYXZhIHR5cGVzIGdlbmVyYXRlZCBmb3IgdXNlci1kZXJpdmVkIHR5cGVzLCBkZXNjcmliaW5nCiAgICB0aGUgbWV0aG9kcyB0aGUgSmF2YSB0eXBlcyBwcm92aWRlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBidWlsdC1pbiB0eXBlcywKICAgIHNlZSA8YSBocmVmPSJjb25YTUxCZWFuc1N1cHBvcnRCdWlsdEluU2NoZW1hVHlwZXMuaHRtbCI+WE1MQmVhbnMgU3VwcG9ydCBmb3IKICAgIEJ1aWx0LUluIFNjaGVtYSBUeXBlczwvYT4uIEZvciBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWV0aG9kcyBleHBvc2VkCiAgICBieSBnZW5lcmF0ZWQgdHlwZXMsIHNlZSA8YSBocmVmPSJjb25NZXRob2RzRm9yR2VuZXJhdGVkSmF2YVR5cGVzLmh0bWwiPk1ldGhvZHMKICAgIGZvciBHZW5lcmF0ZWQgSmF2YSBUeXBlczwvYT4uPC9wPgogIDxwPkluIGdlbmVyYWwsIGFuIEFQSSBnZW5lcmF0ZWQgZnJvbSBzY2hlbWEgaXMgYW4gaW50dWl0aXZlIG1lYW5zIHRvIGFjY2VzcwogICAgWE1MIGluc3RhbmNlcyBiYXNlZCBvbiB0aGUgc2NoZW1hLiBZb3UnbGwgcHJvYmFibHkgZmluZCB0aGF0IGZvciBtb3N0IHVzZXMKICAgIGl0J3MgdW5uZWNlc3NhcnkgdG8ga25vdyB0aGUgcnVsZXMgZm9yIGdlbmVyYXRpbmcgaXQgaW4gb3JkZXIgdG8gdXNlIGl0LiBIb3dldmVyLAogICAgZm9yIHRob3NlIGNhc2VzIHdoZW4gaXQncyB1bmNsZWFyIHdoYXQncyBnb2luZyBvbiBiZWhpbmQgdGhlIHNjZW5lcyAob3IgaWYKICAgIHlvdSdyZSBqdXN0IGN1cmlvdXMpLCB0aGlzIHRvcGljIGRlc2NyaWJlcyB0aGUgcnVsZXMuPC9wPgogIDxwIGNsYXNzPSJub3RlcGFyYSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgWE1MQmVhbnMgQVBJIGFsc28gcHJvdmlkZXMgYQogICAgd2F5IGZvciB5b3UgdG8gZ2V0IGluZm9ybWF0aW9uIDxlbT5hYm91dCA8L2VtPnRoZSB0eXBlIHN5c3RlbSBpdHNlbGYgJiM4MjEyOwogICAgaW4gb3RoZXIgd29yZHMsIGFib3V0IHRoZSBBUEkgYW5kIHRoZSB1bmRlcmx5aW5nIHNjaGVtYS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sCiAgICBzZWUgPGEgaHJlZj0iY29uSW50cm9Ub1RoZVNjaGVtYVR5cGVTeXN0ZW0uaHRtbCI+SW50cm9kdWN0aW9uIHRvIFNjaGVtYSBUeXBlCiAgICBTaWduYXR1cmVzPC9hPi48L3A+CiAgPHA+RWFjaCBvZiB0aGUgdHlwZXMgZ2VuZXJhdGVkIHdoZW4geW91IGNvbXBpbGUgYSBzY2hlbWEgaXMgZGVzaWduZWQgc3BlY2lmaWNhbGx5CiAgICBmb3IgYWNjZXNzIHRvIFhNTCBpbnN0YW5jZXMgY29uZm9ybWluZyB0byB0aGF0IHBhcnQgb2YgdGhlIHNjaGVtYS4gU3RhcnQgYnkKICAgIHRha2luZyBhIGxvb2sgYXQgYSBzaW1wbGUgWE1MIGFuZCBzY2hlbWEgZXhhbXBsZS4gVGhlIGZvbGxvd2luZyBzY2hlbWEgZGVzY3JpYmVzCiAgICBhbiBYTUwgZG9jdW1lbnQgdG8gY29udGFpbiBhIHN0b2NrIHByaWNlIHF1b3RlLjwvcD4KICA8cHJlPiZsdDt4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiZndDsKICAgICZsdDt4czplbGVtZW50IG5hbWU9InByaWNlLXF1b3RlIiZndDsKICAgICAgICAmbHQ7eHM6Y29tcGxleFR5cGUmZ3Q7CiAgICAgICAgICAgICZsdDt4czpzZXF1ZW5jZSZndDsKICAgICAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9InN0b2NrLXN5bWJvbCIgdHlwZT0ieHM6c3RyaW5nIi8mZ3Q7CiAgICAgICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJzdG9jay1wcmljZSIgdHlwZT0ieHM6ZmxvYXQiLyZndDsKICAgICAgICAgICAgJmx0Oy94czpzZXF1ZW5jZSZndDsKICAgICAgICAmbHQ7L3hzOmNvbXBsZXhUeXBlJmd0OwogICAgJmx0Oy94czplbGVtZW50Jmd0OwombHQ7L3hzOnNjaGVtYSZndDsKPC9wcmU+CiAgPHA+VGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIFhNTCB0aGF0IGNvbmZvcm1zIHRvIHRoaXMgc2NoZW1hLjwvcD4KICA8cHJlPiZsdDtwcmljZS1xdW90ZSZndDsKICAgICZsdDtzdG9jay1zeW1ib2wmZ3Q7QkVBUyZsdDsvc3RvY2stc3ltYm9sJmd0OwogICAgJmx0O3N0b2NrLXByaWNlJmd0OzU5LjIxJmx0Oy9zdG9jay1wcmljZSZndDsKJmx0Oy9wcmljZS1xdW90ZSZndDs8L3ByZT4KICA8cD5XaGVuIHlvdSBjb21waWxlIHRoaXMgc2NoZW1hLCB5b3UgZ2V0IHR3byBnZW5lcmF0ZWQgWE1MQmVhbnMgaW50ZXJmYWNlczoKICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj4gUHJpY2VRdW90ZURvY3VtZW50PC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlByaWNlUXVvdGVEb2N1bWVudC5QcmljZVF1b3RlPC9zcGFuPi48L3A+CiAgPHA+RnJvbSB0aGUgc2NoZW1hIHBvaW50IG9mIHZpZXcsIHRoZSBnZW5lcmF0ZWQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlByaWNlUXVvdGU8L3NwYW4+CiAgICBpbnRlcmZhY2UgcmVwcmVzZW50cyB0aGUgPGVtPmNvbXBsZXggdHlwZTwvZW0+IHlvdSBzZWUgaW5zaWRlIHRoZSBzY2hlbWEncwogICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnByaWNlLXF1b3RlPC9zcGFuPiBlbGVtZW50IGRlY2xhcmF0aW9uLiBMb29raW5nIGF0CiAgICB0aGUgWE1MIGluc3RhbmNlLCB5b3UgY2FuIHNlZSB0aGF0IHRoaXMgY29tcGxleCB0eXBlIHRyYW5zbGF0ZXMgaW50byBhIHNlcXVlbmNlCiAgICBvZiB0d28gZWxlbWVudHMsIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zdG9jay1zeW1ib2w8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c3RvY2stcHJpY2U8L3NwYW4+LgogICAgU28gaXQncyBub3Qgc3VycHJpc2luZyB0aGF0IHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+UHJpY2VRdW90ZTwvc3Bhbj4KICAgIGludGVyZmFjZSBleHBvc2VzIG1ldGhvZHMgc3VjaCBhcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Z2V0U3RvY2tQcmljZTwvc3Bhbj4KICAgIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c2V0U3RvY2tQcmljZTwvc3Bhbj4gdG8gc2V0IHRoZSB2YWx1ZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c3RvY2stcHJpY2U8L3NwYW4+CiAgICBlbGVtZW50LjwvcD4KICA8cD5UaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlByaWNlUXVvdGVEb2N1bWVudDwvc3Bhbj4gaW50ZXJmYWNlLCBvbiB0aGUKICAgIG90aGVyIGhhbmQsIHJlcHJlc2VudHMgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wcmljZS1xdW90ZTwvc3Bhbj4gPGVtPmRvY3VtZW50PC9lbT4KICAgIHRoYXQgY29udGFpbnMgdGhlIHJvb3QgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnByaWNlLXF1b3RlPC9zcGFuPiBlbGVtZW50LgogICAgWE1MQmVhbnMgY3JlYXRlcyBhIHNwZWNpYWwgJnF1b3Q7ZG9jdW1lbnQmcXVvdDsgdHlwZSBmb3IgZ2xvYmFsIGVsZW1lbnQgdHlwZXMuCiAgICBBIGRvY3VtZW50IHR5cGUgcHJvdmlkZXMgYSB3YXkgZm9yIHlvdSB0byBnZXQgYW5kIHNldCB0aGUgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcKICAgIHR5cGUsIGhlcmUgcmVwcmVzZW50ZWQgYnkgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlByaWNlUXVvdGU8L3NwYW4+LiBUaGUKICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wcmljZS1xdW90ZTwvc3Bhbj4gZWxlbWVudCBpcyBjb25zaWRlcmVkIGEgPGVtPmdsb2JhbDwvZW0+CiAgICBlbGVtZW50IGJlY2F1c2UgaXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSBhbnl3aGVyZSBlbHNlIGluIHRoZSBzY2hlbWEuIEZvcgogICAgZ2xvYmFsIGVsZW1lbnRzLCB0aGUgWE1MQmVhbnMgc2NoZW1hIGNvbXBpbGVyIGdlbmVyYXRlcyBhbiBpbnRlcmZhY2Ugd2hvc2UKICAgIG5hbWUgZW5kcyB3aXRoICZxdW90O0RvY3VtZW50LiZxdW90OyBUaGlzIGlzIGJlY2F1c2UgYW4gWE1MIHNjaGVtYSBoYXMgbm8KICAgIHdheSBvZiBkZWZpbmluZyBhICZxdW90O3Jvb3QmcXVvdDsgZWxlbWVudDsgYW55IGdsb2JhbCBlbGVtZW50IGNhbiBiZSB0aGUKICAgIHJvb3QuPC9wPgogIDxwPlRoZSBmb2xsb3dpbmcgYml0IG9mIEphdmEgY29kZSBpbGx1c3RyYXRlcyBob3cgeW91IG1pZ2h0IHVzZSB0aGVzZSBpbnRlcmZhY2VzCiAgICB0byBnZXQgdGhlIHN0b2NrIHByaWNlIGNvbnRhaW5lZCBpbiB0aGUgWE1MLjwvcD4KICA8cHJlPgpwdWJsaWMgc3RhdGljIGZsb2F0IGdldFN0b2NrUHJpY2UoamF2YS5pby5GaWxlIG9yZGVyWE1MKSB0aHJvd3MgRXhjZXB0aW9uCnsKICAgIFByaWNlUXVvdGVEb2N1bWVudCBkb2NYTUwgPSBQcmljZVF1b3RlRG9jdW1lbnQuRmFjdG9yeS5wYXJzZShvcmRlclhNTCk7CiAgICBQcmljZVF1b3RlIHF1b3RlWE1MID0gZG9jWE1MLmdldFByaWNlUXVvdGUoKTsKICAgIGZsb2F0IHN0b2NrUHJpY2UgPSBxdW90ZVhNTC5nZXRTdG9ja1ByaWNlKCk7CiAgICByZXR1cm4gc3RvY2tQcmljZTsKfQo8L3ByZT4KICA8cD5UaGlzIGNvZGUgbG9hZHMgdGhlIFhNTCBmcm9tIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkZpbGU8L3NwYW4+IG9iamVjdCwKICAgIGNvbnZlcnRpbmcgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wYXJzZTwvc3Bhbj4gbWV0aG9kJ3MgcmV0dXJuIHZhbHVlCiAgICB0byBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5QcmljZVF1b3RlRG9jdW1lbnQ8L3NwYW4+IGluc3RhbmNlLiBJdCB0aGVuCiAgICB1c2VzIHRoaXMgaW5zdGFuY2UgdG8gZ2V0IGFuIGluc3RhbmNlIG9mIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5QcmljZVF1b3RlPC9zcGFuPi4KICAgIFdpdGggPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlByaWNlUXVvdGU8L3NwYW4+LCB0aGUgY29kZSBleHRyYWN0cyB0aGUgc3RvY2sKICAgIHByaWNlLiA8L3A+CjwvZGl2Pgo8ZGl2PgogIDxkaXYgaWQ9InRvcGljdGV4dCI+CiAgICA8cD5UaGUgWE1MIHNjaGVtYSBzcGVjaWZpY2F0aW9uIHByb3ZpZGVzIGEgcmljaCBzZXQgb2YgcnVsZXMgdGhyb3VnaCB3aGljaAogICAgICB5b3UgY2FuIGRlcml2ZSBuZXcgdHlwZXMuIFdoZW4geW91IGdlbmVyYXRlIGludGVyZmFjZXMgZnJvbSB5b3VyIHNjaGVtYSwKICAgICAgWE1MQmVhbnMgdXNlcyB0aGUgc2NoZW1hJ3MgcnVsZXMgdG8gZGV0ZXJtaW5lIGhvdyB0byBnZW5lcmF0ZSBpbnRlcmZhY2VzLgogICAgICBUaGUgZm9sbG93aW5nIGRlc2NyaWJlcyBzb21lIG9mIHRoZSBndWlkZWxpbmVzIGJ5IHdoaWNoIHRoaXMgaXMgZG9uZS48L3A+CiAgICA8aDI+TmFtZXMgZm9yIEludGVyZmFjZXM8L2gyPgogICAgPHA+SW50ZXJmYWNlcyBhcmUgZ2VuZXJhdGVkIGZvciBzY2hlbWEgdHlwZXMgKGJvdGggc2ltcGxlIGFuZCBjb21wbGV4KS4gQW5vbnltb3VzCiAgICAgIHNjaGVtYSB0eXBlcyByZXN1bHQgaW4gaW5uZXIgaW50ZXJmYWNlcyBpbnNpZGUgdGhlIHR5cGUgaW50ZXJmYWNlIGluIHdoaWNoCiAgICAgIHRoZXkgYXJlIGRlZmluZWQuIFRoZWlyIG5hbWUgY29tZXMgZnJvbSB0aGUgZWxlbWVudCBvciBhdHRyaWJ1dGUgaW4gd2hpY2gKICAgICAgdGhleSBpcyBkZWZpbmVkLjwvcD4KICAgIDxwPk5hbWVzIGZvciBzY2hlbWEgdHlwZXMgYmVjb21lIEphdmEtZnJpZW5kbHkgbmFtZXMgd2hlbiB0aGUgc2NoZW1hIGlzIGNvbXBpbGVkLgogICAgICBJbiBvdGhlciB3b3JkcywgbmFtZXMgc3VjaCBhcyAicHJpY2UtcXVvdGUiIGJlY29tZSAiUHJpY2VRdW90ZS4iIEluIGFkZGl0aW9uLAogICAgICBhIHNjaGVtYSdzIFhNTCBuYW1lc3BhY2UgVVJJcyBiZWNvbWUgcGFja2FnZSBuYW1lcyBmb3IgWE1MQmVhbiB0eXBlcyBnZW5lcmF0ZWQKICAgICAgZnJvbSB0aGUgc2NoZW1hLiBUaGUgd2F5IHRoaXMgbmFtZSB0cmFuc2xhdGlvbiBpcyBkb25lIGlzIGRlc2NyaWJlZCBieSBzZWN0aW9uCiAgICAgIEMgb2YgdGhlIEphdmEgQVBJIGZvciBYTUwgQmluZGluZyAoSkFYQikgc3BlY2lmaWNhdGlvbiBhdCA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9kb3dubG9hZHMvamF4Yi5odG1sIiB0YXJnZXQ9Il9ibGFuayI+CiAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIuaHRtbC48L2E+IDwvcD4KICAgIDxwPkhlcmUgYXJlIGEgZmV3IGV4YW1wbGVzOjwvcD4KICAgIDx0YWJsZT4KICAgICAgPHRyPgogICAgICAgIDx0ZD48c3Ryb25nPlNjaGVtYSBUYXJnZXQgTmFtZXNwYWNlPC9zdHJvbmc+PC90ZD4KICAgICAgICA8dGQgd2lkdGg9IjE1NSI+PHN0cm9uZz5YTUwgTG9jYWxuYW1lPC9zdHJvbmc+PC90ZD4KICAgICAgICA8dGQ+PHN0cm9uZz5GdWxseS1RdWFsaWZpZWQgWE1MQmVhbiBUeXBlIE5hbWU8L3N0cm9uZz48L3RkPgogICAgICA8L3RyPgogICAgICA8dHI+CiAgICAgICAgPHRkPmh0dHA6Ly93d3cubXljb21wYW55LmNvbS8yMDAyL2J1eWVyPC90ZD4KICAgICAgICA8dGQgd2lkdGg9IjE1NSI+cHVyY2hhc2Utb3JkZXItNDwvdGQ+CiAgICAgICAgPHRkPmNvbS5teWNvbXBhbnkueDIwMDIuYnV5ZXIuUHVyY2hhc2VPcmRlcjQ8L3RkPgogICAgICA8L3RyPgogICAgICA8dHI+CiAgICAgICAgPHRkPmh0dHA6Ly9teWNvLmNvbS9zYW1wbGUuaHRtbDwvdGQ+CiAgICAgICAgPHRkIHdpZHRoPSIxNTUiPlNhbXBsZURvY3VtZW50PC90ZD4KICAgICAgICA8dGQ+Y29tLm15Y28uc2FtcGxlLlNhbXBsZURvY3VtZW50PC90ZD4KICAgICAgPC90cj4KICAgICAgPHRyPgogICAgICAgIDx0ZD5odHRwOi8vb3BlbnVyaS5vcmcvdGVzdF9jYXNlXzE8L3RkPgogICAgICAgIDx0ZCB3aWR0aD0iMTU1Ij50ZXN0X3R5cGU8L3RkPgogICAgICAgIDx0ZD5vcmcub3BlbnVyaS50ZXN0Q2FzZTEuVGVzdFR5cGU8L3RkPgogICAgICA8L3RyPgogICAgPC90YWJsZT4KICAgIDxwPldoZW4gdGhlcmUgYXJlIG5hbWUgY29sbGlzaW9ucywgdGhlIGdlbmVyYXRlZCB0eXBlcyB3aWxsIGhhdmUgbmFtZXMgd2l0aAogICAgICBudW1lcmFscyBhcHBlbmRlZCZuYnNwO5cgZm9yIGV4YW1wbGUsICJUZXN0VHlwZTIiLjwvcD4KICAgIDxoMj5HbG9iYWwgRWxlbWVudHMgYW5kIEF0dHJpYnV0ZXM8L2gyPgogICAgPHA+SW4gc2NoZW1hLCBnbG9iYWwgZWxlbWVudCBhbmQgYXR0cmlidXRlIGRlZmluaXRpb25zIGFyZSB0aG9zZSB0aGF0IGFyZQogICAgICBkZWNsYXJlZCBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBzY2hlbWEgKHRoYXQgaXMsIGltbWVkaWF0ZWx5IHdpdGhpbiB0aGUKICAgICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNjaGVtYTwvc3Bhbj4gcm9vdCBlbGVtZW50KS4gQmVjYXVzZSB0aGV5IGFyZSBnbG9iYWwsCiAgICAgIHRoZXkgbWF5IGJlIHJlZmVyZW5jZWQgZnJvbSBpbnNpZGUgdGhlIHNjaGVtYSBieSBuYW1lLiBUaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmNyZWRpdFJlcG9ydDwvc3Bhbj4KICAgICAgKG5vdCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmNyZWRpdFJlcG9ydFR5cGU8L3NwYW4+IGNvbXBsZXggdHlwZSkKICAgICAgZWxlbWVudCBkZWZpbmVkIGluIHRoZSBmb2xsb3dpbmcgc2NoZW1hIGlzIGFuIGV4YW1wbGUuPC9wPgogICAgPHByZT4KJmx0O3hzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9JnF1b3Q7aHR0cDovL29wZW51cmkub3JnL3NhbXBsZXMvY3JlZGl0UmVwb3J0JnF1b3Q7CiAgICB4bWxuczpjcj0mcXVvdDtodHRwOi8vb3BlbnVyaS5vcmcvc2FtcGxlcy9jcmVkaXRSZXBvcnQmcXVvdDsKICAgIHhtbG5zOnhzPSZxdW90O2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJnF1b3Q7CiAgICBlbGVtZW50Rm9ybURlZmF1bHQ9JnF1b3Q7cXVhbGlmaWVkJnF1b3Q7CiAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0mcXVvdDt1bnF1YWxpZmllZCZxdW90OyZndDsKICAgICZsdDt4czpjb21wbGV4VHlwZSBuYW1lPSZxdW90O2NyZWRpdFJlcG9ydFR5cGUmcXVvdDsmZ3Q7CiAgICAgICAgJmx0O3hzOnNlcXVlbmNlJmd0OwogICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O2JhbmtSZXBvcnQmcXVvdDsgdHlwZT0mcXVvdDt4czpzdHJpbmcmcXVvdDsvJmd0OwogICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O3RheFJlcG9ydCZxdW90OyB0eXBlPSZxdW90O3hzOnN0cmluZyZxdW90Oy8mZ3Q7CiAgICAgICAgJmx0Oy94czpzZXF1ZW5jZSZndDsKICAgICZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7CiAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O2NyZWRpdFJlcG9ydCZxdW90OyB0eXBlPSZxdW90O2NyOmNyZWRpdFJlcG9ydFR5cGUmcXVvdDsvJmd0OwombHQ7L3hzOnNjaGVtYSZndDs8L3ByZT4KICAgIDxwPlhNTEJlYW5zIGdlbmVyYXRlcyBhIHNlcGFyYXRlIGludGVyZmFjZSBmb3IgZWFjaCBvZiB0aGVzZS4gQWxzbywgZ2xvYmFsCiAgICAgIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSB0eXBlcyBhcmUgc29tZXdoYXQgdW5pcXVlIGluIHRoYXQgdGhlIHNjaGVtYSBjb21waWxlcgogICAgICB3aWxsIGNyZWF0ZSBzcGVjaWFsIHR5cGVzIHRvIGhvbGQgdGhlIGdsb2JhbGx5IGRlZmluZWQgZWxlbWVudCBvciBhdHRyaWJ1dGUuCiAgICAgIFRoZSBuYW1lcyBvZiB0aGVzZSB0eXBlcyB3aWxsIGJlIGFwcGVuZGVkIHdpdGggJnF1b3Q7RG9jdW1lbnQmcXVvdDsgKGZvcgogICAgICBlbGVtZW50cykgb3IgJnF1b3Q7QXR0cmlidXRlJnF1b3Q7IChmb3IgYXR0cmlidXRlcykuIFlvdSBjYW4gcmV0cmlldmUgdGhlCiAgICAgIGVsZW1lbnQgb3IgYXR0cmlidXRlIGl0c2VsZiAob3IgY3JlYXRlIGEgbmV3IG9uZSkgYnkgY2FsbGluZyB0aGUgYWNjZXNzb3IKICAgICAgbWV0aG9kcyB0aGF0IHRoZSBzcGVjaWFsIHR5cGVzIHByb3ZpZGUuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSB3b3VsZCBjcmVhdGUKICAgICAgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNyZWRpdFJlcG9ydCBlbGVtZW50LjwvcD4KICAgIDxwcmU+Ci8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgc3BlY2lhbCBkb2N1bWVudCB0eXBlLgpDcmVkaXRSZXBvcnREb2N1bWVudCByZXBvcnREb2MgPSBDcmVkaXRSZXBvcnREb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci8qCiAqIFVzZSB0aGUgZG9jdW1lbnQgdHlwZSB0byBhZGQgYSBuZXcgY3JlZGl0UmVwb3J0IGVsZW1lbnQgdG8gdGhlIFhNTCBpbnN0YW5jZS4KICogTm90ZSB0aGF0IHRoZSB0eXBlIHJldHVybmVkIGJ5IHRoZSBhZGROZXdDcmVkaXRSZXBvcnQgbWV0aG9kIGlzIHRoZQogKiBjcmVkaXRSZXBvcnRUeXBlIGNvbXBsZXggdHlwZSBkZWZpbmVkIGZvciBpdCBpbiBzY2hlbWEuCiAqLwpDcmVkaXRSZXBvcnRUeXBlIHJlcG9ydCA9IHJlcG9ydERvYy5hZGROZXdDcmVkaXRSZXBvcnQoKTsKPC9wcmU+CiAgICA8aDI+R2xvYmFsIFVzZXItRGVyaXZlZCBUeXBlczwvaDI+CiAgICA8cD5BIDxlbT51c2VyLWRlcml2ZWQ8L2VtPiB0eXBlIGlzIG9uZSBkZWZpbmVkIHdpdGggYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Y29tcGxleFR5cGU8L3NwYW4+CiAgICAgIG9yIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zaW1wbGVUeXBlPC9zcGFuPiBlbGVtZW50IGluIHNjaGVtYS4gVXNlci1kZXJpdmVkCiAgICAgIHR5cGVzIGF0IHRoZSB0b3AgbGV2ZWwgb2YgYSBzY2hlbWEgYXJlIGdsb2JhbC4gWE1MQmVhbnMgZ2VuZXJhdGVzIGFuIGludGVyZmFjZQogICAgICBmb3IgZWFjaCBvZiB0aGVzZSwgYXMgaXQgZG9lcyB3aXRoIGdsb2JhbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcy4gVGhlc2UKICAgICAgaW50ZXJmYWNlcyBpbmNsdWRlIG1ldGhvZHMgdGhyb3VnaCB3aGljaCB5b3UgY2FuIGdldCBhbmQgc2V0IHRoZSB0eXBlJ3MKICAgICAgdmFsdWVzLCBpbmNsdWRpbmcgYW55IG5lc3RlZCBkZXJpdmVkIHR5cGVzIGl0IG1heSBjb250YWluLiBUaGUgZm9sbG93aW5nCiAgICAgIHNjaGVtYSBzbmlwcGV0IGRlZmluZXMgYSB1c2VyLWRlcml2ZWQgY29tcGxleCB0eXBlIGNhbGxlZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aXRlbVR5cGU8L3NwYW4+LAogICAgICBhbG9uZyB3aXRoIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnByaWNlVHlwZTwvc3Bhbj4gdGhhdCB1c2VzIGl0IGFzIHRoZQogICAgICB0eXBlIGZvciBhbiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aXRlbTwvc3Bhbj4gY2hpbGQgZWxlbWVudC48L3A+CiAgICA8cHJlPgombHQ7eHM6Y29tcGxleFR5cGUgbmFtZT0mcXVvdDtpdGVtVHlwZSZxdW90OyZndDsKICAgICZsdDt4czpzZXF1ZW5jZSZndDsKICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O25hbWUmcXVvdDsgdHlwZT0mcXVvdDt4czpzdHJpbmcmcXVvdDsvJmd0OwogICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9JnF1b3Q7YW1vdW50JnF1b3Q7IHR5cGU9JnF1b3Q7eHM6aW50JnF1b3Q7LyZndDsKICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O3ByaWNlJnF1b3Q7IHR5cGU9JnF1b3Q7eHM6ZG91YmxlJnF1b3Q7LyZndDsKICAgICZsdDsveHM6c2VxdWVuY2UmZ3Q7CiZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7CiZsdDt4czpjb21wbGV4VHlwZSBuYW1lPSZxdW90O3ByaWNlVHlwZSZxdW90OyZndDsKICAgICZsdDt4czpzZXF1ZW5jZSZndDsKICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O2l0ZW0mcXVvdDsgdHlwZT0mcXVvdDtwczppdGVtVHlwZSZxdW90OyBtaW5PY2N1cnM9JnF1b3Q7MCZxdW90OyBtYXhPY2N1cnM9JnF1b3Q7dW5ib3VuZGVkJnF1b3Q7LyZndDsKICAgICZsdDsveHM6c2VxdWVuY2UmZ3Q7CiZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7CiZsdDt4czplbGVtZW50IG5hbWU9JnF1b3Q7cHJpY2UmcXVvdDsgdHlwZT0mcXVvdDtwczpwcmljZVR5cGUmcXVvdDsvJmd0Owo8L3ByZT4KICAgIDxwPkJ5IGRlZmF1bHQsIHRoZSBnZW5lcmF0ZWQgSmF2YSB0eXBlIGZvciA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aXRlbVR5cGU8L3NwYW4+CiAgICAgIHdvdWxkIGJlIGFuIGludGVyZmFjZSBjYWxsZWQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkl0ZW1UeXBlPC9zcGFuPi4gV2l0aAogICAgICB0aGlzIHR5cGUsIHlvdSB3b3VsZCBiZSBhYmxlIHRvIGdldCBhbmQgc2V0IHRoZSB2YWx1ZXMgb2YgaXRzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5uYW1lPC9zcGFuPiwKICAgICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmFtb3VudDwvc3Bhbj4sIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHJpY2U8L3NwYW4+CiAgICAgIGNoaWxkIGVsZW1lbnRzLiBIb3dldmVyLCBhIHVzZXItZGVyaXZlZCB0eXBlIChhcyBvcHBvc2VkIHRvIGFuIGVsZW1lbnQgb3IKICAgICAgYXR0cmlidXRlKSBpcyBhbHdheXMgaW50ZW5kZWQgZm9yIHVzZSBhcyB0aGUgdHlwZSB0byB3aGljaCBhbiBlbGVtZW50IG9yCiAgICAgIGF0dHJpYnV0ZSBpcyBib3VuZC4gSW4gb3RoZXIgd29yZHMsIGl0J3MgY29udGFpbmVkIGJ5IGFuIGVsZW1lbnQgb3IgYXR0cmlidXRlLgogICAgICBXaGlsZSB5b3UgY2FuIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIHVzZXItZGVyaXZlZCB0eXBlLCB0aGUgbmV3IGluc3RhbmNlJ3MKICAgICAgdW5kZXJseWluZyBYTUwgaXMgYSBmcmFnbWVudC4gQXMgdGhlIGdlbmVyYXRlZCBBUEkgd291bGQgbWFrZSBjbGVhciwgdGhlCiAgICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pdGVtVHlwZTwvc3Bhbj4gYmVjb21lcyB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnZXQKICAgICAgbWV0aG9kLCBvciB0aGUgcGFyYW1ldGVyIG9mIGEgc2V0IG1ldGhvZC48L3A+CiAgICA8cHJlPgovLyBDcmVhdGUgYSBuZXcgcHJpY2UgZG9jdW1lbnQuClByaWNlRG9jdW1lbnQgcHJpY2VEb2MgPSBQcmljZURvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKUHJpY2VUeXBlIHByaWNlID0gcHJpY2VEb2MuZ2V0UHJpY2UoKTsKCi8qCiAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBJdGVtVHlwZSBhbmQgc2V0IHRoZSB2YWx1ZXMgb2YgaXRzCiAqIGNoaWxkIGVsZW1lbnRzLgogKi8KSXRlbVR5cGUgaXRlbSA9IEl0ZW1UeXBlLkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKaXRlbS5zZXROYW1lKCZxdW90O2JpY3ljbGUmcXVvdDspOwppdGVtLnNldEFtb3VudCgxMik7Cml0ZW0uc2V0UHJpY2UoNTYwLjAwKTsKCi8qCiAqIFVzZSB0aGUgbmV3IEl0ZW1UeXBlIGluc3RhbmNlIHRvIHNldCB0aGUgdmFsdWUgb2YgdGhlCiAqIHByaWNlIGVsZW1lbnQncyBmaXJzdCBpdGVtIGNoaWxkIGVsZW1lbnQuIE5vdGljZSB0aGF0IHRoZSBzZXQgbWV0aG9kCiAqIGhlcmUgaXMgYW4gIkFycmF5IiBtZXRob2QuIFRoaXMgaXMgYmVjYXVzZSB0aGUgaXRlbSBlbGVtZW50CiAqIGlzIGRlZmluZWQgd2l0aCBhIG1heE9jY3Vycz0idW5ib3VuZGVkIiBhdHRyaWJ1dGUuIEl0IGNhbiBvY2N1cgogKiBtYW55IHRpbWVzIGFzIGEgY2hpbGQgb2YgcHJpY2UuCiAqLwpwcmljZS5zZXRJdGVtQXJyYXkoMCwgaXRlbSk7CjwvcHJlPgogICAgPGgyPk5lc3RlZCBFbGVtZW50cyBhbmQgRGVyaXZlZCBUeXBlczwvaDI+CiAgICA8cD5XaGVuIHlvdXIgc2NoZW1hIGluY2x1ZGVzIG5hbWVkIHR5cGVzIHRoYXQgYXJlIGRlY2xhcmVkIGxvY2FsbHmXd2l0aGluCiAgICAgIHRoZSBkZWNsYXJhdGlvbiBvZiBhbm90aGVyIGVsZW1lbnQgb3IgdHlwZZd0aGUgc2NoZW1hIHR5cGUncyBnZW5lcmF0ZWQgSmF2YQogICAgICBpbnRlcmZhY2Ugd2lsbCBiZSBhbiBpbm5lciBpbnRlcmZhY2Ugd2l0aGluIHRoZSB0eXBlIGl0J3MgbmVzdGVkIGluLjwvcD4KICAgIDxwPkZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHNjaGVtYSBzbmlwcGV0IGRlZmluZXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPm5hbWU8L3NwYW4+CiAgICAgIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Z2VuZGVyPC9zcGFuPiBlbGVtZW50cyBuZXN0ZWQgd2l0aGluIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBlcnNvbjwvc3Bhbj4KICAgICAgY29tcGxleCB0eXBlLiBJbiBwYXJ0aWN1bGFyLCBub3RlIHRoYXQgdGhlIGdlbmRlciBlbGVtZW50IGlzIGRlZmluZWQgYXMKICAgICAgZGVyaXZpbmcgZnJvbSB0aGUgeHM6Tk1UT0tFTiBidWlsdC1pbiB0eXBlLjwvcD4KICAgIDxwcmU+CiZsdDt4czpjb21wbGV4VHlwZSBuYW1lPSJwZXJzb24iJmd0OwogICAgJmx0O3hzOnNlcXVlbmNlJmd0OwogICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvJmd0OwogICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9ImdlbmRlciImZ3Q7CiAgICAgICAgICAgICZsdDt4czpzaW1wbGVUeXBlJmd0OwogICAgICAgICAgICAgICAgJmx0O3hzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iJmd0OwogICAgICAgICAgICAgICAgICAgICZsdDt4czplbnVtZXJhdGlvbiB2YWx1ZT0ibWFsZSIvJmd0OwogICAgICAgICAgICAgICAgICAgICZsdDt4czplbnVtZXJhdGlvbiB2YWx1ZT0iZmVtYWxlIi8mZ3Q7CiAgICAgICAgICAgICAgICAmbHQ7L3hzOnJlc3RyaWN0aW9uJmd0OwogICAgICAgICAgICAmbHQ7L3hzOnNpbXBsZVR5cGUmZ3Q7CiAgICAgICAgJmx0Oy94czplbGVtZW50Jmd0OwogICAgJmx0Oy94czpzZXF1ZW5jZSZndDsKJmx0Oy94czpjb21wbGV4VHlwZSZndDsKPC9wcmU+CiAgICA8cD5UaGUgZ2VuZXJhdGVkIGludGVyZmFjZXMgZm9yIHBlcnNvbiBhbmQgZ2VuZGVyIHdvdWxkIGJlIG9yZ2FuaXplZCBpbiBzb3VyY2UKICAgICAgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZy4gT2YgY291cnNlLCB5b3Ugd291bGRuJ3Qgc2VlIHRoZSBzb3VyY2UsIGJ1dAogICAgICB5b3UgY2FuIHNlZSBoZXJlIHRoYXQgdGhlIEdlbmRlciBpbnRlcmZhY2UgaXMgbmVzdGVkIHdpdGggUGVyc29uLiBBbHNvLAogICAgICBub3RpY2UgdGhhdCBpdCBleHRlbmRzIFhtbE5NVE9LRU4sIG1pcnJvcmluZyB0aGUgc2NoZW1hLjwvcD4KICAgIDxwcmU+cHVibGljIGludGVyZmFjZSBQZXJzb24gZXh0ZW5kcyBYbWxPYmplY3QKewogICAgcHVibGljIGludGVyZmFjZSBHZW5kZXIgZXh0ZW5kcyBYbWxOTVRPS0VOCiAgICB7CiAgICAgICAgLy8gTWV0aG9kcyBvbWl0dGVkIGZvciB0aGlzIGV4YW1wbGUKICAgIH0KICAgIC8vIE1ldGhvZHMgb21pdHRlZCBmb3IgdGhpcyBleGFtcGxlCn0KPC9wcmU+CiAgICA8cD5Zb3UgY291bGQgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+R2VuZGVyPC9zcGFuPgogICAgICB0eXBlIGluIHRoaXMgd2F5ICh0aGVyZSBhcmUgYWxzbyB2YXJpb3VzIGFsdGVybmF0aXZlcyB0byB0aGlzKTo8L3A+CiAgICA8cHJlPgovLyBDcmVhdGUgYSBuZXcgUGVyc29uIGluc3RhbmNlLgpQZXJzb24gcGVyc29uID0gUGVyc29uLkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLyoKICogU2V0IHRoZSBnZW5kZXIgZWxlbWVudCdzIHZhbHVlIHVzaW5nIHRoZQogKiBlbnVtZXJhdGlvbiBnZW5lcmF0ZWQgZnJvbSB0aGUgc2NoZW1hLgogKi8KcGVyc29uLnNldEdlbmRlcihHZW5kZXIuRkVNQUxFKTs8L3ByZT4KICAgIDxoMj5Vc2VyLURlcml2ZWQgU2ltcGxlIFR5cGVzPC9oMj4KICAgIDxwPkluIGFkZGl0aW9uIHRvIHRoZSA0NiBidWlsdC1pbiBzaW1wbGUgdHlwZXMgaW4gWE1MIHNjaGVtYSwgYSBzY2hlbWEgY2FuCiAgICAgIGluY2x1ZGUgaXRzIG93biBjdXN0b20gc2ltcGxlIHR5cGVzIHVzaW5nIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czpzaW1wbGVUeXBlPC9zcGFuPgogICAgICBkZWNsYXJhdGlvbnMuIFRoZXNlIHVzZXItZGVyaXZlZCBzaW1wbGUgdHlwZXMgYXJlIGFsd2F5cyBiYXNlZCBvbiB0aGUgYnVpbHQtaW4KICAgICAgWE1MIHNjaGVtYSB0eXBlcy4gVGhlIGJ1aWx0LWluIHR5cGVzIGNhbiBiZSBtb2RpZmllZCBieSA8ZW0+cmVzdHJpY3Rpbmc8L2VtPgogICAgICB0aGVtLCB0YWtpbmcgPGVtPnVuaW9uczwvZW0+IG9mIHRoZW0sIG9yIG1ha2luZyBzcGFjZS1zZXBhcmF0ZWQgPGVtPmxpc3RzPC9lbT4KICAgICAgb2YgdGhlbS4gRWFjaCBYTUwgc2ltcGxlIHR5cGUgaXMgdHJhbnNsYXRlZCBpbnRvIGEgSmF2YSB0eXBlIHRoYXQgcHJvdmlkZXMKICAgICAgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGEuPC9wPgogICAgPGgzPlVuaW9uczwvaDM+CiAgICA8cD5JbiBzY2hlbWEsIHlvdSBjYW4gdXNlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czp1bmlvbjwvc3Bhbj4gdG8gc3BlY2lmeQogICAgICBhIHNpbXBsZSB0eXBlIHRoYXQgaXMgYWxsb3dlZCB0byBjb250YWluIHZhbHVlcyBvZiBhIG51bWJlciBvZiBvdGhlciBzaW1wbGUKICAgICAgdHlwZXMuIFhNTEJlYW5zIGdlbmVyYXRlcyBhIHR5cGUgZm9yIGEgdW5pb24sIGp1c3QgYXMgaXQgZ2VuZXJhdGVzIGEgdHlwZQogICAgICBmb3IgYW55IG90aGVyIHNjaGVtYSB0eXBlLiBBdCBydW4gdGltZSwgeW91IGNhbiBkaXNjb3ZlciB0aGUgdW5kZXJseWluZwogICAgICB0eXBlIG9mIGFuIGluc3RhbmNlIG9mIGEgdW5pb24gdHlwZSBieSBjYWxsaW5nIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPgogICAgICBpbnRlcmZhY2UncyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aW5zdGFuY2VUeXBlPC9zcGFuPiBtZXRob2QuIE9uY2UgeW91CiAgICAgIGhhdmUgZGV0ZXJtaW5lZCB0aGUgdHlwZSwgeW91IGNhbiBjYXN0IGFuIGluc3RhbmNlIG9mIGEgdW5pb24gdHlwZSB0byB0aGUKICAgICAgYWN0dWFsIHVuZGVybHlpbmcgaW5zdGFuY2UgdHlwZS48L3A+CiAgICA8cHJlPgombHQ7eHM6c2ltcGxlVHlwZSBuYW1lPSZxdW90O2ludE9yU3RyaW5nJnF1b3Q7Jmd0OwogICAgJmx0O3hzOnVuaW9uIG1lbWJlclR5cGVzPSZxdW90O3hzOmludCB4czpzdHJpbmcmcXVvdDsmZ3Q7CiZsdDsveHM6c2ltcGxlVHlwZSZndDsKPC9wcmU+CiAgICA8cD5HaXZlbiB0aGUgcHJlY2VkaW5nIHNjaGVtYSBzbmlwcGV0LCB5b3UgY291bGQgc2V0IHRoZSBpbnRPclN0cmluZyB2YWx1ZQogICAgICB0bywgc2F5LCA2IG9yICZxdW90O3NpeCZxdW90Oy4gVGhlIHVuaW9uIG9mIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czppbnQ8L3NwYW4+CiAgICAgIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6c3RyaW5nPC9zcGFuPiBtYWtlcyBib3RoIGFsbG93YWJsZS48L3A+CiAgICA8cHJlPgovLyBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHR5cGUuCkludE9yU3RyaW5nIGludE9yU3RyaW5nID0gSW50T3JTdHJpbmcuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwppbnRPclN0cmluZy5zZXQoJnF1b3Q7NSZxdW90Oyk7Ci8vIFRoaXMgY29kZSBwcmludHMgIlhtbEludCIgdG8gdGhlIGNvbnNvbGUuClN5c3RlbS5vdXQucHJpbnRsbihpbnRPclN0cmluZy5pbnN0YW5jZVR5cGUoKS5nZXRTaG9ydEphdmFOYW1lKCkpOwo8L3ByZT4KICAgIDxoMz5SZXN0cmljdGlvbnM8L2gzPgogICAgPHA+WE1MIHNjaGVtYSByZXN0cmljdGlvbnMgb24gc2ltcGxlIFhNTEJlYW5zIHR5cGVzIGFyZSBlbmZvcmNlZC4gU28sIGZvcgogICAgICBleGFtcGxlLCBpdCBpcyBpbGxlZ2FsIHRvIHNldCBhIG51bWJlciBvdXRzaWRlIGl0cyByZXN0cmljdGVkIHJhbmdlLiA8L3A+CiAgICA8aDQ+TnVtZXJpYyBUeXBlIFJlc3RyaWN0aW9uczwvaDQ+CiAgICA8cD5JbiBzY2hlbWEsIHlvdSBjYW4gcmVzdHJpY3QgbnVtZXJpYyB0eXBlcyB0byBhbGxvdywgZm9yIGV4YW1wbGUsIG9ubHkgYQogICAgICBwYXJ0aWN1bGFyIHJhbmdlIG9mIHZhbHVlcy4gRm9yIHN1Y2ggYSByZXN0cmljdGlvbiwgWE1MQmVhbnMgdGFpbG9ycyB0aGUKICAgICAgcmVzdWx0aW5nIG5hdHVyYWwgSmF2YSBhbHRlcm5hdGl2ZS4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhdmUgdGhlIGZvbGxvd2luZwogICAgICBlbGVtZW50IGRlZmluZWQgaW4gc2NoZW1hOjwvcD4KICAgIDxwcmU+CiZsdDt4czplbGVtZW50IG5hbWU9Im51bWJlciImZ3Q7CiAgICAmbHQ7eHM6c2ltcGxlVHlwZSZndDsKICAgICAgICAmbHQ7eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aW50ZWdlciImZ3Q7CiAgICAgICAgICAgICZsdDt4czptaW5JbmNsdXNpdmUgdmFsdWU9IjEiLyZndDsKICAgICAgICAgICAgJmx0O3hzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMTAwMDAwMCIvJmd0OwogICAgICAgICZsdDsveHM6cmVzdHJpY3Rpb24mZ3Q7CiAgICAmbHQ7L3hzOnNpbXBsZVR5cGUmZ3Q7CiZsdDsveHM6ZWxlbWVudCZndDsKPC9wcmU+CiAgICA8cD5UaGUgdHlwZSBpcyByZXN0cmljdGVkIGZyb20gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOmludGVnZXI8L3NwYW4+LAogICAgICBidXQgYmVjYXVzZSB0aGUgbnVtYmVyJ3MgcmFuZ2UgaXMgbGltaXRlZCB0byBiZXR3ZWVuIDEgYW5kIDEwMDAwMDAsIGl0IHdpbGwKICAgICAgZml0IGludG8gYSBKYXZhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pbnQ8L3NwYW4+LiBBIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5sb25nPC9zcGFuPgogICAgICBvciA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+amF2YS5tYXRoLkJpZ0ludGVnZXI8L3NwYW4+IHdvdWxkIGJlIHRvbyBiaWcKICAgICAgZm9yIHRoZSBuZWVkLiBJbiBvdGhlciB3b3JkcywgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5nZXROdW1iZXI8L3NwYW4+CiAgICAgIG1ldGhvZCBnZW5lcmF0ZWQgZm9yIHRoaXMgdHlwZSB3aWxsIHJldHVybiBhbiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aW50PC9zcGFuPiwKICAgICAgcmF0aGVyIHRoYW4gYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+QmlnSW50ZWdlcjwvc3Bhbj4gb3IgYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bG9uZzwvc3Bhbj4uPC9wPgogICAgPHA+QnkgdGhlIHNhbWUgdG9rZW4sIGFuIGxvbmcgY2FuIGJlIGNvbXBpbGVkIHRvIGFuIGludCBpZiB0aGUgdG90YWxEaWdpdHMKICAgICAgYXR0cmlidXRlIGlzICZsdDs9OSwgb3IgdGhlIG1pbiBhbmQgbWF4IGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIHdpdGhpbiAzMi1iaXQKICAgICAgMnMgY29tcGxlbWVudCByYW5nZS48L3A+CiAgICA8cD5UaGUgc2luZ2xlIHByaW1pdGl2ZSBYTUwgdHlwZSB4czpkZWNpbWFsIGNhbiBiZSByZXN0cmljdGVkIGluIHNldmVyYWwgd2F5cwogICAgICB0aGF0IGluZmx1ZW5jZSB0aGUgcmVzdWx0aW5nIG5hdHVyYWwgSmF2YSB0eXBlLiBGb3IgZXhhbXBsZSwgaXQgY2FuIGJlOjwvcD4KICA8L2Rpdj4KPC9kaXY+Cjx1bD4KICA8bGk+CiAgICA8ZGl2PgogICAgICA8ZGl2PkNvbXBpbGVkIHRvIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkJpZ0ludGVnZXI8L3NwYW4+IGlmIGl0cyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+ZnJhY3Rpb25EaWdpdDwvc3Bhbj4KICAgICAgICBhdHRyaWJ1dGUgaXMgc2V0IHRvIDAuIDwvZGl2PgogICAgPC9kaXY+CiAgPC9saT4KICA8bGk+CiAgICA8ZGl2PgogICAgICA8ZGl2PkNvbXBpbGVkIHRvIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmxvbmc8L3NwYW4+IGlmIGl0cyB0b3RhbERpZ2l0cwogICAgICAgIGF0dHJpYnV0ZSBpcyAmbHQ7PTE4LCBvciB0aGUgbWluIGFuZCBtYXggYXJlIHdpdGhpbiA2NC1iaXQgMnMgY29tcGxlbWVudAogICAgICAgIHJhbmdlLjwvZGl2PgogICAgPC9kaXY+CiAgPC9saT4KPC91bD4KPGRpdj4KICA8ZGl2PgogICAgPGgzPkVudW1lcmF0aW9uczwvaDM+CiAgICA8cD5JbiBzY2hlbWEsIHlvdSBjYW4gZGVyaXZlIGEgbmV3IHR5cGUgYnkgcmVzdHJpY3RpbmcgYSBidWlsdC1pbiB0eXBlIHNvCiAgICAgIHRoYXQgb25seSBhIGZpbml0ZSBzZXQgb2YgdmFsdWVzIGFyZSBhbGxvd2FibGUuIFdoZXJlIHNjaGVtYSBkb2VzIHRoaXMgYnkKICAgICAgcmVzdHJpY3RpbmcgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOnN0cmluZzwvc3Bhbj4sIFhNTEJlYW5zIGdlbmVyYXRlcwogICAgICBhIHNwZWNpYWwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkVudW08L3NwYW4+IHR5cGUuIFdpdGggYW4gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkVudW08L3NwYW4+LAogICAgICB5b3UgY2FuIHNlbGVjdCB0aGUgZW51bWVyYXRlZCB2YWx1ZSBlaXRoZXIgYnkgaXRzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5TdHJpbmc8L3NwYW4+CiAgICAgIHZhbHVlIG9yIGJ5IGEgbnVtZXJpYyBpbmRleC4gVGhlIGluZGV4J3MgdmFsdWUgaXMgZGV0ZXJtaW5lZCBiYXNlZCBvbiB0aGUKICAgICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlN0cmluZzwvc3Bhbj4gdmFsdWUncyBvcmRlciBpbiB0aGUgc2NoZW1hLiBIYXZpbmcKICAgICAgYW4gaW5kZXggY2FuIGJlIHVzZWZ1bCBpbiBKYXZhIHN3aXRjaCBzdGF0ZW1lbnRzLjwvcD4KICAgIDxwPkZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYWQgYSBkb2N1bWVudCBjb250YWluaW5nIHByaWNlIGVsZW1lbnRzIHdob3NlCiAgICAgIHR5cGUgd2FzIHRoZSBwcmljZVR5cGUgZGVmaW5lZCBpbiB0aGUgZm9sbG93aW5nIHNjaGVtYSBzbmlwcGV0OjwvcD4KICAgIDxwcmU+Jmx0O3hzOmNvbXBsZXhUeXBlIG5hbWU9JnF1b3Q7cHJpY2VUeXBlJnF1b3Q7Jmd0OwogICAgJmx0O3hzOnNlcXVlbmNlJmd0OwogICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9JnF1b3Q7aXRlbSZxdW90OyB0eXBlPSZxdW90O3BzOml0ZW1UeXBlJnF1b3Q7IG1pbk9jY3Vycz0mcXVvdDswJnF1b3Q7CiAgICAgICAgICAgICAgbWF4T2NjdXJzPSZxdW90O3VuYm91bmRlZCZxdW90Oy8mZ3Q7CiAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OwogICAgJmx0O3hzOmF0dHJpYnV0ZSBuYW1lPSZxdW90O3RocmVzaG9sZCZxdW90OyZndDsKICAgICAgICAmbHQ7eHM6c2ltcGxlVHlwZSZndDsKICAgICAgICAgICAgJmx0O3hzOnJlc3RyaWN0aW9uIGJhc2U9JnF1b3Q7eHM6c3RyaW5nJnF1b3Q7Jmd0OwogICAgICAgICAgICAgICAgJmx0O3hzOmVudW1lcmF0aW9uIHZhbHVlPSZxdW90O0JlbG93MTBEb2xsYXJzJnF1b3Q7LyZndDsKICAgICAgICAgICAgICAgICZsdDt4czplbnVtZXJhdGlvbiB2YWx1ZT0mcXVvdDtCZXR3ZWVuMTBBbmQyMERvbGxhcnMmcXVvdDsvJmd0OwogICAgICAgICAgICAgICAgJmx0O3hzOmVudW1lcmF0aW9uIHZhbHVlPSZxdW90O0Fib3ZlMjBEb2xsYXJzJnF1b3Q7LyZndDsKICAgICAgICAgICAgJmx0Oy94czpyZXN0cmljdGlvbiZndDsKICAgICAgICAmbHQ7L3hzOnNpbXBsZVR5cGUmZ3Q7CiAgICAmbHQ7L3hzOmF0dHJpYnV0ZSZndDsKJmx0Oy94czpjb21wbGV4VHlwZSZndDs8L3ByZT4KICAgIDxwPlVzaW5nIHR5cGVzIGdlbmVyYXRlZCBmcm9tIHRoZSBzY2hlbWEsIHlvdSB3b3VsZCBiZSBhYmxlIHRvIHdyaXRlIHRoZSBmb2xsb3dpbmcKICAgICAgSmF2YSBjb2RlIHRvICZxdW90O3N3aXRjaCZxdW90OyBvbiB0aGUgdGhyZXNob2xkIGF0dHJpYnV0ZSdzIGVudW1lcmF0aW9uOjwvcD4KICAgIDxwcmU+Ci8qCiAqIFVzZSB0aGUgaW50VmFsdWUgbWV0aG9kIHByb3ZpZGVkIGJ5IHRoZSBFbnVtIHR5cGUgdG8gZGV0ZXJtaW5lIHRoZSB0aHJlc2hvbGQKICogYXR0cmlidXRlJ3MgY3VycmVudCBlbnVtZXJhdGlvbiB2YWx1ZS4KICovCnN3aXRjaChwcmljZUVsZW1lbnRzW2ldLmdldFRocmVzaG9sZCgpLmludFZhbHVlKCkpCnsKICAgIC8vIFVzZSB0aGUgVGhyZXNob2xkIHR5cGUncyBlbnVtZXJhdGlvbiB2YWx1ZXMgdG8gdGVzdCBmb3IgYW4gYXR0cmlidXRlIHZhbHVlLgogICAgY2FzZSBQcmljZVR5cGUuVGhyZXNob2xkLklOVF9CRUxPV18xMF9ET0xMQVJTOgogICAgICAgIHplcm9CdWZmZXIuYXBwZW5kKGl0ZW0uZ2V0VGl0bGUoKSArICZxdW90O1xuJnF1b3Q7KTsKICAgICAgICBicmVhazsKICAgIGNhc2UgUHJpY2VUeXBlLlRocmVzaG9sZC5JTlRfQkVUV0VFTl8xMF9BTkRfMjBfRE9MTEFSUzoKICAgICAgICB0ZW5CdWZmZXIuYXBwZW5kKGl0ZW0uZ2V0VGl0bGUoKSArICZxdW90O1xuJnF1b3Q7KTsKICAgICAgICBicmVhazsKICAgIGNhc2UgUHJpY2VUeXBlLlRocmVzaG9sZC5JTlRfQUJPVkVfMjBfRE9MTEFSUzoKICAgICAgICB0d2VudHlCdWZmZXIuYXBwZW5kKGl0ZW0uZ2V0VGl0bGUoKSArICZxdW90O1xuJnF1b3Q7KTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCZxdW90O1lvISBTb21ldGhpbmcgdW5leHBlY3RlZCBoYXBwZW5lZCEmcXVvdDspOwogICAgICAgIGJyZWFrOwp9PC9wcmU+CiAgPC9kaXY+CiAgPHAgY2xhc3M9InJlbGF0ZWR0b3BpY3MiPlJlbGF0ZWQgVG9waWNzPC9wPgogIDxwPjxhIGhyZWY9ImNvblhNTEJlYW5zU3VwcG9ydEJ1aWx0SW5TY2hlbWFUeXBlcy5odG1sIj5YTUxCZWFucyBTdXBwb3J0IGZvcgogICAgQnVpbHQtSW4gU2NoZW1hIFR5cGVzPC9hPjwvcD4KPC9kaXY+CiA8IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgoKPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPgo=