PGh0bWw+Cgo8aGVhZD4KPG1ldGEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KPHRpdGxlPkZvbGRpbmcgaW4gRWNsaXBzZSBUZXh0IEVkaXRvcnM8L3RpdGxlPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2RlZmF1bHRfc3R5bGUuY3NzIj4KPC9oZWFkPgoKPGJvZHkgTElOSz0iIzAwMDBmZiIgVkxJTks9IiM4MDAwODAiPgo8ZGl2IGFsaWduPSJyaWdodCI+Jm5ic3A7IDxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21hbiwgVGltZXMsIHNlcmlmIiBzaXplPSIyIj5Db3B5cmlnaHQKICAmY29weTsgMjAwNSBQcmFzaGFudCBEZXZhPC9mb250PgogIDx0YWJsZSBib3JkZXI9MCBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTIgd2lkdGg9IjEwMCUiPgogICAgPHRyPgogICAgICA8dGQgYWxpZ249TEVGVCB2YWxpZ249VE9QIGNvbHNwYW49IjIiIGJnY29sb3I9IiMwMDgwQzAiPjxiPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGZvbnQgY29sb3I9IiNGRkZGRkYiPiZuYnNwO0VjbGlwc2UKICAgICAgICBDb3JuZXIgQXJ0aWNsZTwvZm9udD48L2ZvbnQ+PC9iPjwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+CjwvZGl2Pgo8ZGl2IGFsaWduPSJsZWZ0Ij4KICA8aDE+PGltZyBzcmM9ImltYWdlcy9JZGVhLmpwZyIgaGVpZ2h0PTg2IHdpZHRoPTEyMCBhbGlnbj1DRU5URVI+PC9oMT4KPC9kaXY+CjxwPiZuYnNwOzwvcD4KCjxoMSBBTElHTj0iQ0VOVEVSIj5Gb2xkaW5nIGluIEVjbGlwc2UgVGV4dCBFZGl0b3JzPC9oMT4KCjxibG9ja3F1b3RlPgo8Yj5TdW1tYXJ5PC9iPgoKPGJyPgogIFN0YXJ0aW5nIHdpdGggcmVsZWFzZSAzLjAsIEVjbGlwc2UgYWxsb3dzIGZvbGRpbmcgaW4gaXRzIHRleHQgZWRpdG9yLiBJbiB0aGlzCiAgYXJ0aWNsZSwgSSBleHBsYWluIHRoZSBuZXcgcHJvamVjdGlvbiBpbmZyYXN0cnVjdHVyZSBpbnRyb2R1Y2VkIGluCiAgdGhlIEpGYWNlIFRleHQgZnJhbWV3b3JrCiAgYW5kIHNob3cgaG93IHRvIGV4dGVuZCB0aGUgWE1MIEVkaXRvciBleGFtcGxlIHByb3ZpZGVkCiAgd2l0aCBFY2xpcHNlIHRvIGFsbG93IGZvbGRpbmcgb2YgdGV4dC4KICA8cD48Yj4gQnkgUHJhc2hhbnQgRGV2YTwvYj4gKDxhIGhyZWY9Im1haWx0bzpwcmFzaGFudC5kZXZhQGdtYWlsLmNvbSI+cHJhc2hhbnQuZGV2YUBnbWFpbC5jb208L2E+KTxicj4KICAgIE1hcmNoIDExLCAyMDA1PC9wPgo8L2Jsb2NrcXVvdGU+Cgo8aHIgd2lkdGg9IjEwMCUiPgo8cD5TdGFydGluZyB3aXRoIEVjbGlwc2UgMy4wIHRoZSBKRmFjZSBUZXh0IGZyYW1ld29yayBoYXMgYmVlbiBleHRlbmRlZCB3aXRoIGEKICBmZWF0dXJlIHRvIGFsbG93IGZvciBjb2xsYXBzaW5nIGFuZCBleHBhbmRpbmcgb2YgdGV4dC4gVGhpcyBjYW4gYmUgbm90aWNlZCBpbgogIHRoZSBKRFQgdGV4dCBlZGl0b3IsIHdoaWNoIGFsbG93cyB5b3UgdG8gZm9sZCBpbmRpdmlkdWFsIG1ldGhvZHMgYW5kIGNsYXNzZXMuCiAgWW91IGNhbiBpbXBsZW1lbnQgZm9sZGluZyBpbiB5b3VyIHBsdWctaW4gdG9vLCB0byBhbGxvdyB0aGUgdXNlcnMgdG8gZm9sZCB0ZXh0CiAgYWNjb3JkaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgeW91ciBwbHVnLWluJ3MgZG9jdW1lbnRzLjwvcD4KPHA+WW91IHdpbGwgbm90aWNlIHRoYXQgMiBuZXcgcGFja2FnZXMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBmcmFtZXdvcms6IDwvcD4KPHVsPgogIDxsaT48Yj5vcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnByb2plY3Rpb248L2I+PGJyPgogICAgSW1wbGVtZW50cyB0aGUgaW5mcmFzdHJ1Y3R1cmUgZm9yIGZvbGRpbmcgaW4gYSBVSSBpbmRlcGVuZGVudCBtYW5uZXIuIDxicj4KICAgIFRoaXMgcGFja2FnZSByZXNpZGVzIGluIHRoZSBwbHVnLWluIDxjb2RlPm9yZy5lY2xpcHNlLnRleHQ8L2NvZGU+LjwvbGk+CiAgPGxpPjxiPm9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb248L2I+PGJyPgogICAgVXNlcyB0aGUgY2xhc3MgaW4gPGNvZGU+b3JnLmVjbGlwc2UuamZhY2UudGV4dC5wcm9qZWN0aW9uPC9jb2RlPiB0byBpbXBsZW1lbnQKICAgIGZvbGRpbmcgaW4gYSBVSSBkZXBlbmRlbnQgbWFubmVyLjxicj4KICAgIFRoaXMgcGFja2FnZSByZXNpZGVzIGluIHRoZSBwbHVnLWluIDxjb2RlPm9yZy5lY2xpcHNlLmpmYWNlLnRleHQ8L2NvZGU+LiA8L2xpPgo8L3VsPgo8aDI+QmFzaWMgQ29uY2VwdDwvaDI+CjxwPk5vdyBsZXQncyBsb29rIGF0IHRoZSBiYXNpYyBpZGVhIGluIHRoZSBmcmFtZXdvcmsgdGhhdCBhbGxvd3MgaXQgdG8ganVzdCBzaG93IHBvcnRpb25zCiAgb2YgdGhlIGFjdHVhbCB0ZXh0LiBBbHRob3VnaCB0aGVzZSBjb25jZXB0cyBoYXZlIGJlZW4gaW4gdGhlIGZyYW1ld29yawogIHNpbmNlIDIuMSwgYSB3aG9sZSBuZXcgaW1wbGVtZW50YXRpb24gd2FzIGFkZGVkIGluIDMuMCB0byBzdXBwb3J0IHRoZSBhZGRpdGlvbmFsCiAgcmVxdWlyZW1lbnRzIG9mIHRleHQgZm9sZGluZy48L3A+CjxwPjxpbWcgc3JjPSJpbWFnZXMvd2l0aG91dEZvbGRpbmcucG5nIiB3aWR0aD0iMjg0IiBoZWlnaHQ9IjE3MiI+ICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxpbWcgc3JjPSJpbWFnZXMvd2l0aEZvbGRpbmcucG5nIiB3aWR0aD0iMzY0IiBoZWlnaHQ9IjE3NCI+PC9wPgo8cD5BcyB5b3UgY2FuIHNlZSBpbiB0aGUgZmlndXJlIChhKSBhYm92ZSwgd2l0aG91dCBmb2xkaW5nIHRoaW5ncyB3ZXJlIHZlcnkgc2ltcGxlLgogIFdlIGhhZCBhIGRvY3VtZW50IHRvIGhvbGQgdGhlIHRleHQgYW5kIGEgY29ycmVzcG9uZGluZyB2aWV3IHRvIHByb3ZpZGUgdGhlIFVJCiAgZm9yIHRoZSB0ZXh0LiBOb3cgdGhpbmdzIGFyZSBhIGxpdHRsZSBiaXQgbW9yZSBjb21wbGljYXRlZC4gV2UgaGF2ZSBhIDxzdHJvbmc+TWFzdGVyCiAgRG9jdW1lbnQ8L3N0cm9uZz4sIHdoaWNoIGlzIGxpa2UgdGhlIGRvY3VtZW50IHdlIHVzZWQgdG8gdXNlIHByZXZpb3VzbHkuCiAgSXQgY29udGFpbnMgdGhlIGVudGlyZSB0ZXh0LiBIb3dldmVyLCB0aGVyZSBpcyBhbHNvIGFuIGFkZGl0aW9uYWwgPHN0cm9uZz5Qcm9qZWN0aW9uCiAgRG9jdW1lbnQ8L3N0cm9uZz4gYXR0YWNoZWQgdG8gYSBNYXN0ZXIgRG9jdW1lbnQuIFRoZSBjb250ZW50cyBvZiBhIHByb2plY3Rpb24KICBkb2N1bWVudCBhcmUgYSBzdWJzZXQgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBNYXN0ZXIgRG9jdW1lbnQuIEluIG90aGVyIHdvcmRzLAogIHRoZSBjb250ZW50IG9mIGEgcHJvamVjdGlvbiBkb2N1bWVudCBjb25zaXN0cyBvZiBwb3J0aW9ucyBvZiB0aGUgTWFzdGVyIERvY3VtZW50LjwvcD4KPHA+IEFzIHlvdSBwcm9iYWJhYmx5IGd1ZXNzZWQsIHdoZW4geW91IGNvbGxhcHNlIHRoZSB0ZXh0IGluIHRoZSBlZGl0b3IgeW91IHNlZQogIHRoZSBjb250ZW50cyBvZiBhIHByb2plY3Rpb24gZG9jdW1lbnQgY29udGFpbmluZyBvbmx5IHRoZSBleHBhbmRlZCBzZWN0aW9ucy48L3A+CiAgPGgyPkJlaGluZCB0aGUgc2NlbmVzPC9oMj4KPGg0PlVJIEluZGVwZW5kZW50IEluZnJhc3RydWN0dXJlIDwvaDQ+CjxwPk5vdyBsZXSScyB0YWtlIGEgbG9vayBhdCB0aGUgPGNvZGU+b3JnLmVjbGlwc2UuamZhY2UudGV4dC5wcm9qZWN0aW9uPC9jb2RlPiBwYWNrYWdlLgogIEtlZXAgaW4gbWluZCB0aGF0IHlvdSBkb24ndCBhY3R1YWxseSBoYXZlIHRvIHVzZSB0aGlzIHBhY2thZ2UgaW4gb3JkZXIgdG8gaW1wbGVtZW50CiAgZm9sZGluZyBpbiB5b3VyIHRleHQgZWRpdG9yLiBUaGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uIGlzIGp1c3QKICB0byBoZWxwIHlvdSB1bmRlcnN0YW5kIHRoZSBjb25jZXB0cyBiZWhpbmQgdGhlIGZvbGRpbmcgaW5mcmFzdHJ1Y3R1cmUuPGJyPgogIDxicj4KICBUaGUgY2xhc3NlcyB3ZSBuZWVkIHRvIGNvbmNlbnRyYXRlIG9uIGFyZToKPHVsPgogIDxsaT48Y29kZT5Qcm9qZWN0aW9uRG9jdW1lbnQ8L2NvZGU+OiAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXByZXNlbnRzCiAgICBhIHBvcnRpb24gb2YgdGhlIGNvbnRlbnQgb2YgYSBNYXN0ZXIgRG9jdW1lbnQuPC9saT4KICA8bGk+PGNvZGU+UHJvamVjdGlvbkRvY3VtZW50RXZlbnQ8L2NvZGU+OiAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgZXZlbnQgb2JqZWN0CiAgICBzZW50IG91dCBieSBQcm9qZWN0aW9uRG9jdW1lbnQ8L2xpPgogIDxsaT48Y29kZT5Qcm9qZWN0aW9uRG9jdW1lbnRNYW5hZ2VyPC9jb2RlPjogTWFpbnRhaW5zIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuCiAgICBhIE1hc3RlciBEb2N1bWVudCBhbmQgaXRzIFByb2plY3Rpb24gRG9jdW1lbnRzLjwvbGk+CiA8L3VsPgo8cD5UaGUgcmVzdCBvZiB0aGUgY2xhc3NlcyBpbiB0aGUgcGFja2FnZSBhcmUgZm9yIGludGVybmFsIHVzZSBvbmx5IGFuZCB3ZSBuZWVkCiAgbm90IGJvdGhlciB3aXRoIHRoZW0uPC9wPgo8cD5UaGUgY2xhc3MgPGNvZGU+UHJvamVjdGlvbkRvY3VtZW50TWFuYWdlcjwvY29kZT4gYWN0cyBhcyBnbHVlIGJldHdlZW4gdGhlIG1hc3RlcgogIGRvY3VtZW50IGFuZCBpdHMgY2hpbGQgcHJvamVjdGlvbiBkb2N1bWVudHMsIGNvbm5lY3RpbmcgdGhlbSB0b2dldGhlci4gVGh1cwogIGFueSBjaGFuZ2UgbWFkZSB0byB0aGUgcHJvamVjdGlvbiBkb2N1bWVudCBjYXVzZXMgYSBjb3JyZXNwb25kaW5nIGNoYW5nZQogIHRvIHRoZSBtYXN0ZXIgZG9jdW1lbnQgYW5kIHZpY2UgdmVyc2EuPC9wPgo8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgdXNpbmcgUHJvamVjdGlvbkRvY3VtZW50TWFuYWdlcjo8L3A+Cgo8cHJlPiAgIERvY3VtZW50IG1hc3RlckRvY3VtZW50ID0gPGZvbnQgY29sb3I9IiMwMDAwRkYiPm5ldzwvZm9udD4gRG9jdW1lbnQoKTsKICAgUHJvamVjdGlvbkRvY3VtZW50TWFuYWdlciBtYW5hZ2VyID0gPGZvbnQgY29sb3I9IiMwMDAwRkYiPm5ldzwvZm9udD4gUHJvamVjdGlvbkRvY3VtZW50TWFuYWdlcigpOwo8aW1nIHNyYz0iaW1hZ2VzL3RhZ18xLmdpZiIgQ0VOVEVSPlByb2plY3Rpb25Eb2N1bWVudCBwcm9qZWN0aW9uRG9jdW1lbnQgPSAoUHJvamVjdGlvbkRvY3VtZW50KQogICAgICAgICAgICAgICBtYW5hZ2VyLmNyZWF0ZVNsYXZlRG9jdW1lbnQobWFzdGVyRG9jdW1lbnQpOwo8L3ByZT4KPHA+SW4gdGhlIGFib3ZlIGV4YW1wbGUgd2UgZmlyc3QgY3JlYXRlIGEgPHN0cm9uZz5NYXN0ZXIgRG9jdW1lbnQ8L3N0cm9uZz4gYW5kCiAgdGhlbiBjcmVhdGUgYSA8c3Ryb25nPlByb2plY3Rpb24gRG9jdW1lbnQ8L3N0cm9uZz4gb2ZmIG9mIGl0IGJ5IHVzaW5nIHRoZSA8Y29kZT5Qcm9qZWN0aW9uRG9jdW1lbnRNYW5hZ2VyPC9jb2RlPi4KICBJbnN0YW5jZXMgb2YgdGhlIGNsYXNzIDxjb2RlPlByb2plY3Rpb25Eb2N1bWVudDwvY29kZT4KICAoPGltZyBzcmM9ImltYWdlcy90YWdfMS5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIxMyI+KQogIHNob3VsZCBiZSBjcmVhdGVkIG9ubHkKICBieSB1c2luZyB0aGUgkWZhY3RvcnkgbWV0aG9kkiA8Y29kZT5jcmVhdGVTbGF2ZURvY3VtZW50KCk8L2NvZGU+IG9mIDxjb2RlPlByb2plY3Rpb25Eb2N1bWVudE1hbmFnZXI8L2NvZGU+CiAgYW5kIG5vdCBpbnN0YW50aWF0ZWQgdGhyb3VnaCBpdHMgY29uc3RydWN0b3IuIDwvcD4KPHA+QSBQcm9qZWN0aW9uIERvY3VtZW50IGhhcyB0d28gbWV0aG9kcyB0byBkZWZpbmUgaXRzIGNvbnRlbnQgZnJvbSB0aGUgbWFzdGVyCiAgZG9jdW1lbnQ6PC9wPgo8dWw+CiAgPGxpPjxjb2RlPjxmb250IGNvbG9yPSIjMDAwMEZGIj5wdWJsaWMgdm9pZDwvZm9udD4gYWRkTWFzdGVyRG9jdW1lbnRSYW5nZSg8Zm9udCBjb2xvcj0iIzAwMDBGRiI+aW50PC9mb250PgogICAgb2Zmc2V0SW5NYXN0ZXJEb2N1bWVudCw8Zm9udCBjb2xvcj0iIzAwMDBGRiI+aW50PC9mb250PiBsZW5ndGhJbk1hc3RlckRvY3VtZW50KTwvY29kZT4KICAgIDxicj4KICAgIEFkZHMgYSByYW5nZSBvZiB0ZXh0IGZyb20gdGhlIE1hc3RlciBEb2N1bWVudCB0byB0aGUgUHJvamVjdGlvbiBEb2N1bWVudC4KCTxicj4mbmJzcDs8L2xpPgogIDxsaT4gPGNvZGU+PGZvbnQgY29sb3I9IiMwMDAwRkYiPnB1YmxpYyB2b2lkPC9mb250PiByZW1vdmVNYXN0ZXJEb2N1bWVudFJhbmdlKDxmb250IGNvbG9yPSIjMDAwMEZGIj5pbnQ8L2ZvbnQ+CiAgICBvZmZzZXRJbk1hc3RlckRvY3VtZW50LDxmb250IGNvbG9yPSIjMDAwMEZGIj5pbnQ8L2ZvbnQ+IGxlbmd0aEluTWFzdGVyRG9jdW1lbnQpPC9jb2RlPjxicj4KICAgIFJlbW92ZXMgYSByYW5nZSBvZiB0ZXh0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIE1hc3RlciBEb2N1bWVudCBmcm9tIHRoZSBQcm9qZWN0aW9uCiAgICBEb2N1bWVudC48L2xpPgo8L3VsPgo8cD5BZGRpbmcgbW9yZSB0byB0aGUgcHJldmlvdXMgbGluZXMgb2YgY29kZTogPC9wPgo8cHJlPgptYXN0ZXJEb2N1bWVudC5zZXQoIm9uZSB0d28iKTsKCjxmb250IGNvbG9yPSIjMDA5OTAwIj4vL3JlbW92ZXMgIm9uZSB0IiBmcm9tIHByb2plY3Rpb24gZG9jdW1lbnQ8L2ZvbnQ+CnByb2plY3Rpb25Eb2N1bWVudC5yZW1vdmVNYXN0ZXJEb2N1bWVudFJhbmdlKDAsNSk7Cgo8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Ly9hZGRzICJuZSAiIHRvIHByb2plY3Rpb24gZG9jdW1lbnQ8L2ZvbnQ+CnByb2plY3Rpb25Eb2N1bWVudC5hZGRNYXN0ZXJEb2N1bWVudFJhbmdlKDEsMyk7CgpTeXN0ZW0ub3V0LnByaW50bG4obWFzdGVyRG9jdW1lbnQuZ2V0KCkpOyAgPGZvbnQgY29sb3I9IiMwMDk5MDAiPi8vcHJpbnRzICdvbmUgdHdvJzwvZm9udD4KU3lzdGVtLm91dC5wcmludGxuKHByb2plY3Rpb25Eb2N1bWVudC5nZXQoKSk7PGZvbnQgY29sb3I9IiMwMDk5MDAiPi8vcHJpbnRzICduZSB3byc8L2ZvbnQ+CjwvcHJlPgo8cD5BYm92ZSwgd2Ugc2V0IHRoZSBjb250ZW50cyBvZiB0aGUgbWFzdGVyIGRvY3VtZW50IHRvIGEgc3RyaW5nLgogIERvaW5nIHNvCiAgYXV0b21hdGljYWxseSBzZXRzIHRoZSBjb250ZW50cyBvZiB0aGUgcHJvamVjdGlvbiBkb2N1bWVudCB0byB0aGUgc2FtZSB2YWx1ZS4gVGhlbgogIHdlIG1vZGlmeSB0aGUgcHJvamVjdGlvbiBkb2N1bWVudCB0byBjb250YWluIG9ubHkgY2VydGFpbiBwb3J0aW9ucyBvZiB0aGUgbWFzdGVyCiAgZG9jdW1lbnQuIEZpbmFsbHkgd2Ugb3V0cHV0IHRoZSBjb250ZW50cyBvZiBib3RoIHRoZSBkb2N1bWVudHMgYW5kIHNlZSB0aGF0CiAgdGhlIHBvcnRpb24gb2YgbWFzdGVyIGRvY3VtZW50IHdoaWNoIHdlIHJlbW92ZWQgZnJvbSB0aGUgcHJvamVjdGlvbiBkb2N1bWVudAogIGlzIG5vdCBwcmludGVkIG91dCBidXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBtYXN0ZXIgZG9jdW1lbnQgcmVtYWluIHRoZSBzYW1lLjwvcD4KPGgyPlRoZSBTdGFnZTwvaDI+CjxoND5VSSBEZXBlbmRlbnQgSW5mcmFzdHJ1Y3R1cmU8L2g0Pgo8cD5UbyBhY3R1YWxseSBpbXBsZW1lbnQgZm9sZGluZyBpbiB5b3VyIGVkaXRvciwgeW91IGRvbid0IHJlYWxseSBuZWVkIHRvIGJlIGNvbmNlcm5lZAogIHdpdGggdGhlIGRldGFpbHMgYWJvdmUuCiAgVGhlIEVjbGlwc2UgZGV2ZWxvcGVycyBoYXZlIHByb3ZpZGVkIGEgbmljZSBwYWNrYWdlCiAgbmFtZWQgPGNvZGU+PHN0cm9uZz5vcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uPC9zdHJvbmc+PC9jb2RlPgogIHRoYXQgdGFrZXMgY2FyZSBvZiBhbGwgdGhlIGRldGFpbHMgYW5kIG1ha2VzIHlvdXIgam9iIGZhciBlYXNpZXIuPC9wPgo8cD5UaGUgY2VudGVycGllY2Ugb2YgdGhpcyBwYWNrYWdlIGlzIHRoZSA8Y29kZT5Qcm9qZWN0aW9uVmlld2VyPC9jb2RlPiBjbGFzcywKICB3aGljaCB5b3UgbXVzdCB1c2UgaW4geW91ciBwbHVnLWluIGluc3RlYWQgb2YgdGhlIHVzdWFsIDxjb2RlPlRleHRWaWV3ZXI8L2NvZGU+CiAgY2xhc3MsIHRvIGltcGxlbWVudCBmb2xkaW5nLiBBIDxjb2RlPlByb2plY3Rpb25WaWV3ZXI8L2NvZGU+IGludGVybmFsbHkgdXNlcwogIGEgPGNvZGU+UHJvamVjdGlvbkRvY3VtZW50TWFuYWdlcjwvY29kZT4gdG8gbWFuYWdlIHRoZSBkaXNwbGF5IG9mIFByb2plY3Rpb24KICBEb2N1bWVudHMsIHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhhdC4gSXQgaW1wbGVtZW50cyB0aGUgPGNvZGU+SVRleHRWaWV3ZXJFeHRlbnNpb241PC9jb2RlPgogIGludGVyZmFjZSB3aGljaCBpcyBhIGNlbnRyYWwgcGFydCBvZiB0aGUgVUkgZGVwZW5kZW50IGluZnJhc3RydWN0dXJlLiA8L3A+CjxwPjxjb2RlPklUZXh0Vmlld2VyRXh0ZW5zaW9uNTwvY29kZT4gaW50cm9kdWNlcyB0aGUgY29uY2VwdCBvZgogIDxlbT53aWRnZXQgY29vcmRpbmF0ZXM8L2VtPiBhbmQgPGVtPm1vZGVsIGNvb3JkaW5hdGVzPC9lbT4uCiAgQSB3aWRnZXQgY29vcmRpbmF0ZSBjb3JyZXNwb25kcwogIHRvIGEgcG9zaXRpb24gb24gdGhlIHRleHQgdmlld2VyIHdoaWxlIGEgbW9kZWwgY29vcmRpbmF0ZSBjb3JyZXNwb25kcyB0byBhIHBvc2l0aW9uCiAgb24gdGhlIGRvY3VtZW50LiBBIHdpZGdldCByYW5nZSBhbHdheXMgaGFzIGEgY29ycmVzcG9uZGluZyBtb2RlbCByYW5nZSB3aGljaAogIG1hcHMgdG8gdGhlIHZpZXdlcpJzIGRvY3VtZW50LCB3aGlsZSBvbiB0aGUgb3RoZXIgaGFuZCBhIG1vZGVsIHJhbmdlIGNhbiBiZQogIGVpdGhlciCRZXhwb3NlZJIgb3IgkXVuZXhwb3NlZJIuIEFuIGV4cG9zZWQgbW9kZWwgcmFuZ2UgaXMgdmlzaWJsZSBvbiB0aGUgdmlld2VyCiAgYW5kIGNhbiB0aHVzIGJlIG1hcHBlZCB0byBhIHdpZGdldCByYW5nZS4gVGh1cyB3aGVuIHlvdSBleHBhbmQgdGhlIHRleHQgaW4gdGhlCiAgdmlld2VyLCB0aGF0IG1vZGVsIHJhbmdlIGlzIJFleHBvc2VkkiBhbmQgdmljZSB2ZXJzYS4gPGNvZGU+SVRleHRWaWV3ZXJFeHRlbnNpb241PC9jb2RlPgogIGNvbnRhaW5zIG1ldGhvZHMgdG8gZG8gdGhlIGNvbnZlcnNpb24gZnJvbSB3aWRnZXQgdG8gbW9kZWwgY29vcmRpbmF0ZXMgYW5kIHZpY2UKICB2ZXJzYSwgYW5kIHRvIGV4cG9zZSBtb2RlbCByYW5nZXMuPC9wPgo8aDQ+UHJvamVjdGlvbiBTdXBwb3J0PC9oND4KPHA+QW5vdGhlciBpbXBvcnRhbnQgY2xhc3MgaW4gdGhpcyBwYWNrYWdlIGlzIDxjb2RlPlByb2plY3Rpb25TdXBwb3J0PC9jb2RlPi4KICBUaGlzIGNsYXNzIGNvbnRyb2xzIHRoZSBkaXNwbGF5IGFuZCBjb25maWd1cmF0aW9uIG9mIGFsbCB0aGUgVUkgZWxlbWVudHMgcmVsYXRlZAogIHRvIGZvbGRpbmcsIGZvciBleGFtcGxlLCB0aGUgcGFpbnRpbmcgb2YgdGhvc2UgZWxpcHNpcyBpY29ucyB3aGVuCiAgeW91IGNvbGxhcHNlIGEgcmVnaW9uLCBhbmQgdGhlIHZlcnRpY2FsIGNvbHVtbiB0aGF0IGNvbnRhaW5zIHRoZSB0cmlhbmdsZSBpY29ucwogIHRvIGV4cGFuZC9jb2xsYXBzZSB0ZXh0LiBBIDxjb2RlPlByb2plY3Rpb25TdXBwb3J0PC9jb2RlPiBpbnN0YW5jZSBuZWVkcyB0byBiZSBpbnN0YWxsZWQKICBvbiBhIHZpZXdlci4gVGhlIFhNTCBFZGl0b3IgZXhhbXBsZSBzaG93biA8YSBocmVmPSIjcHJvamVjdGlvblN1cHBvcnQiPmJlbG93PC9hPiBkZW1vbnN0cmF0ZXMgaG93IHRvIGRvIHRoaXMKICBpbiBjb2RlLjwvcD4KPHA+PGNvZGU+UHJvamVjdGlvblN1cHBvcnQ8L2NvZGU+CiAgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IDxlbT5zdW1tYXJpemFibGUgYW5ub3RhdGlvbiB0eXBlczwvZW0+LiBCYXNpY2FsbHksCiAgdGhlc2UgYXJlIHRoZSBhbm5vdGF0aW9ucyB0aGF0IHdpbGwgYXBwZWFyIGluIHRoZSB2ZXJ0aWNhbCBjb2x1bW4gb24gdGhlIGxlZnQKICB3aGVuIHlvdSBmb2xkIHRoZSB0ZXh0IHRoYXQgY29udGFpbnMgdGhlbS4gRm9yIGV4YW1wbGUsIEpEVCBzcGVjaWZpZXMgdGhlIJFlcnJvcpIKICBhbmQgkXdhcm5pbmeSIGFubm90YXRpb24gdHlwZXMgYXMgc3VtbWFyaXphYmxlLCBzbyB0aGF0IHdoZW4geW91IGZvbGQgdGhlIHRleHQKICB0aGF0IGNvbnRhaW5zIGEgd2FybmluZyBvciBhbiBlcnJvciwgaXRzIGljb24gYXBwZWFycyBvbiB0aGUgdmVydGljYWwgY29sdW1uCiAgYmVzaWRlcyB0aGUgZm9sZGluZyBhcnJvdywgYXMgc2hvd24gYmVsb3cuPC9wPgo8cD48aW1nIHNyYz0iaW1hZ2VzL2Fubm90YXRpb25TdW1tYXJ5LnBuZyIgd2lkdGg9IjI4MiIgaGVpZ2h0PSIxMjkiPjwvcD4KPHA+SGVyZSBpcyBob3cgaXQgaXMgaW1wbGVtZW50ZWQ6PC9wPgo8cHJlPmZQcm9qZWN0aW9uU3VwcG9ydC5hZGRTdW1tYXJpemFibGVBbm5vdGF0aW9uVHlwZSgKICAgICAgICAgIm9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmVycm9yIik7CmZQcm9qZWN0aW9uU3VwcG9ydC5hZGRTdW1tYXJpemFibGVBbm5vdGF0aW9uVHlwZSgKICAgICAgICAgIm9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLndhcm5pbmciKTsKPC9wcmU+CjxwPlRoZSA8Y29kZT5zZXRIb3ZlckNvbnRyb2xDcmVhdG9yKCk8L2NvZGU+IG1ldGhvZAogIGFsbG93cyB5b3UgdG8gc2V0IHVwIGEgaG92ZXIgY29udHJvbCB0byBkaXNwbGF5IHRoZSBjb2xsYXBzZWQgdGV4dAogIGluIGEgdG9vbHRpcCBzdHlsZSBib3ggd2hlbiB0aGUgdXNlIG1vdmVzIHRoZSBjdXJzb3Igb3ZlciB0aGUgYXJyb3cuCiAgRm9yIGV4YW1wbGU6PC9wPgo8cD48aW1nIHNyYz0iaW1hZ2VzL2hvdmVyLnBuZyIgd2lkdGg9IjIyMyIgaGVpZ2h0PSIxMzYiPjwvcD4KPHA+VGhlIGNvbnN0cnVjdG9yIHRha2VzIGFuIDxjb2RlPklJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yPC9jb2RlPiBhcyB0aGUgYXJndW1lbnQuIFlvdSB1c3VhbGx5CiAgY3JlYXRlIGFuIGFub255bW91cyBjbGFzcyBoZXJlLiBIZXJlIGlzIGhvdyBKRFQgZG9lcyBpdDogPC9wPgo8cHJlPmZQcm9qZWN0aW9uU3VwcG9ydC5zZXRIb3ZlckNvbnRyb2xDcmVhdG9yKG5ldyBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcigpIHsKICAgPGZvbnQgY29sb3I9IiMwMDAwRkYiPnB1YmxpYzwvZm9udD4gSUluZm9ybWF0aW9uQ29udHJvbCBjcmVhdGVJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgc2hlbGwpIHsKICAgICA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+cmV0dXJuIG5ldzwvZm9udD4gQ3VzdG9tU291cmNlSW5mb3JtYXRpb25Db250cm9sKHNoZWxsLCBJRG9jdW1lbnQuREVGQVVMVF9DT05URU5UX1RZUEUpOwogICB9Cn0pOwo8L3ByZT4KPGg0PlByb2plY3Rpb24gQW5ub3RhdGlvbnM8L2g0Pgo8cD5UbyBlbmFibGUgZm9sZGluZywgd2UgaGF2ZSB0byBzcGVjaWZ5IHdoaWNoIHJlZ2lvbnMgb2YgdGhlIHRleHQgYXJlIGNvbGxhcHNpYmxlLgogIFdlIGRvIHRoaXMgYnkKICBjYWxsaW5nIDxjb2RlPmFkZEFubm90YXRpb24oKTwvY29kZT4KICBhZGRpbmcgPGNvZGU+UHJvamVjdGlvbkFubm90YXRpb25zPC9jb2RlPiB0byB0aGUgUHJvamVjdGlvblZpZXdlcidzCiAgPGNvZGU+UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbDwvY29kZT4uIFRoZSBwb3NpdGlvbiBhbGxvd3MgdGhlIGFubm90YXRpb24gdG8KICBiZSBhdHRhY2hlZCB0byBjZXJ0YWluIHRleHQgaW4gdGhlIGVkaXRvci4gPC9wPgoKPHA+VGhlIG1ldGhvZHMgb2YgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCBhcmUgcHJldHR5IHNlbGYtZXhwbGFuYXRvcnk6IDwvcD4KPHByZT48Zm9udCBjb2xvcj0iIzAwMDBGRiI+Y2xhc3M8L2ZvbnQ+IFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWx7CgogIDxmb250IGNvbG9yPSIjMDAwMEZGIj4gcHVibGljIHZvaWQ8L2ZvbnQ+IGNvbGxhcHNlKEFubm90YXRpb24gYW5ub3RhdGlvbikKICA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+IHB1YmxpYyB2b2lkPC9mb250PiBleHBhbmQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQogIDxmb250IGNvbG9yPSIjMDAwMEZGIj4gcHVibGljIGJvb2xlYW48L2ZvbnQ+IGV4cGFuZEFsbChpbnQgb2Zmc2V0LGludCBsZW5ndGgpCgogIDxmb250IGNvbG9yPSIjMDAwMEZGIj4gcHVibGljIHZvaWQ8L2ZvbnQ+IHRvZ2dsZUV4cGFuc2lvblN0YXRlKEFubm90YXRpb24gYW5ub3RhdGlvbikKCiAgPGZvbnQgY29sb3I9IiMwMDAwRkYiPiBwdWJsaWMgdm9pZDwvZm9udD4gbW9kaWZ5QW5ub3RhdGlvbnMoQW5ub3RhdGlvbltdIGRlbGV0aW9ucyxNYXAgYWRkaXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gbW9kaWZpY2F0aW9ucykKfQo8L3ByZT4KPHA+VGhlc2UgbWV0aG9kcyB0b2dnbGUgdGhlIGFubm90YXRpb25zIHRvIGV4cGFuZC9jb2xsYXBzZSBzdGF0ZXMuCiAgVGhlIG9ubHkgbWV0aG9kIHdoaWNoIG1heSBiZSBjb25mdXNpbmcgaXM6IDxjb2RlPm1vZGlmeUFubm90YXRpb25zKCk8L2NvZGU+LgogIFRoaXMgYmFzaWNhbGx5IGRvZXMgc2V2ZXJhbCBkZWxldGlvbnMsIGFkZGl0aW9ucywgYW5kIG1vZGlmaWNhdGlvbnMgYXQgb25jZS4KICBUaGUgYWRkaXRpb25zCiAgcGFyYW1ldGVyIGlzIGEgTWFwIHdpdGggQW5ub3RhdGlvbiBhcyB0aGUga2V5IGFuZCBQb3NpdGlvbiBhcyB0aGUgdmFsdWUuIEV4ZWN1dGluZwogIHRoZSBtZXRob2QgZ2VuZXJhdGVzIGEgc2luZ2xlIGNoYW5nZSBldmVudCByYXRoZXIgdGhhbiBhIHNlcmllcyBvZiB0aGVtIHdoZW4KICB5b3Ugd291bGQgYWRkIGFuZCByZW1vdmUgYW5ub3RhdGlvbnMgb25lIGFmdGVyIHRoZSBvdGhlci4KPC9wPgo8cD5BIDxjb2RlPlByb2plY3Rpb25Bbm5vdGF0aW9uPC9jb2RlPiBoYXMgdGhlIGZvbGxvd2luZyBtZXRob2RzIHRvIGNvbGxhcHNlL2V4cGFuZHMKICB0aGUgdGV4dCByZWdpb24gaXQgaXMgYXNzb2NpYXRlZCB3aXRoOjwvcD4KPHByZT4gIDxmb250IGNvbG9yPSIjMDAwMEZGIj5wdWJsaWMgdm9pZDwvZm9udD4gbWFya0NvbGxhcHNlZCgpIDxmb250IGNvbG9yPSIjMDA5OTMzIj4gLy9tYXJrcyB0aGUgYW5ub3RhdGlvbiBhcyBjb2xsYXBzZWQ8L2ZvbnQ+CiAgPGZvbnQgY29sb3I9IiMwMDAwRkYiPnB1YmxpYyB2b2lkPC9mb250PiBtYXJrRXhwYW5kZWQoKSAgIDxmb250IGNvbG9yPSIjMDA5OTMzIj4vL21hcmtzIHRoZSBhbm5vdGF0aW9uIGFzIGV4cGFuZGVkPC9mb250PgogIDxmb250IGNvbG9yPSIjMDAwMEZGIj5wdWJsaWMgYm9vbGVhbjwvZm9udD4gaXNDb2xsYXBzZWQoKSA8Zm9udCBjb2xvcj0iIzAwOTkzMyI+Ly90ZWxscyB3aGV0aGVyIHRoZSBhbm5vdGF0aW9uIGlzIGNvbGxhcHNlZCBvciBleHBhbmRlZDwvZm9udD4KPC9wcmU+CjxwPlRodXMsIHdoZW4geW91IGFyZSB3b3JraW5nIGluIEpEVCBhbmQgeW91IGNsaWNrIHRoZSBhcnJvdyBvbiB0aGUgbGVmdCBzaWRlCiAgY29sdW1uIG9mIHRoZSB0ZXh0IHRvIGNvbGxhcHNlIGl0LCB0aGUgbWV0aG9kIDxjb2RlPmlzQ29sbGFwc2VkKCk8L2NvZGU+IGlzCiAgY2FsbGVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHRleHQgaXMgY29sbGFwc2VkIG9yIG5vdCBhbmQgdGhlbgogIDxjb2RlPm1hcmtDb2xsYXBzZWQoKTwvY29kZT4gaXMgY2FsbGVkCiAgaWYgPGNvZGU+aXNDb2xsYXBzZWQoKTwvY29kZT4gcmV0dXJucyBmYWxzZS4gRm9yIGV4YW1wbGUsPC9wPgo8cHJlPiAgPGZvbnQgY29sb3I9IiMwMDAwRkYiPmlmPC9mb250PighYW5ub3RhdGlvbi5pc0NvbGxhcHNlZCgpKQogICAgICBhbm5vdGF0aW9uLm1hcmtDb2xsYXBzZWQoKTsKPC9wcmU+CjxwPjxpbWcgc3JjPSJpbWFnZXMvbm90ZS5naWYiPiBNYW5pcHVsYXRpbmcgUHJvamVjdGlvbkFubm90YXRpb25zIGlzIHRoZSBvbmx5CiAgc3VwcG9ydGVkIHdheSB0byBjb250cm9sIGZvbGRpbmcuIEV2ZW4gaWYgeW91IHdlcmUgdG8gZ2V0IGEgaG9sZCBvZiBhIFByb2plY3Rpb24KICBEb2N1bWVudCwgaXRzIHByb2plY3Rpb24gYmVoYXZpb3Igc2hvdWxkIG5ldmVyIGJlIG1hbmlwdWxhdGVkIGRpcmVjdGx5LiA8L3A+CjxoND5QYWludGluZyB0aGUgQW5ub3RhdGlvbnMuLi48L2g0Pgo8cD5Gb2xkaW5nIGluIHRoZSBlZGl0b3Igd291bGQgYmUgcXVpdGUgdXNlbGVzcyB3aXRob3V0IHRoZSB1c2VyIGludGVyZmFjZQogIHRoYXQgYWxsb3dlZCB1cyB0byBjb2xsYXBzZSBhbmQgZXhwYW5kIHRoZSB0ZXh0LgogIEhlcmUncyB3aGF0IGl0IGxvb2tzIGxpa2UgaW4gdGhlIGVkaXRvcjo8L3A+CjxwPjxpbWcgc3JjPSJpbWFnZXMvcHJvamVjdGlvbkFubm90YXRpb24ucG5nIiB3aWR0aD0iMjI2IiBoZWlnaHQ9IjIxNCI+PC9wPgo8cD5Qcm9qZWN0aW9uQW5ub3RhdGlvbiBoYXMgYSBtZXRob2Qgd2hpY2ggYWN0dWFsbHkgcGFpbnRzIHRob3NlIHRyaWFuZ2xlcyB5b3Ugc2VlCiAgb24gdGhlIGxlZnQuPC9wPgo8cD48Y29kZT48Zm9udCBjb2xvcj0iIzAwMDBGRiI+cHVibGljIHZvaWQ8L2ZvbnQ+IHBhaW50KEdDIGdjLCBDYW52YXMgY2FudmFzLAogIFJlY3RhbmdsZSByZWN0YW5nbGUpPC9jb2RlPjwvcD4KPHA+WW91IGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWctaW4gaWYgeW91IHdhbnQgdG8gZHJhdyBzb21ldGhpbmcgb3RoZXIKICB0aGFuIGFuIHRyaWFuZ2xlIG9uIHRoZSBsZWZ0IHNpZGUsIGZvciBleGFtcGxlIGEgcGx1cy9taW51cyBzaWduLjwvcD4KPHA+VGhlcmUgaXMgb25lIG1vcmUgbWV0aG9kIHlvdSBzaG91bGQga25vdyBhYm91dDo8L3A+CjxwPjxjb2RlPjxmb250IGNvbG9yPSIjMDAwMEZGIj5wdWJsaWMgdm9pZDwvZm9udD4gc2V0UmFuZ2VJbmRpY2F0aW9uKDxmb250IGNvbG9yPSIjMDAwMEZGIj5ib29sZWFuPC9mb250PgogIHJhbmdlSW5kaWNhdGlvbik8L2NvZGU+PC9wPgo8cD5BIDxlbT5yYW5nZSBpbmRpY2F0aW9uPC9lbT4KICBpcyB0aGF0IGxpbmUgeW91IHNlZSB3aGVuIHlvdSBtb3ZlIHlvdXIgY3Vyc29yIHRvIGFuIHRyaWFuZ2xlIGluZGljYXRpbmcKICB0aGF0IHRoZSB0ZXh0IGlzIGV4cGFuZGVkLiBUaGUgbGluZSBzaWduaWZpZXMgdGhlIHJhbmdlIG9mCiAgdGV4dCB0aGF0IHdpbGwgYmUgY29sbGFwc2VkIHdoZW4geW91IGNsaWNrIHRoZSB0cmlhbmdsZSwgYW5kIHRodXMgdGhlIG5hbWUuCiAgUGFzc2luZyB0cnVlIG9yIGZhbHNlIHRvIHRoaXMgbWV0aG9kIGNvbnRyb2xzIHdoZXRoZXIKICB0aGF0IGxpbmUgaXMgZHJhd24gb3Igbm90LjwvcD4KCjxoMj5UaGUgU2hvdzwvaDI+CjxoND5YTUwgRWRpdG9yIHBsdWctaW48L2g0Pgo8cD5JIGNhbiBoZWFyIHlvdSBzYXlpbmcgk1llYWgsIGFsbCB0aGlzIGlzIGZpbmUsIGJ1dCBob3cgZG8gSSBhY3R1YWxseSB1c2UgdGhpcwogIHN0dWZmIGluIG15IHBsdWctaW4/lCBXZWxsIHRvIHNob3cgeW91IGhvdyB0byBkbyB0aGF0IEkgd2lsbCB3YWxrIHlvdSB0aHJvdWdoCiAgYSBsaXR0bGUgZXhhbXBsZS4gV2Ugd2lsbCBleHRlbmQgdGhlIFhNTCBlZGl0b3IgcGx1Zy1pbiBleGFtcGxlIHByb3ZpZGVkIHdpdGgKICBFY2xpcHNlIHRvIGFsbG93IGZvbGRpbmcgb2YgWE1MIGVsZW1lbnRzLiBNeSBhaW0gaXMganVzdCB0byBkZW1vbnN0cmF0ZSB0aGUKICBiYXNpY3Mgb2YgaW1wbGVtZW50aW5nIGZvbGRpbmcgaGVyZSwgc28gSSBoYXZlIHRyaWVkIHRvIGtlZXAgdGhlIGNvZGUgYXMgc2ltcGxlCiAgYXMgcG9zc2libGUuIElmIHlvdSB3YW50IHRvIGFkZCBhbnkgYWR2YW5jZWQgZnVuY3Rpb25hbGl0eSB5b3Ugc2hvdWxkIGJlIGFibGUKICB0byBkbyBzbyB5b3Vyc2VsZiBieSBub3cgKGhvcGVmdWxseSkgOy0pIDwvcD4KPHA+TGV0J3MgbG9vayBhdCB0aGUgc3RlcHMgaW52b2x2ZWQgaW4gc3VwcG9ydGluZyBmb2xkaW5nLgogIE5vdGUgdGhhdCBhbGwgdGhlIG1ldGhvZHMgc2hvd24gYmVsb3cgYXJlIGRlZmluZWQgaW4gdGhlIGNsYXNzCiAgPGNvZGU+WE1MRWRpdG9yPC9jb2RlPiB3aGljaCBleHRlbmRzIHRoZSA8Y29kZT5UZXh0RWRpdG9yPC9jb2RlPiBjbGFzcy48L3A+CgoKPG9sPgogIDxsaT5PdmVycmlkZSA8Y29kZT5jcmVhdGVQYXJ0Q29udHJvbCA8L2NvZGU+IG1ldGhvZCBvZiA8Y29kZT5UZXh0RWRpdG9yPC9jb2RlPgogICAgdG8gY29uZmlndXJlIGFuZCBpbnN0YWxsIDxjb2RlPlByb2plY3Rpb25TdXBwb3J0PC9jb2RlPjwvbGk+CiAgPGxpPk92ZXJyaWRlIDxjb2RlPmNyZWF0ZVNvdXJjZVZpZXdlcjwvY29kZT4gbWV0aG9kIG9mIDxjb2RlPkFic3RyYWN0VGV4dEVkaXRvcjwvY29kZT4KICAgIHRvIHJldHVybiBhIDxjb2RlPlByb2plY3Rpb25WaWV3ZXI8L2NvZGU+PC9saT4KICA8bGk+UHJvdmlkZSBzb21lIGZ1bmN0aW9uYWxpdHkgdG8gZGVmaW5lIGNvbGxhcHNpYmxlIHJlZ2lvbnM8L2xpPgogIDwvb2w+CiAgTm93IGxldHMgc2VlIGhvdyB0byBpbXBsZW1lbnQgdGhpcyBpbiBvdXIgcGx1Zy1pbi4KPHA+PGltZyBzcmM9ImltYWdlcy90cnlpdC5naWYiIHdpZHRoPSI2MSIgaGVpZ2h0PSIxMyI+Q3JlYXRlIGEgbmV3IFBsdWctaW4gcHJvamVjdC4KICBBdCB0aGUgZW5kIG9mIHRoZSBQcm9qZWN0IFdpemFyZCB0aGVyZSB3aWxsIGJlIGFuIG9wdGlvbiB0byBDcmVhdGUgYQogIHBsdWctaW4gdXNpbmcgb25lIG9mIHRoZSB0ZW1wbGF0ZXMuIENoZWNrIGl0IGFuZCBzZWxlY3QgUGx1Zy1pbiB3aXRoIGFuIGVkaXRvci4KICBUaGlzIHdpbGwgY3JlYXRlIGEgcGx1Zy1pbiB3aXRoIGFuIGVkaXRvciBmb3IgWE1MIGZpbGVzLiBOb3cgd2Ugd2lsbCBleHRlbmQKICB0aGlzIGVkaXRvciB0byBhbGxvdyB0aGUgZm9sZGluZyBvZiBYTUwgZWxlbWVudHMuPC9wPgo8cD48c3Ryb25nPjEpPC9zdHJvbmc+IEZpcnN0LCB3ZSBvdmVycmlkZSB0aGUgPGNvZGU+IGNyZWF0ZVBhcnRDb250cm9sPC9jb2RlPgogIG1ldGhvZCBvZiB0aGUgPGNvZGU+VGV4dEVkaXRvcjwvY29kZT4gY2xhc3MuIFRvIGtlZXAgdGhpbmdzIHNpbXBsZQogIEkgaGF2ZW4ndCBwcm92aWRlZCBhbnkgY29kZSBmb3Igc3VtbWFyaXphYmxlIGFubm90YXRpb24gdHlwZXMgb3IgaG92ZXIgY29udHJvbHMsCiAgYnV0IHlvdSBhcmUgZnJlZSB0byBkbyBzbyBpbiB5b3VyIG93biBwbHVnLWluLjwvcD4KPGEgbmFtZT0icHJvamVjdGlvblN1cHBvcnQiPjwvYT48cHJlPjxmb250IGNvbG9yPSIjMDAwMEZGIj5wdWJsaWMgdm9pZDwvZm9udD4gY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKewogICAgPGZvbnQgY29sb3I9IiMwMDAwRkYiPnN1cGVyPC9mb250Pi5jcmVhdGVQYXJ0Q29udHJvbChwYXJlbnQpOwogICAgUHJvamVjdGlvblZpZXdlciB2aWV3ZXIgPShQcm9qZWN0aW9uVmlld2VyKWdldFNvdXJjZVZpZXdlcigpOwoKICAgIHByb2plY3Rpb25TdXBwb3J0ID0gbmV3IFByb2plY3Rpb25TdXBwb3J0KHZpZXdlcixnZXRBbm5vdGF0aW9uQWNjZXNzKCksZ2V0U2hhcmVkQ29sb3JzKCkpOwogICAgcHJvamVjdGlvblN1cHBvcnQuaW5zdGFsbCgpOwoKICAgIDxmb250IGNvbG9yPSIjMDA5OTMzIj4vL3R1cm4gcHJvamVjdGlvbiBtb2RlIG9uPC9mb250PgogICAgdmlld2VyLmRvT3BlcmF0aW9uKFByb2plY3Rpb25WaWV3ZXIuVE9HR0xFKTsKCiAgICBhbm5vdGF0aW9uTW9kZWwgPSB2aWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpOwoKfTwvcHJlPgo8cD48c3Ryb25nPjIpPC9zdHJvbmc+IE5leHQsIHdlIHRlbGwgPGNvZGU+Y3JlYXRlU291cmNlVmlld2VyPC9jb2RlPiB0byByZXR1cm4KICBhIDxjb2RlPlByb2plY3Rpb25WaWV3ZXI8L2NvZGU+IGluc3RlYWQgb2YgYSA8Y29kZT5Tb3VyY2VWaWV3ZXI8L2NvZGU+LiA8L3A+CjxwcmU+PGZvbnQgY29sb3I9IiMwMDAwRkYiPnByb3RlY3RlZDwvZm9udD4gSVNvdXJjZVZpZXdlciBjcmVhdGVTb3VyY2VWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwKICAgICAgICAgICAgSVZlcnRpY2FsUnVsZXIgcnVsZXIsIDxmb250IGNvbG9yPSIjMDAwMEZGIj5pbnQ8L2ZvbnQ+IHN0eWxlcykKewogICBJU291cmNlVmlld2VyIHZpZXdlciA9IDxmb250IGNvbG9yPSIjMDAwMEZGIj5uZXc8L2ZvbnQ+IFByb2plY3Rpb25WaWV3ZXIocGFyZW50LCBydWxlciwKCQkJCWdldE92ZXJ2aWV3UnVsZXIoKSwgaXNPdmVydmlld1J1bGVyVmlzaWJsZSgpLCBzdHlsZXMpOwoKICAgPGZvbnQgY29sb3I9IiMwMDk5MzMiPi8vIGVuc3VyZSBkZWNvcmF0aW9uIHN1cHBvcnQgaGFzIGJlZW4gY3JlYXRlZCBhbmQgY29uZmlndXJlZC48L2ZvbnQ+CiAgIGdldFNvdXJjZVZpZXdlckRlY29yYXRpb25TdXBwb3J0KHZpZXdlcik7CgogICA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+cmV0dXJuPC9mb250PiB2aWV3ZXI7Cn0KPC9wcmU+Cgo8cD48c3Ryb25nPjMpPC9zdHJvbmc+IEZpbmFsbHksIHdlIG5lZWQgc29tZSBtZWNoYW5pc20gdG8gdGVsbCB0aGUgZWRpdG9yIHdoaWNoCiAgcmVnaW9ucyBhcmUgY29sbGFwc2libGUuIEZvciB0aGF0IEkgaGF2ZSB3cml0dGVuIGEgKHZlcnkpIHNtYWxsIHBhcnNlciBmb3IgWE1MCiAgKHdoaWNoIGlzIHZlcnkgYnVnZ3kgYW5kIGRvZXNuJ3Qgc3VwcG9ydCBuZXN0ZWQgZWxlbWVudHMpLiBUaGUgcGFyc2VyIHJ1bnMgYXMKICBhIHJlY29uY2lsaW5nIHN0cmF0ZWd5IGFuZCBwYXJzZXMgdGhlIGVudGlyZSBkb2N1bWVudCBldmVyeSB0aW1lIGl0IGlzIG1vZGlmaWVkLgogIFRoZSBwYXJzZXIgdGhlbiBwYXNzZXMgdGhlIHJhbmdlIG9mIGV2ZXJ5IFhNTCBlbGVtZW50IHRvIHRoZSBlZGl0b3IsIHdoaWNoIHRoZW4KICBpbiB0dXJuIGFkZHMgUHJvamVjdGlvbiBBbm5vdGF0aW9ucyB0byBkZWZpbmUgY29sbGFwc2libGUgcmVnaW9ucy48L3A+CiAgPHA+CiAgVGhlIHNvdXJjZSBjb2RlIGZvciBteSBzaW1wbGUgcGFyc2VyIGlzIHRvbyBsYXJnZSB0byBzaG93IGhlcmUsIGhvd2V2ZXIsIHRob3NlCiAgaW50ZXJlc3RlZCBjYW4gdGFrZSBhIGxvb2sgYXQgdGhlIDxjb2RlPlhtbFJlY29uY2lsaW5nU3RyYXRlZ3kuamF2YTwvY29kZT4KICBmaWxlIGluIHRoZSBwcm92aWRlZCBzb3VyY2UgY29kZS4gPC9wPgo8cD5CZWxvdyBpcyB0aGUgY29kZSB0aGF0IGRvZXMgYWxsIHRoaXM6PC9wPgo8cHJlPjxmb250IGNvbG9yPSIjMDAwMEZGIj5wcml2YXRlPC9mb250PiBBbm5vdGF0aW9uW10gb2xkQW5ub3RhdGlvbnM7Cjxmb250IGNvbG9yPSIjMDAwMEZGIj5wdWJsaWMgdm9pZDwvZm9udD4gdXBkYXRlRm9sZGluZ1N0cnVjdHVyZShBcnJheUxpc3QgcG9zaXRpb25zKQp7CiAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW3Bvc2l0aW9ucy5zaXplKCldOwoKICAgPGZvbnQgY29sb3I9IiMwMDk5MzMiPi8vdGhpcyB3aWxsIGhvbGQgdGhlIG5ldyBhbm5vdGF0aW9ucyBhbG9uZwogICAvL3dpdGggdGhlaXIgY29ycmVzcG9uZGluZyBwb3NpdGlvbnM8L2ZvbnQ+CiAgIEhhc2hNYXAgbmV3QW5ub3RhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwoKICAgPGZvbnQgY29sb3I9IiMwMDAwRkYiPmZvcjwvZm9udD4oPGZvbnQgY29sb3I9IiMwMDAwRkYiPmludDwvZm9udD4gaSA9IDA7IGkgPCBwb3NpdGlvbnMuc2l6ZSgpO2krKykKICAgewogICAgICBQcm9qZWN0aW9uQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gPGZvbnQgY29sb3I9IiMwMDAwRkYiPm5ldzwvZm9udD4gUHJvamVjdGlvbkFubm90YXRpb24oKTsKCiAgICAgIG5ld0Fubm90YXRpb25zLnB1dChhbm5vdGF0aW9uLCBwb3NpdGlvbnMuZ2V0KGkpKTsKCiAgICAgIGFubm90YXRpb25zW2ldID0gYW5ub3RhdGlvbjsKICAgfQoKICAgYW5ub3RhdGlvbk1vZGVsLm1vZGlmeUFubm90YXRpb25zKG9sZEFubm90YXRpb25zLCBuZXdBbm5vdGF0aW9ucyxudWxsKTsKCiAgIG9sZEFubm90YXRpb25zID0gYW5ub3RhdGlvbnM7Cn0KPC9wcmU+CjxwPkhlcmUgaXMgb3VyIGNvbXBsZXRlZCBlZGl0b3Igd2l0aCBmb2xkaW5nOjwvcD4KPHA+PGltZyBzcmM9ImltYWdlcy94bWxFZGl0b3IucG5nIiB3aWR0aD0iMzMxIiBoZWlnaHQ9IjIwMyI+PC9wPgo8aDE+U291cmNlIENvZGU8L2gxPgo8cD5BbGwgdGhlIHNvdXJjZSBjb2RlIHRoYXQgYWNjb21wYW5pZXMgdGhpcyBhcnRpY2xlCiAgbWF5IGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSJ4bWxFZGl0b3JQbHVnaW4uemlwIj54bWxFZGl0b3JQbHVnaW4uemlwIGZpbGU8L2E+LjwvcD4KPHA+PGI+VXBkYXRlICgxOUFwcmlsMjAwNSk6PC9iPiBNeSAoYnVnZ3kpIHhtbCBwYXJzZXIgaGFzIGJlZW4gcmVwbGFjZWQgYnkgYSBiZXR0ZXIgb25lIGZyb20KR2VyZCBDYXN0YW4gd2hpY2ggc3VwcG9ydHMgbmVzdGVkIHhtbCBlbGVtZW50cy4KPC9wPgo8aDE+Q29uY2x1c2lvbjwvaDE+CjxwPkJ5IG5vdywgeW91IHNob3VsZCBoYXZlIHVuZGVyc3Rvb2QgdGhlIFVJIGluZGVwZW5kZW50IGFuZCBkZXBlbmRlbnQgaW5mcmFzdHJ1Y3R1cmUKICB1c2VkIGluIEpGYWNlIFRleHQgdG8gaW1wbGVtZW50IHRoZSBmb2xkaW5nIGNhcGFiaWxpdHkuIFlvdSBzaG91bGQgYWxzbyBoYXZlCiAgdW5kZXJzdG9vZCBob3cgdG8gaW1wbGVtZW50IGZvbGRpbmcgaW4gdGhlIHRleHQgZWRpdG9yIG9mIHlvdXIgZWNsaXBzZSBwbHVnLWluLgogIFBsdXMgeW91IGV2ZW4gZ290IGEgZnJlZSBYTUwgZWRpdG9yIGZvciBFY2xpcHNlIHdpdGggZm9sZGluZyBzdXBwb3J0IDstKS48L3A+CjxoMT5SZWZlcmVuY2VzPC9oMT4KPHVsPgogIDxsaT48YSBocmVmPSJodHRwOi8vZGV2cmVzb3VyY2UuaHAuY29tL2RyYy90ZWNobmljYWxfd2hpdGVfcGFwZXJzL2VjbGlwZWRpdG9yL2luZGV4LmpzcCIgdGFyZ2V0PSJfYmxhbmsiPkNyZWF0aW5nIGEgdGV4dC1iYXNlZCBlZGl0b3IgZm9yIEVjbGlwc2U8L2E+PC9saT4KICA8bGk+QXJ0aWNsZXMgaW4gdGhlIEVjbGlwc2UgMy4wIEZhcXMgYm9vayBvbiB0ZXh0IGVkaXRvcnM6CiAgICA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2VmYXEub3JnL2NocmlzL2ZhcS9odG1sL2ZhcTI2Mi5odG1sIiB0YXJnZXQ9Il9ibGFuayI+W0ZBUTI2Ml08L2E+CiAgICA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2VmYXEub3JnL2NocmlzL2ZhcS9odG1sL2ZhcTI2My5odG1sIiB0YXJnZXQ9Il9ibGFuayI+W0ZBUTI2M108L2E+CiAgICA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2VmYXEub3JnL2NocmlzL2ZhcS9odG1sL2ZhcTI2NC5odG1sIiB0YXJnZXQ9Il9ibGFuayI+W0ZBUTI2NF08L2E+CiAgICA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2VmYXEub3JnL2NocmlzL2ZhcS9odG1sL2ZhcTI2NS5odG1sIiB0YXJnZXQ9Il9ibGFuayI+W0ZBUTI2NV08L2E+CiAgICA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2VmYXEub3JnL2NocmlzL2ZhcS9odG1sL2ZhcTI2Ni5odG1sIiB0YXJnZXQ9Il9ibGFuayI+W0ZBUTI2Nl08L2E+CiAgICA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2VmYXEub3JnL2NocmlzL2ZhcS9odG1sL2ZhcTI2Ny5odG1sIiB0YXJnZXQ9Il9ibGFuayI+W0ZBUTI2N108L2E+CiAgICA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2VmYXEub3JnL2NocmlzL2ZhcS9odG1sL2ZhcTI2OC5odG1sIiB0YXJnZXQ9Il9ibGFuayI+W0ZBUTI2OF08L2E+CiAgICA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2VmYXEub3JnL2NocmlzL2ZhcS9odG1sL2ZhcTI2OS5odG1sIiB0YXJnZXQ9Il9ibGFuayI+W0ZBUTI2OV08L2E+CiAgICA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2VmYXEub3JnL2NocmlzL2ZhcS9odG1sL2ZhcTI3MC5odG1sIiB0YXJnZXQ9Il9ibGFuayI+W0ZBUTI3MF08L2E+CiAgICA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2VmYXEub3JnL2NocmlzL2ZhcS9odG1sL2ZhcTI3MS5odG1sIiB0YXJnZXQ9Il9ibGFuayI+W0ZBUTI3MV08L2E+CiAgICA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2VmYXEub3JnL2NocmlzL2ZhcS9odG1sL2ZhcTI3Mi5odG1sIiB0YXJnZXQ9Il9ibGFuayI+W0ZBUTI3Ml08L2E+CiAgICA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2VmYXEub3JnL2NocmlzL2ZhcS9odG1sL2ZhcTI3My5odG1sIiB0YXJnZXQ9Il9ibGFuayI+W0ZBUTI3M108L2E+CiAgICA8L2xpPgogIDxsaT48YSBocmVmPSJodHRwOi8vaGVscC5lY2xpcHNlLm9yZy9oZWxwMzAvdG9waWMvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLmlzdi9ndWlkZS9lZGl0b3JzLmh0bSIgdGFyZ2V0PSJfYmxhbmsiPk9ubGluZSBoZWxwIGZvciBFZGl0b3JzPC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9oZWxwLmVjbGlwc2Uub3JnL2hlbHAzMC90b3BpYy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MuaXN2L3NhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuamF2YWVkaXRvci9kb2MtaHRtbC91aV9qYXZhZWRpdG9yX2V4Lmh0bWwiIHRhcmdldD0iX2JsYW5rIj5PbmxpbmUgaGVscCBmb3IgdGhlIEphdmEgZWRpdG9yIGV4YW1wbGU8L2E+PC9saT4KPC91bD4KPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYW5kIGxvZ29zIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4KPC9ib2R5Pgo8L2h0bWw+Cg==