VGhpcyBpcyB0aGUgVk1TIHZlcnNpb24gb2YgR05VIE1ha2UsIHVwZGF0ZWQgYnkgSGFydG11dCBCZWNrZXIKCkNoYW5nZXMgYXJlIGJhc2VkIG9uIEdOVSBtYWtlIDMuODAuIExhdGVzdCBjaGFuZ2VzIGFyZSBmb3IgT3BlblZNUy9JNjQKYW5kIG5ldyBWTVMgQ1JUTHMuCgpUaGlzIHZlcnNpb24gd2FzIHRlc3RlZCBvbiBPcGVuVk1TL0k2NCBWOC4yIChmaWVsZCB0ZXN0KSB3aXRoIGhwIEMKWDcuMS0wMjQgT3BlblZNUy9BbHBoYSBWNy4zLTIgd2l0aCBDb21wYXEgQyBWNi41LTAwMSBhbmQgT3BlblZNUy9WQVggNy4xCndpdGggQ29tcGFxIEMgVjYuMi0wMDMgVGhlcmUgYXJlIHN0aWxsIHNvbWUgd2FybmluZyBhbmQgaW5mb3JtYXRpb25hbAptZXNzYWdlIGlzc3VlZCBieSB0aGUgY29tcGlsZXJzLgoKQnVpbGQgaW5zdHJ1Y3Rpb25zCk1ha2UgYSAxc3QgdmVyc2lvbgogICAgICAgJCBAbWFrZWZpbGUuY29tCiAgICAgICAkIHJlbmEgbWFrZS5leGUgMXN0LW1ha2UuZXhlClVzZSB0aGUgMXN0IHZlcnNpb24gdG8gZ2VuZXJhdGUgYSAybmQgdmVyc2lvbgogICAgICAgJCBtYyBzeXMkZGlzazpbXTFzdC1tYWtlIGNsZWFuCiAgICAgICAkIG1jIHN5cyRkaXNrOltdMXN0LW1ha2UKVmVyaWZ5IHlvdXIgMm5kIHZlcnNpb24KICAgICAgICQgcmVuYSBtYWtlLmV4ZSAybmQtbWFrZS5leGUKICAgICAgICQgbWMgc3lzJGRpc2s6W10ybmQtbWFrZSBjbGVhbgogICAgICAgJCBtYyBzeXMkZGlzazpbXTJuZC1tYWtlCgpDaGFuZ2VzOgoKLiBJbiBkZWZhdWx0LmMgZGVmaW5lIHZhcmlhYmxlIEFSQ0ggYXMgSUE2NCBmb3IgVk1TIG9uIEl0YW5pdW0gc3lzdGVtcy4KCi4gSW4gbWFrZWZpbGUudm1zIGF2b2lkIG5hbWUgY29sbGlzaW9uIGZvciBnbG9iIGFuZCBnbG9iZnJlZS4KCkluIG5ld2VyIHZlcnNpb24gb2YgdGhlIFZNUyBDUlRMIHRoZXJlIGFyZSBnbG9iIGFuZCBnbG9iZnJlZSBpbXBsZW1lbnRlZC4KQ29tcGlsaW5nIGFuZCBsaW5raW5nIG1heSByZXN1bHQgaW4KCiAgJUlMSU5LLVctTVVMREVGTE5LRywgc3ltYm9sIERFQ0MkR0xPQkZSRUUgaGFzIHN1YnNlcXVlbnQgbGlua2FnZSBkZWZpbml0aW9uCiAgICAgICBpbiBtb2R1bGUgREVDQyRTSFIgZmlsZSBTWVMkQ09NTU9OOltTWVNMSUJdREVDQyRTSFIuRVhFOzEKICAlSUxJTkstVy1NVUxERUYsIHN5bWJvbCBERUNDJEdMT0JGUkVFIG11bHRpcGx5IGRlZmluZWQKICAgICAgIGluIG1vZHVsZSBERUNDJFNIUiBmaWxlIFNZUyRDT01NT046W1NZU0xJQl1ERUNDJFNIUi5FWEU7MQoKbGlua2VyIG1lc3NhZ2VzIChhbmQgc2ltaWxhciBmb3IgREVDQyRHTE9CKS4gVGhlIG1lc3NhZ2VzIGp1c3Qgc2F5LCB0aGF0Cmdsb2JmcmVlIGlzIGEga25vd24gQ1JUTCB3aG9zZSBuYW1lIHdhcyBtYXBwZWQgYnkgdGhlIGNvbXBpbGVyIHRvCkRFQ0MkR0xPQkZSRUUuICBUaGlzIGlzIGRvbmUgaW4gZ2xvYi5jIGFzIHdlbGwsIHNvIHRoaXMgbmFtZSBpcyBkZWZpbmVkCnR3aWNlLiBPbmUgcG9zc2libGUgc29sdXRpb24gaXMgdG8gdXNlIHRoZSBWTVMgdmVyc2lvbnMgb2YgZ2xvYiBhbmQKZ2xvYmZyZWUuIEhvd2V2ZXIsIHRoZW4gdGhlIGJ1aWxkIGVudmlyb25tZW50IG5lZWRzIHRvIGZpZ3VyZSBvdXQgaWYKdGhlcmUgaXMgYSBuZXcgQ1JUTCBzdXBwb3J0aW5nIHRoZXNlIG9yIG5vdC4gVGhpcyBhZGRzIGNvbXBsZXhpdHkuIEV2ZW4KbW9yZSwgdGhlc2UgZnVuY3Rpb25zIHJldHVybiBWTVMgZmlsZSBzcGVjaWZpY2F0aW9ucywgd2hpY2ggaXMgbm90CmV4cGVjdGVkIGJ5IHRoZSBvdGhlciBtYWtlIHNvdXJjZXMuIFRoZXJlIGlzIGEgc3dpdGNoIGF0IHJ1biB0aW1lIChhIFZNUwpsb2dpY2FsIERFQ0MkR0xPQl9VTklYX1NUWUxFKSwgd2hpY2ggY2FuIGJlIHNldCB0byBnZXQgVW5peCBzdHlsZQpuYW1lcy4gVGhpcyBtYXkgY29uZmxpY3Qgd2l0aCBvdGhlciBzb2Z0d2FyZS4gVGhlIHJlY29tbWVuZGVkIHNvbHV0aW9uCmZvciB0aGlzIGlzIHRvIHNldCB0aGlzIHN3aXRjaCBqdXN0IHByaW9yIHRvIGNhbGxpbmcgbWFpbjogaW4gYW4KaW5pdGlhbGl6YXRpb24gcm91dGluZS4gVGhpcyBhZGRzIG1vcmUgY29tcGxleGl0eSBhbmQgbW9yZSBWTVMgc3BlY2lmaWMKY29kZS4gSXQgaXMgZWFzaWVyIHRvIHRlbGwgdGhlIGNvbXBpbGVyIE5PVCB0byBtYXAgdGhlIHJvdXRpbmUgbmFtZXMKd2l0aCBhIHNpbXBsZSBjaGFuZ2UgaW4gbWFrZWZpbGUudm1zLgoKU29tZSBub3RlcyBvbiBjYXNlIHNlbnNpdGl2ZSBuYW1lcyBpbiBydWxlcyBhbmQgb24gdGhlIGRpc2suIEluIHRoZSBWTVMKdGVtcGxhdGUgZm9yIENPTkZJRy5IIGNhc2Ugc2Vuc2l0aXZlIHJ1bGVzIGNhbiBiZSBlbmFibGVkIHdpdGggZGVmaW5pbmcKV0FOVF9DQVNFX1NFTlNJVElWRV9UQVJHRVRTLiBGb3IgcmVjZW50IHZlcnNpb24gb2YgVk1TIHRoZXJlIGlzIGEgY2FzZQpzZW5zaXRpdmUgZmlsZSBzeXN0ZW06IE9EUzUuIFRvIG1ha2UgdXNlIG9mIHRoYXQsIGFkZGl0aW9uYWxseSB1bi1kZWZpbmluZwp0aGUgSEFWRV9DQVNFX0lOU0VOU0lUSVZFX0ZTIGlzIHJlcXVpcmVkLiBBcyB0aGVzZSBhcmUgQyBtYWNyb3MsIGRpZmZlcmVudAp2ZXJzaW9ucyBvZiBtYWtlIG5lZWQgdG8gYmUgYnVpbHQgdG8gaGF2ZSBhbnkgY2FzZSBzZW5zaXRpdml0eSBmb3IgVk1TCndvcmtpbmcuIFVuZm9ydHVuYXRlbHksIGZvciBPRFM1IGRpc2tzIHRoYXQncyBub3QgYWxsLgoKLSBVc3VhbGx5IERDTCB1cGNhc2VzIGNvbW1hbmQgbGluZSB0b2tlbnMgKGV4Y2VwdCBzdHJpbmdzKSBhbmQgdXN1YWxseSB0aGUKICBmaWxlIHN5c3RlbSBpcyBjYXNlIGJsaW5kIChzaW1pbGFyIHRvIGhvdyBXaW5kb3dzIHN5c3RlbXMgd29yaykKCSQgc2V0IHByb2MvcGFyc2U9ZXh0ZW5kZWQvY2FzZT1zZW5zaXRpdmUKICBwcmVzZXJ2ZXMgbG93ZXIgYW5kIFVQUEVSIG9uIHRoZSBjb21tYW5kIGxpbmUgYW5kIChmb3IgdGhpcyBwcm9jZXNzIGFuZCBhbGwKICBzdWItcHJvY2Vzc2VzKSBlbmFibGVzIGNhc2Ugc2Vuc2l0aXZpdHkgaW4gdGhlIGZpbGUgc3lzdGVtCgotIFVzdWFsbHkgdGhlIENSVEwgdHJpZXMgdG8gcmV2ZXJzZSB3aGF0IERDTCBkaWQgd2l0aCBjb21tYW5kIGxpbmUgdG9rZW5zLCBpdAogIGxvd2VyY2FzZXMgYWxsIHRva2VucyAoZXhjZXB0IHN0cmluZ3MpCgkkIGRlZmluZSBERUNDJEFSR1ZfUEFSU0VfU1RZTEUgZW5hYmxlCiAgcGFzc2VzICh0aGUgbm93IHByZXNlcnZlZCkgbG93ZXIgYW5kIFVQUEVSIGZyb20gdGhlIGNvbW1hbmQgbGluZSB0byBtYWluKCkKCi0gVXN1YWxseSB0aGUgQ1JUTCB1cGNhc2VzIHRoZSBhcmd1bWVudHMgdG8gb3BlbigpIGFuZCBmcmllbmRzCgkkIGRlZmluZSBERUNDJEVGU19DQVNFX1BSRVNFUlZFIGVuYWJsZQogIHByZXNlcnZlcyB0aGUgbmFtZXMgYXMgaXMuCgpJdCBpcyBpbXBvcnRhbnQgdG8ga25vdyB0aGF0IG5vdCBhbGwgVk1TIHRvb2xzIGFyZSByZWFkeSBmb3IgY2FzZSBzZW5zaXRpdml0eS4KV2l0aCB0aGlzIHNldHVwIHNvbWUgdG9vbHMgbWF5IG5vdCB3b3JrIGFzIGV4cGVjdGVkLiBUaGUgc2V0dXAgc2hvdWxkIG5vdApibGluZGx5IGJlIGFwcGxpZWQgZm9yIGFsbCB1c2VycyBpbiBkZWZhdWx0IGxvZ2luIHByb2NlZHVyZXMuCgpFeGFtcGxlPyBUaGUgcG9vciBjb2RpbmcgZ2l2ZXMgYSBjb21waWxlciBtZXNzYWdlLCBzaG93aW5nIHRoYXQgdGhlcmUgYXJlCmRpZmZlcmVudCBmaWxlczoKCiQgZGlyCgpEaXJlY3RvcnkgT0RTNURJU0tbSEJdCgpBLmM7MSAgICAgICAgICAgICAgIEIuYzsxICAgICAgICAgICAgICAgYy5jOzEgICAgICAgICAgICAgICBYLmM7MQp4LmM7MQoKVG90YWwgb2YgNSBmaWxlcy4KJCBvZHM1bWFrZSB4Lm9iagpjYyAgICAvb2JqPXgub2JqIHguYwoKZm9vKCl7bG93ZXJjYXNlX3goKTt9Ci4uLi4uLl4KJUNDLUktSU1QTElDSVRGVU5DLCBJbiB0aGlzIHN0YXRlbWVudCwgdGhlIGlkZW50aWZpZXIgImxvd2VyY2FzZV94IiBpcyBpbXBsaWNpdGx5IGRlY2xhcmVkIGFzIGEgZnVuY3Rpb24uCmF0IGxpbmUgbnVtYmVyIDEgaW4gZmlsZSBPRFM1RElTS1tIQl14LmM7MQokIG1jIFNZUyRTWVNERVZJQ0U6W0hBUlRNVVQuTUFLRV8zXzgwUF1vZHM1bWFrZSBYLm9iagpjYyAgICAvb2JqPVgub2JqIFguYwoKZm9vKCkge1VQUEVSQ0FTRV9YKCk7fQouLi4uLi4uXgolQ0MtSS1JTVBMSUNJVEZVTkMsIEluIHRoaXMgc3RhdGVtZW50LCB0aGUgaWRlbnRpZmllciAiVVBQRVJDQVNFX1giIGlzIGltcGxpY2l0bHkgZGVjbGFyZWQgYXMgYSBmdW5jdGlvbi4KYXQgbGluZSBudW1iZXIgMSBpbiBmaWxlIE9EUzVESVNLW0hCXVguYzsxCiQgZGlyCgpEaXJlY3RvcnkgT0RTNURJU0tbSEJdCgpBLmM7MSAgICAgICAgICAgICAgIEIuYzsxICAgICAgICAgICAgICAgYy5jOzEgICAgICAgICAgICAgICBYLmM7MQp4LmM7MSAgICAgICAgICAgICAgIFgub2JqOzEgICAgICAgICAgICAgeC5vYmo7MQoKVG90YWwgb2YgNyBmaWxlcy4KJAoMClRoaXMgaXMgdGhlIFZNUyBwb3J0IG9mIEdOVSBNYWtlIGRvbmUgYnkgSGFydG11dC5CZWNrZXJAY29tcGFxLmNvbS4KCkl0IGlzIGJhc2VkIG9uIHRoZSBzcGVjaWZpYyB2ZXJzaW9uIDMuNzdrIGFuZCBvbiAzLjc4LjEuIDMuNzdrIHdhcyBkb25lCmJ5IEtsYXVzIEvkbXBmIDxra2FlbXBmQHJtaS5kZT4sIHRoZSBjb2RlIHdhcyBiYXNlZCBvbiB0aGUgVk1TIHBvcnQgb2YKR05VIE1ha2UgMy42MCBieSBNaWtlIE1vcmV0dGkuCgpJdCB3YXMgcG9ydGVkIG9uIE9wZW5WTVMvQWxwaGEgVjcuMSwgREVDQyBWNS43LTAwNi4gSXQgd2FzIHJlLWJ1aWxkIGFuZAp0ZXN0ZWQgb24gT3BlblZNUy9BbHBoYSBWNy4yLCBPcGVuVk1TL1ZBWCA3LjEgYW5kIDUuNS0yLiBEaWZmZXJlbnQKdmVyc2lvbnMgb2YgREVDQyB3ZXJlIHVzZWQuIFZBWEMgd2FzIHRyaWVkOiBpdCBmYWlsczsgYnV0IGl0IGRvZXNuJ3QKc2VlbSB3b3J0aCB0byBnZXQgaXQgd29ya2luZy4gVGhlcmUgYXJlIHN0aWxsIHNvbWUgUFRSTUlTTUFUQ0ggd2FybmluZ3MKZHVyaW5nIHRoZSBjb21waWxlLiBBbHRob3VnaCBwZXJsIGlzIHdvcmtpbmcgb24gVk1TIHRoZSB0ZXN0IHNjcmlwdHMKZG9uJ3Qgd29yay4gVGhlIGZ1bmN0aW9uICRzaGVsbCBpcyBzdGlsbCBtaXNzaW5nLgoKVGhlcmUgaXMgYSBrbm93biBidWcgaW4gc29tZSBvZiB0aGUgVk1TIENSVExzLiBJdCBpcyBpbiB0aGUgc2hpcHBlZAp2ZXJzaW9ucyBvZiBWTVMgVjcuMiBhbmQgVjcuMi0xIGFuZCBpbiB0aGUgY3VycmVudGx5IChPY3RvYmVyIDE5OTkpCmF2YWlsYWJsZSBFQ09zIGZvciBWTVMgVjcuMSBhbmQgbmV3ZXIgdmVyc2lvbnMuIEl0IGlzIGZpeGVkIGluIHZlcnNpb25zCnNoaXBwZWQgd2l0aCBuZXdlciBWTVMgdmVyc2lvbnMgYW5kIGFsbCBFQ08ga2l0cyBhZnRlciBPY3RvYmVyIDE5OTkuIEl0Cm9ubHkgc2hvd3MgdXAgZHVyaW5nIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBwZXJpb2QgKERTVCk6IHN0YXQoKQpyZXR1cm5zIGEgbW9kaWZpY2F0aW9uIHRpbWUgMSBob3VyIGFoZWFkLiBUaGlzIHJlc3VsdHMgaW4gR05VIG1ha2UKd2FybmluZyBtZXNzYWdlcy4gRm9yIGEganVzdCBjcmVhdGVkIHNvdXJjZSB5b3Ugd2lsbCBzZWU6CgogJCBnbWFrZSB4LmV4ZQogZ21ha2UuZXhlOzE6ICoqKiBXYXJuaW5nOiBGaWxlIGB4LmMnIGhhcyBtb2RpZmljYXRpb24gdGltZSBpbiB0aGUgZnV0dXJlICg5NDA1ODI4NjMgPiA5NDA1NzkyNjkpCiBjYyAgICAvb2JqPXgub2JqIHguYwogbGluayAgeC5vYmogICAgL2V4ZT14LmV4ZQogZ21ha2UuZXhlOzE6ICoqKiBXYXJuaW5nOiAgQ2xvY2sgc2tldyBkZXRlY3RlZC4gIFlvdXIgYnVpbGQgbWF5IGJlIGluY29tcGxldGUuCgoKTmV3IGluIDMuNzguMToKCkZpeCBhIHByb2JsZW0gd2l0aCBhdXRvbWF0aWNhbGx5IHJlbWFraW5nIG1ha2VmaWxlcy4gR05VIG1ha2UgdXNlcyBhbgpleGVjdmUgdG8gcmVzdGFydCBpdHNlbGYgYWZ0ZXIgYSBzdWNjZXNzZnVsIHJlbWFrZSBvZiB0aGUgbWFrZWZpbGUuIE9uClVOSVggc3lzdGVtcyBleGVjdmUgcmVwbGFjZXMgdGhlIHJ1bm5pbmcgcHJvZ3JhbSB3aXRoIGEgbmV3IG9uZSBhbmQKcmVzZXRzIGFsbCBzaWduYWwgaGFuZGxpbmcgdG8gdGhlIGRlZmF1bHQuIE9uIFZNUyBleGVjdmUgY3JlYXRlcyBhIGNoaWxkCnByb2Nlc3MsIHNpZ25hbCBhbmQgZXhpdCBoYW5kbGVycyBvZiB0aGUgcGFyZW50IGFyZSBzdGlsbCBhY3RpdmUsIGFuZCwKdW5mb3J0dW5hdGVseSwgY29ycnVwdCB0aGUgZXhpdCBjb2RlIGZyb20gdGhlIGNoaWxkLiBGaXggaW4gam9iLmM6Cmlnbm9yZSBTSUdDSExELgoKQWRkZWQgc29tZSBzd2l0Y2hlcyB0byByZWZsZWN0IGxhdGVzdCBmZWF0dXJlcyBvZiBERUNDLiBNb2RpZmljYXRpb25zIGluCm1ha2VmaWxlLnZtcy4KClNldCBzb21lIGRlZmluaXRpb25zIHRvIHJlZmxlY3QgbGF0ZXN0IGZlYXR1cmVzIG9mIERFQ0MuIE1vZGlmaWNhdGlvbnMgaW4KY29uZmlnLmgtdm1zICh3aGljaCBpcyBjb3BpZWQgdG8gY29uZmlnLmgpLgoKQWRkZWQgZXh0ZXJuIHN0cmNtcGkgZGVjbGFyYXRpb24gdG8gYXZvaWQgJ2ltcGxpY2l0bHkgZGVjbGFyZWQnIG1lc3NhZ2VzLgpNb2RpZmljYXRpb24gaW4gbWFrZS5oLgoKRGVmYXVsdCBydWxlIGZvciBDKyssIGNvbmRpdGlvbmFscyBmb3IgZ2NjIChHQ0NfSVNfTkFUSVZFKSBvciBERUMvRGlnaXRhbC8KQ29tcGFxIGMvYysrIGNvbXBpbGVycy4gTW9kaWZpY2F0aW9ucyBpbiBkZWZhdWx0LmMuCgpVc2FnZSBvZiBvcGVuZGlyKCkgYW5kIGZyaWVuZHMsIHN1cHByZXNzIGZpbGUgdmVyc2lvbi4gTW9kaWZpY2F0aW9ucyBpbiBkaXIuYy4KCkFkZGVkIFZNUyBzcGVjaWZpYyBjb2RlIHRvIGhhbmRsZSBjdHJsK2MgYW5kIGN0cmwreSB0byBhYm9ydCBtYWtlLgpNb2RpZmljYXRpb25zIGluIGpvYi5jLgoKQWRkZWQgc3VwcG9ydCB0byBoYXZlIGNhc2Ugc2Vuc2l0aXZlIHRhcmdldHMgYW5kIGRlcGVuZGVuY2llcyBidXQgdG8Kc3RpbGwgdXNlIGNhc2UgYmxpbmQgZmlsZSBuYW1lcy4gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IgSmF2YQptYWtlZmlsZXMgb24gVk1TOgoKCS5TVUZGSVhFUyA6CgkuU1VGRklYRVMgOgkuY2xhc3MgLmphdmEKCS5qYXZhLmNsYXNzIDoKCQlqYXZhYyAiJDwKCUhlbGxvV29ybGQuY2xhc3MgOiAgICAgIEhlbGxvV29ybGQuamF2YQoKQSBuZXcgbWFjcm8gV0FOVF9DQVNFX1NFTlNJVElWRV9UQVJHRVRTIGluIGNvbmZpZy5oLXZtcyB3YXMgaW50cm9kdWNlZC4KSXQgbmVlZHMgdG8gYmUgZW5hYmxlZCB0byBnZXQgdGhpcyBmZWF0dXJlOyBkZWZhdWx0IGlzIGRpc2FibGVkLiAgVGhlCm1hY3JvIEhBVkVfQ0FTRV9JTlNFTlNJVElWRV9GUyBtdXN0IG5vdCBiZSB0b3VjaGVkOiBpdCBpcyBzdGlsbCBlbmFibGVkLgpNb2RpZmljYXRpb25zIGluIGZpbGUuYyBhbmQgY29uZmlnLmgtdm1zLgoKQm9vdHN0cmFwIG1ha2UgdG8gc3RhcnQgYnVpbGRpbmcgbWFrZSBpcyBzdGlsbCBtYWtlZmlsZS5jb20sIGJ1dCBtYWtlCm5lZWRzIHRvIGJlIHJlLW1hZGUgd2l0aCBhIG1ha2UgdG8gbWFrZSBhIGNvcnJlY3QgdmVyc2lvbjogaWdub3JlIGFsbApwb3NzaWJsZSB3YXJuaW5ncywgZGVsZXRlIGFsbCBvYmplY3RzLCByZW5hbWUgbWFrZS5leGUgdG8gYSBkaWZmZXJlbnQKbmFtZSBhbmQgcnVuIGl0LgoKTWFkZSBzb21lIG1pbm9yIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGJvb3RzdHJhcCBidWlsZCBtYWtlZmlsZS5jb20uCgwKVGhpcyBpcyB0aGUgVk1TIHBvcnQgb2YgR05VIE1ha2UuCgpJdCBpcyBiYXNlZCBvbiB0aGUgVk1TIHBvcnQgb2YgR05VIE1ha2UgMy42MCBieSBNaWtlIE1vcmV0dGkuCgpUaGlzIHBvcnQgd2FzIGRvbmUgYnkgS2xhdXMgS+RtcGYgPGtrYWVtcGZAcm1pLmRlPgoKVGhlcmUgaXMgZmlyc3QtbGV2ZWwgc3VwcG9ydCBhdmFpbGFibGUgZnJvbSBwcm9HSVMgU29mdHdhcmUsIEdlcm1hbnkuClZpc2l0IHRoZWlyIHdlYi1zaXRlIGF0IGh0dHA6Ly93d3cucHJvZ2lzLmRlIHRvIGdldCBpbmZvcm1hdGlvbgphYm91dCBvdGhlciB2bXMgc29mdHdhcmUgYW5kIGZvcnRoY29taW5nIHVwZGF0ZXMgdG8gZ251IG1ha2UuCgpOZXcgZm9yIDMuNzc6CgovYmluL3NoIHN0eWxlIEkvTyByZWRpcmVjdGlvbiBpcyBzdXBwb3J0ZWQuIFlvdSBjYW4gbm93IHdyaXRlIGxpbmVzIGxpa2UKCW1jciBzeXMkZGlzazpbXXByb2dyYW0uZXhlIDwgaW5wdXQudHh0ID4gb3V0cHV0LnR4dCAmPiBlcnJvci50eHQKCk1ha2VmaWxlIHZhcmlhYmxlcyBhcmUgbG9va2VkIHVwIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LiBZb3UgY2FuIHNldApzeW1ib2xzIG9yIGxvZ2ljYWxzIGluIERDTCBhbmQgZXZhbHVhdGUgdGhlbSBpbiB0aGUgTWFrZWZpbGUgdmlhCiQoPG5hbWUtb2Ytc3ltYm9sLW9yLWxvZ2ljYWw+KS4gIFZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBNYWtlZmlsZQpvdmVycmlkZSBWTVMgc3ltYm9scy9sb2dpY2FscyAhCgpGdW5jdGlvbnMgZm9yIGZpbGUgbmFtZXMgYXJlIHdvcmtpbmcgbm93LiBTZWUgdGhlIEdOVSBNYWtlIG1hbnVhbCBmb3IKJChkaXIgLi4uKSAgYW5kICQod2lsZGNhcmQgLi4uKS4gIFVuaXgtc3R5bGUgYW5kIFZNUy1zdHlsZSBuYW1lcyBhcmUKc3VwcG9ydGVkIGFzIGFyZ3VtZW50cy4KClRoZSBkZWZhdWx0IHJ1bGVzIGFyZSBzZXQgdXAgZm9yIEdOVSBDLiBCdWlsZGluZyBhbiBleGVjdXRhYmxlIGZyb20gYQpzaW5nbGUgc291cmNlIGZpbGUgaXMgYXMgZWFzeSBhcyAnbWFrZSBmaWxlLmV4ZScuCgpUaGUgdmFyaWFibGUgJChBUkNIKSBpcyBwcmVkZWZpbmVkIGFzIEFMUEhBIG9yIFZBWCByZXNwLiBNYWtlZmlsZXMgZm9yCmRpZmZlcmVudCBWTVMgc3lzdGVtcyBjYW4gbm93IGJlIHdyaXR0ZW4gYnkgY2hlY2tpbmcgJChBUkNIKSBhcyBpbgogIGlmZXEgKCQoQVJDSCksQUxQSEEpCiAgICAkKEVDSE8pICJPbiB0aGUgQWxwaGEiCiAgZWxzZQogICAgJChFQ0hPKSAiT24gdGhlIFZBWCIKICBlbmRpZgoKQ29tbWFuZCBsaW5lcyBvZiBleGNlc3NpdmUgbGVuZ3RoIGFyZSBjb3JyZWN0bHkgYnJva2VuIGFuZCB3cml0dGVuIHRvIGEKYmF0Y2ggZmlsZSBpbiBzeXMkc2NyYXRjaCBmb3IgbGF0ZXIgZXhlY3V0aW9uLiBUaGVyZSdzIG5vIGxpbWl0IHRvIHRoZQpsZW5ndGhzIG9mIGNvbW1hbmRzIChhbmQgbm8gbmVlZCBmb3IgLm9wdCBmaWxlcyA6LSkgYW55IG1vcmUuCgpFbXB0eSBjb21tYW5kcyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkgYW5kIGRvbid0IGVuZCBpbiBhIG5ldyBEQ0wgcHJvY2Vzcy4KCgpOZXcgZm9yIDMuNzY6CgpKb2huIFcuIEVhdG9uIGhhcyB1cGRhdGVkIHRoZSBWTVMgcG9ydCB0byBzdXBwb3J0IGxpYnJhcmllcyBhbmQgVlBBVEguCgoKVG8gYnVpbGQgTWFrZSwgc2ltcGx5IHR5cGUgQG1ha2VmaWxlLiAgVGhpcyBzaG91bGQgY29tcGlsZSBhbGwgdGhlCm5lY2Vzc2FyeSBmaWxlcyBhbmQgbGluayBNYWtlLiAgVGhlcmUgaXMgYWxzbyBhIGZpbGUgY2FsbGVkCm1ha2VmaWxlLnZtcy4gIElmIHlvdSBhbHJlYWR5IGhhdmUgR05VIE1ha2UgYnVpbHQgeW91IGNhbiBqdXN0IHVzZQpNYWtlIHdpdGggdGhpcyBtYWtlZmlsZSB0byByZWJ1aWxkLgoKSGVyZSBhcmUgc29tZSBub3RlcyBhYm91dCBHTlUgTWFrZSBmb3IgVk1TOgoKVGhlIGNkIGNvbW1hbmQgaXMgc3VwcG9ydGVkIGlmIGl0J3MgY2FsbGVkIGFzICQoQ0QpLiBUaGlzIGludm9rZXMKdGhlICdidWlsdGluX2NkJyBjb21tYW5kIHdoaWNoIGNoYW5nZXMgdGhlIGRpcmVjdG9yeS4KQ2FsbGluZyAnc2V0IGRlZicgZG9lc24ndCBkbyB0aGUgdHJpY2ssIHNpbmNlIGEgc3ViLXNoZWxsIGlzCnNwYXduZWQgZm9yIHRoaXMgY29tbWFuZCwgdGhlIGRpcmVjdG9yeSBpcyBjaGFuZ2VkICppbiB0aGlzIHN1Yi1zaGVsbCoKYW5kIHRoZSBzdWItc2hlbGwgZW5kcy4KCkxpYnJhcmllcyBhcmUgbm90IHN1cHBvcnRlZC4gVGhleSB3ZXJlIGluIEdOVSBNYWtlIDMuNjAgYnV0IHNvbWVob3cgSQpkaWRuJ3QgY2FyZSBwb3J0aW5nIHRoZSBjb2RlLiBJZiB0aGVyZSBpcyBlbm91Z2ggaW50ZXJlc3QsIEknbGwgZG8gaXQgYXQKc29tZSBsYXRlciB0aW1lLgoKVGhlIHZhcmlhYmxlICReIHNlcGFyYXRlcyBmaWxlcyB3aXRoIGNvbW1hcyBpbnN0ZWFkIG9mIHNwYWNlcyAoSXQncyB0aGUKbmF0dXJhbCB0aGluZyB0byBkbyBmb3IgVk1TKS4KClNlZSBkZWZhdWx0cy5jIGZvciBWTVMgZGVmYXVsdCBzdWZmaXhlcyBhbmQgbXkgZGVmaW5pdGlvbnMgZm9yIGRlZmF1bHQKcnVsZXMgYW5kIHZhcmlhYmxlcy4KClRoZSBzaGVsbCBmdW5jdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LgoKTG9hZCBhdmVyYWdlIHJvdXRpbmVzIGhhdmVuJ3QgYmVlbiBpbXBsZW1lbnRlZCBmb3IgVk1TIHlldC4KClRoZSBkZWZhdWx0IGluY2x1ZGUgZGlyZWN0b3J5IGZvciBpbmNsdWRpbmcgb3RoZXIgbWFrZWZpbGVzIGlzClNZUyRTWVNST09UOltTWVNMSUJdIChJIGRvbid0IHJlbWVtYmVyIHdoeSBJIGRpZG4ndCBqdXN0IHVzZQpTWVMkTElCUkFSWTogaW5zdGVhZDsgbWF5YmUgaXQgd291bGRuJ3Qgd29yayB0aGF0IHdheSkuCgpUaGUgZGVmYXVsdCBtYWtlZmlsZXMgbWFrZSBsb29rcyBmb3IgYXJlOiBtYWtlZmlsZS52bXMsIGdudW1ha2VmaWxlLAptYWtlZmlsZS4sIGFuZCBnbnVtYWtlZmlsZS4gLgoKVGhlIHN0YXQoKSBmdW5jdGlvbiBhbmQgaGFuZGxpbmcgb2YgdGltZSBzdGFtcHMgaW4gVk1TIGlzIGJyb2tlbiwgc28gSQpyZXBsYWNlZCBpdCB3aXRoIGEgaGFjayBpbiB2bXNmdW5jdGlvbnMuYy4gSSB3aWxsIHByb3ZpZGUgYSBmdWxsIHJld3JpdGUKc29tZXdoZXJlIGluIHRoZSBmdXR1cmUuIEJlIHdhcm5lZCwgdGhlIHRpbWUgcmVzb2x1dGlvbiBpbnNpZGUgbWFrZSBpcwpsZXNzIHRoYW4gd2hhdCB2bXMgcHJvdmlkZXMuIFRoaXMgbWlnaHQgYmUgYSBwcm9ibGVtIG9uIHRoZSBmYXN0ZXIgQWxwaGFzLgoKWW91IGNhbiB1c2UgYSA6IGluIGEgZmlsZW5hbWUgb25seSBpZiB5b3UgcHJlY2VlZCBpdCB3aXRoIGEgYmFja3NsYXNoICgnXCcpLgpFLmcuLSBob2JiZXNcOltib2dhcy5maWxlc10KCk1ha2UgaWdub3JlcyBzdWNjZXNzLCBpbmZvcm1hdGlvbmFsLCBvciB3YXJuaW5nIGVycm9ycyAoLVMtLCAtSS0sIG9yCi1XLSkuICBCdXQgaXQgd2lsbCBzdG9wIG9uIC1FLSBhbmQgLUYtIGVycm9ycy4gKHVubGVzcyB5b3UgZG8gc29tZXRoaW5nCnRvIG92ZXJyaWRlIHRoaXMgaW4geW91ciBtYWtlZmlsZSwgb3Igd2hhdGV2ZXIpLgoKUmVtb3RlIHN0dWZmIGlzbid0IGltcGxlbWVudGVkIHlldC4KCk11bHRpcGxlIGxpbmUgRENMIGNvbW1hbmRzLCBzdWNoIGFzICJpZiIgc3RhdGVtZW50cywgbXVzdCBiZSBwdXQgaW5zaWRlCmNvbW1hbmQgZmlsZXMuICBZb3UgY2FuIHJ1biBhIGNvbW1hbmQgZmlsZSBieSB1c2luZyBcQC4KCgpWTVMgY2hhbmdlcyBtYWRlIGZvciAzLjc0LjMKCkxvdHMgb2YgZGVmYXVsdCBzZXR0aW5ncyBhcmUgYWRhcHRlZCBmb3IgVk1TLiBTZWUgZGVmYXVsdC5jLgoKTG9uZyBjb21tYW5kIGxpbmVzIGFyZSBub3cgY29udmVydGVkIHRvIGNvbW1hbmQgZmlsZXMuCgpDb21tYSAoJywnKSBhcyBhIHNlcGFyYXRvciBpcyBub3cgYWxsb3dlZC4gU2VlIG1ha2VmaWxlLnZtcyBmb3IgYW4gZXhhbXBsZS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LAoyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgpUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgTWFrZS4KCkdOVSBNYWtlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCnRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCkdOVSBNYWtlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQpXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUgpBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKR05VIE1ha2U7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQpGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCg==