Q2hhbmdlcyBpbiB2ZXJzaW9uIDEuMC4xOgotIEZpeGVkIGNvbW1lbnQgdGFncyB3aGljaCB3ZXJlIG91dHB1dGluZyBhcyAnPD8tLScgaW5zdGVhZCBvZiAKICB0aGUgY29ycmVjdCAnPCEtLScuCi0gSW1wbGVtZW50ZWQgdGhlIE5leHQgYW5kIFByZXYgbWV0aG9kcyBvZiB0aGUgVGlYbWxBdHRyaWJ1dGUgY2xhc3MuCi0gUmVuYW1lZCAnTGFzdEF0dHJpYnR1dGUnIHRvICdMYXN0QXR0cmlidXRlJwotIEZpeGVkIGJhZCBwb2ludGVyIHRvICdpc3NwYWNlJyB0aGF0IGNvdWxkIG9jY3VyIHdoaWxlIHBhcnNpbmcgdGV4dC4KLSBFcnJvcnMgZmluZGluZyBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0YWdzIG5vIGxvbmdlciB0aHJvdyBpdCBpbnRvIGFuCiAgaW5maW5pdGUgbG9vcC4gKEhvcGVmdWxseS4pCgpDaGFuZ2VzIGluIHZlcnNpb24gMS4wLjIKLSBNaW5vciBkb2N1bWVudGF0aW9uIGZpeGVzLgoKQ2hhbmdlcyBpbiB2ZXJzaW9uIDEuMC4zCi0gQWZ0ZXIgbm9kZXMgYXJlIGFkZGVkIHRvIGEgZG9jdW1lbnQsIHRoZXkgcmV0dXJuIGEgcG9pbnRlcgogIHRvIHRoZSBuZXcgbm9kZSBpbnN0ZWFkIG9mIGEgYm9vbCBmb3Igc3VjY2Vzcy4KLSBFbGVtZW50cyBjYW4gYmUgY29uc3RydWN0ZWQgd2l0aCBhIHZhbHVlLCB3aGljaCBpcyB0aGUKICBlbGVtZW50IG5hbWUuIEV2ZXJ5IGVsZW1lbnQgbXVzdCBoYXZlIGEgdmFsdWUgb3IgaXQgd2lsbCBiZQogIGludmFsaWQsIGJ1dCB0aGUgY29kZSBjaGFuZ2VzIHRvIGVuZm9yY2UgdGhpcyBhcmUgbm90IGZ1bGx5CiAgaW4gcGxhY2UuCgpDaGFuZ2VzIGluIHZlcnNpb24gMS4xLjAKLSBBZGRlZCB0aGUJVGlYbWxBdHRyaWJ1dGVTZXQgY2xhc3MgdG8gcHVsbCB0aGUgYXR0cmlidXRlcyBpbnRvCiAgYSBzZXBlcmF0ZSBjb250YWluZXIuCi0gTW92ZWQgdGhlIGRvdWJseSBsaWtlZCBsaXN0IG91dCBvZiBYbWxCYXNlLiBOb3cgWG1sQmFzZSBvbmx5CiAgcmVxdWlyZXMgdGhlIFByaW50KCkgZnVuY3Rpb24gYW5kIGRlZmluZXMgc29tZSB1dGlsaXR5IGZ1bmN0aW9ucy4KLSBNb3ZlZCBlcnJvcnMgaW50byBhIHNlcGVyYXRlIGZpbGUuIChXaXRoIHRoZSBpZGVhIG9mIGludGVybmF0aW9uYWxpemF0aW9uCiAgdG8gdGhlIG90aGVyIGxhdGluLTEgbGFuZ3VhZ2VzLikKLSBBZGRlZCB0aGUgIk5vZGVUeXBlIgotIEZpeGVkIHdoaXRlIHNwYWNlIHBhcnNpbmcgaW4gdGV4dCB0byBjb25mb3JtIHdpdGggdGhlIHN0YW5kYXJkLiAKICBCYXNpY2FsbHksIGFsbCB3aGl0ZSBzcGFjZSBiZWNvbWVzIGp1c3Qgb25lIHNwYWNlLgotIEFkZGVkIHRoZSBUaVhtbERlY2xhcmF0aW9uIGNsYXNzIHRvIHJlYWQgeG1sIGRlY2xhcmF0aW9ucy4KCkNoYW5nZXMgaW4gdmVyc2lvbiAxLjIuMAotIFJlbW92ZWQgdGhlIGZhY3RvcnkuIFRoZSBmYWN0b3J5IHdhcyBub3QgcmVhbGx5IGluIHRoZSBzcGlyaXQgCiAgb2Ygc21hbGwgYW5kIHNpbXBsZSwgY29uZnVzZWQgdGhlIGNvZGUsIGFuZCB3YXMgb2YgbGltaXRlZCB2YWx1ZS4KLSBBZGRlZCBGaXJzdENoaWxkRWxlbWVudCBhbmQgTmV4dFNpYmxpbmdFbGVtZW50LCBiZWNhdXNlIHRoZXkKICBhcmUgc3VjaCBjb21tb24gZnVuY3Rpb25zLgotIFJlLXdyb3RlIHRoZSBleGFtcGxlIHRvIHRlc3QgYW5kIGRlbW9uc3RyYXRlIG1vcmUgZnVuY3Rpb25hbGl0eS4KCkNoYW5nZXMgaW4gdmVyc2lvbiAxLjIuMQotIEZpeGVkIGEgYnVnIHdoZXJlIGNvbW1lbnRzIGNvdWxkbid0IGJlIGluc2lkZSBlbGVtZW50cy4KLSBMb2FkaW5nIG5vdyBjbGVhcnMgb3V0IGV4aXN0aW5nIFhNTCByYXRoZXIgdGhhbiBhcHBlbmRpbmcuCi0gQWRkZWQgdGhlICJDbGVhciIgbWV0aG9kIG9uIGEgbm9kZSB0byBkZWxldGUgYWxsIGl0cyBjaGlsZHJlbi4KCkNoYW5nZXMgaW4gdmVyc2lvbiAxLjIuMgotIEZpeGVkIFRpWG1sQXR0cmlidXRlOjpQcmV2aW91cyBhY3R1YWxseSByZXR1cm5pbmcgIm5leHQuIiBUaGFua3MKICB0byBSaWNrYXJkIFRyb2Vkc3NvbiBmb3IgdGhlIGJ1ZyBmaXguCgpDaGFuZ2VzIGluIHZlcnNpb24gMS4yLjMKLSBBZGRlZCB0aGUgVElYTUwgcHJlZml4IHRvIHRoZSBlcnJvciBzdHJpbmdzIHRvIHJlc29sdmUgY29uZmxpY3RzCiAgd2l0aCAjZGVmaW5lcyBpbiBPUyBoZWFkZXJzLiBUaGFua3MgdG8gU3RldmUgTGhvbW1lLgotIEZpeGVkIGEgZGVsZXRlIGJ1ZiB0aGF0IHNob3VsZCBiZSBhIGRlbGV0ZSBbXSBidWYuIAogIFRoYW5rcyB0byBFcGhpIFNpbm93aXR6LgoKQ2hhbmdlcyBpbiB2ZXJzaW9uIDEuMi40Ci0gUmVwbGFjZUNoaWxkKCkgd2FzIGFsbW9zdCBndWFyZW50ZWVkIHRvIGZhaWwuIFNob3VsZCBiZSBmaXhlZCwKICB0aGFua3MgdG8gSm9lIFNtaXRoLiBKb2UgYWxzbyBwb2ludGVkIG91dCB0aGF0IHRoZSBQcmludCgpIGZ1bmN0aW9ucwogIHNob3VsZCB0YWtlIHN0cmVhbSByZWZlcmVuY2VzOiBJIGFncmVlLCBhbmQgd291bGQgbGlrZSB0byBvdmVybG9hZAogIHRoZSBQcmludCgpIG1ldGhvZCB0byB0YWtlIGVpdGhlciBmb3JtYXQsIGJ1dCBJIGRvbid0IHdhbnQgdG8gZG8gCiAgdGhpcyBpbiBhIGRvdCByZWxlYXNlLgotIFNvbWUgY29tcGlsZXJzIHNlZW0gdG8gbmVlZCBhbiBleHRyYSA8Y3R5cGUuaD4gaW5jbHVkZS4gVGhhbmtzCiAgdG8gU3RldmUgTGhvbW1lIGZvciB0aGF0LgoKQ2hhbmdlcyBpbiB2ZXJzaW9uIDIuMC4wIEJFVEEKLSBNYWRlIHRoZSBUb1hYWCgpIGNhc3RzIHNhZmUgaWYgJ3RoaXMnIGlzIG51bGwuIAogIFdoZW4gIkxvYWRGaWxlIiBpcyBjYWxsZWQgd2l0aCBhIGZpbGVuYW1lLCB0aGUgdmFsdWUgd2lsbCBjb3JyZWN0bHkgZ2V0IHNldC4KICBUaGFua3MgdG8gQnJpYW4gWW9kZXIuCi0gRml4ZWQgYnVnIHdoZXJlIGlzYWxwaGEoKSBhbmQgaXNhbG51bSgpIHdvdWxkIGdldCBjYWxsZWQgd2l0aCBhIG5lZ2F0aXZlIHZhbHVlIGZvciAKICBoaWdoIGFzY2lpIG51bWJlcnMuIFRoYW5rcyB0byBBbGVza3kgQWtzZW5vdi4KLSBGaXhlZCBzb21lIGVycm9ycyBjb2RlcyB0aGF0IHdlcmUgbm90IGdldHRpbmcgc2V0LgotIE1hZGUgbWV0aG9kcyAiY29uc3QiIHRoYXQgd2VyZSBub3QuCi0gQWRkZWQgYSBzd2l0Y2ggdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGlnbm9yaW5nIG9mIHdoaXRlIHNwYWNlLiAoIFRpWG1sRG9jdW1lbnQ6OlNldElnbm9yZVdoaXRlU3BhY2UoKSApCi0gR3JlYXRlciBzdGFuZGFyZGl6YXRpb24gYW5kIGNvZGUgcmUtdXNlIGluIHRoZSBwYXJzZXIuCi0gQWRkZWQgYSBzdHJlYW0gb3V0IG9wZXJhdG9yLgotIEFkZGVkIGEgc3RyZWFtIGluIG9wZXJhdG9yLgotIEVudGl0eSBzdXBwb3J0LCBvZiBwcmVkZWZpbmVkIGVudGl0ZXMuICYjeCBlbnRpdGllcyBhcmUgdW50b3VjaGVkIGJ5IGlucHV0IG9yIG91dHB1dC4KLSBJbXByb3ZlZCB0ZXh0IG91dCBmb3JtYXR0aW5nLgotIEZpeGVkIFJlcGxhY2VDaGlsZCBidWcsIHRoYW5rcyB0byBUYW8gQ2hlbi4KCkNoYW5nZXMgaW4gdmVyc2lvbiAyLjAuMQotIEZpeGVkIGhhbmdpbmcgb24gbG9hZGluZyBhIDAgbGVuZ3RoIGZpbGUuIFRoYW5rcyB0byBKZWZmIFNjb3p6YWZhdmEuCi0gRml4ZWQgY3Jhc2hpbmcgb24gSW5zZXJ0QmVmb3JlQ2hpbGQgYW5kIEluc2VydEFmdGVyQ2hpbGQuIEFsc28gcG9zc2liaWxpdHkgb2YgYmFkIGxpbmtzIGJlaW5nCiAgY3JlYXRlZCBieSBzYW1lIGZ1bmN0aW9uLiBUaGFua3MgdG8gRnJhbmsgRGUgcHJpbnMuCi0gQWRkZWQgbWlzc2luZyBsaWNlbmNlIHRleHQuIFRoYW5rcyB0byBMYXJzIFdpbGxlbXNlbnMuCi0gQWRkZWQgPGN0eXBlLmg+IGluY2x1ZGUsIGF0IHRoZSBzdWdnZXN0aW9uIG9mIFN0ZXZlIFdhbHRlcnMuCgpDaGFuZ2VzIGluIHZlcnNpb24gMi4xLjAKLSBZdmVzIEJlcnF1aW4gYnJpbmdzIHVzIHRoZSBTVEwgc3dpdGNoLiBUaGUgZm9ydW0gb24gU291cmNlRm9yZ2UsIGFuZCB2YXJpb3VzIGVtYWlscyB0bwogIG1lLCBoYXZlIGxvbmcgZGViYXRlZCBhbGwgb3V0IFNUTCB2cy4gbm8gU1RMIGF0IGFsbC4gQW5kIG5vdyB5b3UgY2FuIGhhdmUgaXQgYm90aCB3YXlzLgogIFRpbnlYbWwgd2lsbCBjb21waWxlIGVpdGhlciB3YXkuCgpDaGFuZ2VzIGluIHZlcnNpb24gMi4xLjEKLSBDb21waWxhdGlvbiB3YXJuaW5ncy4KCkNoYW5nZXMgaW4gdmVyc2lvbiAyLjEuMgotIFVuZWVkZWQgY29kZSBpcyBub3QgY29tcGlsZWQgaW4gdGhlIFNUTCBjYXNlLgotIENoYW5nZWQgaGVhZGVycyBzbyB0aGF0IFNUTCBjYW4gYmUgdHVybmVkIG9uIG9yIG9mZiBpbiB0aW55eG1sLmgKCkNoYW5nZXMgaW4gdmVyc2lvbiAyLjEuMwotIEZpeGVkIG5vbi1jb25zdCByZWZlcmVuY2UgaW4gQVBJOyBub3cgdXNlcyBhIHBvaW50ZXIuCi0gQ29weSBjb25zdHJ1Y3RvciBvZiBUaVhtbFN0cmluZyBub3QgY2hlY2tpbmcgZm9yIGFzc2lnbm1lbnQgdG8gc2VsZi4KLSBOaW1yb2QgQ29oZW4gZm91bmQgYSB0cnVseSBldmlsIGJ1ZyBpbiB0aGUgU1RMIGltcGxlbWVudGF0aW9uIHRoYXQgb2NjdXJzCiAgd2hlbiBhIHN0cmluZyBpcyBjb252ZXJ0ZWQgdG8gYSBjX3N0ciBhbmQgdGhlbiBhc3NpZ25lZCB0byBzZWxmLiBTZWFyY2ggZm9yCiAgU1RMX1NUUklOR19CVUcgZm9yIGEgZnVsbCBkZXNjcmlwdGlvbi4gSSdtIGFzc2VydGluZyB0aGlzIGlzIGEgTWljcm9zb2Z0IFNUTAogIGJ1Zywgc2luY2UgJnN0cmluZyBhbmQgc3RyaW5nLmNfc3RyKCkgc2hvdWxkIG5ldmVyIGJlIHRoZSBzYW1lLiBOZXZlcnRoZWxlc3MsCiAgdGhlIGNvZGUgd29ya3MgYXJvdW5kIGl0LgotIFVyaXZhbiBTYWFpYiBwb2ludGVkIG91dCBhIGNvbXBpbGVyIGNvbmZsaWN0LCB3aGVyZSB0aGUgQyBoZWFkZXJzIGRlZmluZQogIHRoZSBpc2JsYW5rIG1hY3JvLCB3aGljaCB3YXMgd2lwaW5nIG91dCB0aGUgVGlYbWxTdHJpbmc6OmlzYmxhbmsoKSBtZXRob2QuCiAgVGhlIG1ldGhvZCB3YXMgdW51c2VkIGFuZCBoYXMgYmVlbiByZW1vdmVkLgoKQ2hhbmdlcyBpbiB2ZXJzaW9uIDIuMS40Ci0gUmV3b3JrZWQgdGhlIGVudGl0eSBjb2RlLiBFbnRpdGllcyB3ZXJlIG5vdCBjb3JyZWN0bHkgc3VydmluZyByb3VuZCB0cmlwIGlucHV0IGFuZCBvdXRwdXQuCiAgV2lsbCBub3cgYXV0b21hdGljYWxseSBjcmVhdGUgZW50aXRpZXMgZm9yIGhpZ2ggYXNjaWkgaW4gb3V0cHV0LgoKQ2hhbmdlcyBpbiB2ZXJzaW9uIDIuMS41Ci0gQnVnIGZpeCBieSBreWxvdGFuIDogaW5maW5pdGUgbG9vcCBvbiBzb21lIGlucHV0ICh0aW55eG1scGFyc2VyLmNwcCByZXYgMS4yNykKLSBDb250cmlidXRlZCBieSBJdmljYSBBcmFjaWMgKGJ5dGVsb3JkKSA6IDEgbmV3IFZDKysgcHJvamVjdCB0byBjb21waWxlIHZlcnNpb25zIGFzIHN0YXRpYyBsaWJyYXJpZXMgKHRpbnl4bWxfbGliLmRzcCksIAogIGFuZCBhbiBleGFtcGxlIHVzYWdlIGluIHhtbHRlc3QuZHNwCiAgKFBhdGNoIHJlcXVlc3QgSUQgNjc4NjA1KQotIEEgc3VnZ2VzdGlvbiBieSBSb25hbGQgRmVubmVyIEpyIChkb3JtbG9jaykgdG8gYWRkICNpbmNsdWRlIDxpc3RyZWFtPiBhbmQgPG9zdHJlYW0+IGZvciBBcHBsZSdzIFByb2plY3QgQnVpbGRlciAKICAoUGF0Y2ggcmVxdWVzdCBJRCA2OTc2NDIpCi0gQSBwYXRjaCBmcm9tIG9ob21tZXMgdGhhdCBhbGxvd3MgdG8gcGFyc2UgY29ycmVjdGx5IGRvdHMgaW4gZWxlbWVudCBuYW1lcyBhbmQgYXR0cmlidXRlIG5hbWVzCiAgKFBhdGNoIHJlcXVlc3QgNjAyNjAwIGFuZCBreWxvdGFuIDcwMTcyOCkKLSBBIHBhdGNoIGZyb20gIGhlcm1pdGdlZWsgKCBKYW1lcyApIGFuZCB3YXN0ZWxhbmQgZm9yIGltcHJvcGVyIGVycm9yIHJlcG9ydGluZwotIFJldmlld2VkIGJ5IExlZSwgd2l0aCB0aGUgZm9sbG93aW5nIGNoYW5nZXM6CgktIEdvdCBzaWNrIG9mIGZpZ2h0aW5nIHRoZSBTVEwvbm9uLVNUTCB0aGluZyBpbiB0aGUgd2luZG93cyBidWlsZC4gQnJva2UKCSAgdGhlbSBvdXQgYXMgc2VwZXJhdGUgcHJvamVjdHMuCgktIEkgaGF2ZSB0b28gbG9uZyBub3QgaW5jbHVkZWQgdGhlIGRzdy4gQWRkZWQuCgktIFRpbnlYbWxUZXh0IGhhZCBhIHByb3RlY3RlZCBQcmludC4gT2RkLgoJLSBNYWRlIExpbmtFbmRDaGlsZCBwdWJsaWMsIHdpdGggZG9jcyBhbmQgYXBwcm9wcmlhdGUgd2FybmluZ3MuCgktIFVwZGF0ZWQgdGhlIGRvY3MuCgoyLjIuMAotIEZpeGVkIGFuIHVuaW5pdGlhbGl6ZWQgcG9pbnRlciBpbiB0aGUgVGlYbWxBdHRyaWJ1dGVzCi0gRml4ZWQgU1RMIGNvbXBpbGF0aW9uIHByb2JsZW0gaW4gTWluR1cgKGFuZCBnY2MgMz8pIC0gdGhhbmtzIEJyaWFuIFlvZGVyIGZvciBmaW5kaW5nIHRoaXMgb25lCi0gRml4ZWQgYSBzeW50YXggZXJyb3IgaW4gVGlYbWxEZWNsYXJhdGlvbiAtIHRoYW5rcyBCcmlhbiBZb2RlcgotIEZsZXRjaGVyIER1bm4gcHJvcG9zZWQgYW5kIHN1Ym1pdHRlZCBuZXcgZXJyb3IgaGFuZGxpbmcgdGhhdCB0cmFja2VkIHRoZSByb3cgYW5kIGNvbHVtbi4gTGVlCiAgbW9kaWZpZWQgaXQgdG8gbm90IGhhdmUgcGVyZm9ybWFuY2UgaW1wYWN0LgotIEdlbmVyYWwgY2xlYW51cCBzdWdnZXN0aW9ucyBmcm9tIEZsZXRjaGVyIER1bm4uCi0gSW4gZXJyb3IgaGFuZGxpbmcsIGdlbmVyYWwgZXJyb3JzIHdpbGwgbm8gbG9uZ2VyIGNsZWFyIHRoZSBlcnJvciBzdGF0ZSBvZiBzcGVjaWZpYyBvbmVzLgotIEZpeCBlcnJvciBpbiBkb2N1bWVudGF0aW9uIDogY29tbWVudHMgc3RhcnRpbmcgd2l0aCAiPD8tLSIgaW5zdGVhZCBvZiAiPCEtLSIgKHRoYW5rcyBpb25fcHVsc2UpCi0gQWRkZWQgdGhlIFRpWG1sSGFuZGxlLiBBbiBlYXN5LCBzYWZlIHdheSB0byBicm93c2UgWE1MIERPTXMgd2l0aCBsZXNzIGNvZGUuCi0gQWRkZWQgUXVlcnlBdHRyaWJ1dGUgY2FsbHMgd2hpY2ggaGF2ZSBiZXR0ZXIgZXJyb3IgbWVzc2FnaW5nLiAoUHJvcG9zZWQgYnkgRmxldGNoZXIgRHVubikKLSBOb2RlcyBhbmQgYXR0cmlidXRlcyBjYW4gbm93IHByaW50IHRoZW1zZWx2ZXMgdG8gc3RyaW5ncy4gKFl2ZXMgc3VnZ2VzdGlvbikKLSBGaXhlZCBidWcgd2hlcmUgZW50aXRpZXMgd2l0aCBvbmUgY2hhcmFjdGVyIHdvdWxkIGNvbmZ1c2UgcGFyc2VyLiAoVGhhbmtzIFJvbWFuKQoKMi4yLjEKLSBBZGRpdGlvbmFsIHRlc3RpbmcgKG5vIG1vcmUgYnVncyBmb3VuZCB0byBiZSBmaXhlZCBpbiB0aGlzIHJlbGVhc2UpCi0gU2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgdG8gdGhlIGN1cnNvciBjb2RlLgoKMi4zLjAKLSBVc2VyIERhdGEgYXJlIG5vdyBkZWZpbmVkIGluIFRpWG1sQmFzZSBpbnN0ZWFkIG9mIFRpWG1sTm9kZQotIENoYXJhY3RlciBFbnRpdGllcyBhcmUgbm93IFVDUy0yCi0gQ2hhcmFjdGVyIEVudGl0aWVzIGNhbiBiZSBkZWNpbWFsIG9yIGhleGFkZWNpbWFsCi0gVVRGLTggY29udmVyc2lvbi4KLSBGaXhlZCBtYW55LCBtYW55IGJ1Z3MuCgoyLjMuMQotIEZpeGVkIGJ1ZyBpbiBoYW5kbGluZyBudWxscyBlbWJlZGRlZCBpbiB0aGUgaW5wdXQuCi0gTWFrZSBVVEYtOCBwYXJzZXIgdG9sZXJhbnQgb2YgYmFkIHRleHQgZW5jb2RpbmcuCi0gQWRkZWQgZW5jb2RpbmcgZGV0ZWN0aW9uLiAKLSBNYW55IGZpeGVzIGFuZCBpbnB1dCBmcm9tIEpvaG4tUGhpbGlwIExlb25hcmQgSm9oYW5zc29uIChKUCkgYW5kIEVsbGVycywgCiAgaW5jbHVkaW5nIFVURi04IGZlZWRiYWNrLCBidWcgcmVwb3J0cywgYW5kIHBhdGNoZXMuIFRoYW5rcyEKLSBBZGRlZCB2ZXJzaW9uICMgY29uc3RhbnRzIC0gYSBzdWdnZXN0aW9uIGZyb20gSlAgYW5kIEVsbGVycy4KLSBbIDk3OTE4MCBdIE1pc3NpbmcgOyBpbiBlbnRpdHkgcmVmZXJlbmNlLCBmaXggZnJvbSBSb2IgTGF2ZWF1eC4KLSBDb3B5IGNvbnN0cnVjdG9ycyBhbmQgYXNzaWdubWVudCBoYXZlIGJlZW4gYSBsb25nIHRpbWUgY29taW5nLiBUaGFua3MgdG8KICBGb2trZSBhbmQgSlAuCgoyLjMuMgotIE1hZGUgdGhlIElzQWxwaGEgYW5kIElzQWxwaGFOdW0gbXVjaCBtb3JlIHRvbGVyYW50IG9mIG5vbi1VVEYtOCBlbmNvZGluZ3MuIFRoYW5rcwogIFZvbGtlciBCb2VyY2hlcnMgZm9yIGZpbmRpbmcgdGhlIGlzc3VlLgotIFJhbiB0aGUgcHJvZ3JhbSB0aG91Z2ggdGhlIG1hZ25pZmljZW50IFZhbGdyaW5kIC0gaHR0cDovL3ZhbGdyaW5kLmtkZS5vcmcgLSB0byBjaGVjawogIGZvciBtZW1vcnkgZXJyb3JzLiBGaXhlZCBzb21lIG1pbm9yIGlzc3Vlcy4KCjIuMy4zCi0gRml4ZWQgY3Jhc2ggd2hlbiB0ZXN0IHByb2dyYW0gd2FzIHJ1biBmcm9tIGluY29ycmVjdCBkaXJlY3RvcnkuCi0gRml4ZWQgYnVnIDEwNzA3MTcgLSBlbXB0eSBkb2N1bWVudCBub3QgcmV0dXJuZWQgY29ycmVjdGx5IC0gdGhhbmtzIEthdHN1aGlzYSBZdWFzYS4KLSBCdWcgMTA3OTMwMSByZXNvbHZlZCAtIGRlcHJlY2F0ZWQgc3RkbGliIGNhbGxzLiBUaGFua3MgQWRyaWFuIEJvZWluZy4KLSBCdWcgMTAzNTIxOCBmaXhlZCAtIGRvY3VtZW50YXRpb24gZXJyb3JzLiBYdW5qaSBMdW8KLSBPdGhlciBidWcgZml4ZXMgaGF2ZSBhY2N1bXVsYXRlZCBhbmQgYmVlbiBmaXhlZCBvbiB0aGUgd2F5IGFzIHdlbGw7IG15IGFwb2xvZ2llcyB0bwogIGF1dGhvcnMgbm90IGNyZWRpdGVkIQotIEJpZyBmaXggLyBhZGRpdGlvbiBpcyB0byBjb3JyZWN0bHkgcmV0dXJuIGNvbnN0IHZhbHVlcy4gVGlueVhtbCBjb3VsZCBiYXNpY2FsbHkKICByZW1vdmUgY29uc3QgaW4gYSBtZXRob2QgbGlrZSB0aGlzOiBUaVhtbEVsZW1lbnQqIEZvbygpIGNvbnN0LCB3aGVyZSB0aGUgcmV0dXJuZWQgZWxlbWVudAogIHdhcyBhIHBvaW50ZXIgdG8gaW50ZXJuYWwgZGF0YS4gVGhhdCBpcyBub3c6IGNvbnN0IFRpWG1sRWxlbWVudCogRm9vKCkgY29uc3QgYW5kCiAgVGlYbWxFbGVtZW50KiBGb28oKS4KCjIuMy40Ci0gRml4ZWQgYWRkaXRpb25hbCBjb25zdCBlcnJvcnMsIHRoYW5rcyBLZW50IEdpYnNvbi4KLSBDb3JyZWN0bHkgcmUtZW5hYmxlIHdhcm5pbmdzIGFmdGVyIHRpbnl4bWwgaGVhZGVyLiBUaGFua3MgQ29yeSBOZWxzb24uCi0gVmFyaWV0eSBvZiB0eXBlIGNsZWFudXAgYW5kIHdhcm5pbmcgZml4ZXMuIFRoYW5rcyBXYXJyZW4gU3RldmVucy4KLSBDbGVhbmVkIHVwIHVubmVlZGVkIGNvbnN0cnVjdG9yIGNhbGxzIGluIFRpbnlTdHJpbmcgLSB0aGFua3MgdG8gR2VvZmYgQ2FybHRvbiBhbmQKICB0aGUgZGlzY3Vzc2lvbiBncm91cCBvbiBzb3VyY2Vmb3JnZS4KCjIuNC4wCi0gSW1wcm92ZWQgc3RyaW5nIGNsYXNzLCB0aGFua3MgVHlnZSBMb3ZzZXQgKHdob3NlIG5hbWUgZ2V0cyBtYW5nbGVkIGluIEVuZ2xpc2ggLSBzb3JyeSkKLSBUeXBlIGNhc3QgY29tcGlsZXIgd2FybmluZywgdGhhbmtzIFJvYiB2YW4gZGVuIEJvZ2FhcmQKLSBBZGRlZCBHZXRUZXh0KCkgY29udmVuaWVuY2UgZnVuY3Rpb24uIFRoYW5rcyBJbHlhIFBhcm5pdWsgJiBBbmRyZXcgRWxsZXJzIGZvciBpbnB1dC4KLSBNYW55IHRoYW5rcyB0byBtYXJsb25pc20gZm9yIGZpbmRpbmcgYW4gaW5maW5pdGUgbG9vcCBpbiBiYWQgeG1sLgotIEEgcGF0Y2ggdG8gY2xlYW51cCB3YXJuaW5ncyBmcm9tIFJvYmVydCBHZWJpcy4KLSBBZGRlZCBWYWx1ZVN0cigpIHRvIGdldCB0aGUgdmFsdWUgb2YgYSBub2RlIGFzIGEgc3RyaW5nLgotIFRpWG1sVGV4dCBjYW4gbm93IHBhcnNlIGFuZCBvdXRwdXQgYXMgQ0RBVEEKLSBBZGRpdGlvbmFsIHN0cmluZyBpbXByb3ZlbWVudCBmcm9tIEphbWVzICh6Mjg5NSkKLSBSZW1vdmVkIGV4dHJhbmVvdXMgJ2NvbnN0JywgdGhhbmtzIERhdmlkIEFsZHJpY2gKLSBGaXJzdCBwYXNzIGF0IHN3aXRjaGluZyB0byB0aGUgInNhZmUiIHN0ZGxpYiBmdW5jdGlvbnMuIE1hbnkgcGVvcGxlIGhhdmUgc3VnZ2VzdGVkIGFuZAogIHB1c2hlZCBvbiB0aGlzLCBidXQgV2FycmVuIFN0ZXZlbnMgcHV0IHRvZ2V0aGVyIHRoZSBmaXJzdCBwcm9wb3NhbC4KLSBUaW55WG1sIG5vdyB3aWxsIGRvIEVPTCBub3JtYWxpemF0aW9uIGJlZm9yZSBwYXJzaW5nLCBjb25zaXN0ZW50IHdpdGggdGhlIFczQyBYTUwgc3BlYy4KLSBEb2N1bWVudHMgbG9hZGVkIHdpdGggdGhlIFVURi04IEJPTSB3aWxsIG5vdyBzYXZlIHdpdGggdGhlIFVURi04IEJPTS4gR29vZCBzdWdnZXN0aW9uIAogIGZyb20gJ2luc3RydWN0b3JfJwotIEVsbGVycyBzdWJtaXR0ZWQgaGlzIHZlcnkgcG9wdWxhciB0dXRvcmlhbHMsIHdoaWNoIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgZGlzdHJpYnV0aW9uLgoKMi40LjEKLSBGaXhlZCBDREFUQSBvdXRwdXQgZm9ybWF0dGluZwotIEZpeGVkIG1lbW9yeSBhbGxvY2F0b3JzIGluIFRpbnlTdHJpbmcgdG8gd29yayB3aXRoIG92ZXJsb2FkZWQgbmV3L2RlbGV0ZQoKMi40LjIKLSBzb2xvc25ha2UgcG9pbnRlZCBvdXQgdGhhdCBUSVhNTF9MT0cgY2F1c2VzIHByb2JsZW1zIG9uIGFuIFhCT1guIFRoZSBkZWZpbml0aW9uIGluIHRoZSBoZWFkZXIKICB3YXMgc3VwZXJmbG91cyBhbmQgd2FzIG1vdmVkIGluc2lkZSBvZiBERUJVR19QQVJTSU5HCgoyLjQuMwotIEZpeGVkIGEgdGVzdCBidWcgdGhhdCBjYXVzZWQgYSBjcmFzaCBpbiAneG1sdGVzdCcuIFRpbnlYTUwgd2FzIGZpbmUsIGJ1dCBpdCBpc24ndCBnb29kCiAgdG8gc2hpcCB3aXRoIGEgYnJva2VuIHRlc3Qgc3VpdGUuCi0gU3RhcnRlZCBjb252ZXJ0aW5nIHNvbWUgZnVuY3Rpb25zIHRvIG5vdCBjYXN0IGJldHdlZW4gc3RkOjpzdHJpbmcgYW5kIGNvbnN0IGNoYXIqIAogIHF1aXRlIGFzIG9mdGVuLgotIEFkZGVkIEZJTEUqIHZlcnNpb25zIG9mIHRoZSBkb2N1bWVudCBsb2FkcyAtIGdvb2Qgc3VnZ2VzdGlvbiBmcm9tIFdhZGUgQnJhaW5lcmQKLSBFbXB0eSBkb2N1bWVudHMgbWlnaHQgbm90IGFsd2F5cyByZXR1cm4gdGhlIGVycm9ycyB0aGV5IHNob3VsZC4gWzEzOTg5MTVdIFRoYW5rcyB0byBpZ29yIHYuCi0gQWRkZWQgc29tZSBhc3NlcnRzIGZvciBtdWx0aXBseSBhZGRpbmcgYSBub2RlLCByZWdhcmRuZyBidWcgWzEzOTE5MzddIHN1Z2dlc3RlZCBieSBQYWNvIEFyam9uaWxsYS4KCjIuNC40Ci0gQnVnIGZpbmQgdGhhbmtzIHRvIGFuZHJlLWdyb3NzIGZvdW5kIGEgbWVtb3J5IGxlYWsgdGhhdCBvY2N1cmVkIHdoZW4gYSBkb2N1bWVudCBmYWlsZWQgdG8gbG9hZC4KLSBCdWcgZmluZCAoYW5kIGdvb2QgYW5hbHlzaXMpIGJ5IFZpcnR1YWxKaW0gd2hvIGZvdW5kIGEgY2FzZSB3aGVyZSBhdHRyaWJ1dGUgcGFyc2luZyAKICBzaG91bGQgYmUgdGhyb3dpbmcgYW4gZXJyb3IgYW5kIHdhc24ndC4KLSBTdGV2ZSBIeWF0dCBzdWdnZXN0ZWQgdGhlIFF1ZXJ5VmFsdWVBdHRyaWJ1dGUgbWV0aG9kLCB3aGljaCBpcyBub3cgaW1wbGVtZW50ZWQuCi0gRGF2aWRBIGlkZW50aWZpZWQgYSBjaHVuayBvZiBkZWFkIGNvZGUuCi0gQW5kcmV3IEJheHRlciBzZW50IGluIHNvbWUgY29tcGlsZXIgd2FybmluZ3MgdGhhdCB3ZXJlIGdvb2QgY2xlYW4gdXAgcG9pbnRzLgoKMi41Ci0gQWRkZWQgdGhlIFZpc2l0KCkgQVBJLiBNYW55IHRoYW5rcyB0byBib3RoIEFuZHJldyBFbGxlcnRvbiBhbmQgSm9obi1QaGlsaXAgZm9yIGFsbCB0aGVpcgogIHdvcmssIGNvZGUsIHN1Z2dlc3Rpb24sIGFuZCBqdXN0IGdlbmVyYWwgcHVzaGluZyB0aGF0IGl0IHNob3VsZCBiZSBkb25lLgotIFJlbW92ZWQgZXhpc3Rpbmcgc3RyZWFtaW5nIGNvZGUgYW5kIHVzZSBUaVhtbFByaW50ZXIgaW5zdGVhZC4KLSBbIHRpbnl4bWwtQnVncy0xNTI3MDc5IF0gQ29tcGlsZSBlcnJvciBpbiB0aW55c3RyLmNwcCBmaXhlZCwgdGhhbmtzIHRvIFBhdWwgU3VnZ3MKLSBbIHRpbnl4bWwtQnVncy0xNTIyODkwIF0gU2F2ZUZpbGUgaGFzIG5vIGVycm9yIGNoZWNrcyBmaXhlZCwgdGhhbmtzIHRvIEl2YW4gRG9icm9rb3RvdgotIEl2YW4gRG9icm9rb3RvdiBhbHNvIHJlcG9ydGVkIHJlZHVuZGFudCBtZW1vcnkgYWxsb2NhdGlvbiBpbiB0aGUgQXR0cmlidXRlKCkgbWV0aG9kLCB3aGljaAogIHVwb24gaW52ZXN0aWdhdGlvbiB3YXMgYSBtZXNzLiBUaGUgYXR0cmlidXRlIHNob3VsZCBub3cgYmUgZml4ZWQgZm9yIGJvdGggY29uc3QgY2hhciogYW5kIAogIHN0ZDo6c3RyaW5nLCBhbmQgdGhlIHJldHVybiB0eXBlcyBtYXRjaCB0aGUgaW5wdXQgcGFyYW1ldGVycy4KLSBGZWF0dXJlIFsgMTUxMTEwNSBdIE1ha2UgVGlYbWxDb21tZW50IGNvbnN0cnVjdG9yIGFjY2VwdCBhIHN0cmluZyAvIGNoYXIqLCBpbXBsZW1lbnRlZC4KICBUaGFua3MgdG8gS2FybCBJdHNjaGVuIGZvciB0aGUgZmVlZGJhY2suCi0gWyAxNDgwMTA4IF0gU3RyZWFtIHBhcnNpbmcgZmFpbHMgd2hlbiBDREFUQSBjb250YWlucyB0YWdzIHdhcyBmb3VuZCBieSBUb2JpYXMgR3JpbW0sIHdobyBhbHNvCiAgc3VibWl0dGVkIGEgdGVzdCBjYXNlIGFuZCBwYXRjaC4gQSBzaWduaWZpY2FudCBidWcgaW4gQ0RBVEEgc3RyZWFtaW5nIChvcGVyYXRvcj4+KSBoYXMgbm93CiAgYmVlbiBmaXhlZC4KCjIuNS4yCi0gTGlldmVuLCBhbmQgb3RoZXJzLCBwb2ludGVkIG91dCBhIG1pc3NpbmcgY29uc3QtY2FzdCB0aGF0IHVwc2V0IHRoZSBPcGVuIFdhdGNvbSBjb21waWxlci4KICBTaG91bGQgbm93IGJlIGZpeGVkLgotIEVycm9yUm93IGFuZCBFcnJvckNvbCBzaG91bGQgaGF2ZSBiZWVuIGNvbnN0LCBhbmQgd2VyZW4ndC4gRml4ZWQgdGhhbmtzIHRvIERtaXRyeSBQb2x1dG92LgoKMi41LjMKLSB6bG9lX3psbyBpZGVudGlmaWVkIGEgbWlzc2luZyBzdHJpbmcgc3BlY2lhbGl6YXRpb24gZm9yIFF1ZXJ5VmFsdWVBdHRyaWJ1dGUoKSBbIDE2OTU0MjkgXS4gV29ya2VkCiAgb24gdGhpcyBidWcsIGJ1dCBub3Qgc3VyZSBob3cgdG8gZml4IGl0IGluIGEgc2FmZSwgY3Jvc3MtY29tcGlsZXIgd2F5LgotIGluY3JlYXNlZCB3YXJuaW5nIGxldmVsIHRvIDQgYW5kIHR1cm5lZCBvbiBkZXRlY3QgNjQgYml0IHBvcnRhYmlsaXR5IGlzc3VlcyBmb3IgVkMyMDA1LgogIE1heSBhZGRyZXNzIFsgMTY3NzczNyBdIFZTMjAwNTogL1dwNjQgd2FybmluZ3MKLSBncm9zaGVjayBpZGVudGlmaWVkIHNldmVyYWwgcHJvYmxlbXMgd2l0aCB0aGUgRG9jdW1lbnQgY29weS4gTWFueSB0aGFua3MgZm9yIFsgMTY2MDM2NyBdCi0gTmljZSBjYXRjaCwgYW5kIHN1Z2dlc3RlZCBmaXgsIGJlIEdpbGFkIE5vdmlrIG9uIHRoZSBQcmludGVyIGRyb3BwaW5nIGVudGl0aWVzLgogICJbIDE2MDA2NTAgXSBCdWcgd2hlbiBwcmludGluZyB4bWwgdGV4dCIgaXMgbm93IGZpeGVkLgotIEEgc3VidGxlIGZpeCBmcm9tIE5pY29zIEdvbGxhbiBpbiB0aGUgdGlueXN0cmluZyBpbml0aWFsaXplcjogCiAgWyAxNTgxNDQ5IF0gRml4IGluaXRpYWxpc2VyIG9mIFRpWG1sU3RyaW5nOjpudWxscmVwXwotIEdyZWF0IGNhdGNoLCBhbHRob3VnaCB0aGVyZSBpc24ndCBhIHN1Ym1pdHRlciBmb3IgdGhlIGJ1Zy4gWyAxNDc1MjAxIF0gVGlueVhNTCBwYXJzZXMgZW50aXRpZXMgaW4gY29tbWVudHMuIAogIENvbW1lbnRzIHNob3VsZCBub3QsIGluIGZhY3QsIHBhcnNlIGVudGl0aWVzLiBGaXhlZCB0aGUgY29kZSBwYXRoIGFuZCBhZGRlZCB0ZXN0cy4KLSBXZSB3ZXJlIG5vdCBjYXRjaGluZyBhbGwgdGhlIHJldHVybnMgZnJvbSBmdGVsbC4gVGhhbmtzIHRvIEJlcm5hcmQgZm9yIGNhdGNoaW5nIHRoYXQuCiAgCjIuNS40Ci0gQSBUaVhNTERvY3VtZW50IGNhbid0IGJlIGEgc3ViLW5vZGUuIEJsb2NrIHRoaXMgZnJvbSBoYXBwZW5pbmcgaW4gdGhlICdyZXBsYWNlJy4gVGhhbmtzIE5vYW0uCi0gWyAxNzE0ODMxIF0gVGlYbWxCYXNlOjpsb2NhdGlvbiBpcyBub3QgY29waWVkIGJ5IGNvcHktY3RvcnMsIGZpeCByZXBvcnRlZCBhbmQgc3VnZ2VzdGVkIGJ5IE5pY29sYSBDaXZyYW4uCi0gRml4ZWQgcG9zc2libGUgbWVtb3J5IG92ZXJydW4gaW4gdGhlIGNvbW1lbnQgcmVhZGluZyBjb2RlIC0gdGhhbmtzIGdjYXJsdG9uNzcKCjIuNS41Ci0gQWxleCB2YW4gZGVyIFdhbCBzcG90dGVkIGluY29ycmVjdCB0eXBlcyAobGYpIGJlaW5nIHVzZWQgaW4gcHJpbnQgYW5kIHNjYW4uIHJvYmVydG5lc3RvciBwb2ludGVkIG91dCBzb21lIHByb2JsZW1zIHdpdGggdGhlIHNpbXBsZSBzb2x1dGlvbi4gVHlwZXMgdXBkYXRlZC4KLSBKb2hhbm5lcyBIaWxsZXJ0IHBvaW50ZWQgb3V0IHNvbWUgYnVnIHR5cG9zLgotIENocmlzdGlhbiBNdWVsbGVyIGlkZW50aWZpZWQgaW5jb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nIHdpdGggQXR0cmlidXRlcy4KLSBvbGl2aWVyIGJhcnRoZWxlbXkgYWxzbyByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBkb3VibGUgdHJ1bmNhdGlvbiwgYWxzbyByZWxhdGVkIHRvIHRoZSAlbGYgaXNzdWUuCi0gemFlbHNpdXMgY2FtZSB1cCB3aXRoIGEgZ3JlYXQgKGFuZCBzaW1wbGUpIHN1Z2dlc3Rpb24gdG8gZml4IFF1ZXJ5VmFsdWVBdHRyaWJ1dGUgdHJ1bmNhdGluZyBzdHJpbmdzLgotIGFkZGVkIHNvbWUgbnVsbCBwb2ludGVyIGNoZWNrcyBzdWdnZXN0ZWQgYnkgaGFuc2VuawotIFNhbWkgVuRpc+RuZW4gZm91bmQgYSAocmFyZSkgYnVmZmVyIG92ZXJydW4gdGhhdCBjb3VsZCBvY2N1ciBpbiBwYXJzaW5nLgotIHZpIHRyaSBmaWxlZCBhIGJ1ZyB0aGF0IGxlZCB0byBhIHJlZmFjdG9yaW5nIG9mIHRoZSBhdHRyaWJ1dGUgc2V0dGluZyBtZXNzIChhcyB3ZWxsIGFzIGFkZGluZyBhIG1pc3NpbmcgU2V0RG91YmxlQXR0cmlidXRlKCkgKQotIHJlbW92ZWQgVElYTUxfRVJST1JfT1VUX09GX01FTU9SWS4gVGlueVhNTCBkb2VzIG5vdCBzeXN0ZW1hdGljYWxseSBhZGRyZXNzIE9PTywgYW5kIHRoZSBub3Rpb24gaXQgZG9lcyBpcyBtaXNsZWFkaW5nLgotIHZhbm5ldG8sIGtlaXRobWFyc2hhbGwsIG90aGVycyBhbGwgcmVwb3J0ZWQgdGhlIHdhcm5pbmcgZnJvbSBJc1doaXRlU3BhY2UoKSB1c2FnZS4gQ2xlYW5lZCB0aGlzIHVwIC0gbWFueSB0aGFua3MgdG8gZXZlcnlvbmUgd2hvIHJlcG9ydGVkIHRoaXMgb25lLgotIHRpYnVyIGZvdW5kIGEgYnVnIGluIGVuZCB0YWcgcGFyc2luZwoKCjIuNi4yCi0gU3dpdGNoZWQgb3ZlciB0byBWQyAyMDEwCi0gRml4ZWQgdXAgYWxsIHRoZSBidWlsZCBpc3N1ZXMgYXJpc2luZyBmcm9tIHRoYXQuIChMb3RzIG9mIGxhdGVudCBidWlsZCBwcm9ibGVtcy4pCi0gUmVtb3ZlZCB0aGUgb2xkLCBub3cgdW5tYWludGFpbmVkIGFuZCBsaWtlbHkgbm90IHdvcmtpbmcsIGJ1aWxkIGZpbGVzLgotIEZpeGVkIHNvbWUgc3RhdGljIGFuYWx5c2lzIGlzc3VlcyByZXBvcnRlZCBieSBvcmJpdGNvd2JveSBmcm9tIGNwcGNoZWNrLiAKLSBCYXlhcmQgOTUgc2VudCBpbiBhbmFseXNpcyBmcm9tIGEgZGlmZmVyZW50IGFuYWx5emVyIC0gZml4ZXMgYXBwbGllZCBmcm9tIHRoYXQgYXMgd2VsbC4KLSBUaW0gS29zc2Ugc2VudCBhIHBhdGNoIGZpeGluZyBhbiBpbmZpbml0ZSBsb29wLgotIE1hIEFuZ3VvIGlkZW50aWZpZWQgYSBkb2MgaXNzdWUuCi0gRWRkaWUgQ29oZW4gaWRlbnRpZmllZCBhIG1pc3NpbmcgcXVhbGlmaWVyIHJlc3VsdGluZyBpbiBhIGNvbXBpbGF0aW9uIGVycm9yIG9uIHNvbWUgc3lzdGVtcy4KLSBGaXhlZCBhIGxpbmUgZW5kaW5nIGJ1Zy4gKFdoYXQgeWVhciBpcyB0aGlzPyBDYW4gd2UgYWxsIGFncmVlIG9uIGEgZm9ybWF0IGZvciB0ZXh0IGZpbGVzPyBQbGVhc2U/IC4uLm9oIHdlbGwuKQoK