KnNwZWxsLnR4dCoJRm9yIFZpbSB2ZXJzaW9uIDcuNC4gIExhc3QgY2hhbmdlOiAyMDEzIE5vdiAxMgoKCgkJICBWSU0gUkVGRVJFTkNFIE1BTlVBTAkgIGJ5IEJyYW0gTW9vbGVuYWFyCgoKU3BlbGwgY2hlY2tpbmcJCQkJCQkqc3BlbGwqCgoxLiBRdWljayBzdGFydAkJCXxzcGVsbC1xdWlja3N0YXJ0fAoyLiBSZW1hcmtzIG9uIHNwZWxsIGNoZWNraW5nCXxzcGVsbC1yZW1hcmtzfAozLiBHZW5lcmF0aW5nIGEgc3BlbGwgZmlsZQl8c3BlbGwtbWtzcGVsbHwKNC4gU3BlbGwgZmlsZSBmb3JtYXQJCXxzcGVsbC1maWxlLWZvcm1hdHwKCntWaSBkb2VzIG5vdCBoYXZlIGFueSBvZiB0aGVzZSBjb21tYW5kc30KClNwZWxsIGNoZWNraW5nIGlzIG5vdCBhdmFpbGFibGUgd2hlbiB0aGUgfCtzeW50YXh8IGZlYXR1cmUgaGFzIGJlZW4gZGlzYWJsZWQKYXQgY29tcGlsZSB0aW1lLgoKTm90ZTogVGhlcmUgYWxzbyBpcyBhIHZpbXNwZWxsIHBsdWdpbi4gIElmIHlvdSBoYXZlIGl0IHlvdSBjYW4gZG8gIjpoZWxwCnZpbXNwZWxsIiB0byBmaW5kIGFib3V0IGl0LiAgQnV0IHlvdSB3aWxsIHByb2JhYmx5IHdhbnQgdG8gZ2V0IHJpZCBvZiB0aGUKcGx1Z2luIGFuZCB1c2UgdGhlICdzcGVsbCcgb3B0aW9uIGluc3RlYWQsIGl0IHdvcmtzIGJldHRlci4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxLiBRdWljayBzdGFydAkJCQkJKnNwZWxsLXF1aWNrc3RhcnQqICpFNzU2KgoKVGhpcyBjb21tYW5kIHN3aXRjaGVzIG9uIHNwZWxsIGNoZWNraW5nOiA+CgoJOnNldGxvY2FsIHNwZWxsIHNwZWxsbGFuZz1lbl91cwoKVGhpcyBzd2l0Y2hlcyBvbiB0aGUgJ3NwZWxsJyBvcHRpb24gYW5kIHNwZWNpZmllcyB0byBjaGVjayBmb3IgVVMgRW5nbGlzaC4KClRoZSB3b3JkcyB0aGF0IGFyZSBub3QgcmVjb2duaXplZCBhcmUgaGlnaGxpZ2h0ZWQgd2l0aCBvbmUgb2YgdGhlc2U6CglTcGVsbEJhZAl3b3JkIG5vdCByZWNvZ25pemVkCQkJfGhsLVNwZWxsQmFkfAoJU3BlbGxDYXAJd29yZCBub3QgY2FwaXRhbGlzZWQJCQl8aGwtU3BlbGxDYXB8CglTcGVsbFJhcmUJcmFyZSB3b3JkCQkJCXxobC1TcGVsbFJhcmV8CglTcGVsbExvY2FsCXdyb25nIHNwZWxsaW5nIGZvciBzZWxlY3RlZCByZWdpb24JfGhsLVNwZWxsTG9jYWx8CgpWaW0gb25seSBjaGVja3Mgd29yZHMgZm9yIHNwZWxsaW5nLCB0aGVyZSBpcyBubyBncmFtbWFyIGNoZWNrLgoKSWYgdGhlICdtb3VzZW1vZGVsJyBvcHRpb24gaXMgc2V0IHRvICJwb3B1cCIgYW5kIHRoZSBjdXJzb3IgaXMgb24gYSBiYWRseQpzcGVsbGVkIHdvcmQgb3IgaXQgaXMgInBvcHVwX3NldHBvcyIgYW5kIHRoZSBtb3VzZSBwb2ludGVyIGlzIG9uIGEgYmFkbHkKc3BlbGxlZCB3b3JkLCB0aGVuIHRoZSBwb3B1cCBtZW51IHdpbGwgY29udGFpbiBhIHN1Ym1lbnUgdG8gcmVwbGFjZSB0aGUgYmFkCndvcmQuICBOb3RlOiB0aGlzIHNsb3dzIGRvd24gdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIHBvcHVwIG1lbnUuICBOb3RlIGZvciBHVEs6CmRvbid0IHJlbGVhc2UgdGhlIHJpZ2h0IG1vdXNlIGJ1dHRvbiB1bnRpbCB0aGUgbWVudSBhcHBlYXJzLCBvdGhlcndpc2UgaXQKd29uJ3Qgd29yay4KClRvIHNlYXJjaCBmb3IgdGhlIG5leHQgbWlzc3BlbGxlZCB3b3JkOgoKCQkJCQkJCSpdcyoKXXMJCQlNb3ZlIHRvIG5leHQgbWlzc3BlbGxlZCB3b3JkIGFmdGVyIHRoZSBjdXJzb3IuCgkJCUEgY291bnQgYmVmb3JlIHRoZSBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIHJlcGVhdC4KCQkJJ3dyYXBzY2FuJyBhcHBsaWVzLgoKCQkJCQkJCSpbcyoKW3MJCQlMaWtlICJdcyIgYnV0IHNlYXJjaCBiYWNrd2FyZHMsIGZpbmQgdGhlIG1pc3NwZWxsZWQKCQkJd29yZCBiZWZvcmUgdGhlIGN1cnNvci4gIERvZXNuJ3QgcmVjb2duaXplIHdvcmRzCgkJCXNwbGl0IG92ZXIgdHdvIGxpbmVzLCB0aHVzIG1heSBzdG9wIGF0IHdvcmRzIHRoYXQgYXJlCgkJCW5vdCBoaWdobGlnaHRlZCBhcyBiYWQuICBEb2VzIG5vdCBzdG9wIGF0IHdvcmQgd2l0aAoJCQltaXNzaW5nIGNhcGl0YWwgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KCgkJCQkJCQkqXVMqCl1TCQkJTGlrZSAiXXMiIGJ1dCBvbmx5IHN0b3AgYXQgYmFkIHdvcmRzLCBub3QgYXQgcmFyZQoJCQl3b3JkcyBvciB3b3JkcyBmb3IgYW5vdGhlciByZWdpb24uCgoJCQkJCQkJKltTKgpbUwkJCUxpa2UgIl1TIiBidXQgc2VhcmNoIGJhY2t3YXJkcy4KCgpUbyBhZGQgd29yZHMgdG8geW91ciBvd24gd29yZCBsaXN0OgoKCQkJCQkJCSp6ZyoKemcJCQlBZGQgd29yZCB1bmRlciB0aGUgY3Vyc29yIGFzIGEgZ29vZCB3b3JkIHRvIHRoZSBmaXJzdAoJCQluYW1lIGluICdzcGVsbGZpbGUnLiAgQSBjb3VudCBtYXkgcHJlY2VkZSB0aGUgY29tbWFuZAoJCQl0byBpbmRpY2F0ZSB0aGUgZW50cnkgaW4gJ3NwZWxsZmlsZScgdG8gYmUgdXNlZC4gIEEKCQkJY291bnQgb2YgdHdvIHVzZXMgdGhlIHNlY29uZCBlbnRyeS4KCgkJCUluIFZpc3VhbCBtb2RlIHRoZSBzZWxlY3RlZCBjaGFyYWN0ZXJzIGFyZSBhZGRlZCBhcyBhCgkJCXdvcmQgKGluY2x1ZGluZyB3aGl0ZSBzcGFjZSEpLgoJCQlXaGVuIHRoZSBjdXJzb3IgaXMgb24gdGV4dCB0aGF0IGlzIG1hcmtlZCBhcyBiYWRseQoJCQlzcGVsbGVkIHRoZW4gdGhlIG1hcmtlZCB0ZXh0IGlzIHVzZWQuCgkJCU90aGVyd2lzZSB0aGUgd29yZCB1bmRlciB0aGUgY3Vyc29yLCBzZXBhcmF0ZWQgYnkKCQkJbm9uLXdvcmQgY2hhcmFjdGVycywgaXMgdXNlZC4KCgkJCUlmIHRoZSB3b3JkIGlzIGV4cGxpY2l0bHkgbWFya2VkIGFzIGJhZCB3b3JkIGluCgkJCWFub3RoZXIgc3BlbGwgZmlsZSB0aGUgcmVzdWx0IGlzIHVucHJlZGljdGFibGUuCgoJCQkJCQkJKnpHKgp6RwkJCUxpa2UgInpnIiBidXQgYWRkIHRoZSB3b3JkIHRvIHRoZSBpbnRlcm5hbCB3b3JkIGxpc3QKCQkJfGludGVybmFsLXdvcmRsaXN0fC4KCgkJCQkJCQkqencqCnp3CQkJTGlrZSAiemciIGJ1dCBtYXJrIHRoZSB3b3JkIGFzIGEgd3JvbmcgKGJhZCkgd29yZC4KCQkJSWYgdGhlIHdvcmQgYWxyZWFkeSBhcHBlYXJzIGluICdzcGVsbGZpbGUnIGl0IGlzCgkJCXR1cm5lZCBpbnRvIGEgY29tbWVudCBsaW5lLiAgU2VlIHxzcGVsbGZpbGUtY2xlYW51cHwKCQkJZm9yIGdldHRpbmcgcmlkIG9mIHRob3NlLgoKCQkJCQkJCSp6VyoKelcJCQlMaWtlICJ6dyIgYnV0IGFkZCB0aGUgd29yZCB0byB0aGUgaW50ZXJuYWwgd29yZCBsaXN0CgkJCXxpbnRlcm5hbC13b3JkbGlzdHwuCgp6dXcJCQkJCQkJKnp1ZyogKnp1dyoKenVnCQkJVW5kbyB8end8IGFuZCB8emd8LCByZW1vdmUgdGhlIHdvcmQgZnJvbSB0aGUgZW50cnkgaW4KCQkJJ3NwZWxsZmlsZScuICBDb3VudCB1c2VkIGFzIHdpdGggfHpnfC4KCnp1VwkJCQkJCQkqenVHKiAqenVXKgp6dUcJCQlVbmRvIHx6V3wgYW5kIHx6R3wsIHJlbW92ZSB0aGUgd29yZCBmcm9tIHRoZSBpbnRlcm5hbAoJCQl3b3JkIGxpc3QuICBDb3VudCB1c2VkIGFzIHdpdGggfHpnfC4KCgkJCQkJCQkqOnNwZSogKjpzcGVsbGdvb2QqCjpbY291bnRdc3BlW2xsZ29vZF0ge3dvcmR9CgkJCUFkZCB7d29yZH0gYXMgYSBnb29kIHdvcmQgdG8gJ3NwZWxsZmlsZScsIGxpa2Ugd2l0aAoJCQl8emd8LiAgV2l0aG91dCBjb3VudCB0aGUgZmlyc3QgbmFtZSBpcyB1c2VkLCB3aXRoIGEKCQkJY291bnQgb2YgdHdvIHRoZSBzZWNvbmQgZW50cnksIGV0Yy4KCjpzcGVbbGxnb29kXSEge3dvcmR9CUFkZCB7d29yZH0gYXMgYSBnb29kIHdvcmQgdG8gdGhlIGludGVybmFsIHdvcmQgbGlzdCwKCQkJbGlrZSB3aXRoIHx6R3wuCgoJCQkJCQkJKjpzcGVsbHcqICo6c3BlbGx3cm9uZyoKOltjb3VudF1zcGVsbHdbcm9uZ10ge3dvcmR9CgkJCUFkZCB7d29yZH0gYXMgYSB3cm9uZyAoYmFkKSB3b3JkIHRvICdzcGVsbGZpbGUnLCBhcwoJCQl3aXRoIHx6d3wuICBXaXRob3V0IGNvdW50IHRoZSBmaXJzdCBuYW1lIGlzIHVzZWQsIHdpdGgKCQkJYSBjb3VudCBvZiB0d28gdGhlIHNlY29uZCBlbnRyeSwgZXRjLgoKOnNwZWxsd1tyb25nXSEge3dvcmR9CUFkZCB7d29yZH0gYXMgYSB3cm9uZyAoYmFkKSB3b3JkIHRvIHRoZSBpbnRlcm5hbCB3b3JkCgkJCWxpc3QsIGxpa2Ugd2l0aCB8eld8LgoKOltjb3VudF1zcGVsbHVbbmRvXSB7d29yZH0JCQkJKjpzcGVsbHUqICo6c3BlbGx1bmRvKgoJCQlMaWtlIHx6dXd8LiAgW2NvdW50XSB1c2VkIGFzIHdpdGggfDpzcGVsbGdvb2R8LgoKOnNwZWxsdVtuZG9dISB7d29yZH0JTGlrZSB8enVXfC4gIFtjb3VudF0gdXNlZCBhcyB3aXRoIHw6c3BlbGxnb29kfC4KCgpBZnRlciBhZGRpbmcgYSB3b3JkIHRvICdzcGVsbGZpbGUnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmRzIGl0cyBhc3NvY2lhdGVkCiIuc3BsIiBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBiZSB1cGRhdGVkIGFuZCByZWxvYWRlZC4gIElmIHlvdSBjaGFuZ2UKJ3NwZWxsZmlsZScgbWFudWFsbHkgeW91IG5lZWQgdG8gdXNlIHRoZSB8Om1rc3BlbGx8IGNvbW1hbmQuICBUaGlzIHNlcXVlbmNlIG9mCmNvbW1hbmRzIG1vc3RseSB3b3JrcyB3ZWxsOiA+Cgk6ZWRpdCA8ZmlsZSBpbiAnc3BlbGxmaWxlJz4KPAkobWFrZSBjaGFuZ2VzIHRvIHRoZSBzcGVsbCBmaWxlKSA+Cgk6bWtzcGVsbCEgJQoKTW9yZSBkZXRhaWxzIGFib3V0IHRoZSAnc3BlbGxmaWxlJyBmb3JtYXQgYmVsb3cgfHNwZWxsLXdvcmRsaXN0LWZvcm1hdHwuCgoJCQkJCQkJKmludGVybmFsLXdvcmRsaXN0KgpUaGUgaW50ZXJuYWwgd29yZCBsaXN0IGlzIHVzZWQgZm9yIGFsbCBidWZmZXJzIHdoZXJlICdzcGVsbCcgaXMgc2V0LiAgSXQgaXMKbm90IHN0b3JlZCwgaXQgaXMgbG9zdCB3aGVuIHlvdSBleGl0IFZpbS4gIEl0IGlzIGFsc28gY2xlYXJlZCB3aGVuICdlbmNvZGluZycKaXMgc2V0LgoKCkZpbmRpbmcgc3VnZ2VzdGlvbnMgZm9yIGJhZCB3b3JkczoKCQkJCQkJCSp6PSoKej0JCQlGb3IgdGhlIHdvcmQgdW5kZXIvYWZ0ZXIgdGhlIGN1cnNvciBzdWdnZXN0IGNvcnJlY3RseQoJCQlzcGVsbGVkIHdvcmRzLiAgVGhpcyBhbHNvIHdvcmtzIHRvIGZpbmQgYWx0ZXJuYXRpdmVzCgkJCWZvciBhIHdvcmQgdGhhdCBpcyBub3QgaGlnaGxpZ2h0ZWQgYXMgYSBiYWQgd29yZCwKCQkJZS5nLiwgd2hlbiB0aGUgd29yZCBhZnRlciBpdCBpcyBiYWQuCgkJCUluIFZpc3VhbCBtb2RlIHRoZSBoaWdobGlnaHRlZCB0ZXh0IGlzIHRha2VuIGFzIHRoZQoJCQl3b3JkIHRvIGJlIHJlcGxhY2VkLgoJCQlUaGUgcmVzdWx0cyBhcmUgc29ydGVkIG9uIHNpbWlsYXJpdHkgdG8gdGhlIHdvcmQgYmVpbmcKCQkJcmVwbGFjZWQuCgkJCVRoaXMgbWF5IHRha2UgYSBsb25nIHRpbWUuICBIaXQgQ1RSTC1DIHdoZW4geW91IGdldAoJCQlib3JlZC4KCgkJCUlmIHRoZSBjb21tYW5kIGlzIHVzZWQgd2l0aG91dCBhIGNvdW50IHRoZQoJCQlhbHRlcm5hdGl2ZXMgYXJlIGxpc3RlZCBhbmQgeW91IGNhbiBlbnRlciB0aGUgbnVtYmVyCgkJCW9mIHlvdXIgY2hvaWNlIG9yIHByZXNzIDxFbnRlcj4gaWYgeW91IGRvbid0IHdhbnQgdG8KCQkJcmVwbGFjZS4gIFlvdSBjYW4gYWxzbyB1c2UgdGhlIG1vdXNlIHRvIGNsaWNrIG9uIHlvdXIKCQkJY2hvaWNlIChvbmx5IHdvcmtzIGlmIHRoZSBtb3VzZSBjYW4gYmUgdXNlZCBpbiBOb3JtYWwKCQkJbW9kZSBhbmQgd2hlbiB0aGVyZSBhcmUgbm8gbGluZSB3cmFwcykuICBDbGljayBvbiB0aGUKCQkJZmlyc3QgbGluZSAodGhlIGhlYWRlcikgdG8gY2FuY2VsLgoKCQkJVGhlIHN1Z2dlc3Rpb25zIGxpc3RlZCBub3JtYWxseSByZXBsYWNlIGEgaGlnaGxpZ2h0ZWQKCQkJYmFkIHdvcmQuICBTb21ldGltZXMgdGhleSBpbmNsdWRlIG90aGVyIHRleHQsIGluIHRoYXQKCQkJY2FzZSB0aGUgcmVwbGFjZWQgdGV4dCBpcyBhbHNvIGxpc3RlZCBhZnRlciBhICI8Ii4KCgkJCUlmIGEgY291bnQgaXMgdXNlZCB0aGF0IHN1Z2dlc3Rpb24gaXMgdXNlZCwgd2l0aG91dAoJCQlwcm9tcHRpbmcuICBGb3IgZXhhbXBsZSwgIjF6PSIgYWx3YXlzIHRha2VzIHRoZSBmaXJzdAoJCQlzdWdnZXN0aW9uLgoKCQkJSWYgJ3ZlcmJvc2UnIGlzIG5vbi16ZXJvIGEgc2NvcmUgd2lsbCBiZSBkaXNwbGF5ZWQKCQkJd2l0aCB0aGUgc3VnZ2VzdGlvbnMgdG8gaW5kaWNhdGUgdGhlIGxpa2VsaW5lc3MgdG8gdGhlCgkJCWJhZGx5IHNwZWxsZWQgd29yZCAodGhlIGhpZ2hlciB0aGUgc2NvcmUgdGhlIG1vcmUKCQkJZGlmZmVyZW50KS4KCQkJV2hlbiBhIHdvcmQgd2FzIHJlcGxhY2VkIHRoZSByZWRvIGNvbW1hbmQgIi4iIHdpbGwKCQkJcmVwZWF0IHRoZSB3b3JkIHJlcGxhY2VtZW50LiAgVGhpcyB3b3JrcyBsaWtlICJjaXciLAoJCQl0aGUgZ29vZCB3b3JkIGFuZCA8RXNjPi4gIFRoaXMgZG9lcyBOT1Qgd29yayBmb3IgVGhhaQoJCQlhbmQgb3RoZXIgbGFuZ3VhZ2VzIHdpdGhvdXQgc3BhY2VzIGJldHdlZW4gd29yZHMuCgoJCQkJCSo6c3BlbGxyKiAqOnNwZWxscmVwYWxsKiAqRTc1MiogKkU3NTMqCjpzcGVsbHJbZXBhbGxdCQlSZXBlYXQgdGhlIHJlcGxhY2VtZW50IGRvbmUgYnkgfHo9fCBmb3IgYWxsIG1hdGNoZXMKCQkJd2l0aCB0aGUgcmVwbGFjZWQgd29yZCBpbiB0aGUgY3VycmVudCB3aW5kb3cuCgpJbiBJbnNlcnQgbW9kZSwgd2hlbiB0aGUgY3Vyc29yIGlzIGFmdGVyIGEgYmFkbHkgc3BlbGxlZCB3b3JkLCB5b3UgY2FuIHVzZQpDVFJMLVggcyB0byBmaW5kIHN1Z2dlc3Rpb25zLiAgVGhpcyB3b3JrcyBsaWtlIEluc2VydCBtb2RlIGNvbXBsZXRpb24uICBVc2UKQ1RSTC1OIHRvIHVzZSB0aGUgbmV4dCBzdWdnZXN0aW9uLCBDVFJMLVAgdG8gZ28gYmFjay4gfGlfQ1RSTC1YX3N8CgpUaGUgJ3NwZWxsc3VnZ2VzdCcgb3B0aW9uIGluZmx1ZW5jZXMgaG93IHRoZSBsaXN0IG9mIHN1Z2dlc3Rpb25zIGlzIGdlbmVyYXRlZAphbmQgc29ydGVkLiAgU2VlIHwnc3BlbGxzdWdnZXN0J3wuCgpUaGUgJ3NwZWxsY2FwY2hlY2snIG9wdGlvbiBpcyB1c2VkIHRvIGNoZWNrIHRoZSBmaXJzdCB3b3JkIG9mIGEgc2VudGVuY2UKc3RhcnRzIHdpdGggYSBjYXBpdGFsLiAgVGhpcyBkb2Vzbid0IHdvcmsgZm9yIHRoZSBmaXJzdCB3b3JkIGluIHRoZSBmaWxlLgpXaGVuIHRoZXJlIGlzIGEgbGluZSBicmVhayByaWdodCBhZnRlciBhIHNlbnRlbmNlIHRoZSBoaWdobGlnaHRpbmcgb2YgdGhlIG5leHQKbGluZSBtYXkgYmUgcG9zdHBvbmVkLiAgVXNlIHxDVFJMLUx8IHdoZW4gbmVlZGVkLiAgQWxzbyBzZWUgfHNldC1zcGMtYXV0b3wgZm9yCmhvdyBpdCBjYW4gYmUgc2V0IGF1dG9tYXRpY2FsbHkgd2hlbiAnc3BlbGxsYW5nJyBpcyBzZXQuCgpWaW0gY291bnRzIHRoZSBudW1iZXIgb2YgdGltZXMgYSBnb29kIHdvcmQgaXMgZW5jb3VudGVyZWQuICBUaGlzIGlzIHVzZWQgdG8Kc29ydCB0aGUgc3VnZ2VzdGlvbnM6IHdvcmRzIHRoYXQgaGF2ZSBiZWVuIHNlZW4gYmVmb3JlIGdldCBhIHNtYWxsIGJvbnVzLAp3b3JkcyB0aGF0IGhhdmUgYmVlbiBzZWVuIG9mdGVuIGdldCBhIGJpZ2dlciBib251cy4gIFRoZSBDT01NT04gaXRlbSBpbiB0aGUKYWZmaXggZmlsZSBjYW4gYmUgdXNlZCB0byBkZWZpbmUgY29tbW9uIHdvcmRzLCBzbyB0aGF0IHRoaXMgbWVjaGFuaXNtIGFsc28Kd29ya3MgaW4gYSBuZXcgb3Igc2hvcnQgZmlsZSB8c3BlbGwtQ09NTU9OfC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBSZW1hcmtzIG9uIHNwZWxsIGNoZWNraW5nCQkJCSpzcGVsbC1yZW1hcmtzKgoKUEVSRk9STUFOQ0UKClZpbSBkb2VzIG9uLXRoZS1mbHkgc3BlbGwgY2hlY2tpbmcuICBUbyBtYWtlIHRoaXMgd29yayBmYXN0IHRoZSB3b3JkIGxpc3QgaXMKbG9hZGVkIGluIG1lbW9yeS4gIFRodXMgdGhpcyB1c2VzIGEgbG90IG9mIG1lbW9yeSAoMSBNYnl0ZSBvciBtb3JlKS4gIFRoZXJlCm1pZ2h0IGFsc28gYmUgYSBub3RpY2VhYmxlIGRlbGF5IHdoZW4gdGhlIHdvcmQgbGlzdCBpcyBsb2FkZWQsIHdoaWNoIGhhcHBlbnMKd2hlbiAnc3BlbGwnIGlzIHNldCBhbmQgd2hlbiAnc3BlbGxsYW5nJyBpcyBzZXQgd2hpbGUgJ3NwZWxsJyB3YXMgYWxyZWFkeSBzZXQuClRvIG1pbmltaXplIHRoZSBkZWxheSBlYWNoIHdvcmQgbGlzdCBpcyBvbmx5IGxvYWRlZCBvbmNlLCBpdCBpcyBub3QgZGVsZXRlZAp3aGVuICdzcGVsbGxhbmcnIGlzIG1hZGUgZW1wdHkgb3IgJ3NwZWxsJyBpcyByZXNldC4gIFdoZW4gJ2VuY29kaW5nJyBpcyBzZXQKYWxsIHRoZSB3b3JkIGxpc3RzIGFyZSByZWxvYWRlZCwgdGh1cyB5b3UgbWF5IG5vdGljZSBhIGRlbGF5IHRoZW4gdG9vLgoKClJFR0lPTlMKCkEgd29yZCBtYXkgYmUgc3BlbGxlZCBkaWZmZXJlbnRseSBpbiB2YXJpb3VzIHJlZ2lvbnMuICBGb3IgZXhhbXBsZSwgRW5nbGlzaApjb21lcyBpbiAoYXQgbGVhc3QpIHRoZXNlIHZhcmlhbnRzOgoKCWVuCQlhbGwgcmVnaW9ucwoJZW5fYXUJCUF1c3RyYWxpYQoJZW5fY2EJCUNhbmFkYQoJZW5fZ2IJCUdyZWF0IEJyaXRhaW4KCWVuX256CQlOZXcgWmVhbGFuZAoJZW5fdXMJCVVTQQoKV29yZHMgdGhhdCBhcmUgbm90IHVzZWQgaW4gb25lIHJlZ2lvbiBidXQgYXJlIHVzZWQgaW4gYW5vdGhlciByZWdpb24gYXJlCmhpZ2hsaWdodGVkIHdpdGggU3BlbGxMb2NhbCB8aGwtU3BlbGxMb2NhbHwuCgpBbHdheXMgdXNlIGxvd2VyY2FzZSBsZXR0ZXJzIGZvciB0aGUgbGFuZ3VhZ2UgYW5kIHJlZ2lvbiBuYW1lcy4KCldoZW4gYWRkaW5nIGEgd29yZCB3aXRoIHx6Z3wgb3IgYW5vdGhlciBjb21tYW5kIGl0J3MgYWx3YXlzIGFkZGVkIGZvciBhbGwKcmVnaW9ucy4gIFlvdSBjYW4gY2hhbmdlIHRoYXQgYnkgbWFudWFsbHkgZWRpdGluZyB0aGUgJ3NwZWxsZmlsZScuICBTZWUKfHNwZWxsLXdvcmRsaXN0LWZvcm1hdHwuICBOb3RlIHRoYXQgdGhlIHJlZ2lvbnMgYXMgc3BlY2lmaWVkIGluIHRoZSBmaWxlcyBpbgonc3BlbGxmaWxlJyBhcmUgb25seSB1c2VkIHdoZW4gYWxsIGVudHJpZXMgaW4gJ3NwZWxsbGFuZycgc3BlY2lmeSB0aGUgc2FtZQpyZWdpb24gKG5vdCBjb3VudGluZyBmaWxlcyBzcGVjaWZpZWQgYnkgdGhlaXIgLnNwbCBuYW1lKS4KCgkJCQkJCQkqc3BlbGwtZ2VybWFuKgpTcGVjaWZpYyBleGNlcHRpb246IEZvciBHZXJtYW4gdGhlc2Ugc3BlY2lhbCByZWdpb25zIGFyZSB1c2VkOgoJZGUJCWFsbCBHZXJtYW4gd29yZHMgYWNjZXB0ZWQKCWRlX2RlCQlvbGQgYW5kIG5ldyBzcGVsbGluZwoJZGVfMTkJCW9sZCBzcGVsbGluZwoJZGVfMjAJCW5ldyBzcGVsbGluZwoJZGVfYXQJCUF1c3RyaWEKCWRlX2NoCQlTd2l0emVybGFuZAoKCQkJCQkJCSpzcGVsbC1ydXNzaWFuKgpTcGVjaWZpYyBleGNlcHRpb246IEZvciBSdXNzaWFuIHRoZXNlIHNwZWNpYWwgcmVnaW9ucyBhcmUgdXNlZDoKCXJ1CQlhbGwgUnVzc2lhbiB3b3JkcyBhY2NlcHRlZAoJcnVfcnUJCSJJRSIgbGV0dGVyIHNwZWxsaW5nCglydV95bwkJIllPIiBsZXR0ZXIgc3BlbGxpbmcKCgkJCQkJCQkqc3BlbGwteWlkZGlzaCoKWWlkZGlzaCByZXF1aXJlcyB1c2luZyAidXRmLTgiIGVuY29kaW5nLCBiZWNhdXNlIG9mIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMKdXNlZC4gIElmIHlvdSBhcmUgdXNpbmcgbGF0aW4xIFZpbSB3aWxsIHVzZSB0cmFuc2xpdGVyYXRlZCAocm9tYW5pemVkKSBZaWRkaXNoCmluc3RlYWQuICBJZiB5b3Ugd2FudCB0byB1c2UgdHJhbnNsaXRlcmF0ZWQgWWlkZGlzaCB3aXRoIHV0Zi04IHVzZSAieWktdHIiLgpJbiBhIHRhYmxlOgoJJ2VuY29kaW5nJwknc3BlbGxsYW5nJwoJdXRmLTgJCXlpCQlZaWRkaXNoCglsYXRpbjEJCXlpCQl0cmFuc2xpdGVyYXRlZCBZaWRkaXNoCgl1dGYtOAkJeWktdHIJCXRyYW5zbGl0ZXJhdGVkIFlpZGRpc2gKCgkJCQkJCQkqc3BlbGwtY2prKgpDaGluZXNlLCBKYXBhbmVzZSBhbmQgb3RoZXIgRWFzdCBBc2lhbiBjaGFyYWN0ZXJzIGFyZSBub3JtYWxseSBtYXJrZWQgYXMKZXJyb3JzLCBiZWNhdXNlIHNwZWxsIGNoZWNraW5nIG9mIHRoZXNlIGNoYXJhY3RlcnMgaXMgbm90IHN1cHBvcnRlZC4gSWYKJ3NwZWxsbGFuZycgaW5jbHVkZXMgImNqayIsIHRoZXNlIGNoYXJhY3RlcnMgYXJlIG5vdCBtYXJrZWQgYXMgZXJyb3JzLiAgVGhpcwppcyB1c2VmdWwgd2hlbiBlZGl0aW5nIHRleHQgd2l0aCBzcGVsbCBjaGVja2luZyB3aGlsZSBzb21lIEFzaWFuIHdvcmRzIGFyZQpwcmVzZW50LgoKClNQRUxMIEZJTEVTCQkJCQkJKnNwZWxsLWxvYWQqCgpWaW0gc2VhcmNoZXMgZm9yIHNwZWxsIGZpbGVzIGluIHRoZSAic3BlbGwiIHN1YmRpcmVjdG9yeSBvZiB0aGUgZGlyZWN0b3JpZXMgaW4KJ3J1bnRpbWVwYXRoJy4gIFRoZSBuYW1lIGlzOiBMTC5FRUUuc3BsLCB3aGVyZToKCUxMCXRoZSBsYW5ndWFnZSBuYW1lCglFRUUJdGhlIHZhbHVlIG9mICdlbmNvZGluZycKClRoZSB2YWx1ZSBmb3IgIkxMIiBjb21lcyBmcm9tICdzcGVsbGxhbmcnLCBidXQgZXhjbHVkZXMgdGhlIHJlZ2lvbiBuYW1lLgpFeGFtcGxlczoKCSdzcGVsbGxhbmcnCUxMIH4KCWVuX3VzCQllbgoJZW4tcmFyZQkJZW4tcmFyZQoJbWVkaWNhbF9jYQltZWRpY2FsCgpPbmx5IHRoZSBmaXJzdCBmaWxlIGlzIGxvYWRlZCwgdGhlIG9uZSB0aGF0IGlzIGZpcnN0IGluICdydW50aW1lcGF0aCcuICBJZgp0aGlzIHN1Y2NlZWRzIHRoZW4gYWRkaXRpb25hbGx5IGZpbGVzIHdpdGggdGhlIG5hbWUgTEwuRUVFLmFkZC5zcGwgYXJlIGxvYWRlZC4KQWxsIHRoZSBvbmVzIHRoYXQgYXJlIGZvdW5kIGFyZSB1c2VkLgoKSWYgbm8gc3BlbGwgZmlsZSBpcyBmb3VuZCB0aGUgfFNwZWxsRmlsZU1pc3Npbmd8IGF1dG9jb21tYW5kIGV2ZW50IGlzCnRyaWdnZXJlZC4gIFRoaXMgbWF5IHRyaWdnZXIgdGhlIHxzcGVsbGZpbGUudmltfCBwbHVnaW4gdG8gb2ZmZXIgeW91CmRvd25sb2FkaW5nIHRoZSBzcGVsbCBmaWxlLgoKQWRkaXRpb25hbGx5LCB0aGUgZmlsZXMgcmVsYXRlZCB0byB0aGUgbmFtZXMgaW4gJ3NwZWxsZmlsZScgYXJlIGxvYWRlZC4gIFRoZXNlCmFyZSB0aGUgZmlsZXMgdGhhdCB8emd8IGFuZCB8end8IGFkZCBnb29kIGFuZCB3cm9uZyB3b3JkcyB0by4KCkV4Y2VwdGlvbnM6Ci0gVmltIHVzZXMgImxhdGluMSIgd2hlbiAnZW5jb2RpbmcnIGlzICJpc28tODg1OS0xNSIuICBUaGUgZXVybyBzaWduIGRvZXNuJ3QKICBtYXR0ZXIgZm9yIHNwZWxsaW5nLgotIFdoZW4gbm8gc3BlbGwgZmlsZSBmb3IgJ2VuY29kaW5nJyBpcyBmb3VuZCAiYXNjaWkiIGlzIHRyaWVkLiAgVGhpcyBvbmx5CiAgd29ya3MgZm9yIGxhbmd1YWdlcyB3aGVyZSBuZWFybHkgYWxsIHdvcmRzIGFyZSBBU0NJSSwgc3VjaCBhcyBFbmdsaXNoLiAgSXQKICBoZWxwcyB3aGVuICdlbmNvZGluZycgaXMgbm90ICJsYXRpbjEiLCBzdWNoIGFzIGlzby04ODU5LTIsIGFuZCBFbmdsaXNoIHRleHQKICBpcyBiZWluZyBlZGl0ZWQuICBGb3IgdGhlICIuYWRkIiBmaWxlcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBmb3VuZCBtYWluCiAgc3BlbGwgZmlsZSBpcyB1c2VkLgoKRm9yIGV4YW1wbGUsIHdpdGggdGhlc2UgdmFsdWVzOgoJJ3J1bnRpbWVwYXRoJyBpcyAifi8udmltLC91c3Ivc2hhcmUvdmltNzAsfi8udmltL2FmdGVyIgoJJ2VuY29kaW5nJyAgICBpcyAiaXNvLTg4NTktMiIKCSdzcGVsbGxhbmcnICAgaXMgInBsIgoKVmltIHdpbGwgbG9vayBmb3I6CjEuIH4vLnZpbS9zcGVsbC9wbC5pc28tODg1OS0yLnNwbAoyLiAvdXNyL3NoYXJlL3ZpbTcwL3NwZWxsL3BsLmlzby04ODU5LTIuc3BsCjMuIH4vLnZpbS9zcGVsbC9wbC5pc28tODg1OS0yLmFkZC5zcGwKNC4gL3Vzci9zaGFyZS92aW03MC9zcGVsbC9wbC5pc28tODg1OS0yLmFkZC5zcGwKNS4gfi8udmltL2FmdGVyL3NwZWxsL3BsLmlzby04ODU5LTIuYWRkLnNwbAoKVGhpcyBhc3N1bWVzIDEuIGlzIG5vdCBmb3VuZCBhbmQgMi4gaXMgZm91bmQuCgpJZiAnZW5jb2RpbmcnIGlzICJsYXRpbjEiIFZpbSB3aWxsIGxvb2sgZm9yOgoxLiB+Ly52aW0vc3BlbGwvcGwubGF0aW4xLnNwbAoyLiAvdXNyL3NoYXJlL3ZpbTcwL3NwZWxsL3BsLmxhdGluMS5zcGwKMy4gfi8udmltL2FmdGVyL3NwZWxsL3BsLmxhdGluMS5zcGwKNC4gfi8udmltL3NwZWxsL3BsLmFzY2lpLnNwbAo1LiAvdXNyL3NoYXJlL3ZpbTcwL3NwZWxsL3BsLmFzY2lpLnNwbAo2LiB+Ly52aW0vYWZ0ZXIvc3BlbGwvcGwuYXNjaWkuc3BsCgpUaGlzIGFzc3VtZXMgbm9uZSBvZiB0aGVtIGFyZSBmb3VuZCAoUG9saXNoIGRvZXNuJ3QgbWFrZSBzZW5zZSB3aGVuIGxlYXZpbmcKb3V0IHRoZSBub24tQVNDSUkgY2hhcmFjdGVycykuCgpTcGVsbGluZyBmb3IgRUJDRElDIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLgoKQSBzcGVsbCBmaWxlIG1pZ2h0IG5vdCBiZSBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgJ2VuY29kaW5nJy4gIFNlZQp8c3BlbGwtbWtzcGVsbHwgYWJvdXQgaG93IHRvIGNyZWF0ZSBhIHNwZWxsIGZpbGUuICBDb252ZXJ0aW5nIGEgc3BlbGwgZmlsZQp3aXRoICJpY29udiIgd2lsbCBOT1Qgd29yayEKCk5vdGU6IG9uIFZNUyAiLntlbmN9LnNwbCIgaXMgY2hhbmdlZCB0byAiX3tlbmN9LnNwbCIgdG8gYXZvaWQgdHJvdWJsZSB3aXRoCmZpbGVuYW1lcy4KCgkJCQkJCSAgICAqc3BlbGwtc3VnLWZpbGUqICpFNzgxKgpJZiB0aGVyZSBpcyBhIGZpbGUgd2l0aCBleGFjdGx5IHRoZSBzYW1lIG5hbWUgYXMgdGhlICIuc3BsIiBmaWxlIGJ1dCBlbmRpbmcgaW4KIi5zdWciLCB0aGF0IGZpbGUgd2lsbCBiZSB1c2VkIGZvciBnaXZpbmcgYmV0dGVyIHN1Z2dlc3Rpb25zLiAgSXQgaXNuJ3QgbG9hZGVkCmJlZm9yZSBzdWdnZXN0aW9ucyBhcmUgbWFkZSB0byByZWR1Y2UgbWVtb3J5IHVzZS4KCgkJCQkgICAgKkU3NTgqICpFNzU5KiAqRTc3OCogKkU3NzkqICpFNzgwKiAqRTc4MioKV2hlbiBsb2FkaW5nIGEgc3BlbGwgZmlsZSBWaW0gY2hlY2tzIHRoYXQgaXQgaXMgcHJvcGVybHkgZm9ybWF0dGVkLiAgSWYgeW91CmdldCBhbiBlcnJvciB0aGUgZmlsZSBtYXkgYmUgdHJ1bmNhdGVkLCBtb2RpZmllZCBvciBpbnRlbmRlZCBmb3IgYW5vdGhlciBWaW0KdmVyc2lvbi4KCgpTUEVMTEZJTEUgQ0xFQU5VUAkJCQkJKnNwZWxsZmlsZS1jbGVhbnVwKgoKVGhlIHx6d3wgY29tbWFuZCB0dXJucyBleGlzdGluZyBlbnRyaWVzIGluICdzcGVsbGZpbGUnIGludG8gY29tbWVudCBsaW5lcy4KVGhpcyBhdm9pZHMgaGF2aW5nIHRvIHdyaXRlIGEgbmV3IGZpbGUgZXZlcnkgdGltZSwgYnV0IHJlc3VsdHMgaW4gdGhlIGZpbGUKb25seSBnZXR0aW5nIGxvbmdlciwgbmV2ZXIgc2hvcnRlci4gIFRvIGNsZWFuIHVwIHRoZSBjb21tZW50IGxpbmVzIGluIGFsbAoiLmFkZCIgc3BlbGwgZmlsZXMgZG8gdGhpczogPgoJOnJ1bnRpbWUgc3BlbGwvY2xlYW5hZGQudmltCgpUaGlzIGRlbGV0ZXMgYWxsIGNvbW1lbnQgbGluZXMsIGV4Y2VwdCB0aGUgb25lcyB0aGF0IHN0YXJ0IHdpdGggIiMjIi4gIFVzZQoiIyMiIGxpbmVzIHRvIGFkZCBjb21tZW50cyB0aGF0IHlvdSB3YW50IHRvIGtlZXAuCgpZb3UgY2FuIGludm9rZSB0aGlzIHNjcmlwdCBhcyBvZnRlbiBhcyB5b3UgbGlrZS4gIEEgdmFyaWFibGUgaXMgcHJvdmlkZWQgdG8Kc2tpcCB1cGRhdGluZyBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjaGFuZ2VkIHJlY2VudGx5LiAgU2V0IGl0IHRvIHRoZSBudW1iZXIgb2YKc2Vjb25kcyB0aGF0IGhhcyBwYXNzZWQgc2luY2UgYSBmaWxlIHdhcyBjaGFuZ2VkIGJlZm9yZSBpdCB3aWxsIGJlIGNsZWFuZWQuCkZvciBleGFtcGxlLCB0byBjbGVhbiBvbmx5IGZpbGVzIHRoYXQgd2VyZSBub3QgY2hhbmdlZCBpbiB0aGUgbGFzdCBob3VyOiA+CiAgICAgIGxldCBnOnNwZWxsX2NsZWFuX2xpbWl0ID0gNjAgKiA2MApUaGUgZGVmYXVsdCBpcyBvbmUgc2Vjb25kLgoKCldPUkRTCgpWaW0gdXNlcyBhIGZpeGVkIG1ldGhvZCB0byByZWNvZ25pemUgYSB3b3JkLiAgVGhpcyBpcyBpbmRlcGVuZGVudCBvZgonaXNrZXl3b3JkJywgc28gdGhhdCBpdCBhbHNvIHdvcmtzIGluIGhlbHAgZmlsZXMgYW5kIGZvciBsYW5ndWFnZXMgdGhhdAppbmNsdWRlIGNoYXJhY3RlcnMgbGlrZSAnLScgaW4gJ2lza2V5d29yZCcuICBUaGUgd29yZCBjaGFyYWN0ZXJzIGRvIGRlcGVuZCBvbgonZW5jb2RpbmcnLgoKVGhlIHRhYmxlIHdpdGggd29yZCBjaGFyYWN0ZXJzIGlzIHN0b3JlZCBpbiB0aGUgbWFpbiAuc3BsIGZpbGUuICBUaGVyZWZvcmUgaXQKbWF0dGVycyB3aGF0IHRoZSBjdXJyZW50IGxvY2FsZSBpcyB3aGVuIGdlbmVyYXRpbmcgaXQhICBBIC5hZGQuc3BsIGZpbGUgZG9lcwpub3QgY29udGFpbiBhIHdvcmQgdGFibGUgdGhvdWdoLgoKRm9yIGEgd29yZCB0aGF0IHN0YXJ0cyB3aXRoIGEgZGlnaXQgdGhlIGRpZ2l0IGlzIGlnbm9yZWQsIHVubGVzcyB0aGUgd29yZCBhcyBhCndob2xlIGlzIHJlY29nbml6ZWQuICBUaHVzIGlmICIzRCIgaXMgYSB3b3JkIGFuZCAiRCIgaXMgbm90IHRoZW4gIjNEIiBpcwpyZWNvZ25pemVkIGFzIGEgd29yZCwgYnV0IGlmICIzRCIgaXMgbm90IGEgd29yZCB0aGVuIG9ubHkgdGhlICJEIiBpcyBtYXJrZWQgYXMKYmFkLiAgSGV4IG51bWJlcnMgaW4gdGhlIGZvcm0gMHgxMmFiIGFuZCAwWDEyQUIgYXJlIHJlY29nbml6ZWQuCgoKV09SRCBDT01CSU5BVElPTlMKCkl0IGlzIHBvc3NpYmxlIHRvIHNwZWxsLWNoZWNrIHdvcmRzIHRoYXQgaW5jbHVkZSBhIHNwYWNlLiAgVGhpcyBpcyB1c2VkIHRvCnJlY29nbml6ZSB3b3JkcyB0aGF0IGFyZSBpbnZhbGlkIHdoZW4gdXNlZCBieSB0aGVtc2VsdmVzLCBlLmcuIGZvciAiZXQgYWwuIi4KSXQgY2FuIGFsc28gYmUgdXNlZCB0byByZWNvZ25pemUgInRoZSB0aGUiIGFuZCBoaWdobGlnaHQgaXQuCgpUaGUgbnVtYmVyIG9mIHNwYWNlcyBpcyBpcnJlbGV2YW50LiAgSW4gbW9zdCBjYXNlcyBhIGxpbmUgYnJlYWsgbWF5IGFsc28KYXBwZWFyLiAgSG93ZXZlciwgdGhpcyBtYWtlcyBpdCBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hlcmUgdG8gc3RhcnQgY2hlY2tpbmcKZm9yIHNwZWxsaW5nIG1pc3Rha2VzLiAgV2hlbiB5b3UgbWFrZSBhIGNoYW5nZSB0byBvbmUgbGluZSBhbmQgb25seSB0aGF0IGxpbmUKaXMgcmVkcmF3biBWaW0gd29uJ3QgbG9vayBpbiB0aGUgcHJldmlvdXMgbGluZSwgdGh1cyB3aGVuICJldCIgaXMgYXQgdGhlIGVuZApvZiB0aGUgcHJldmlvdXMgbGluZSAiYWwuIiB3aWxsIGJlIGZsYWdnZWQgYXMgYW4gZXJyb3IuICBBbmQgd2hlbiB5b3UgdHlwZQoidGhlPENSPnRoZSIgdGhlIGhpZ2hsaWdodGluZyBkb2Vzbid0IGFwcGVhciB1bnRpbCB0aGUgZmlyc3QgbGluZSBpcyByZWRyYXduLgpVc2UgfENUUkwtTHwgdG8gcmVkcmF3IHJpZ2h0IGF3YXkuICAiW3MiIHdpbGwgYWxzbyBzdG9wIGF0IGEgd29yZCBjb21iaW5hdGlvbgp3aXRoIGEgbGluZSBicmVhay4KCldoZW4gZW5jb3VudGVyaW5nIGEgbGluZSBicmVhayBWaW0gc2tpcHMgY2hhcmFjdGVycyBzdWNoIGFzICcqJywgJz4nIGFuZCAnIicsCnNvIHRoYXQgY29tbWVudHMgaW4gQywgc2hlbGwgYW5kIFZpbSBjb2RlIGNhbiBiZSBzcGVsbCBjaGVja2VkLgoKClNZTlRBWCBISUdITElHSFRJTkcJCQkJCSpzcGVsbC1zeW50YXgqCgpGaWxlcyB0aGF0IHVzZSBzeW50YXggaGlnaGxpZ2h0aW5nIGNhbiBzcGVjaWZ5IHdoZXJlIHNwZWxsIGNoZWNraW5nIHNob3VsZCBiZQpkb25lOgoKMS4gIGV2ZXJ5d2hlcmUJCQkgICBkZWZhdWx0CjIuICBpbiBzcGVjaWZpYyBpdGVtcwkJICAgdXNlICJjb250YWlucz1AU3BlbGwiCjMuICBldmVyeXdoZXJlIGJ1dCBzcGVjaWZpYyBpdGVtcyAgdXNlICJjb250YWlucz1ATm9TcGVsbCIKCkZvciB0aGUgc2Vjb25kIG1ldGhvZCBhZGRpbmcgdGhlIEBOb1NwZWxsIGNsdXN0ZXIgd2lsbCBkaXNhYmxlIHNwZWxsIGNoZWNraW5nCmFnYWluLiAgVGhpcyBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIGFkZCBAU3BlbGwgdG8gdGhlIGNvbW1lbnRzIG9mIGEKcHJvZ3JhbSwgYW5kIGFkZCBATm9TcGVsbCBmb3IgaXRlbXMgdGhhdCBzaG91bGRuJ3QgYmUgY2hlY2tlZC4KQWxzbyBzZWUgfDpzeW4tc3BlbGx8IGZvciB0ZXh0IHRoYXQgaXMgbm90IGluIGEgc3ludGF4IGl0ZW0uCgoKVklNIFNDUklQVFMKCklmIHlvdSB3YW50IHRvIHdyaXRlIGEgVmltIHNjcmlwdCB0aGF0IGRvZXMgc29tZXRoaW5nIHdpdGggc3BlbGxpbmcsIHlvdSBtYXkKZmluZCB0aGVzZSBmdW5jdGlvbnMgdXNlZnVsOgoKICAgIHNwZWxsYmFkd29yZCgpCWZpbmQgYmFkbHkgc3BlbGxlZCB3b3JkIGF0IHRoZSBjdXJzb3IKICAgIHNwZWxsc3VnZ2VzdCgpCWdldCBsaXN0IG9mIHNwZWxsaW5nIHN1Z2dlc3Rpb25zCiAgICBzb3VuZGZvbGQoKQkJZ2V0IHRoZSBzb3VuZC1hLWxpa2UgdmVyc2lvbiBvZiBhIHdvcmQKCgpTRVRUSU5HICdzcGVsbGNhcGNoZWNrJyBBVVRPTUFUSUNBTExZCQkJKnNldC1zcGMtYXV0byoKCkFmdGVyIHRoZSAnc3BlbGxsYW5nJyBvcHRpb24gaGFzIGJlZW4gc2V0IHN1Y2Nlc3NmdWxseSwgVmltIHdpbGwgc291cmNlIHRoZQpmaWxlcyAic3BlbGwvTEFORy52aW0iIGluICdydW50aW1lcGF0aCcuICAiTEFORyIgaXMgdGhlIHZhbHVlIG9mICdzcGVsbGxhbmcnCnVwIHRvIHRoZSBmaXJzdCBjb21tYSwgZG90IG9yIHVuZGVyc2NvcmUuICBUaGlzIGNhbiBiZSB1c2VkIHRvIHNldCBvcHRpb25zCnNwZWNpZmljYWxseSBmb3IgdGhlIGxhbmd1YWdlLCBlc3BlY2lhbGx5ICdzcGVsbGNhcGNoZWNrJy4KClRoZSBkaXN0cmlidXRpb24gaW5jbHVkZXMgYSBmZXcgb2YgdGhlc2UgZmlsZXMuICBVc2UgdGhpcyBjb21tYW5kIHRvIHNlZSB3aGF0CnRoZXkgZG86ID4KCTpuZXh0ICRWSU1SVU5USU1FL3NwZWxsLyoudmltCgpOb3RlIHRoYXQgdGhlIGRlZmF1bHQgc2NyaXB0cyBkb24ndCBzZXQgJ3NwZWxsY2FwY2hlY2snIGlmIGl0IHdhcyBjaGFuZ2VkIGZyb20KdGhlIGRlZmF1bHQgdmFsdWUuICBUaGlzIGFzc3VtZXMgdGhlIHVzZXIgcHJlZmVycyBhbm90aGVyIHZhbHVlIHRoZW4uCgoKRE9VQkxFIFNDT1JJTkcJCQkJCQkqc3BlbGwtZG91YmxlLXNjb3JpbmcqCgpUaGUgJ3NwZWxsc3VnZ2VzdCcgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCAiZG91YmxlIiBzY29yaW5nLiAgVGhpcwptZWNoYW5pc20gaXMgYmFzZWQgb24gdGhlIHByaW5jaXBsZSB0aGF0IHRoZXJlIGFyZSB0d28ga2luZHMgb2Ygc3BlbGxpbmcKbWlzdGFrZXM6CgoxLiBZb3Uga25vdyBob3cgdG8gc3BlbGwgdGhlIHdvcmQsIGJ1dCBtaXN0eXBlIHNvbWV0aGluZy4gIFRoaXMgcmVzdWx0cyBpbiBhCiAgIHNtYWxsIGVkaXRpbmcgZGlzdGFuY2UgKGNoYXJhY3RlciBzd2FwcGVkL29taXR0ZWQvaW5zZXJ0ZWQpIGFuZCBwb3NzaWJseSBhCiAgIHdvcmQgdGhhdCBzb3VuZHMgY29tcGxldGVseSBkaWZmZXJlbnQuCgoyLiBZb3UgZG9uJ3Qga25vdyBob3cgdG8gc3BlbGwgdGhlIHdvcmQgYW5kIHR5cGUgc29tZXRoaW5nIHRoYXQgc291bmRzIHJpZ2h0LgogICBUaGUgZWRpdCBkaXN0YW5jZSBjYW4gYmUgYmlnIGJ1dCB0aGUgd29yZCBpcyBzaW1pbGFyIGFmdGVyIHNvdW5kLWZvbGRpbmcuCgpTaW5jZSBzY29yZXMgZm9yIHRoZXNlIHR3byBtaXN0YWtlcyB3aWxsIGJlIHZlcnkgZGlmZmVyZW50IHdlIHVzZSBhIGxpc3QKZm9yIGVhY2ggYW5kIG1peCB0aGVtLgoKVGhlIHNvdW5kLWZvbGRpbmcgaXMgc2xvdyBhbmQgcGVvcGxlIHRoYXQga25vdyB0aGUgbGFuZ3VhZ2Ugd29uJ3QgbWFrZSB0aGUKc2Vjb25kIGtpbmQgb2YgbWlzdGFrZXMuICBUaGVyZWZvcmUgJ3NwZWxsc3VnZ2VzdCcgY2FuIGJlIHNldCB0byBzZWxlY3QgdGhlCnByZWZlcnJlZCBtZXRob2QgZm9yIHNjb3JpbmcgdGhlIHN1Z2dlc3Rpb25zLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIEdlbmVyYXRpbmcgYSBzcGVsbCBmaWxlCQkJCSpzcGVsbC1ta3NwZWxsKgoKVmltIHVzZXMgYSBiaW5hcnkgZmlsZSBmb3JtYXQgZm9yIHNwZWxsaW5nLiAgVGhpcyBncmVhdGx5IHNwZWVkcyB1cCBsb2FkaW5nCnRoZSB3b3JkIGxpc3QgYW5kIGtlZXBzIGl0IHNtYWxsLgoJCQkJCQkgICAgKi5hZmYqICouZGljKiAqTXlzcGVsbCoKWW91IGNhbiBjcmVhdGUgYSBWaW0gc3BlbGwgZmlsZSBmcm9tIHRoZSAuYWZmIGFuZCAuZGljIGZpbGVzIHRoYXQgTXlzcGVsbAp1c2VzLiAgTXlzcGVsbCBpcyB1c2VkIGJ5IE9wZW5PZmZpY2Uub3JnIGFuZCBNb3ppbGxhLiBUaGUgT3Blbk9mZmljZSAub3h0IApmaWxlcyBhcmUgemlwIGZpbGVzIHdoaWNoIGNvbnRhaW4gdGhlIC5hZmYgYW5kIC5kaWMgZmlsZXMuIFlvdSBzaG91bGQgYmUgYWJsZQp0byBmaW5kIHRoZW0gaGVyZToKCWh0dHA6Ly9leHRlbnNpb25zLnNlcnZpY2VzLm9wZW5vZmZpY2Uub3JnL2RpY3Rpb25hcnkKVGhlIG9sZGVyLCBPcGVuT2ZmaWNlIDIgZmlsZXMgbWF5IGJlIHVzZWQgaWYgdGhpcyBkb2Vzbid0IHdvcms6CglodHRwOi8vd2lraS5zZXJ2aWNlcy5vcGVub2ZmaWNlLm9yZy93aWtpL0RpY3Rpb25hcmllcwpZb3UgY2FuIGFsc28gdXNlIGEgcGxhaW4gd29yZCBsaXN0LiAgVGhlIHJlc3VsdHMgYXJlIHRoZSBzYW1lLCB0aGUgY2hvaWNlCmRlcGVuZHMgb24gd2hhdCB3b3JkIGxpc3RzIHlvdSBjYW4gZmluZC4KCklmIHlvdSBpbnN0YWxsIEFhcCAoZnJvbSB3d3cuYS1hLXAub3JnKSB5b3UgY2FuIHVzZSB0aGUgcmVjaXBlcyBpbiB0aGUKcnVudGltZS9zcGVsbC8/Py8gZGlyZWN0b3JpZXMuICBBYXAgd2lsbCB0YWtlIGNhcmUgb2YgZG93bmxvYWRpbmcgdGhlIGZpbGVzLAphcHBseSBwYXRjaGVzIG5lZWRlZCBmb3IgVmltIGFuZCBidWlsZCB0aGUgLnNwbCBmaWxlLgoKTWFrZSBzdXJlIHlvdXIgY3VycmVudCBsb2NhbGUgaXMgc2V0IHByb3Blcmx5LCBvdGhlcndpc2UgVmltIGRvZXNuJ3Qga25vdyB3aGF0CmNoYXJhY3RlcnMgYXJlIHVwcGVyL2xvd2VyIGNhc2UgbGV0dGVycy4gIElmIHRoZSBsb2NhbGUgaXNuJ3QgYXZhaWxhYmxlIChlLmcuLAp3aGVuIHVzaW5nIGFuIE1TLVdpbmRvd3MgY29kZXBhZ2Ugb24gVW5peCkgYWRkIHRhYmxlcyB0byB0aGUgLmFmZiBmaWxlCnxzcGVsbC1hZmZpeC1jaGFyc3wuICBJZiB0aGUgLmFmZiBmaWxlIGRvZXNuJ3QgZGVmaW5lIGEgdGFibGUgdGhlbiB0aGUgd29yZAp0YWJsZSBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBzcGVsbGluZyBpcyB1c2VkLiAgSWYgc3BlbGxpbmcgaXMgbm90IGFjdGl2ZQp0aGVuIFZpbSB3aWxsIHRyeSB0byBndWVzcy4KCgkJCQkJCQkqOm1rc3AqICo6bWtzcGVsbCoKOm1rc3BbZWxsXVshXSBbLWFzY2lpXSB7b3V0bmFtZX0ge2lubmFtZX0gLi4uCgkJCUdlbmVyYXRlIGEgVmltIHNwZWxsIGZpbGUgZnJvbSB3b3JkIGxpc3RzLiAgRXhhbXBsZTogPgoJCTpta3NwZWxsIC90bXAvbmwgbmxfTkwud29yZHMKPAkJCQkJCQkJKkU3NTEqCgkJCVdoZW4ge291dG5hbWV9IGVuZHMgaW4gIi5zcGwiIGl0IGlzIHVzZWQgYXMgdGhlIG91dHB1dAoJCQlmaWxlIG5hbWUuICBPdGhlcndpc2UgaXQgc2hvdWxkIGJlIGEgbGFuZ3VhZ2UgbmFtZSwKCQkJc3VjaCBhcyAiZW4iLCB3aXRob3V0IHRoZSByZWdpb24gbmFtZS4gIFRoZSBmaWxlCgkJCXdyaXR0ZW4gd2lsbCBiZSAie291dG5hbWV9LntlbmNvZGluZ30uc3BsIiwgd2hlcmUKCQkJe2VuY29kaW5nfSBpcyB0aGUgdmFsdWUgb2YgdGhlICdlbmNvZGluZycgb3B0aW9uLgoKCQkJV2hlbiB0aGUgb3V0cHV0IGZpbGUgYWxyZWFkeSBleGlzdHMgWyFdIG11c3QgYmUgdXNlZAoJCQl0byBvdmVyd3JpdGUgaXQuCgoJCQlXaGVuIHRoZSBbLWFzY2lpXSBhcmd1bWVudCBpcyBwcmVzZW50LCB3b3JkcyB3aXRoCgkJCW5vbi1hc2NpaSBjaGFyYWN0ZXJzIGFyZSBza2lwcGVkLiAgVGhlIHJlc3VsdGluZyBmaWxlCgkJCWVuZHMgaW4gImFzY2lpLnNwbCIuCgoJCQlUaGUgaW5wdXQgY2FuIGJlIHRoZSBNeXNwZWxsIGZvcm1hdCBmaWxlcyB7aW5uYW1lfS5hZmYKCQkJYW5kIHtpbm5hbWV9LmRpYy4gIElmIHtpbm5hbWV9LmFmZiBkb2VzIG5vdCBleGlzdCB0aGVuCgkJCXtpbm5hbWV9IGlzIHVzZWQgYXMgdGhlIGZpbGUgbmFtZSBvZiBhIHBsYWluIHdvcmQKCQkJbGlzdC4KCgkJCU11bHRpcGxlIHtpbm5hbWV9IGFyZ3VtZW50cyBjYW4gYmUgZ2l2ZW4gdG8gY29tYmluZQoJCQlyZWdpb25zIGludG8gb25lIFZpbSBzcGVsbCBmaWxlLiAgRXhhbXBsZTogPgoJCTpta3NwZWxsIH4vLnZpbS9zcGVsbC9lbiAvdG1wL2VuX1VTIC90bXAvZW5fQ0EgL3RtcC9lbl9BVQo8CQkJVGhpcyBjb21iaW5lcyB0aGUgRW5nbGlzaCB3b3JkIGxpc3RzIGZvciBVUywgQ0EgYW5kIEFVCgkJCWludG8gb25lIGVuLnNwbCBmaWxlLgoJCQlVcCB0byBlaWdodCByZWdpb25zIGNhbiBiZSBjb21iaW5lZC4gKkU3NTQqICpFNzU1KgoJCQlUaGUgUkVQIGFuZCBTQUwgaXRlbXMgb2YgdGhlIGZpcnN0IC5hZmYgZmlsZSB3aGVyZQoJCQl0aGV5IGFwcGVhciBhcmUgdXNlZC4gfHNwZWxsLVJFUHwgfHNwZWxsLVNBTHwKCQkJCQkJCQkqRTg0NSoKCQkJVGhpcyBjb21tYW5kIHVzZXMgYSBsb3Qgb2YgbWVtb3J5LCByZXF1aXJlZCB0byBmaW5kCgkJCXRoZSBvcHRpbWFsIHdvcmQgdHJlZSAoUG9saXNoLCBJdGFsaWFuIGFuZCBIdW5nYXJpYW4KCQkJcmVxdWlyZSBzZXZlcmFsIGh1bmRyZWQgTWJ5dGUpLiAgVGhlIGZpbmFsIHJlc3VsdCB3aWxsCgkJCWJlIG11Y2ggc21hbGxlciwgYmVjYXVzZSBjb21wcmVzc2lvbiBpcyB1c2VkLiAgVG8KCQkJYXZvaWQgcnVubmluZyBvdXQgb2YgbWVtb3J5IGNvbXByZXNzaW9uIHdpbGwgYmUgZG9uZQoJCQlub3cgYW5kIHRoZW4uICBUaGlzIGNhbiBiZSB0dW5lZCB3aXRoIHRoZSAnbWtzcGVsbG1lbScKCQkJb3B0aW9uLgoKCQkJQWZ0ZXIgdGhlIHNwZWxsIGZpbGUgd2FzIHdyaXR0ZW4gYW5kIGl0IHdhcyBiZWluZyB1c2VkCgkJCWluIGEgYnVmZmVyIGl0IHdpbGwgYmUgcmVsb2FkZWQgYXV0b21hdGljYWxseS4KCjpta3NwW2VsbF0gWy1hc2NpaV0ge25hbWV9LntlbmN9LmFkZAoJCQlMaWtlICI6bWtzcGVsbCIgYWJvdmUsIHVzaW5nIHtuYW1lfS57ZW5jfS5hZGQgYXMgdGhlCgkJCWlucHV0IGZpbGUgYW5kIHByb2R1Y2luZyBhbiBvdXRwdXQgZmlsZSBpbiB0aGUgc2FtZQoJCQlkaXJlY3RvcnkgdGhhdCBoYXMgIi5zcGwiIGFwcGVuZGVkLgoKOm1rc3BbZWxsXSBbLWFzY2lpXSB7bmFtZX0KCQkJTGlrZSAiOm1rc3BlbGwiIGFib3ZlLCB1c2luZyB7bmFtZX0gYXMgdGhlIGlucHV0IGZpbGUKCQkJYW5kIHByb2R1Y2luZyBhbiBvdXRwdXQgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkKCQkJdGhhdCBoYXMgIi57ZW5jfS5zcGwiIGFwcGVuZGVkLgoKVmltIHdpbGwgcmVwb3J0IHRoZSBudW1iZXIgb2YgZHVwbGljYXRlIHdvcmRzLiAgVGhpcyBtaWdodCBiZSBhIG1pc3Rha2UgaW4gdGhlCmxpc3Qgb2Ygd29yZHMuICBCdXQgc29tZXRpbWVzIGl0IGlzIHVzZWQgdG8gaGF2ZSBkaWZmZXJlbnQgcHJlZml4ZXMgYW5kCnN1ZmZpeGVzIGZvciB0aGUgc2FtZSBiYXNpYyB3b3JkIHRvIGF2b2lkIHRoZW0gY29tYmluaW5nIChlLmcuIEN6ZWNoIHVzZXMKdGhpcykuICBJZiB5b3Ugd2FudCBWaW0gdG8gcmVwb3J0IGFsbCBkdXBsaWNhdGUgd29yZHMgc2V0IHRoZSAndmVyYm9zZScKb3B0aW9uLgoKU2luY2UgeW91IG1pZ2h0IHdhbnQgdG8gY2hhbmdlIGEgTXlzcGVsbCB3b3JkIGxpc3QgZm9yIHVzZSB3aXRoIFZpbSB0aGUKZm9sbG93aW5nIHByb2NlZHVyZSBpcyByZWNvbW1lbmRlZDoKCjEuIE9idGFpbiB0aGUgeHhfWVkuYWZmIGFuZCB4eF9ZWS5kaWMgZmlsZXMgZnJvbSBNeXNwZWxsLgoyLiBNYWtlIGEgY29weSBvZiB0aGVzZSBmaWxlcyB0byB4eF9ZWS5vcmlnLmFmZiBhbmQgeHhfWVkub3JpZy5kaWMuCjMuIENoYW5nZSB0aGUgeHhfWVkuYWZmIGFuZCB4eF9ZWS5kaWMgZmlsZXMgdG8gcmVtb3ZlIGJhZCB3b3JkcywgYWRkIG1pc3NpbmcKICAgd29yZHMsIGRlZmluZSB3b3JkIGNoYXJhY3RlcnMgd2l0aCBGT0wvTE9XL1VQUCwgZXRjLiAgVGhlIGRpc3RyaWJ1dGVkCiAgICIqLmRpZmYiIGZpbGVzIGNhbiBiZSB1c2VkLgo0LiBTdGFydCBWaW0gd2l0aCB0aGUgcmlnaHQgbG9jYWxlIGFuZCB1c2UgfDpta3NwZWxsfCB0byBnZW5lcmF0ZSB0aGUgVmltCiAgIHNwZWxsIGZpbGUuCjUuIFRyeSBvdXQgdGhlIHNwZWxsIGZpbGUgd2l0aCAiOnNldCBzcGVsbCBzcGVsbGxhbmc9eHgiIGlmIHlvdSB3cm90ZSBpdCBpbgogICBhIHNwZWxsIGRpcmVjdG9yeSBpbiAncnVudGltZXBhdGgnLCBvciAiOnNldCBzcGVsbGxhbmc9eHguZW5jLnNwbCIgaWYgeW91CiAgIHdyb3RlIGl0IHNvbWV3aGVyZSBlbHNlLgoKV2hlbiB0aGUgTXlzcGVsbCBmaWxlcyBhcmUgdXBkYXRlZCB5b3UgY2FuIG1lcmdlIHRoZSBkaWZmZXJlbmNlczoKMS4gT2J0YWluIHRoZSBuZXcgTXlzcGVsbCBmaWxlcyBhcyB4eF9ZWS5uZXcuYWZmIGFuZCB4eF9VVS5uZXcuZGljLgoyLiBVc2UgVmltZGlmZiB0byBzZWUgd2hhdCBjaGFuZ2VkOiA+Cgl2aW1kaWZmIHh4X1lZLm9yaWcuZGljIHh4X1lZLm5ldy5kaWMKMy4gVGFrZSBvdmVyIHRoZSBjaGFuZ2VzIHlvdSBsaWtlIGluIHh4X1lZLmRpYy4KICAgWW91IG1heSBhbHNvIG5lZWQgdG8gY2hhbmdlIHh4X1lZLmFmZi4KNC4gUmVuYW1lIHh4X1lZLm5ldy5kaWMgdG8geHhfWVkub3JpZy5kaWMgYW5kIHh4X1lZLm5ldy5hZmYgdG8geHhfWVkubmV3LmFmZi4KCgpTUEVMTCBGSUxFIFZFUlNJT05TCQkJCQkqRTc3MCogKkU3NzEqICpFNzcyKgoKU3BlbGwgY2hlY2tpbmcgaXMgYSByZWxhdGl2ZWx5IG5ldyBmZWF0dXJlIGluIFZpbSwgdGh1cyBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlCi5zcGwgZmlsZSBmb3JtYXQgd2lsbCBiZSBjaGFuZ2VkIHRvIHN1cHBvcnQgbW9yZSBsYW5ndWFnZXMuICBWaW0gd2lsbCBjaGVjawp0aGUgdmFsaWRpdHkgb2YgdGhlIHNwZWxsIGZpbGUgYW5kIHJlcG9ydCBhbnl0aGluZyB3cm9uZy4KCglFNzcxOiBPbGQgc3BlbGwgZmlsZSwgbmVlZHMgdG8gYmUgdXBkYXRlZCB+ClRoaXMgc3BlbGwgZmlsZSBpcyBvbGRlciB0aGFuIHlvdXIgVmltLiAgWW91IG5lZWQgdG8gdXBkYXRlIHRoZSAuc3BsIGZpbGUuCgoJRTc3MjogU3BlbGwgZmlsZSBpcyBmb3IgbmV3ZXIgdmVyc2lvbiBvZiBWaW0gfgpUaGlzIG1lYW5zIHRoZSBzcGVsbCBmaWxlIHdhcyBtYWRlIGZvciBhIGxhdGVyIHZlcnNpb24gb2YgVmltLiAgWW91IG5lZWQgdG8KdXBkYXRlIFZpbS4KCglFNzcwOiBVbnN1cHBvcnRlZCBzZWN0aW9uIGluIHNwZWxsIGZpbGUgfgpUaGlzIG1lYW5zIHRoZSBzcGVsbCBmaWxlIHdhcyBtYWRlIGZvciBhIGxhdGVyIHZlcnNpb24gb2YgVmltIGFuZCBjb250YWlucyBhCnNlY3Rpb24gdGhhdCBpcyByZXF1aXJlZCBmb3IgdGhlIHNwZWxsIGZpbGUgdG8gd29yay4gIEluIHRoaXMgY2FzZSBpdCdzCnByb2JhYmx5IGEgZ29vZCBpZGVhIHRvIHVwZ3JhZGUgeW91ciBWaW0uCgoKU1BFTEwgRklMRSBEVU1QCgpJZiBmb3Igc29tZSByZWFzb24geW91IHdhbnQgdG8gY2hlY2sgd2hhdCB3b3JkcyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50bHkKdXNlZCBzcGVsbGluZyBmaWxlcywgdXNlIHRoaXMgY29tbWFuZDoKCgkJCQkJCQkqOnNwZWxsZHVtcCogKjpzcGVsbGQqCjpzcGVsbGRbdW1wXQkJT3BlbiBhIG5ldyB3aW5kb3cgYW5kIGZpbGwgaXQgd2l0aCBhbGwgY3VycmVudGx5IHZhbGlkCgkJCXdvcmRzLiAgQ29tcG91bmQgd29yZHMgYXJlIG5vdCBpbmNsdWRlZC4KCQkJTm90ZTogRm9yIHNvbWUgbGFuZ3VhZ2VzIHRoZSByZXN1bHQgbWF5IGJlIGVub3Jtb3VzLAoJCQljYXVzaW5nIFZpbSB0byBydW4gb3V0IG9mIG1lbW9yeS4KCjpzcGVsbGRbdW1wXSEJCUxpa2UgIjpzcGVsbGR1bXAiIGFuZCBpbmNsdWRlIHRoZSB3b3JkIGNvdW50LiAgVGhpcyBpcwoJCQl0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSB3b3JkIHdhcyBmb3VuZCB3aGlsZQoJCQl1cGRhdGluZyB0aGUgc2NyZWVuLiAgV29yZHMgdGhhdCBhcmUgaW4gQ09NTU9OIGl0ZW1zCgkJCWdldCBhIHN0YXJ0aW5nIGNvdW50IG9mIDEwLgoKVGhlIGZvcm1hdCBvZiB0aGUgd29yZCBsaXN0IGlzIHVzZWQgfHNwZWxsLXdvcmRsaXN0LWZvcm1hdHwuICBZb3Ugc2hvdWxkIGJlCmFibGUgdG8gcmVhZCBpdCB3aXRoICI6bWtzcGVsbCIgdG8gZ2VuZXJhdGUgb25lIC5zcGwgZmlsZSB0aGF0IGluY2x1ZGVzIGFsbAp0aGUgd29yZHMuCgpXaGVuIGFsbCBlbnRyaWVzIHRvICdzcGVsbGxhbmcnIHVzZSB0aGUgc2FtZSByZWdpb25zIG9yIG5vIHJlZ2lvbnMgYXQgYWxsIHRoZW4KdGhlIHJlZ2lvbiBpbmZvcm1hdGlvbiBpcyBpbmNsdWRlZCBpbiB0aGUgZHVtcGVkIHdvcmRzLiAgT3RoZXJ3aXNlIG9ubHkgd29yZHMKZm9yIHRoZSBjdXJyZW50IHJlZ2lvbiBhcmUgaW5jbHVkZWQgYW5kIG5vICIvcmVnaW9ucyIgbGluZSBpcyBnZW5lcmF0ZWQuCgpDb21tZW50IGxpbmVzIHdpdGggdGhlIG5hbWUgb2YgdGhlIC5zcGwgZmlsZSBhcmUgdXNlZCBhcyBhIGhlYWRlciBhYm92ZSB0aGUKd29yZHMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBmcm9tIHRoYXQgLnNwbCBmaWxlLgoKClNQRUxMIEZJTEUgTUlTU0lORwkJKnNwZWxsLVNwZWxsRmlsZU1pc3NpbmcqICpzcGVsbGZpbGUudmltKgoKSWYgdGhlIHNwZWxsIGZpbGUgZm9yIHRoZSBsYW5ndWFnZSB5b3UgYXJlIHVzaW5nIGlzIG5vdCBhdmFpbGFibGUsIHlvdSB3aWxsCmdldCBhbiBlcnJvciBtZXNzYWdlLiAgQnV0IGlmIHRoZSAic3BlbGxmaWxlLnZpbSIgcGx1Z2luIGlzIGFjdGl2ZSBpdCB3aWxsCm9mZmVyIHlvdSB0byBkb3dubG9hZCB0aGUgc3BlbGwgZmlsZS4gIEp1c3QgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMsIGl0IHdpbGwKYXNrIHlvdSB3aGVyZSB0byB3cml0ZSB0aGUgZmlsZSAodGhlcmUgbXVzdCBiZSBhIHdyaXRhYmxlIGRpcmVjdG9yeSBpbgoncnVudGltZXBhdGgnIGZvciB0aGlzKS4KClRoZSBwbHVnaW4gaGFzIGEgZGVmYXVsdCBwbGFjZSB3aGVyZSB0byBsb29rIGZvciBzcGVsbCBmaWxlcywgb24gdGhlIFZpbSBmdHAKc2VydmVyLiAgSWYgeW91IHdhbnQgdG8gdXNlIGFub3RoZXIgbG9jYXRpb24gb3IgYW5vdGhlciBwcm90b2NvbCwgc2V0IHRoZQpnOnNwZWxsZmlsZV9VUkwgdmFyaWFibGUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0IGhvbGRzIHRoZSBzcGVsbCBmaWxlcy4gIFRoZQp8bmV0cnd8IHBsdWdpbiBpcyB1c2VkIGZvciBnZXR0aW5nIHRoZSBmaWxlLCBsb29rIHRoZXJlIGZvciB0aGUgc3BlY2lmaWMKc3ludGF4IG9mIHRoZSBVUkwuICBFeGFtcGxlOiA+CglsZXQgZzpzcGVsbGZpbGVfVVJMID0gJ2h0dHA6Ly9mdHAudmltLm9yZy92aW0vcnVudGltZS9zcGVsbCcKWW91IG1heSBuZWVkIHRvIGVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMuCgpUaGUgcGx1Z2luIHdpbGwgb25seSBhc2sgYWJvdXQgZG93bmxvYWRpbmcgYSBsYW5ndWFnZSBvbmNlLiAgSWYgeW91IHdhbnQgdG8KdHJ5IGFnYWluIGFueXdheSByZXN0YXJ0IFZpbSwgb3Igc2V0IGc6c3BlbGxmaWxlX1VSTCB0byBhbm90aGVyIHZhbHVlIChlLmcuLApwcmVwZW5kIGEgc3BhY2UpLgoKVG8gYXZvaWQgdXNpbmcgdGhlICJzcGVsbGZpbGUudmltIiBwbHVnaW4gZG8gdGhpcyBpbiB5b3VyIHZpbXJjIGZpbGU6ID4KCglsZXQgbG9hZGVkX3NwZWxsZmlsZV9wbHVnaW4gPSAxCgpJbnN0ZWFkIG9mIHVzaW5nIHRoZSBwbHVnaW4geW91IGNhbiBkZWZpbmUgYSB8U3BlbGxGaWxlTWlzc2luZ3wgYXV0b2NvbW1hbmQgdG8KaGFuZGxlIHRoZSBtaXNzaW5nIGZpbGUgeW91cnNlbGYuICBZb3UgY2FuIHVzZSBpdCBsaWtlIHRoaXM6ID4KCgk6YXUgU3BlbGxGaWxlTWlzc2luZyAqIGNhbGwgRG93bmxvYWRfc3BlbGxfZmlsZShleHBhbmQoJzxhbWF0Y2g+JykpCgpUaHVzIHRoZSA8YW1hdGNoPiBpdGVtIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBsYW5ndWFnZS4gIEFub3RoZXIgaW1wb3J0YW50CnZhbHVlIGlzICdlbmNvZGluZycsIHNpbmNlIGV2ZXJ5IGVuY29kaW5nIGhhcyBpdHMgb3duIHNwZWxsIGZpbGUuICBXaXRoIHR3bwpleGNlcHRpb25zOgotIEZvciBJU08tODg1OS0xNSAobGF0aW45KSB0aGUgbmFtZSAibGF0aW4xIiBpcyB1c2VkICh0aGUgZW5jb2RpbmdzIG9ubHkKICBkaWZmZXIgaW4gY2hhcmFjdGVycyBub3QgdXNlZCBpbiBkaWN0aW9uYXJ5IHdvcmRzKS4KLSBUaGUgbmFtZSAiYXNjaWkiIG1heSBhbHNvIGJlIHVzZWQgZm9yIHNvbWUgbGFuZ3VhZ2VzIHdoZXJlIHRoZSB3b3JkcyB1c2UKICBvbmx5IEFTQ0lJIGxldHRlcnMgZm9yIG1vc3Qgb2YgdGhlIHdvcmRzLgoKVGhlIGRlZmF1bHQgInNwZWxsZmlsZS52aW0iIHBsdWdpbiB1c2VzIHRoaXMgYXV0b2NvbW1hbmQsIGlmIHlvdSBkZWZpbmUgeW91cgphdXRvY29tbWFuZCBhZnRlcndhcmRzIHlvdSBtYXkgd2FudCB0byB1c2UgIjphdSEgU3BlbGxGaWxlTWlzc2luZyIgdG8gb3ZlcnJ1bGUKaXQuICBJZiB5b3UgZGVmaW5lIHlvdXIgYXV0b2NvbW1hbmQgYmVmb3JlIHRoZSBwbHVnaW4gaXMgbG9hZGVkIGl0IHdpbGwgbm90aWNlCnRoaXMgYW5kIG5vdCBkbyBhbnl0aGluZy4KCQkJCQkJCSpFNzk3KgpOb3RlIHRoYXQgdGhlIFNwZWxsRmlsZU1pc3NpbmcgYXV0b2NvbW1hbmQgbXVzdCBub3QgY2hhbmdlIG9yIGRlc3Ryb3kgdGhlCmJ1ZmZlciB0aGUgdXNlciB3YXMgZWRpdGluZy4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo0LiBTcGVsbCBmaWxlIGZvcm1hdAkJCQkJKnNwZWxsLWZpbGUtZm9ybWF0KgoKVGhpcyBpcyB0aGUgZm9ybWF0IG9mIHRoZSBmaWxlcyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBwZXJzb24gd2hvIGNyZWF0ZXMgYW5kCm1haW50YWlucyBhIHdvcmQgbGlzdC4KCk5vdGUgdGhhdCB3ZSBhdm9pZCB0aGUgd29yZCAiZGljdGlvbmFyeSIgaGVyZS4gIFRoYXQgaXMgYmVjYXVzZSB0aGUgZ29hbCBvZgpzcGVsbCBjaGVja2luZyBkaWZmZXJzIGZyb20gd3JpdGluZyBhIGRpY3Rpb25hcnkgKGFzIGluIHRoZSBib29rKS4gIEZvcgpzcGVsbGluZyB3ZSBuZWVkIGEgbGlzdCBvZiB3b3JkcyB0aGF0IGFyZSBPSywgdGh1cyBzaG91bGQgbm90IGJlIGhpZ2hsaWdodGVkLgpQZXJzb24gYW5kIGNvbXBhbnkgbmFtZXMgd2lsbCBub3QgYXBwZWFyIGluIGEgZGljdGlvbmFyeSwgYnV0IGRvIGFwcGVhciBpbiBhCndvcmQgbGlzdC4gIEFuZCBzb21lIG9sZCB3b3JkcyBhcmUgcmFyZWx5IHVzZWQgd2hpbGUgdGhleSBhcmUgY29tbW9uCm1pc3NwZWxsaW5ncy4gIFRoZXNlIGRvIGFwcGVhciBpbiBhIGRpY3Rpb25hcnkgYnV0IG5vdCBpbiBhIHdvcmQgbGlzdC4KClRoZXJlIGFyZSB0d28gZm9ybWF0czogQSBzdHJhaWdodCBsaXN0IG9mIHdvcmRzIGFuZCBhIGxpc3QgdXNpbmcgYWZmaXgKY29tcHJlc3Npb24uICBUaGUgZmlsZXMgd2l0aCBhZmZpeCBjb21wcmVzc2lvbiBhcmUgdXNlZCBieSBNeXNwZWxsIChNb3ppbGxhCmFuZCBPcGVuT2ZmaWNlLm9yZykuICBUaGlzIHJlcXVpcmVzIHR3byBmaWxlcywgb25lIHdpdGggLmFmZiBhbmQgb25lIHdpdGggLmRpYwpleHRlbnNpb24uCgoKRk9STUFUIE9GIFNUUkFJR0hUIFdPUkQgTElTVAkJCQkqc3BlbGwtd29yZGxpc3QtZm9ybWF0KgoKVGhlIHdvcmRzIG11c3QgYXBwZWFyIG9uZSBwZXIgbGluZS4gIFRoYXQgaXMgYWxsIHRoYXQgaXMgcmVxdWlyZWQuCgpBZGRpdGlvbmFsbHkgdGhlIGZvbGxvd2luZyBpdGVtcyBhcmUgcmVjb2duaXplZDoKCi0gRW1wdHkgYW5kIGJsYW5rIGxpbmVzIGFyZSBpZ25vcmVkLgoKCSMgY29tbWVudCB+Ci0gTGluZXMgc3RhcnRpbmcgd2l0aCBhICMgYXJlIGlnbm9yZWQgKGNvbW1lbnQgbGluZXMpLgoKCS9lbmNvZGluZz11dGYtOCB+Ci0gQSBsaW5lIHN0YXJ0aW5nIHdpdGggIi9lbmNvZGluZz0iLCBiZWZvcmUgYW55IHdvcmQsIHNwZWNpZmllcyB0aGUgZW5jb2RpbmcKICBvZiB0aGUgZmlsZS4gIEFmdGVyIHRoZSBzZWNvbmQgJz0nIGNvbWVzIGFuIGVuY29kaW5nIG5hbWUuICBUaGlzIHRlbGxzIFZpbQogIHRvIHNldHVwIGNvbnZlcnNpb24gZnJvbSB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIHRvICdlbmNvZGluZycuICBUaHVzIHlvdSBjYW4KICB1c2Ugb25lIHdvcmQgbGlzdCBmb3Igc2V2ZXJhbCB0YXJnZXQgZW5jb2RpbmdzLgoKCS9yZWdpb25zPXVzY2EgfgotIEEgbGluZSBzdGFydGluZyB3aXRoICIvcmVnaW9ucz0iIHNwZWNpZmllcyB0aGUgcmVnaW9uIG5hbWVzIHRoYXQgYXJlCiAgc3VwcG9ydGVkLiAgRWFjaCByZWdpb24gbmFtZSBtdXN0IGJlIHR3byBBU0NJSSBsZXR0ZXJzLiAgVGhlIGZpcnN0IG9uZSBpcwogIHJlZ2lvbiAxLiAgVGh1cyAiL3JlZ2lvbnM9dXNjYSIgaGFzIHJlZ2lvbiAxICJ1cyIgYW5kIHJlZ2lvbiAyICJjYSIuCiAgSW4gYW4gYWRkaXRpb24gd29yZCBsaXN0IHRoZSByZWdpb24gbmFtZXMgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBtYWluIHdvcmQKICBsaXN0IQoKLSBPdGhlciBsaW5lcyBzdGFydGluZyB3aXRoICcvJyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuICBUaGUgb25lcyB0aGF0CiAgYXJlIG5vdCByZWNvZ25pemVkIGFyZSBpZ25vcmVkLiAgWW91IGRvIGdldCBhIHdhcm5pbmcgbWVzc2FnZSwgc28gdGhhdCB5b3UKICBrbm93IHNvbWV0aGluZyB3b24ndCB3b3JrLgoKLSBBICIvIiBtYXkgZm9sbG93IHRoZSB3b3JkIHdpdGggdGhlIGZvbGxvd2luZyBpdGVtczoKICAgID0JCUNhc2UgbXVzdCBtYXRjaCBleGFjdGx5LgogICAgPwkJUmFyZSB3b3JkLgogICAgIQkJQmFkICh3cm9uZykgd29yZC4KICAgIGRpZ2l0CUEgcmVnaW9uIGluIHdoaWNoIHRoZSB3b3JkIGlzIHZhbGlkLiAgSWYgbm8gcmVnaW9ucyBhcmUKCQlzcGVjaWZpZWQgdGhlIHdvcmQgaXMgdmFsaWQgaW4gYWxsIHJlZ2lvbnMuCgpFeGFtcGxlOgoKCSMgVGhpcyBpcyBhbiBleGFtcGxlIHdvcmQgbGlzdAkJY29tbWVudAoJL2VuY29kaW5nPWxhdGluMQkJCWVuY29kaW5nIG9mIHRoZSBmaWxlCgkvcmVnaW9ucz11c2NhZ2IJCQkJcmVnaW9ucyAidXMiLCAiY2EiIGFuZCAiZ2IiCglleGFtcGxlCQkJCQl3b3JkIGZvciBhbGwgcmVnaW9ucwoJYmxhaC8xMgkJCQkJd29yZCBmb3IgcmVnaW9ucyAidXMiIGFuZCAiY2EiCgl2aW0vIQkJCQkJYmFkIHdvcmQKCUNhbXBiZWxsLz8zCQkJCXJhcmUgd29yZCBpbiByZWdpb24gMyAiZ2IiCgkncyBtb3JuaW5ncy89CQkJCWtlZXAtY2FzZSB3b3JkCgpOb3RlIHRoYXQgd2hlbiAiLz0iIGlzIHVzZWQgdGhlIHNhbWUgd29yZCB3aXRoIGFsbCB1cHBlci1jYXNlIGxldHRlcnMgaXMgbm90CmFjY2VwdGVkLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBhIHdvcmQgd2l0aCBtaXhlZCBjYXNlIHRoYXQgaXMgYXV0b21hdGljYWxseQptYXJrZWQgYXMga2VlcC1jYXNlLCB0aG9zZSB3b3JkcyBtYXkgYXBwZWFyIGluIGFsbCB1cHBlci1jYXNlIGxldHRlcnMuCgoKRk9STUFUIFdJVEggLkFGRiBBTkQgLkRJQyBGSUxFUwkJCQkqYWZmLWRpYy1mb3JtYXQqCgpUaGVyZSBhcmUgdHdvIGZpbGVzOiB0aGUgYmFzaWMgd29yZCBsaXN0IGFuZCBhbiBhZmZpeCBmaWxlLiAgVGhlIGFmZml4IGZpbGUKc3BlY2lmaWVzIHNldHRpbmdzIGZvciB0aGUgbGFuZ3VhZ2UgYW5kIGNhbiBjb250YWluIGFmZml4ZXMuICBUaGUgYWZmaXhlcyBhcmUKdXNlZCB0byBtb2RpZnkgdGhlIGJhc2ljIHdvcmRzIHRvIGdldCB0aGUgZnVsbCB3b3JkIGxpc3QuICBUaGlzIHNpZ25pZmljYW50bHkKcmVkdWNlcyB0aGUgbnVtYmVyIG9mIHdvcmRzLCBlc3BlY2lhbGx5IGZvciBhIGxhbmd1YWdlIGxpa2UgUG9saXNoLiAgVGhpcyBpcwpjYWxsZWQgYWZmaXggY29tcHJlc3Npb24uCgpUaGUgYmFzaWMgd29yZCBsaXN0IGFuZCB0aGUgYWZmaXggZmlsZSBhcmUgY29tYmluZWQgd2l0aCB0aGUgIjpta3NwZWxsIgpjb21tYW5kIGFuZCByZXN1bHRzIGluIGEgYmluYXJ5IHNwZWxsIGZpbGUuICBBbGwgdGhlIHByZXByb2Nlc3NpbmcgaGFzIGJlZW4KZG9uZSwgdGh1cyB0aGlzIGZpbGUgbG9hZHMgZmFzdC4gIFRoZSBiaW5hcnkgc3BlbGwgZmlsZSBmb3JtYXQgaXMgZGVzY3JpYmVkIGluCnRoZSBzb3VyY2UgY29kZSAoc3JjL3NwZWxsLmMpLiAgQnV0IG9ubHkgZGV2ZWxvcGVycyBuZWVkIHRvIGtub3cgYWJvdXQgaXQuCgpUaGUgcHJlcHJvY2Vzc2luZyBhbHNvIGFsbG93cyB1cyB0byB0YWtlIHRoZSBNeXNwZWxsIGxhbmd1YWdlIGZpbGVzIGFuZCBtb2RpZnkKdGhlbSBiZWZvcmUgdGhlIFZpbSB3b3JkIGxpc3QgaXMgbWFkZS4gIFRoZSB0b29scyBmb3IgdGhpcyBjYW4gYmUgZm91bmQgaW4gdGhlCiJzcmMvc3BlbGwiIGRpcmVjdG9yeS4KClRoZSBmb3JtYXQgZm9yIHRoZSBhZmZpeCBhbmQgd29yZCBsaXN0IGZpbGVzIGlzIGJhc2VkIG9uIHdoYXQgTXlzcGVsbCB1c2VzCih0aGUgc3BlbGwgY2hlY2tlciBvZiBNb3ppbGxhIGFuZCBPcGVuT2ZmaWNlLm9yZykuICBBIGRlc2NyaXB0aW9uIGNhbiBiZSBmb3VuZApoZXJlOgoJaHR0cDovL2xpbmd1Y29tcG9uZW50Lm9wZW5vZmZpY2Uub3JnL2FmZml4LnJlYWRtZSB+Ck5vdGUgdGhhdCBhZmZpeGVzIGFyZSBjYXNlIHNlbnNpdGl2ZSwgdGhpcyBpc24ndCBvYnZpb3VzIGZyb20gdGhlIGRlc2NyaXB0aW9uLgoKVmltIHN1cHBvcnRzIHF1aXRlIGEgZmV3IGV4dHJhcy4gIFRoZXkgYXJlIGRlc2NyaWJlZCBiZWxvdyB8c3BlbGwtYWZmaXgtdmltfC4KQXR0ZW1wdHMgaGF2ZSBiZWVuIG1hZGUgdG8ga2VlcCB0aGlzIGNvbXBhdGlibGUgd2l0aCBvdGhlciBzcGVsbCBjaGVja2Vycywgc28KdGhhdCB0aGUgc2FtZSBmaWxlcyBjYW4gb2Z0ZW4gYmUgdXNlZC4gIE9uZSBvdGhlciBwcm9qZWN0IHRoYXQgb2ZmZXJzIG1vcmUKdGhhbiBNeXNwZWxsIGlzIEh1bnNwZWxsICggaHR0cDovL2h1bnNwZWxsLnNmLm5ldCApLgoKCldPUkQgTElTVCBGT1JNQVQJCQkJKnNwZWxsLWRpYy1mb3JtYXQqCgpBIHNob3J0IGV4YW1wbGUsIHdpdGggbGluZSBudW1iZXJzOgoKCTEJMTIzNCB+CgkyCWFhbiB+CgkzCUFscyB+Cgk0CUV0dGVuLUxldXIgfgoJNQlldCBhbC4gfgoJNgkncy1HcmF2ZW5oYWdlIH4KCTcJJ3MtR3JhdmVuaGFhZ3MgfgoJOAkjIHdvcmQgdGhhdCBkaWZmZXJzIGJldHdlZW4gcmVnaW9ucyB+Cgk5CWthZG8vMSB+CgkxMAljYWRlYXUvMiB+CgkxMQlUQ1AsSVAgfgoJMTIJL3RoZSBTIGFmZml4IG1heSBhZGQgYSAncycgfgoJMTMJYmVkZWwvUyB+CgpUaGUgZmlyc3QgbGluZSBjb250YWlucyB0aGUgbnVtYmVyIG9mIHdvcmRzLiAgVmltIGlnbm9yZXMgaXQsIGJ1dCB5b3UgZG8gZ2V0CmFuIGVycm9yIG1lc3NhZ2UgaWYgaXQncyBub3QgdGhlcmUuICAqRTc2MCoKCldoYXQgZm9sbG93cyBpcyBvbmUgd29yZCBwZXIgbGluZS4gIFdoaXRlIHNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgaXMKaWdub3JlZCwgYWxsIG90aGVyIHdoaXRlIHNwYWNlIG1hdHRlcnMuICBUaGUgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIGluIHRoZQphZmZpeCBmaWxlIHxzcGVsbC1TRVR8LgoKQ29tbWVudCBsaW5lcyBzdGFydCB3aXRoICcjJyBvciAnLycuICBTZWUgdGhlIGV4YW1wbGUgbGluZXMgOCBhbmQgMTIuICBOb3RlCnRoYXQgcHV0dGluZyBhIGNvbW1lbnQgYWZ0ZXIgYSB3b3JkIGlzIE5PVCBhbGxvd2VkOgoKCQlzb21ld29yZCAgICMgY29tbWVudCB0aGF0IGNhdXNlcyBhbiBlcnJvciEgfgoKQWZ0ZXIgdGhlIHdvcmQgdGhlcmUgaXMgYW4gb3B0aW9uYWwgc2xhc2ggYW5kIGZsYWdzLiAgTW9zdCBvZiB0aGVzZSBmbGFncyBhcmUKbGV0dGVycyB0aGF0IGluZGljYXRlIHRoZSBhZmZpeGVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCB0aGlzIHdvcmQuICBUaGVzZSBhcmUKc3BlY2lmaWVkIHdpdGggU0ZYIGFuZCBQRlggbGluZXMgaW4gdGhlIC5hZmYgZmlsZSwgc2VlIHxzcGVsbC1TRlh8IGFuZAp8c3BlbGwtUEZYfC4gIFZpbSBhbGxvd3MgdXNpbmcgb3RoZXIgZmxhZyB0eXBlcyB3aXRoIHRoZSBGTEFHIGl0ZW0gaW4gdGhlCmFmZml4IGZpbGUgfHNwZWxsLUZMQUd8LgoKV2hlbiB0aGUgd29yZCBvbmx5IGhhcyBsb3dlci1jYXNlIGxldHRlcnMgaXQgd2lsbCBhbHNvIG1hdGNoIHdpdGggdGhlIHdvcmQKc3RhcnRpbmcgd2l0aCBhbiB1cHBlci1jYXNlIGxldHRlci4KCldoZW4gdGhlIHdvcmQgaW5jbHVkZXMgYW4gdXBwZXItY2FzZSBsZXR0ZXIsIHRoaXMgbWVhbnMgdGhlIHVwcGVyLWNhc2UgbGV0dGVyCmlzIHJlcXVpcmVkIGF0IHRoaXMgcG9zaXRpb24uICBUaGUgc2FtZSB3b3JkIHdpdGggYSBsb3dlci1jYXNlIGxldHRlciBhdCB0aGlzCnBvc2l0aW9uIHdpbGwgbm90IG1hdGNoLiBXaGVuIHNvbWUgb2YgdGhlIG90aGVyIGxldHRlcnMgYXJlIHVwcGVyLWNhc2UgaXQgd2lsbApub3QgbWF0Y2ggZWl0aGVyLgoKVGhlIHdvcmQgd2l0aCBhbGwgdXBwZXItY2FzZSBjaGFyYWN0ZXJzIHdpbGwgYWx3YXlzIGJlIE9LLAoKCXdvcmQgbGlzdAltYXRjaGVzCQkJZG9lcyBub3QgbWF0Y2ggfgoJYWxzCQlhbHMgQWxzIEFMUwkJQUxzIEFsUyBhTHMgYUxTCglBbHMJCUFscyAgQUxTCQlhbHMgQUxzIEFsUyBhTHMgYUxTCglBTFMJCUFMUwkJCWFscyBBbHMgQUxzIEFsUyBhTHMgYUxTCglBbFMJCUFsUyBBTFMJCQlhbHMgQWxzIEFMcyBhTHMgYUxTCgpUaGUgS0VFUENBU0UgYWZmaXggSUQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmaWNhbGx5IG1hdGNoIGEgd29yZCB3aXRoIGlkZW50aWNhbApjYXNlIG9ubHksIHNlZSBiZWxvdyB8c3BlbGwtS0VFUENBU0V8LgoKTm90ZTogaW4gbGluZSA1IHRvIDcgbm9uLXdvcmQgY2hhcmFjdGVycyBhcmUgdXNlZC4gIFlvdSBjYW4gaW5jbHVkZSBhbnkKY2hhcmFjdGVyIGluIGEgd29yZC4gIFdoZW4gY2hlY2tpbmcgdGhlIHRleHQgYSB3b3JkIHN0aWxsIG9ubHkgbWF0Y2hlcyB3aGVuIGl0CmFwcGVhcnMgd2l0aCBhIG5vbi13b3JkIGNoYXJhY3RlciBiZWZvcmUgYW5kIGFmdGVyIGl0LiAgRm9yIE15c3BlbGwgYSB3b3JkCnN0YXJ0aW5nIHdpdGggYSBub24td29yZCBjaGFyYWN0ZXIgcHJvYmFibHkgd29uJ3Qgd29yay4KCkluIGxpbmUgMTIgdGhlIHdvcmQgIlRDUC9JUCIgaXMgZGVmaW5lZC4gIFNpbmNlIHRoZSBzbGFzaCBoYXMgYSBzcGVjaWFsCm1lYW5pbmcgdGhlIGNvbW1hIGlzIHVzZWQgaW5zdGVhZC4gIFRoaXMgaXMgZGVmaW5lZCB3aXRoIHRoZSBTTEFTSCBpdGVtIGluIHRoZQphZmZpeCBmaWxlLCBzZWUgfHNwZWxsLVNMQVNIfC4gIE5vdGUgdGhhdCB3aXRob3V0IHRoaXMgU0xBU0ggaXRlbSB0aGUgd29yZAp3aWxsIGJlICJUQ1AsSVAiLgoKCkFGRklYIEZJTEUgRk9STUFUCQkJKnNwZWxsLWFmZi1mb3JtYXQqICpzcGVsbC1hZmZpeC12aW0qCgoJCQkJCQkJKnNwZWxsLWFmZml4LWNvbW1lbnQqCkNvbW1lbnQgbGluZXMgaW4gdGhlIC5hZmYgZmlsZSBzdGFydCB3aXRoIGEgJyMnOgoKCSMgY29tbWVudCBsaW5lIH4KCkl0ZW1zIHdpdGggYSBmaXhlZCBudW1iZXIgb2YgYXJndW1lbnRzIGNhbiBiZSBmb2xsb3dlZCBieSBhIGNvbW1lbnQuICBCdXQgb25seQppZiBub25lIG9mIHRoZSBhcmd1bWVudHMgY2FuIGNvbnRhaW4gd2hpdGUgc3BhY2UuICBUaGUgY29tbWVudCBtdXN0IHN0YXJ0IHdpdGgKYSAiIyIgY2hhcmFjdGVyLiAgRXhhbXBsZToKCglLRUVQQ0FTRSA9ICAjIGZpeCBjYXNlIGZvciB3b3JkcyB3aXRoIHRoaXMgZmxhZyB+CgoKRU5DT0RJTkcJCQkJCQkJKnNwZWxsLVNFVCoKClRoZSBhZmZpeCBmaWxlIGNhbiBiZSBpbiBhbnkgZW5jb2RpbmcgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgImljb252Ii4gIEhvd2V2ZXIsCmluIHNvbWUgY2FzZXMgdGhlIGN1cnJlbnQgbG9jYWxlIHNob3VsZCBhbHNvIGJlIHNldCBwcm9wZXJseSBhdCB0aGUgdGltZQp8Om1rc3BlbGx8IGlzIGludm9rZWQuICBBZGRpbmcgRk9ML0xPVy9VUFAgbGluZXMgcmVtb3ZlcyB0aGlzIHJlcXVpcmVtZW50CnxzcGVsbC1GT0x8LgoKVGhlIGVuY29kaW5nIHNob3VsZCBiZSBzcGVjaWZpZWQgYmVmb3JlIGFueXRoaW5nIHdoZXJlIHRoZSBlbmNvZGluZyBtYXR0ZXJzLgpUaGUgZW5jb2RpbmcgYXBwbGllcyBib3RoIHRvIHRoZSBhZmZpeCBmaWxlIGFuZCB0aGUgZGljdGlvbmFyeSBmaWxlLiAgSXQgaXMKZG9uZSB3aXRoIGEgU0VUIGxpbmU6CgoJU0VUIHV0Zi04IH4KClRoZSBlbmNvZGluZyBjYW4gYmUgZGlmZmVyZW50IGZyb20gdGhlIHZhbHVlIG9mIHRoZSAnZW5jb2RpbmcnIG9wdGlvbiBhdCB0aGUKdGltZSAiOm1rc3BlbGwiIGlzIHVzZWQuICBWaW0gd2lsbCB0aGVuIGNvbnZlcnQgZXZlcnl0aGluZyB0byAnZW5jb2RpbmcnIGFuZApnZW5lcmF0ZSBhIHNwZWxsIGZpbGUgZm9yICdlbmNvZGluZycuICBJZiBzb21lIG9mIHRoZSB1c2VkIGNoYXJhY3RlcnMgdG8gbm90CmZpdCBpbiAnZW5jb2RpbmcnIHlvdSB3aWxsIGdldCBhbiBlcnJvciBtZXNzYWdlLgoJCQkJCQkJKnNwZWxsLWFmZml4LW1ieXRlKgpXaGVuIHVzaW5nIGEgbXVsdGktYnl0ZSBlbmNvZGluZyBpdCdzIHBvc3NpYmxlIHRvIHVzZSBtb3JlIGRpZmZlcmVudCBhZmZpeApmbGFncy4gIEJ1dCBNeXNwZWxsIGRvZXNuJ3Qgc3VwcG9ydCB0aGF0LCB0aHVzIHlvdSBtYXkgbm90IHdhbnQgdG8gdXNlIGl0CmFueXdheS4gIEZvciBjb21wYXRpYmlsaXR5IHVzZSBhbiA4LWJpdCBlbmNvZGluZy4KCgpJTkZPUk1BVElPTgoKVGhlc2UgZW50cmllcyBpbiB0aGUgYWZmaXggZmlsZSBjYW4gYmUgdXNlZCB0byBhZGQgaW5mb3JtYXRpb24gdG8gdGhlIHNwZWxsCmZpbGUuICBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZSBmb3JtYXQsIGJ1dCB0aGV5IHNob3VsZCBiZSBpbiB0aGUKcmlnaHQgZW5jb2RpbmcuCgoJCQkJKnNwZWxsLU5BTUUqICpzcGVsbC1WRVJTSU9OKiAqc3BlbGwtSE9NRSoKCQkJCSpzcGVsbC1BVVRIT1IqICpzcGVsbC1FTUFJTCogKnNwZWxsLUNPUFlSSUdIVCoKCU5BTUUJCU5hbWUgb2YgdGhlIGxhbmd1YWdlCglWRVJTSU9OCQkxLjAuMSAgd2l0aCBmaXhlcwoJSE9NRQkJaHR0cDovL3d3dy5teWhvbWUuZXUKCUFVVEhPUgkJSm9obiBEb2UKCUVNQUlMCQlqb2huIEFUIERvZSBET1QgbmV0CglDT1BZUklHSFQJTEdQTAoKVGhlc2UgZmllbGRzIGFyZSBwdXQgaW4gdGhlIC5zcGwgZmlsZSBhcy1pcy4gIFRoZSB8OnNwZWxsaW5mb3wgY29tbWFuZCBjYW4gYmUKdXNlZCB0byB2aWV3IHRoZSBpbmZvLgoKCQkJCQkJCSo6c3BlbGxpbmZvKiAqOnNwZWxsaSoKOnNwZWxsaVtuZm9dCQlEaXNwbGF5IHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWxsIGZpbGUocykgdXNlZCBmb3IKCQkJdGhlIGN1cnJlbnQgYnVmZmVyLgoKCkNIQVJBQ1RFUiBUQUJMRVMKCQkJCQkJCSpzcGVsbC1hZmZpeC1jaGFycyoKV2hlbiB1c2luZyBhbiA4LWJpdCBlbmNvZGluZyB0aGUgYWZmaXggZmlsZSBzaG91bGQgZGVmaW5lIHdoYXQgY2hhcmFjdGVycyBhcmUKd29yZCBjaGFyYWN0ZXJzLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBzeXN0ZW0gd2hlcmUgIjpta3NwZWxsIiBpcyB1c2VkIG1heSBub3QKc3VwcG9ydCBhIGxvY2FsZSB3aXRoIHRoaXMgZW5jb2RpbmcgYW5kIGlzYWxwaGEoKSB3b24ndCB3b3JrLiAgRm9yIGV4YW1wbGUKd2hlbiB1c2luZyAiY3AxMjUwIiBvbiBVbml4LgoJCQkJCQkqRTc2MSogKkU3NjIqICpzcGVsbC1GT0wqCgkJCQkJCSpzcGVsbC1MT1cqICpzcGVsbC1VUFAqClRocmVlIGxpbmVzIGluIHRoZSBhZmZpeCBmaWxlIGFyZSBuZWVkZWQuICBTaW1wbGlzdGljIGV4YW1wbGU6CgoJRk9MICDh6/EgfgoJTE9XICDh6/EgfgoJVVBQICDBy9EgfgoKQWxsIHRocmVlIGxpbmVzIG11c3QgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIG51bWJlciBvZiBjaGFyYWN0ZXJzLgoKVGhlICJGT0wiIGxpbmUgc3BlY2lmaWVzIHRoZSBjYXNlLWZvbGRlZCBjaGFyYWN0ZXJzLiAgVGhlc2UgYXJlIHVzZWQgdG8KY29tcGFyZSB3b3JkcyB3aGlsZSBpZ25vcmluZyBjYXNlLiAgRm9yIG1vc3QgZW5jb2RpbmdzIHRoaXMgaXMgaWRlbnRpY2FsIHRvCnRoZSBsb3dlciBjYXNlIGxpbmUuCgpUaGUgIkxPVyIgbGluZSBzcGVjaWZpZXMgdGhlIGNoYXJhY3RlcnMgaW4gbG93ZXItY2FzZS4gIE1vc3RseSBpdCdzIGVxdWFsIHRvCnRoZSAiRk9MIiBsaW5lLgoKVGhlICJVUFAiIGxpbmUgc3BlY2lmaWVzIHRoZSBjaGFyYWN0ZXJzIHdpdGggdXBwZXItY2FzZS4gIFRoYXQgaXMsIGEgY2hhcmFjdGVyCmlzIHVwcGVyLWNhc2Ugd2hlcmUgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgY2hhcmFjdGVyIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGluCiJGT0wiLgoKQW4gZXhjZXB0aW9uIGlzIG1hZGUgZm9yIHRoZSBHZXJtYW4gc2hhcnAgcyDfLiAgVGhlIHVwcGVyLWNhc2UgdmVyc2lvbiBpcwoiU1MiLiAgSW4gdGhlIEZPTC9MT1cvVVBQIGxpbmVzIGl0IHNob3VsZCBiZSBpbmNsdWRlZCwgc28gdGhhdCBpdCdzIHJlY29nbml6ZWQKYXMgYSB3b3JkIGNoYXJhY3RlciwgYnV0IHVzZSB0aGUg3yBjaGFyYWN0ZXIgaW4gYWxsIHRocmVlLgoKQVNDSUkgY2hhcmFjdGVycyBzaG91bGQgYmUgb21pdHRlZCwgVmltIGFsd2F5cyBoYW5kbGVzIHRoZXNlIGluIHRoZSBzYW1lIHdheS4KV2hlbiB0aGUgZW5jb2RpbmcgaXMgVVRGLTggbm8gd29yZCBjaGFyYWN0ZXJzIG5lZWQgdG8gYmUgc3BlY2lmaWVkLgoKCQkJCQkJCSpFNzYzKgpWaW0gYWxsb3dzIHlvdSB0byB1c2Ugc3BlbGwgY2hlY2tpbmcgZm9yIHNldmVyYWwgbGFuZ3VhZ2VzIGluIHRoZSBzYW1lIGZpbGUuCllvdSBjYW4gbGlzdCB0aGVtIGluIHRoZSAnc3BlbGxsYW5nJyBvcHRpb24uICBBcyBhIGNvbnNlcXVlbmNlIGFsbCBzcGVsbCBmaWxlcwpmb3IgdGhlIHNhbWUgZW5jb2RpbmcgbXVzdCB1c2UgdGhlIHNhbWUgd29yZCBjaGFyYWN0ZXJzLCBvdGhlcndpc2UgdGhleSBjYW4ndApiZSBjb21iaW5lZCB3aXRob3V0IGVycm9ycy4KCklmIHlvdSBnZXQgYW4gRTc2MyB3YXJuaW5nIHRoYXQgdGhlIHdvcmQgdGFibGVzIGRpZmZlciB5b3UgbmVlZCB0byB1cGRhdGUgeW91cgoiLnNwbCIgc3BlbGwgZmlsZXMuICBJZiB5b3UgZG93bmxvYWRlZCB0aGUgZmlsZXMsIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YKYWxsIHNwZWxsIGZpbGVzIHlvdSB1c2UuICBPdGhlcndpc2UgZ2VuZXJhdGUgdGhlIC5zcGwgZmlsZSBhZ2FpbiB3aXRoCnw6bWtzcGVsbHwuICBJZiB5b3Ugc3RpbGwgZ2V0IGVycm9ycyBjaGVjayB0aGUgRk9MLCBMT1cgYW5kIFVQUCBsaW5lcyBpbiB0aGUKdXNlZCAuYWZmIGZpbGVzLgoKVGhlIFhYLmFzY2lpLnNwbCBzcGVsbCBmaWxlIGdlbmVyYXRlZCB3aXRoIHRoZSAiLWFzY2lpIiBhcmd1bWVudCB3aWxsIG5vdApjb250YWluIHRoZSB0YWJsZSB3aXRoIGNoYXJhY3RlcnMsIHNvIHRoYXQgaXQgY2FuIGJlIGNvbWJpbmUgd2l0aCBzcGVsbCBmaWxlcwpmb3IgYW55IGVuY29kaW5nLiAgVGhlIC5hZGQuc3BsIGZpbGVzIGFsc28gZG8gbm90IGNvbnRhaW4gdGhlIHRhYmxlLgoKCk1JRC1XT1JEIENIQVJBQ1RFUlMKCQkJCQkJCSpzcGVsbC1taWR3b3JkKgpTb21lIGNoYXJhY3RlcnMgYXJlIG9ubHkgdG8gYmUgY29uc2lkZXJlZCB3b3JkIGNoYXJhY3RlcnMgaWYgdGhleSBhcmUgdXNlZCBpbgpiZXR3ZWVuIHR3byBvcmRpbmFyeSB3b3JkIGNoYXJhY3RlcnMuICBBbiBleGFtcGxlIGlzIHRoZSBzaW5nbGUgcXVvdGU6IEl0IGlzCm9mdGVuIHVzZWQgdG8gcHV0IHRleHQgaW4gcXVvdGVzLCB0aHVzIGl0IGNhbid0IGJlIHJlY29nbml6ZWQgYXMgYSB3b3JkCmNoYXJhY3RlciwgYnV0IHdoZW4gaXQgYXBwZWFycyBpbiBiZXR3ZWVuIHdvcmQgY2hhcmFjdGVycyBpdCBtdXN0IGJlIHBhcnQgb2YKdGhlIHdvcmQuICBUaGlzIGlzIG5lZWRlZCB0byBkZXRlY3QgYSBzcGVsbGluZyBlcnJvciBzdWNoIGFzIHRoZXknYXJlLiAgVGhhdApzaG91bGQgYmUgdGhleSdyZSwgYnV0IHNpbmNlICJ0aGV5IiBhbmQgImFyZSIgYXJlIHdvcmRzIHRoZW1zZWx2ZXMgdGhhdCB3b3VsZApnbyB1bm5vdGljZWQuCgpUaGVzZSBjaGFyYWN0ZXJzIGFyZSBkZWZpbmVkIHdpdGggTUlEV09SRCBpbiB0aGUgLmFmZiBmaWxlLiAgRXhhbXBsZToKCglNSURXT1JECSctIH4KCgpGTEFHIFRZUEVTCQkJCQkJKnNwZWxsLUZMQUcqCgpGbGFncyBhcmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBhZmZpeGVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBhIHdvcmQgYW5kIGZvcgpvdGhlciBwcm9wZXJ0aWVzIG9mIHRoZSB3b3JkLiAgTm9ybWFsbHkgc2luZ2xlLWNoYXJhY3RlciBmbGFncyBhcmUgdXNlZC4gIFRoaXMKbGltaXRzIHRoZSBudW1iZXIgb2YgcG9zc2libGUgZmxhZ3MsIGVzcGVjaWFsbHkgZm9yIDgtYml0IGVuY29kaW5ncy4gIFRoZSBGTEFHCml0ZW0gY2FuIGJlIHVzZWQgaWYgbW9yZSBhZmZpeGVzIGFyZSB0byBiZSB1c2VkLiAgUG9zc2libGUgdmFsdWVzOgoKCUZMQUcgbG9uZwl1c2UgdHdvLWNoYXJhY3RlciBmbGFncwoJRkxBRyBudW0JdXNlIG51bWJlcnMsIGZyb20gMSB1cCB0byA2NTAwMAoJRkxBRyBjYXBsb25nCXVzZSBvbmUtY2hhcmFjdGVyIGZsYWdzIHdpdGhvdXQgQS1aIGFuZCB0d28tY2hhcmFjdGVyCgkJCWZsYWdzIHRoYXQgc3RhcnQgd2l0aCBBLVoKCldpdGggIkZMQUcgbnVtIiB0aGUgbnVtYmVycyBpbiBhIGxpc3Qgb2YgYWZmaXhlcyBuZWVkIHRvIGJlIHNlcGFyYXRlZCB3aXRoIGEKY29tbWE6ICIyMzQsMjE0MywxNDM1Ii4gIFRoaXMgbWV0aG9kIGlzIGluZWZmaWNpZW50LCBidXQgdXNlZnVsIGlmIHRoZSBmaWxlIGlzCmdlbmVyYXRlZCB3aXRoIGEgcHJvZ3JhbS4KCldoZW4gdXNpbmcgImNhcGxvbmciIHRoZSB0d28tY2hhcmFjdGVyIGZsYWdzIGFsbCBzdGFydCB3aXRoIGEgY2FwaXRhbDogIkFhIiwKIkIxIiwgIkJCIiwgZXRjLiAgVGhpcyBpcyB1c2VmdWwgdG8gdXNlIG9uZS1jaGFyYWN0ZXIgZmxhZ3MgZm9yIHRoZSBtb3N0CmNvbW1vbiBpdGVtcyBhbmQgdHdvLWNoYXJhY3RlciBmbGFncyBmb3IgdW5jb21tb24gaXRlbXMuCgpOb3RlOiBXaGVuIHVzaW5nIHV0Zi04IG9ubHkgY2hhcmFjdGVycyB1cCB0byA2NTAwMCBtYXkgYmUgdXNlZCBmb3IgZmxhZ3MuCgpOb3RlOiBldmVuIHdoZW4gdXNpbmcgIm51bSIgb3IgImxvbmciIHRoZSBudW1iZXIgb2YgZmxhZ3MgYXZhaWxhYmxlIHRvCmNvbXBvdW5kaW5nIGFuZCBwcmVmaXhlcyBpcyBsaW1pdGVkIHRvIGFib3V0IDI1MC4KCgpBRkZJWEVTCgkJCQkJICAgICpzcGVsbC1QRlgqICpzcGVsbC1TRlgqClRoZSB1c3VhbCBQRlggKHByZWZpeCkgYW5kIFNGWCAoc3VmZml4KSBsaW5lcyBhcmUgc3VwcG9ydGVkIChzZWUgdGhlIE15c3BlbGwKZG9jdW1lbnRhdGlvbiBvciB0aGUgQXNwZWxsIG1hbnVhbDoKaHR0cDovL2FzcGVsbC5uZXQvbWFuLWh0bWwvQWZmaXgtQ29tcHJlc3Npb24uaHRtbCkuCgpTdW1tYXJ5OgoJU0ZYIEwgWSAyIH4KCVNGWCBMIDAgcmUgW154XSB+CglTRlggTCAwIHJvIHggfgoKVGhlIGZpcnN0IGxpbmUgaXMgYSBoZWFkZXIgYW5kIGhhcyBmb3VyIGZpZWxkczoKCVNGWCB7ZmxhZ30ge2NvbWJpbmV9IHtjb3VudH0KCntmbGFnfQkJVGhlIG5hbWUgdXNlZCBmb3IgdGhlIHN1ZmZpeC4gIE1vc3RseSBpdCdzIGEgc2luZ2xlIGxldHRlciwKCQlidXQgb3RoZXIgY2hhcmFjdGVycyBjYW4gYmUgdXNlZCwgc2VlIHxzcGVsbC1GTEFHfC4KCntjb21iaW5lfQlDYW4gYmUgJ1knIG9yICdOJy4gIFdoZW4gJ1knIHRoZW4gdGhlIHdvcmQgcGx1cyBzdWZmaXggY2FuCgkJYWxzbyBoYXZlIGEgcHJlZml4LiAgV2hlbiAnTicgdGhlbiBhIHByZWZpeCBpcyBub3QgYWxsb3dlZC4KCntjb3VudH0JCVRoZSBudW1iZXIgb2YgbGluZXMgZm9sbG93aW5nLiAgSWYgdGhpcyBpcyB3cm9uZyB5b3Ugd2lsbCBnZXQKCQlhbiBlcnJvciBtZXNzYWdlLgoKRm9yIFBGWCB0aGUgZmllbGRzIGFyZSBleGFjdGx5IHRoZSBzYW1lLgoKVGhlIGJhc2ljIGZvcm1hdCBmb3IgdGhlIGZvbGxvd2luZyBsaW5lcyBpczoKCVNGWCB7ZmxhZ30ge3N0cmlwfSB7YWRkfSB7Y29uZGl0aW9ufSB7ZXh0cmF9Cgp7ZmxhZ30JCU11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIHtmbGFnfSB1c2VkIGluIHRoZSBmaXJzdCBsaW5lLgoKe3N0cmlwfQkJQ2hhcmFjdGVycyByZW1vdmVkIGZyb20gdGhlIGJhc2ljIHdvcmQuICBUaGVyZSBpcyBubyBjaGVjayBpZgoJCXRoZSBjaGFyYWN0ZXJzIGFyZSBhY3R1YWxseSB0aGVyZSwgb25seSB0aGUgbGVuZ3RoIGlzIHVzZWQgKGluCgkJYnl0ZXMpLiAgVGhpcyBiZXR0ZXIgbWF0Y2ggdGhlIHtjb25kaXRpb259LCBvdGhlcndpc2Ugc3RyYW5nZQoJCXRoaW5ncyBtYXkgaGFwcGVuLiAgSWYgdGhlIHtzdHJpcH0gbGVuZ3RoIGlzIGVxdWFsIHRvIG9yCgkJbG9uZ2VyIHRoYW4gdGhlIGJhc2ljIHdvcmQgdGhlIHN1ZmZpeCB3b24ndCBiZSB1c2VkLgoJCVdoZW4ge3N0cmlwfSBpcyAwICh6ZXJvKSB0aGVuIG5vdGhpbmcgaXMgc3RyaXBwZWQuCgp7YWRkfQkJQ2hhcmFjdGVycyBhZGRlZCB0byB0aGUgYmFzaWMgd29yZCwgYWZ0ZXIgcmVtb3Zpbmcge3N0cmlwfS4KCQlPcHRpb25hbGx5IHRoZXJlIGlzIGEgJy8nIGZvbGxvd2VkIGJ5IGZsYWdzLiAgVGhlIGZsYWdzIGFwcGx5CgkJdG8gdGhlIHdvcmQgcGx1cyBhZmZpeC4gIFNlZSB8c3BlbGwtYWZmaXgtZmxhZ3N8Cgp7Y29uZGl0aW9ufQlBIHNpbXBsaXN0aWMgcGF0dGVybi4gIE9ubHkgd2hlbiB0aGlzIG1hdGNoZXMgd2l0aCBhIGJhc2ljCgkJd29yZCB3aWxsIHRoZSBzdWZmaXggYmUgdXNlZCBmb3IgdGhhdCB3b3JkLiAgVGhpcyBpcyBub3JtYWxseQoJCWZvciB1c2luZyBvbmUgc3VmZml4IGxldHRlciB3aXRoIGRpZmZlcmVudCB7YWRkfSBhbmQge3N0cmlwfQoJCWZpZWxkcyBmb3Igd29yZHMgd2l0aCBkaWZmZXJlbnQgZW5kaW5ncy4KCQlXaGVuIHtjb25kaXRpb259IGlzIGEgLiAoZG90KSB0aGVyZSBpcyBubyBjb25kaXRpb24uCgkJVGhlIHBhdHRlcm4gbWF5IGNvbnRhaW46CgkJLSBMaXRlcmFsIGNoYXJhY3RlcnMuCgkJLSBBIHNldCBvZiBjaGFyYWN0ZXJzIGluIFtdLiBbYWJjXSBtYXRjaGVzIGEsIGIgYW5kIGMuCgkJICBBIGRhc2ggaXMgYWxsb3dlZCBmb3IgYSByYW5nZSBbYS1jXSwgYnV0IHRoaXMgaXMKCQkgIFZpbS1zcGVjaWZpYy4KCQktIEEgc2V0IG9mIGNoYXJhY3RlcnMgdGhhdCBzdGFydHMgd2l0aCBhIF4sIG1lYW5pbmcgdGhlCgkJICBjb21wbGVtZW50IG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVycy4gW15hYmNdIG1hdGNoZXMgYW55CgkJICBjaGFyYWN0ZXIgYnV0IGEsIGIgYW5kIGMuCgp7ZXh0cmF9CQlPcHRpb25hbCBleHRyYSB0ZXh0OgoJCSAgICAjIGNvbW1lbnQJCUNvbW1lbnQgaXMgaWdub3JlZAoJCSAgICAtCQkJSHVuc3BlbGwgdXNlcyB0aGlzLCBpZ25vcmVkCgpGb3IgUEZYIHRoZSBmaWVsZHMgYXJlIHRoZSBzYW1lLCBidXQgdGhlIHtzdHJpcH0sIHthZGR9IGFuZCB7Y29uZGl0aW9ufSBhcHBseQp0byB0aGUgc3RhcnQgb2YgdGhlIHdvcmQuCgpOb3RlOiBNeXNwZWxsIGlnbm9yZXMgYW55IGV4dHJhIHRleHQgYWZ0ZXIgdGhlIHJlbGV2YW50IGluZm8uICBWaW0gcmVxdWlyZXMKdGhpcyB0ZXh0IHRvIHN0YXJ0IHdpdGggYSAiIyIgc28gdGhhdCBtaXN0YWtlcyBkb24ndCBnbyB1bm5vdGljZWQuICBFeGFtcGxlOgoKCVNGWCBGIDAgaW4gICBbXmldbiAgICAgICMgU3Bpb24gPiBTcGlvbmluICB+CglTRlggRiAwIG5lbiAgaW4JCSMgQmF1ZXJpbiA+IEJhdWVyaW5uZW4gfgoKQXBwYXJlbnRseSBNeXNwZWxsIGFsbG93cyBhbiBhZmZpeCBuYW1lIHRvIGFwcGVhciBtb3JlIHRoYW4gb25jZS4gIFNpbmNlIHRoaXMKbWlnaHQgYWxzbyBiZSBhIG1pc3Rha2UsIFZpbSBjaGVja3MgZm9yIGFuIGV4dHJhICJTIi4gIFRoZSBhZmZpeCBmaWxlcyBmb3IKTXlzcGVsbCB0aGF0IHVzZSB0aGlzIGZlYXR1cmUgYXBwYXJlbnRseSBoYXZlIHRoaXMgZmxhZy4gIEV4YW1wbGU6CgoJU0ZYIGEgWSAxIFMgfgoJU0ZYIGEgMCBhbiAuIH4KCglTRlggYSBZIDIgUyB+CglTRlggYSAwIGVuIC4gfgoJU0ZYIGEgMCBvbiAuIH4KCgpBRkZJWCBGTEFHUwkJCQkJCSpzcGVsbC1hZmZpeC1mbGFncyoKClRoaXMgaXMgYSBmZWF0dXJlIHRoYXQgY29tZXMgZnJvbSBIdW5zcGVsbDogVGhlIGFmZml4IG1heSBzcGVjaWZ5IGZsYWdzLiAgVGhpcwp3b3JrcyBzaW1pbGFyIHRvIGZsYWdzIHNwZWNpZmllZCBvbiBhIGJhc2ljIHdvcmQuICBUaGUgZmxhZ3MgYXBwbHkgdG8gdGhlCmJhc2ljIHdvcmQgcGx1cyB0aGUgYWZmaXggKGJ1dCB0aGVyZSBhcmUgcmVzdHJpY3Rpb25zKS4gIEV4YW1wbGU6CgoJU0ZYIFMgWSAxIH4KCVNGWCBTIDAgcyAuIH4KCglTRlggQSBZIDEgfgoJU0ZYIEEgMCBhYmxlL1MgLiB+CgpXaGVuIHRoZSBkaWN0aW9uYXJ5IGZpbGUgY29udGFpbnMgImRyaW5rL0FTIiB0aGVuIHRoZXNlIHdvcmRzIGFyZSBwb3NzaWJsZToKCglkcmluawoJZHJpbmtzCQl1c2VzIFMgc3VmZml4Cglkcmlua2FibGUJdXNlcyBBIHN1ZmZpeAoJZHJpbmthYmxlcwl1c2VzIEEgc3VmZml4IGFuZCB0aGVuIFMgc3VmZml4CgpHZW5lcmFsbHkgdGhlIGZsYWdzIG9mIHRoZSBzdWZmaXggYXJlIGFkZGVkIHRvIHRoZSBmbGFncyBvZiB0aGUgYmFzaWMgd29yZCwKYm90aCBhcmUgdXNlZCBmb3IgdGhlIHdvcmQgcGx1cyBzdWZmaXguICBCdXQgdGhlIGZsYWdzIG9mIHRoZSBiYXNpYyB3b3JkIGFyZQpvbmx5IHVzZWQgb25jZSBmb3IgYWZmaXhlcywgZXhjZXB0IHRoYXQgYm90aCBvbmUgcHJlZml4IGFuZCBvbmUgc3VmZml4IGNhbiBiZQp1c2VkIHdoZW4gYm90aCBzdXBwb3J0IGNvbWJpbmluZy4KClNwZWNpZmljYWxseSwgdGhlIGFmZml4IGZsYWdzIGNhbiBiZSB1c2VkIGZvcjoKLSBTdWZmaXhlcyBvbiBzdWZmaXhlcywgYXMgaW4gdGhlIGV4YW1wbGUgYWJvdmUuICBUaGlzIHdvcmtzIG9uY2UsIHRodXMgeW91CiAgY2FuIGhhdmUgdHdvIHN1ZmZpeGVzIG9uIGEgd29yZCAocGx1cyBvbmUgcHJlZml4KS4KLSBNYWtpbmcgdGhlIHdvcmQgd2l0aCB0aGUgYWZmaXggcmFyZSwgYnkgdXNpbmcgdGhlIHxzcGVsbC1SQVJFfCBmbGFnLgotIEV4Y2x1ZGUgdGhlIHdvcmQgd2l0aCB0aGUgYWZmaXggZnJvbSBjb21wb3VuZGluZywgYnkgdXNpbmcgdGhlCiAgfHNwZWxsLUNPTVBPVU5ERk9SQklERkxBR3wgZmxhZy4KLSBBbGxvdyB0aGUgd29yZCB3aXRoIHRoZSBhZmZpeCB0byBiZSBwYXJ0IG9mIGEgY29tcG91bmQgd29yZCBvbiB0aGUgc2lkZSBvZgogIHRoZSBhZmZpeCB3aXRoIHRoZSB8c3BlbGwtQ09NUE9VTkRQRVJNSVRGTEFHfC4KLSBVc2UgdGhlIE5FRURDT01QT1VORCBmbGFnOiB3b3JkIHBsdXMgYWZmaXggY2FuIG9ubHkgYmUgdXNlZCBhcyBwYXJ0IG9mIGEKICBjb21wb3VuZCB3b3JkLiB8c3BlbGwtTkVFRENPTVBPVU5EfAotIENvbXBvdW5kIGZsYWdzOiB3b3JkIHBsdXMgYWZmaXggY2FuIGJlIHBhcnQgb2YgYSBjb21wb3VuZCB3b3JkIGF0IHRoZSBlbmQsCiAgbWlkZGxlLCBzdGFydCwgZXRjLiAgVGhlIGZsYWdzIGFyZSBjb21iaW5lZCB3aXRoIHRoZSBmbGFncyBvZiB0aGUgYmFzaWMKICB3b3JkLiAgfHNwZWxsLWNvbXBvdW5kfAotIE5FRURBRkZJWDogYW5vdGhlciBhZmZpeCBpcyBuZWVkZWQgdG8gbWFrZSBhIHZhbGlkIHdvcmQuCi0gQ0lSQ1VNRklYLCBhcyBleHBsYWluZWQganVzdCBiZWxvdy4KCgpDSVJDVU1GSVgJCQkJCQkqc3BlbGwtQ0lSQ1VNRklYKgoKVGhlIENJUkNVTUZJWCBmbGFnIG1lYW5zIGEgcHJlZml4IGFuZCBzdWZmaXggbXVzdCBiZSBhZGRlZCBhdCB0aGUgc2FtZSB0aW1lLgpJZiBhIHByZWZpeCBoYXMgdGhlIENJUkNVTUZJWCBmbGFnIHRoYW4gb25seSBzdWZmaXhlcyB3aXRoIHRoZSBDSVJDVU1GSVggZmxhZwpjYW4gYmUgYWRkZWQsIGFuZCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KQW4gYWx0ZXJuYXRpdmUgaXMgdG8gb25seSBzcGVjaWZ5IHRoZSBzdWZmaXgsIGFuZCBnaXZlIHRoZSB0aGF0IHN1ZmZpeCB0d28KZmxhZ3M6IFRoZSByZXF1aXJlZCBwcmVmaXggYW5kIHRoZSBORUVEQUZGSVggZmxhZy4gIHxzcGVsbC1ORUVEQUZGSVh8CgoKUEZYUE9TVFBPTkUJCQkJCQkqc3BlbGwtUEZYUE9TVFBPTkUqCgpXaGVuIGFuIGFmZml4IGZpbGUgaGFzIHZlcnkgbWFueSBwcmVmaXhlcyB0aGF0IGFwcGx5IHRvIG1hbnkgd29yZHMgaXQncyBub3QKcG9zc2libGUgdG8gYnVpbGQgdGhlIHdob2xlIHdvcmQgbGlzdCBpbiBtZW1vcnkuICBUaGlzIGFwcGxpZXMgdG8gSGVicmV3IChhCmxpc3Qgd2l0aCBhbGwgd29yZHMgaXMgb3ZlciBhIEdieXRlKS4gIEluIHRoYXQgY2FzZSBhcHBseWluZyBwcmVmaXhlcyBtdXN0IGJlCnBvc3Rwb25lZC4gIFRoaXMgbWFrZXMgc3BlbGwgY2hlY2tpbmcgc2xvd2VyLiAgSXQgaXMgaW5kaWNhdGVkIGJ5IHRoaXMga2V5d29yZAppbiB0aGUgLmFmZiBmaWxlOgoKCVBGWFBPU1RQT05FIH4KCk9ubHkgcHJlZml4ZXMgd2l0aG91dCBhIGNob3Agc3RyaW5nIGFuZCB3aXRob3V0IGZsYWdzIGNhbiBiZSBwb3N0cG9uZWQuClByZWZpeGVzIHdpdGggYSBjaG9wIHN0cmluZyBvciB3aXRoIGZsYWdzIHdpbGwgc3RpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHdvcmQKbGlzdC4gIEFuIGV4Y2VwdGlvbiBpZiB0aGUgY2hvcCBzdHJpbmcgaXMgb25lIGNoYXJhY3RlciBhbmQgZXF1YWwgdG8gdGhlIGxhc3QKY2hhcmFjdGVyIG9mIHRoZSBhZGRlZCBzdHJpbmcsIGJ1dCBpbiBsb3dlciBjYXNlLiAgVGh1cyB3aGVuIHRoZSBjaG9wIHN0cmluZwppcyB1c2VkIHRvIGFsbG93IHRoZSBmb2xsb3dpbmcgd29yZCB0byBzdGFydCB3aXRoIGFuIHVwcGVyIGNhc2UgbGV0dGVyLgoKCldPUkRTIFdJVEggQSBTTEFTSAkJCQkJKnNwZWxsLVNMQVNIKgoKVGhlIHNsYXNoIGlzIHVzZWQgaW4gdGhlIC5kaWMgZmlsZSB0byBzZXBhcmF0ZSB0aGUgYmFzaWMgd29yZCBmcm9tIHRoZSBhZmZpeApsZXR0ZXJzIGFuZCBvdGhlciBmbGFncy4gIFVuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMgeW91IGNhbm5vdCB1c2UgYSBzbGFzaCBpbgphIHdvcmQuICBUaHVzICJUQ1AvSVAiIGlzIG5vdCBhIHdvcmQgYnV0ICJUQ1AiIHdpdGggdGhlIGZsYWdzICJJUCIuICBUbyBpbmNsdWRlCmEgc2xhc2ggaW4gdGhlIHdvcmQgcHV0IGEgYmFja3NsYXNoIGJlZm9yZSBpdDogIlRDUFwvSVAiLiAgSW4gdGhlIHJhcmUgY2FzZQp5b3Ugd2FudCB0byB1c2UgYSBiYWNrc2xhc2ggaW5zaWRlIGEgd29yZCB5b3UgbmVlZCB0byB1c2UgdHdvIGJhY2tzbGFzaGVzLgpBbnkgb3RoZXIgdXNlIG9mIHRoZSBiYWNrc2xhc2ggaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24uCgoKS0VFUC1DQVNFIFdPUkRTCQkJCQkJKnNwZWxsLUtFRVBDQVNFKgoKSW4gdGhlIGFmZml4IGZpbGUgYSBLRUVQQ0FTRSBsaW5lIGNhbiBiZSB1c2VkIHRvIGRlZmluZSB0aGUgYWZmaXggbmFtZSB1c2VkCmZvciBrZWVwLWNhc2Ugd29yZHMuICBFeGFtcGxlOgoKCUtFRVBDQVNFID0gfgoKVGhpcyBmbGFnIGlzIG5vdCBzdXBwb3J0ZWQgYnkgTXlzcGVsbC4gIEl0IGhhcyB0aGUgbWVhbmluZyB0aGF0IGNhc2UgbWF0dGVycy4KVGhpcyBjYW4gYmUgdXNlZCBpZiB0aGUgd29yZCBkb2VzIG5vdCBoYXZlIHRoZSBmaXJzdCBsZXR0ZXIgaW4gdXBwZXIgY2FzZSBhdAp0aGUgc3RhcnQgb2YgYSBzZW50ZW5jZS4gIEV4YW1wbGU6CgogICAgd29yZCBsaXN0CSAgICBtYXRjaGVzCQkgICAgZG9lcyBub3QgbWF0Y2ggfgogICAgJ3MgbW9yZ2Vucy89ICAgICdzIG1vcmdlbnMJCSAgICAnUyBtb3JnZW5zICdzIE1vcmdlbnMgJ1MgTU9SR0VOUwogICAgJ3MgTW9yZ2VucwkgICAgJ3MgTW9yZ2VucyAnUyBNT1JHRU5TICAgJ1MgbW9yZ2VucyAncyBtb3JnZW5zCgpUaGUgZmxhZyBjYW4gYWxzbyBiZSB1c2VkIHRvIGF2b2lkIHRoYXQgdGhlIHdvcmQgbWF0Y2hlcyB3aGVuIGl0IGlzIGluIGFsbAp1cHBlci1jYXNlIGxldHRlcnMuCgoKUkFSRSBXT1JEUwkJCQkJCSpzcGVsbC1SQVJFKgoKSW4gdGhlIGFmZml4IGZpbGUgYSBSQVJFIGxpbmUgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIHRoZSBhZmZpeCBuYW1lIHVzZWQgZm9yCnJhcmUgd29yZHMuICBFeGFtcGxlOgoKCVJBUkUgPyB+CgpSYXJlIHdvcmRzIGFyZSBoaWdobGlnaHRlZCBkaWZmZXJlbnRseSBmcm9tIGJhZCB3b3Jkcy4gIFRoaXMgaXMgdG8gYmUgdXNlZCBmb3IKd29yZHMgdGhhdCBhcmUgY29ycmVjdCBmb3IgdGhlIGxhbmd1YWdlLCBidXQgYXJlIGhhcmRseSBldmVyIHVzZWQgYW5kIGNvdWxkIGJlCmEgdHlwaW5nIG1pc3Rha2UgYW55d2F5LiAgV2hlbiB0aGUgc2FtZSB3b3JkIGlzIGZvdW5kIGFzIGdvb2QgaXQgd29uJ3QgYmUKaGlnaGxpZ2h0ZWQgYXMgcmFyZS4KClRoaXMgZmxhZyBjYW4gYWxzbyBiZSB1c2VkIG9uIGFuIGFmZml4LCBzbyB0aGF0IGEgYmFzaWMgd29yZCBpcyBub3QgcmFyZSBidXQKdGhlIGJhc2ljIHdvcmQgcGx1cyBhZmZpeCBpcyByYXJlIHxzcGVsbC1hZmZpeC1mbGFnc3wuICBIb3dldmVyLCBpZiB0aGUgd29yZAphbHNvIGFwcGVhcnMgYXMgYSBnb29kIHdvcmQgaW4gYW5vdGhlciB3YXkgKGUuZy4sIGluIGFub3RoZXIgcmVnaW9uKSBpdCB3b24ndApiZSBtYXJrZWQgYXMgcmFyZS4KCgpCQUQgV09SRFMJCQkJCQkqc3BlbGwtQkFEKgoKSW4gdGhlIGFmZml4IGZpbGUgYSBCQUQgbGluZSBjYW4gYmUgdXNlZCB0byBkZWZpbmUgdGhlIGFmZml4IG5hbWUgdXNlZCBmb3IKYmFkIHdvcmRzLiAgRXhhbXBsZToKCglCQUQgISB+CgpUaGlzIGNhbiBiZSB1c2VkIHRvIGV4Y2x1ZGUgd29yZHMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgZ29vZC4gIEZvciBleGFtcGxlCiJ0aGUgdGhlIiBpbiB0aGUgLmRpYyBmaWxlOgoKCXRoZSB0aGUvISB+CgpPbmNlIGEgd29yZCBoYXMgYmVlbiBtYXJrZWQgYXMgYmFkIGl0IHdvbid0IGJlIHVuZG9uZSBieSBlbmNvdW50ZXJpbmcgdGhlIHNhbWUKd29yZCBhcyBnb29kLgoKVGhlIGZsYWcgYWxzbyBhcHBsaWVzIHRvIHRoZSB3b3JkIHdpdGggYWZmaXhlcywgdGh1cyB0aGlzIGNhbiBiZSB1c2VkIHRvIG1hcmsKYSB3aG9sZSBidW5jaCBvZiByZWxhdGVkIHdvcmRzIGFzIGJhZC4KCgkJCQkJCQkqc3BlbGwtRk9SQklEREVOV09SRCoKRk9SQklEREVOV09SRCBjYW4gYmUgdXNlZCBqdXN0IGxpa2UgQkFELiAgRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBIdW5zcGVsbC4KCgkJCQkJCQkqc3BlbGwtTkVFREFGRklYKgpUaGUgTkVFREFGRklYIGZsYWcgaXMgdXNlZCB0byByZXF1aXJlIHRoYXQgYSB3b3JkIGlzIHVzZWQgd2l0aCBhbiBhZmZpeC4gIFRoZQp3b3JkIGl0c2VsZiBpcyBub3QgYSBnb29kIHdvcmQgKHVubGVzcyB0aGVyZSBpcyBhbiBlbXB0eSBhZmZpeCkuICBFeGFtcGxlOgoKCU5FRURBRkZJWCArIH4KCgpDT01QT1VORCBXT1JEUwkJCQkJCSpzcGVsbC1jb21wb3VuZCoKCkEgY29tcG91bmQgd29yZCBpcyBhIGxvbmdlciB3b3JkIG1hZGUgYnkgY29uY2F0ZW5hdGluZyB3b3JkcyB0aGF0IGFwcGVhciBpbgp0aGUgLmRpYyBmaWxlLiAgVG8gc3BlY2lmeSB3aGljaCB3b3JkcyBtYXkgYmUgY29uY2F0ZW5hdGVkIGEgY2hhcmFjdGVyIGlzCnVzZWQuICBUaGlzIGNoYXJhY3RlciBpcyBwdXQgaW4gdGhlIGxpc3Qgb2YgYWZmaXhlcyBhZnRlciB0aGUgd29yZC4gIFdlIHdpbGwKY2FsbCB0aGlzIGNoYXJhY3RlciBhIGZsYWcgaGVyZS4gIE9idmlvdXNseSB0aGVzZSBmbGFncyBtdXN0IGJlIGRpZmZlcmVudCBmcm9tCmFueSBhZmZpeCBJRHMgdXNlZC4KCgkJCQkJCQkqc3BlbGwtQ09NUE9VTkRGTEFHKgpUaGUgTXlzcGVsbCBjb21wYXRpYmxlIG1ldGhvZCB1c2VzIG9uZSBmbGFnLCBzcGVjaWZpZWQgd2l0aCBDT01QT1VOREZMQUcuICBBbGwKd29yZHMgd2l0aCB0aGlzIGZsYWcgY29tYmluZSBpbiBhbnkgb3JkZXIuICBUaGlzIG1lYW5zIHRoZXJlIGlzIG5vIGNvbnRyb2wKb3ZlciB3aGljaCB3b3JkIGNvbWVzIGZpcnN0LiAgRXhhbXBsZToKCUNPTVBPVU5ERkxBRyBjIH4KCgkJCQkJCQkqc3BlbGwtQ09NUE9VTkRSVUxFKgpBIG1vcmUgYWR2YW5jZWQgbWV0aG9kIHRvIHNwZWNpZnkgaG93IGNvbXBvdW5kIHdvcmRzIGNhbiBiZSBmb3JtZWQgdXNlcwptdWx0aXBsZSBpdGVtcyB3aXRoIG11bHRpcGxlIGZsYWdzLiAgVGhpcyBpcyBub3QgY29tcGF0aWJsZSB3aXRoIE15c3BlbGwgMy4wLgpMZXQncyBzdGFydCB3aXRoIGFuIGV4YW1wbGU6CglDT01QT1VORFJVTEUgYysgfgoJQ09NUE9VTkRSVUxFIHNlIH4KClRoZSBmaXJzdCBsaW5lIGRlZmluZXMgdGhhdCB3b3JkcyB3aXRoIHRoZSAiYyIgZmxhZyBjYW4gYmUgY29uY2F0ZW5hdGVkIGluIGFueQpvcmRlci4gIFRoZSBzZWNvbmQgbGluZSBkZWZpbmVzIGNvbXBvdW5kIHdvcmRzIHRoYXQgYXJlIG1hZGUgb2Ygb25lIHdvcmQgd2l0aAp0aGUgInMiIGZsYWcgYW5kIG9uZSB3b3JkIHdpdGggdGhlICJlIiBmbGFnLiAgV2l0aCB0aGlzIGRpY3Rpb25hcnk6Cglib3JrL2MgfgoJb25pb24vcyB+Cglzb3VwL2UgfgoKWW91IGNhbiBtYWtlIHRoZXNlIHdvcmRzOgoJYm9yawoJYm9ya2JvcmsKCWJvcmtib3JrYm9yawoJKGV0Yy4pCglvbmlvbgoJc291cAoJb25pb25zb3VwCgpUaGUgQ09NUE9VTkRSVUxFIGl0ZW0gbWF5IGFwcGVhciBtdWx0aXBsZSB0aW1lcy4gIFRoZSBhcmd1bWVudCBpcyBtYWRlIG91dCBvZgpvbmUgb3IgbW9yZSBncm91cHMsIHdoZXJlIGVhY2ggZ3JvdXAgY2FuIGJlOgoJb25lIGZsYWcJCQllLmcuLCBjCglhbHRlcm5hdGUgZmxhZ3MgaW5zaWRlIFtdCWUuZy4sIFthYmNdCk9wdGlvbmFsbHkgdGhpcyBtYXkgYmUgZm9sbG93ZWQgYnk6CgkqCXRoZSBncm91cCBhcHBlYXJzIHplcm8gb3IgbW9yZSB0aW1lcywgZS5nLiwgc20qZQoJKwl0aGUgZ3JvdXAgYXBwZWFycyBvbmUgb3IgbW9yZSB0aW1lcywgZS5nLiwgYysKCT8JdGhlIGdyb3VwIGFwcGVhcnMgemVybyB0aW1lcyBvciBvbmNlLCBlLmcuLCB4PwoKVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSByZWdleHAgcGF0dGVybiBzeW50YXggKGJ1dCBub3QgdGhlIHNhbWUhKS4gIEEgZmV3CmV4YW1wbGVzIHdpdGggdGhlIHNlcXVlbmNlIG9mIHdvcmQgZmxhZ3MgdGhleSByZXF1aXJlOgogICAgQ09NUE9VTkRSVUxFIHgrCSAgICB4IHh4IHh4eCBldGMuCiAgICBDT01QT1VORFJVTEUgeXoJICAgIHl6CiAgICBDT01QT1VORFJVTEUgeCt6CSAgICB4eiB4eHogeHh4eiBldGMuCiAgICBDT01QT1VORFJVTEUgeXgrCSAgICB5eCB5eHggeXh4eCBldGMuCiAgICBDT01QT1VORFJVTEUgeHk/egkgICAgeHogeHl6CgogICAgQ09NUE9VTkRSVUxFIFthYmNdeiAgICBheiBieiBjegogICAgQ09NUE9VTkRSVUxFIFthYmNdK3ogICBheiBhYXogYWJheiBieiBiYXogYmNieiBjeiBjYXogY2JheiBldGMuCiAgICBDT01QT1VORFJVTEUgYVt4eXpdKyAgIGF4IGF4eCBheHl6IGF5IGF5eCBheXp6IGF6IGF6eSBhenh5IGV0Yy4KICAgIENPTVBPVU5EUlVMRSBzbSplCSAgICBzZSBzbWUgc21tZSBzbW1tZSBldGMuCiAgICBDT01QT1VORFJVTEUgc1t4eXpdKmUgIHNlIHN4ZSBzeHllIHN4eXhlIHN5ZSBzeXplIHN6ZSBzenllIHN6eXhlICBldGMuCgpBIHNwZWNpZmljIGV4YW1wbGU6IEFsbG93IGEgY29tcG91bmQgdG8gYmUgbWFkZSBvZiB0d28gd29yZHMgYW5kIGEgZGFzaDoKCUluIHRoZSAuYWZmIGZpbGU6CgkgICAgQ09NUE9VTkRSVUxFIHNkZSB+CgkgICAgTkVFREFGRklYIHggfgoJICAgIENPTVBPVU5EV09SRE1BWCAzIH4KCSAgICBDT01QT1VORE1JTiAxIH4KCUluIHRoZSAuZGljIGZpbGU6CgkgICAgc3RhcnQvcyB+CgkgICAgZW5kL2UgfgoJICAgIC0veGQgfgoKVGhpcyBhbGxvd3MgZm9yIHRoZSB3b3JkICJzdGFydC1lbmQiLCBidXQgbm90ICJzdGFydGVuZCIuCgpBbiBhZGRpdGlvbmFsIGltcGxpZWQgcnVsZSBpcyB0aGF0LCB3aXRob3V0IGZ1cnRoZXIgZmxhZ3MsIGEgd29yZCB3aXRoIGEKcHJlZml4IGNhbm5vdCBiZSBjb21wb3VuZGVkIGFmdGVyIGFub3RoZXIgd29yZCwgYW5kIGEgd29yZCB3aXRoIGEgc3VmZml4CmNhbm5vdCBiZSBjb21wb3VuZGVkIHdpdGggYSBmb2xsb3dpbmcgd29yZC4gIFRodXMgdGhlIGFmZml4IGNhbm5vdCBhcHBlYXIKb24gdGhlIGluc2lkZSBvZiBhIGNvbXBvdW5kIHdvcmQuICBUaGlzIGNhbiBiZSBjaGFuZ2VkIHdpdGggdGhlCnxzcGVsbC1DT01QT1VORFBFUk1JVEZMQUd8LgoKCQkJCQkJCSpzcGVsbC1ORUVEQ09NUE9VTkQqClRoZSBORUVEQ09NUE9VTkQgZmxhZyBpcyB1c2VkIHRvIHJlcXVpcmUgdGhhdCBhIHdvcmQgaXMgdXNlZCBhcyBwYXJ0IG9mIGEKY29tcG91bmQgd29yZC4gIFRoZSB3b3JkIGl0c2VsZiBpcyBub3QgYSBnb29kIHdvcmQuICBFeGFtcGxlOgoKCU5FRURDT01QT1VORCAmIH4KCgkJCQkJCQkqc3BlbGwtT05MWUlOQ09NUE9VTkQqClRoZSBPTkxZSU5DT01QT1VORCBkb2VzIGV4YWN0bHkgdGhlIHNhbWUgYXMgTkVFRENPTVBPVU5ELiAgU3VwcG9ydGVkIGZvcgpjb21wYXRpYmlsaXR5IHdpdGggSHVuc3BlbGwuCgoJCQkJCQkJKnNwZWxsLUNPTVBPVU5ETUlOKgpUaGUgbWluaW1hbCBjaGFyYWN0ZXIgbGVuZ3RoIG9mIGEgd29yZCB1c2VkIGZvciBjb21wb3VuZGluZyBpcyBzcGVjaWZpZWQgd2l0aApDT01QT1VORE1JTi4gIEV4YW1wbGU6CglDT01QT1VORE1JTiA1IH4KCldoZW4gb21pdHRlZCB0aGVyZSBpcyBubyBtaW5pbWFsIGxlbmd0aC4gIE9idmlvdXNseSB5b3UgY291bGQganVzdCBsZWF2ZSBvdXQKdGhlIGNvbXBvdW5kIGZsYWcgZnJvbSBzaG9ydCB3b3JkcyBpbnN0ZWFkLCB0aGlzIGZlYXR1cmUgaXMgcHJlc2VudCBmb3IKY29tcGF0aWJpbGl0eSB3aXRoIE15c3BlbGwuCgoJCQkJCQkJKnNwZWxsLUNPTVBPVU5EV09SRE1BWCoKVGhlIG1heGltdW0gbnVtYmVyIG9mIHdvcmRzIHRoYXQgY2FuIGJlIGNvbmNhdGVuYXRlZCBpbnRvIGEgY29tcG91bmQgd29yZCBpcwpzcGVjaWZpZWQgd2l0aCBDT01QT1VORFdPUkRNQVguICBFeGFtcGxlOgoJQ09NUE9VTkRXT1JETUFYIDMgfgoKV2hlbiBvbWl0dGVkIHRoZXJlIGlzIG5vIG1heGltdW0uICBJdCBhcHBsaWVzIHRvIGFsbCBjb21wb3VuZCB3b3Jkcy4KClRvIHNldCBhIGxpbWl0IGZvciB3b3JkcyB3aXRoIHNwZWNpZmljIGZsYWdzIG1ha2Ugc3VyZSB0aGUgaXRlbXMgaW4KQ09NUE9VTkRSVUxFIHdoZXJlIHRoZXkgYXBwZWFyIGRvbid0IGFsbG93IHRvbyBtYW55IHdvcmRzLgoKCQkJCQkJCSpzcGVsbC1DT01QT1VORFNZTE1BWCoKVGhlIG1heGltdW0gbnVtYmVyIG9mIHN5bGxhYmxlcyB0aGF0IGEgY29tcG91bmQgd29yZCBtYXkgY29udGFpbiBpcyBzcGVjaWZpZWQKd2l0aCBDT01QT1VORFNZTE1BWC4gIEV4YW1wbGU6CglDT01QT1VORFNZTE1BWCA2IH4KClRoaXMgaGFzIG5vIGVmZmVjdCBpZiB0aGVyZSBpcyBubyBTWUxMQUJMRSBpdGVtLiAgV2l0aG91dCBDT01QT1VORFNZTE1BWCB0aGVyZQppcyBubyBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHN5bGxhYmxlcy4KCklmIGJvdGggQ09NUE9VTkRXT1JETUFYIGFuZCBDT01QT1VORFNZTE1BWCBhcmUgZGVmaW5lZCwgYSBjb21wb3VuZCB3b3JkIGlzCmFjY2VwdGVkIGlmIGl0IGZpdHMgb25lIG9mIHRoZSBjcml0ZXJpYSwgdGh1cyBpcyBlaXRoZXIgbWFkZSBmcm9tIHVwIHRvCkNPTVBPVU5EV09SRE1BWCB3b3JkcyBvciBjb250YWlucyB1cCB0byBDT01QT1VORFNZTE1BWCBzeWxsYWJsZXMuCgoJCQkJCQkgICAgKnNwZWxsLUNPTVBPVU5ERk9SQklERkxBRyoKVGhlIENPTVBPVU5ERk9SQklERkxBRyBzcGVjaWZpZXMgYSBmbGFnIHRoYXQgY2FuIGJlIHVzZWQgb24gYW4gYWZmaXguICBJdAptZWFucyB0aGF0IHRoZSB3b3JkIHBsdXMgYWZmaXggY2Fubm90IGJlIHVzZWQgaW4gYSBjb21wb3VuZCB3b3JkLiAgRXhhbXBsZToKCWFmZml4IGZpbGU6CgkJQ09NUE9VTkRGTEFHIGMgfgoJCUNPTVBPVU5ERk9SQklERkxBRyB4IH4KCQlTRlggYSBZIDIgfgoJCVNGWCBhIDAgcyAgIC4gfgoJCVNGWCBhIDAgaXplL3ggLiB+CglkaWN0aW9uYXJ5OgoJCXdvcmQvYyB+CgkJdXRpbC9hYyB+CgpUaGlzIGFsbG93cyBmb3IgIndvcmR1dGlsIiBhbmQgIndvcmR1dGlscyIgYnV0IG5vdCAid29yZHV0aWxpemUiLgpOb3RlOiB0aGlzIGRvZXNuJ3Qgd29yayBmb3IgcG9zdHBvbmVkIHByZWZpeGVzIHlldC4KCgkJCQkJCSAgICAqc3BlbGwtQ09NUE9VTkRQRVJNSVRGTEFHKgpUaGUgQ09NUE9VTkRQRVJNSVRGTEFHIHNwZWNpZmllcyBhIGZsYWcgdGhhdCBjYW4gYmUgdXNlZCBvbiBhbiBhZmZpeC4gIEl0Cm1lYW5zIHRoYXQgdGhlIHdvcmQgcGx1cyBhZmZpeCBjYW4gYWxzbyBiZSB1c2VkIGluIGEgY29tcG91bmQgd29yZCBpbiBhIHdheQp3aGVyZSB0aGUgYWZmaXggZW5kcyB1cCBoYWxmd2F5IHRoZSB3b3JkLiAgV2l0aG91dCB0aGlzIGZsYWcgdGhhdCBpcyBub3QKYWxsb3dlZC4KTm90ZTogdGhpcyBkb2Vzbid0IHdvcmsgZm9yIHBvc3Rwb25lZCBwcmVmaXhlcyB5ZXQuCgoJCQkJCQkgICAgKnNwZWxsLUNPTVBPVU5EUk9PVCoKVGhlIENPTVBPVU5EUk9PVCBmbGFnIGlzIHVzZWQgZm9yIHdvcmRzIGluIHRoZSBkaWN0aW9uYXJ5IHRoYXQgYXJlIGFscmVhZHkgYQpjb21wb3VuZC4gIFRoaXMgbWVhbnMgaXQgY291bnRzIGZvciB0d28gd29yZHMgd2hlbiBjaGVja2luZyB0aGUgY29tcG91bmRpbmcKcnVsZXMuICBDYW4gYWxzbyBiZSB1c2VkIGZvciBhbiBhZmZpeCB0byBjb3VudCB0aGUgYWZmaXggYXMgYSBjb21wb3VuZGluZwp3b3JkLgoKCQkJCQkJKnNwZWxsLUNIRUNLQ09NUE9VTkRQQVRURVJOKgpDSEVDS0NPTVBPVU5EUEFUVEVSTiBpcyB1c2VkIHRvIGRlZmluZSBwYXR0ZXJucyB0aGF0LCB3aGVuIG1hdGNoaW5nIGF0IHRoZQpwb3NpdGlvbiB3aGVyZSB0d28gd29yZHMgYXJlIGNvbXBvdW5kZWQgdG9nZXRoZXIgZm9yYmlkcyB0aGUgY29tcG91bmQuCkZvciBleGFtcGxlOgoJQ0hFQ0tDT01QT1VORFBBVFRFUk4gbyBlIH4KClRoaXMgZm9yYmlkcyBjb21wb3VuZGluZyBpZiB0aGUgZmlyc3Qgd29yZCBlbmRzIGluICJvIiBhbmQgdGhlIHNlY29uZCB3b3JkCnN0YXJ0cyB3aXRoICJlIi4KClRoZSBhcmd1bWVudHMgbXVzdCBiZSBwbGFpbiB0ZXh0LCBubyBwYXR0ZXJucyBhcmUgYWN0dWFsbHkgc3VwcG9ydGVkLCBkZXNwaXRlCnRoZSBpdGVtIG5hbWUuICBDYXNlIGlzIGFsd2F5cyBpZ25vcmVkLgoKVGhlIEh1bnNwZWxsIGZlYXR1cmUgdG8gdXNlIHRocmVlIGFyZ3VtZW50cyBhbmQgZmxhZ3MgaXMgbm90IHN1cHBvcnRlZC4KCgkJCQkJCQkqc3BlbGwtU1lMTEFCTEUqClRoZSBTWUxMQUJMRSBpdGVtIGRlZmluZXMgY2hhcmFjdGVycyBvciBjaGFyYWN0ZXIgc2VxdWVuY2VzIHRoYXQgYXJlIHVzZWQgdG8KY291bnQgdGhlIG51bWJlciBvZiBzeWxsYWJsZXMgaW4gYSB3b3JkLiAgRXhhbXBsZToKCVNZTExBQkxFIGHhZelp7W/z9vV1+vz7eS9hYS9hdS9lYS9lZS9laS9pZS9vYS9vZS9vby9vdS91dS91aSB+CgpCZWZvcmUgdGhlIGZpcnN0IHNsYXNoIGlzIHRoZSBzZXQgb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBjb3VudGVkIGZvciBvbmUKc3lsbGFibGUsIGFsc28gd2hlbiByZXBlYXRlZCBhbmQgbWl4ZWQsIHVudGlsIHRoZSBuZXh0IGNoYXJhY3RlciB0aGF0IGlzIG5vdAppbiB0aGlzIHNldC4gIEFmdGVyIHRoZSBzbGFzaCBjb21lIHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGNvdW50ZWQKZm9yIG9uZSBzeWxsYWJsZS4gIFRoZXNlIGFyZSBwcmVmZXJyZWQgb3ZlciB1c2luZyBjaGFyYWN0ZXJzIGZyb20gdGhlIHNldC4KV2l0aCB0aGUgZXhhbXBsZSAiaWRlZWVuIiBoYXMgdGhyZWUgc3lsbGFibGVzLCBjb3VudGVkIGJ5ICJpIiwgImVlIiBhbmQgImUiLgoKT25seSBjYXNlLWZvbGRlZCBsZXR0ZXJzIG5lZWQgdG8gYmUgaW5jbHVkZWQuCgpBbm90aGVyIHdheSB0byByZXN0cmljdCBjb21wb3VuZGluZyB3YXMgbWVudGlvbmVkIGFib3ZlOiBBZGRpbmcgdGhlCnxzcGVsbC1DT01QT1VOREZPUkJJREZMQUd8IGZsYWcgdG8gYW4gYWZmaXggY2F1c2VzIGFsbCB3b3JkcyB0aGF0IGFyZSBtYWRlCndpdGggdGhhdCBhZmZpeCB0byBub3QgYmUgdXNlZCBmb3IgY29tcG91bmRpbmcuCgoKVU5MSU1JVEVEIENPTVBPVU5ESU5HCQkJCQkqc3BlbGwtTk9CUkVBSyoKCkZvciBzb21lIGxhbmd1YWdlcywgc3VjaCBhcyBUaGFpLCB0aGVyZSBpcyBubyBzcGFjZSBpbiBiZXR3ZWVuIHdvcmRzLiAgVGhpcwpsb29rcyBsaWtlIGFsbCB3b3JkcyBhcmUgY29tcG91bmRlZC4gIFRvIHNwZWNpZnkgdGhpcyB1c2UgdGhlIE5PQlJFQUsgaXRlbSBpbgp0aGUgYWZmaXggZmlsZSwgd2l0aG91dCBhcmd1bWVudHM6CglOT0JSRUFLIH4KClZpbSB3aWxsIHRyeSB0byBmaWd1cmUgb3V0IHdoZXJlIG9uZSB3b3JkIGVuZHMgYW5kIGEgbmV4dCBzdGFydHMuICBXaGVuIHRoZXJlCmFyZSBzcGVsbGluZyBtaXN0YWtlcyB0aGlzIG1heSBub3QgYmUgcXVpdGUgcmlnaHQuCgoKCQkJCQkJCSpzcGVsbC1DT01NT04qCkNvbW1vbiB3b3JkcyBjYW4gYmUgc3BlY2lmaWVkIHdpdGggdGhlIENPTU1PTiBpdGVtLiAgVGhpcyB3aWxsIGdpdmUgYmV0dGVyCnN1Z2dlc3Rpb25zIHdoZW4gZWRpdGluZyBhIHNob3J0IGZpbGUuICBFeGFtcGxlOgoKCUNPTU1PTiAgdGhlIG9mIHRvIGFuZCBhIGluIGlzIGl0IHlvdSB0aGF0IGhlIHdhcyBmb3Igb24gYXJlIH4KClRoZSB3b3JkcyBtdXN0IGJlIHNlcGFyYXRlZCBieSB3aGl0ZSBzcGFjZSwgdXAgdG8gMjUgcGVyIGxpbmUuCldoZW4gbXVsdGlwbGUgcmVnaW9ucyBhcmUgc3BlY2lmaWVkIGluIGEgIjpta3NwZWxsIiBjb21tYW5kIHRoZSBjb21tb24gd29yZHMKZm9yIGFsbCByZWdpb25zIGFyZSBjb21iaW5lZCBhbmQgdXNlZCBmb3IgYWxsIHJlZ2lvbnMuCgoJCQkJCQkJKnNwZWxsLU5PU1BMSVRTVUdTKgpUaGlzIGl0ZW0gaW5kaWNhdGVzIHRoYXQgc3BsaXR0aW5nIGEgd29yZCB0byBtYWtlIHN1Z2dlc3Rpb25zIGlzIG5vdCBhIGdvb2QKaWRlYS4gIFNwbGl0LXdvcmQgc3VnZ2VzdGlvbnMgd2lsbCBhcHBlYXIgb25seSB3aGVuIHRoZXJlIGFyZSBmZXcgc2ltaWxhcgp3b3Jkcy4KCglOT1NQTElUU1VHUyB+CgoJCQkJCQkJKnNwZWxsLU5PU1VHR0VTVCoKVGhlIGZsYWcgc3BlY2lmaWVkIHdpdGggTk9TVUdHRVNUIGNhbiBiZSB1c2VkIGZvciB3b3JkcyB0aGF0IHdpbGwgbm90IGJlCnN1Z2dlc3RlZC4gIENhbiBiZSB1c2VkIGZvciBvYnNjZW5lIHdvcmRzLgoKCU5PU1VHR0VTVCAlIH4KCgpSRVBMQUNFTUVOVFMJCQkJCQkqc3BlbGwtUkVQKgoKSW4gdGhlIGFmZml4IGZpbGUgUkVQIGl0ZW1zIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBjb21tb24gbWlzdGFrZXMuICBUaGlzIGlzCnVzZWQgdG8gbWFrZSBzcGVsbGluZyBzdWdnZXN0aW9ucy4gIFRoZSBpdGVtcyBkZWZpbmUgdGhlICJmcm9tIiB0ZXh0IGFuZCB0aGUKInRvIiByZXBsYWNlbWVudC4gIEV4YW1wbGU6CgoJUkVQIDQgfgoJUkVQIGYgcGggfgoJUkVQIHBoIGYgfgoJUkVQIGsgY2ggfgoJUkVQIGNoIGsgfgoKVGhlIGZpcnN0IGxpbmUgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgUkVQIGxpbmVzIGZvbGxvd2luZy4gIFZpbSBpZ25vcmVzIHRoZQpudW1iZXIsIGJ1dCBpdCBtdXN0IGJlIHRoZXJlIChmb3IgY29tcGF0aWJpbGl0eSB3aXRoIE15c3BlbGwpLgoKRG9uJ3QgaW5jbHVkZSBzaW1wbGUgb25lLWNoYXJhY3RlciByZXBsYWNlbWVudHMgb3Igc3dhcHMuICBWaW0gd2lsbCB0cnkgdGhlc2UKYW55d2F5LiAgWW91IGNhbiBpbmNsdWRlIHdob2xlIHdvcmRzIGlmIHlvdSB3YW50IHRvLCBidXQgeW91IG1pZ2h0IHdhbnQgdG8gdXNlCnRoZSAiZmlsZToiIGl0ZW0gaW4gJ3NwZWxsc3VnZ2VzdCcgaW5zdGVhZC4KCllvdSBjYW4gaW5jbHVkZSBhIHNwYWNlIGJ5IHVzaW5nIGFuIHVuZGVyc2NvcmU6CgoJUkVQIHRoZV90aGUgdGhlIH4KCgpTSU1JTEFSIENIQVJBQ1RFUlMJCQkJCSpzcGVsbC1NQVAqICpFNzgzKgoKSW4gdGhlIGFmZml4IGZpbGUgTUFQIGl0ZW1zIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBsZXR0ZXJzIHRoYXQgYXJlIHZlcnkgbXVjaAphbGlrZS4gIFRoaXMgaXMgbW9zdGx5IHVzZWQgZm9yIGEgbGV0dGVyIHdpdGggZGlmZmVyZW50IGFjY2VudHMuICBUaGlzIGlzIHVzZWQKdG8gcHJlZmVyIHN1Z2dlc3Rpb25zIHdpdGggdGhlc2UgbGV0dGVycyBzdWJzdGl0dXRlZC4gIEV4YW1wbGU6CgoJTUFQIDIgfgoJTUFQIGXp6+roIH4KCU1BUCB1/Pn6+yB+CgpUaGUgZmlyc3QgbGluZSBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBNQVAgbGluZXMgZm9sbG93aW5nLiAgVmltIGlnbm9yZXMgdGhlCm51bWJlciwgYnV0IHRoZSBsaW5lIG11c3QgYmUgdGhlcmUuCgpFYWNoIGxldHRlciBtdXN0IGFwcGVhciBpbiBvbmx5IG9uZSBvZiB0aGUgTUFQIGl0ZW1zLiAgSXQncyBhIGJpdCBtb3JlCmVmZmljaWVudCBpZiB0aGUgZmlyc3QgbGV0dGVyIGlzIEFTQ0lJIG9yIGF0IGxlYXN0IG9uZSB3aXRob3V0IGFjY2VudHMuCgoKLlNVRyBGSUxFCQkJCQkJKnNwZWxsLU5PU1VHRklMRSoKCldoZW4gc291bmRmb2xkaW5nIGlzIHNwZWNpZmllZCBpbiB0aGUgYWZmaXggZmlsZSB0aGVuICI6bWtzcGVsbCIgd2lsbCBub3JtYWxseQpwcm9kdWNlIGEgLnN1ZyBmaWxlIG5leHQgdG8gdGhlIC5zcGwgZmlsZS4gIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGZpbmQKc3VnZ2VzdGlvbnMgYnkgdGhlaXIgc291bmQtYS1saWtlIGZvcm0gcXVpY2tseS4gIEF0IHRoZSBjb3N0IG9mIGEgbG90IG9mCm1lbW9yeSAodGhlIGFtb3VudCBkZXBlbmRzIG9uIHRoZSBudW1iZXIgb2Ygd29yZHMsIHw6bWtzcGVsbHwgd2lsbCBkaXNwbGF5IGFuCmVzdGltYXRlIHdoZW4gaXQncyBkb25lKS4KClRvIGF2b2lkIHByb2R1Y2luZyBhIC5zdWcgZmlsZSB1c2UgdGhpcyBpdGVtIGluIHRoZSBhZmZpeCBmaWxlOgoKCU5PU1VHRklMRSB+CgpVc2VycyBjYW4gc2ltcGx5IG9taXQgdGhlIC5zdWcgZmlsZSBpZiB0aGV5IGRvbid0IHdhbnQgdG8gdXNlIGl0LgoKClNPVU5ELUEtTElLRQkJCQkJCSpzcGVsbC1TQUwqCgpJbiB0aGUgYWZmaXggZmlsZSBTQUwgaXRlbXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIHRoZSBzb3VuZHMtYS1saWtlIG1lY2hhbmlzbQp0byBiZSB1c2VkLiAgVGhlIG1haW4gaXRlbXMgZGVmaW5lIHRoZSAiZnJvbSIgdGV4dCBhbmQgdGhlICJ0byIgcmVwbGFjZW1lbnQuClNpbXBsaXN0aWMgZXhhbXBsZToKCglTQUwgQ0lBCQkJIFggfgoJU0FMIENICQkJIFggfgoJU0FMIEMJCQkgSyB+CglTQUwgSwkJCSBLIH4KClRoZXJlIGFyZSBhIGZldyBydWxlcyBhbmQgdGhpcyBjYW4gYmVjb21lIHF1aXRlIGNvbXBsaWNhdGVkLiAgQW4gZXhwbGFuYXRpb24KaG93IGl0IHdvcmtzIGNhbiBiZSBmb3VuZCBpbiB0aGUgQXNwZWxsIG1hbnVhbDoKaHR0cDovL2FzcGVsbC5uZXQvbWFuLWh0bWwvUGhvbmV0aWMtQ29kZS5odG1sLgoKVGhlcmUgYXJlIGEgZmV3IHNwZWNpYWwgaXRlbXM6CgoJU0FMIGZvbGxvd3VwCQl0cnVlIH4KCVNBTCBjb2xsYXBzZV9yZXN1bHQJdHJ1ZSB+CglTQUwgcmVtb3ZlX2FjY2VudHMJdHJ1ZSB+CgoiMSIgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgInRydWUiLiAgQW55IG90aGVyIHZhbHVlIG1lYW5zICJmYWxzZSIuCgoKU0lNUExFIFNPVU5ERk9MRElORwkJCQkqc3BlbGwtU09GT0ZST00qICpzcGVsbC1TT0ZPVE8qCgpUaGUgU0FMIG1lY2hhbmlzbSBpcyBjb21wbGV4IGFuZCBzbG93LiAgQSBzaW1wbGVyIG1lY2hhbmlzbSBpcyBtYXBwaW5nIGFsbApjaGFyYWN0ZXJzIHRvIGFub3RoZXIgY2hhcmFjdGVyLCBtYXBwaW5nIHNpbWlsYXIgc291bmRpbmcgY2hhcmFjdGVycyB0byB0aGUKc2FtZSBjaGFyYWN0ZXIuICBBdCB0aGUgc2FtZSB0aW1lIHRoaXMgZG9lcyBjYXNlIGZvbGRpbmcuICBZb3UgY2FuIG5vdCBoYXZlCmJvdGggU0FMIGl0ZW1zIGFuZCBzaW1wbGUgc291bmRmb2xkaW5nLgoKVGhlcmUgYXJlIHR3byBpdGVtcyByZXF1aXJlZDogb25lIHRvIHNwZWNpZnkgdGhlIGNoYXJhY3RlcnMgdGhhdCBhcmUgbWFwcGVkCmFuZCBvbmUgdGhhdCBzcGVjaWZpZXMgdGhlIGNoYXJhY3RlcnMgdGhleSBhcmUgbWFwcGVkIHRvLiAgVGhleSBtdXN0IGhhdmUKZXhhY3RseSB0aGUgc2FtZSBudW1iZXIgb2YgY2hhcmFjdGVycy4gIEV4YW1wbGU6CgogICAgU09GT0ZST00gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiB+CiAgICBTT0ZPVE8gICBlYmN0ZWZnaGVqa2xubmVwa3JzdGV2dmtlc2ViY3RlZmdoZWprbG5uZXBrcnN0ZXZ2a2VzIH4KCkluIHRoZSBleGFtcGxlIGFsbCB2b3dlbHMgYXJlIG1hcHBlZCB0byB0aGUgc2FtZSBjaGFyYWN0ZXIgJ2UnLiAgQW5vdGhlcgptZXRob2Qgd291bGQgYmUgdG8gbGVhdmUgb3V0IGFsbCB2b3dlbHMuICBTb21lIGNoYXJhY3RlcnMgdGhhdCBzb3VuZCBuZWFybHkKdGhlIHNhbWUgYW5kIGFyZSBvZnRlbiBtaXhlZCB1cCwgc3VjaCBhcyAnbScgYW5kICduJywgYXJlIG1hcHBlZCB0byB0aGUgc2FtZQpjaGFyYWN0ZXIuICBEb24ndCBkbyB0aGlzIHRvbyBtdWNoLCBhbGwgd29yZHMgd2lsbCBzdGFydCBsb29raW5nIGFsaWtlLgoKQ2hhcmFjdGVycyB0aGF0IGRvIG5vdCBhcHBlYXIgaW4gU09GT0ZST00gd2lsbCBiZSBsZWZ0IG91dCwgZXhjZXB0IHRoYXQgYWxsCndoaXRlIHNwYWNlIGlzIHJlcGxhY2VkIGJ5IG9uZSBzcGFjZS4gIFNlcXVlbmNlcyBvZiB0aGUgc2FtZSBjaGFyYWN0ZXIgaW4KU09GT0ZST00gYXJlIHJlcGxhY2VkIGJ5IG9uZS4KCllvdSBjYW4gdXNlIHRoZSB8c291bmRmb2xkKCl8IGZ1bmN0aW9uIHRvIHRyeSBvdXQgdGhlIHJlc3VsdHMuICBPciBzZXQgdGhlCid2ZXJib3NlJyBvcHRpb24gdG8gc2VlIHRoZSBzY29yZSBpbiB0aGUgb3V0cHV0IG9mIHRoZSB8ej18IGNvbW1hbmQuCgoKVU5TVVBQT1JURUQgSVRFTVMJCQkJKnNwZWxsLWFmZml4LW5vdC1zdXBwb3J0ZWQqCgpUaGVzZSBpdGVtcyBhcHBlYXIgaW4gdGhlIGFmZml4IGZpbGUgb2Ygb3RoZXIgc3BlbGwgY2hlY2tlcnMuICBJbiBWaW0gdGhleSBhcmUKaWdub3JlZCwgbm90IHN1cHBvcnRlZCBvciBkZWZpbmVkIGluIGFub3RoZXIgd2F5LgoKQUNDRU5UCQkoSHVuc3BlbGwpCQkJCSpzcGVsbC1BQ0NFTlQqCgkJVXNlIE1BUCBpbnN0ZWFkLiB8c3BlbGwtTUFQfAoKQlJFQUsJCShIdW5zcGVsbCkJCQkJKnNwZWxsLUJSRUFLKgoJCURlZmluZSBicmVhayBwb2ludHMuICBVbmNsZWFyIGhvdyBpdCB3b3JrcyBleGFjdGx5LgoJCU5vdCBzdXBwb3J0ZWQuCgpDSEVDS0NPTVBPVU5EQ0FTRSAgKEh1bnNwZWxsKQkJCSpzcGVsbC1DSEVDS0NPTVBPVU5EQ0FTRSoKCQlEaXNhbGxvdyB1cHBlcmNhc2UgbGV0dGVycyBhdCBjb21wb3VuZCB3b3JkIGJvdW5kYXJpZXMuCgkJTm90IHN1cHBvcnRlZC4KCkNIRUNLQ09NUE9VTkREVVAgIChIdW5zcGVsbCkJCQkqc3BlbGwtQ0hFQ0tDT01QT1VORERVUCoKCQlEaXNhbGxvdyB1c2luZyB0aGUgc2FtZSB3b3JkIHR3aWNlIGluIGEgY29tcG91bmQuICBOb3QKCQlzdXBwb3J0ZWQuCgpDSEVDS0NPTVBPVU5EUkVQICAoSHVuc3BlbGwpCQkJKnNwZWxsLUNIRUNLQ09NUE9VTkRSRVAqCgkJU29tZXRoaW5nIGFib3V0IHVzaW5nIFJFUCBpdGVtcyBhbmQgY29tcG91bmQgd29yZHMuICBOb3QKCQlzdXBwb3J0ZWQuCgpDSEVDS0NPTVBPVU5EVFJJUExFICAoSHVuc3BlbGwpCQkJKnNwZWxsLUNIRUNLQ09NUE9VTkRUUklQTEUqCgkJRm9yYmlkIHRocmVlIGlkZW50aWNhbCBjaGFyYWN0ZXJzIHdoZW4gY29tcG91bmRpbmcuICBOb3QKCQlzdXBwb3J0ZWQuCgpDT01QTEVYUFJFRklYRVMgIChIdW5zcGVsbCkJCQkJKnNwZWxsLUNPTVBMRVhQUkVGSVhFUyoKCQlFbmFibGVzIHVzaW5nIHR3byBwcmVmaXhlcy4gIE5vdCBzdXBwb3J0ZWQuCgpDT01QT1VORAkoSHVuc3BlbGwpCQkJCSpzcGVsbC1DT01QT1VORCoKCQlUaGlzIGlzIG9uZSBsaW5lIHdpdGggdGhlIGNvdW50IG9mIENPTVBPVU5EIGl0ZW1zLCBmb2xsb3dlZCBieQoJCXRoYXQgbWFueSBDT01QT1VORCBsaW5lcyB3aXRoIGEgcGF0dGVybi4KCQlSZW1vdmUgdGhlIGZpcnN0IGxpbmUgd2l0aCB0aGUgY291bnQgYW5kIHJlbmFtZSB0aGUgb3RoZXIKCQlpdGVtcyB0byBDT01QT1VORFJVTEUgfHNwZWxsLUNPTVBPVU5EUlVMRXwKCkNPTVBPVU5ERklSU1QJKEh1bnNwZWxsKQkJCQkqc3BlbGwtQ09NUE9VTkRGSVJTVCoKCQlVc2UgQ09NUE9VTkRSVUxFIGluc3RlYWQuIHxzcGVsbC1DT01QT1VORFJVTEV8CgpDT01QT1VOREJFR0lOCShIdW5zcGVsbCkJCQkJKnNwZWxsLUNPTVBPVU5EQkVHSU4qCgkJVXNlIENPTVBPVU5EUlVMRSBpbnN0ZWFkLiB8c3BlbGwtQ09NUE9VTkRSVUxFfAoKQ09NUE9VTkRFTkQJKEh1bnNwZWxsKQkJCQkqc3BlbGwtQ09NUE9VTkRFTkQqCgkJVXNlIENPTVBPVU5EUlVMRSBpbnN0ZWFkLiB8c3BlbGwtQ09NUE9VTkRSVUxFfAoKQ09NUE9VTkRNSURETEUJKEh1bnNwZWxsKQkJCQkqc3BlbGwtQ09NUE9VTkRNSURETEUqCgkJVXNlIENPTVBPVU5EUlVMRSBpbnN0ZWFkLiB8c3BlbGwtQ09NUE9VTkRSVUxFfAoKQ09NUE9VTkRSVUxFUwkoSHVuc3BlbGwpCQkJCSpzcGVsbC1DT01QT1VORFJVTEVTKgoJCU51bWJlciBvZiBDT01QT1VORFJVTEUgbGluZXMgZm9sbG93aW5nLiAgSWdub3JlZCwgYnV0IHRoZQoJCWFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIuCgpDT01QT1VORFNZTExBQkxFICAoSHVuc3BlbGwpCQkJKnNwZWxsLUNPTVBPVU5EU1lMTEFCTEUqCgkJVXNlIFNZTExBQkxFIGFuZCBDT01QT1VORFNZTE1BWCBpbnN0ZWFkLiB8c3BlbGwtU1lMTEFCTEV8CgkJfHNwZWxsLUNPTVBPVU5EU1lMTUFYfAoKS0VZCQkoSHVuc3BlbGwpCQkJCSpzcGVsbC1LRVkqCgkJRGVmaW5lIGNoYXJhY3RlcnMgdGhhdCBhcmUgY2xvc2UgdG9nZXRoZXIgb24gdGhlIGtleWJvYXJkLgoJCVVzZWQgdG8gZ2l2ZSBiZXR0ZXIgc3VnZ2VzdGlvbnMuICBOb3Qgc3VwcG9ydGVkLgoJCQpMQU5HCQkoSHVuc3BlbGwpCQkJCSpzcGVsbC1MQU5HKgoJCVRoaXMgc3BlY2lmaWVzIGxhbmd1YWdlLXNwZWNpZmljIGJlaGF2aW9yLiAgVGhpcyBhY3R1YWxseQoJCW1vdmVzIHBhcnQgb2YgdGhlIGxhbmd1YWdlIGtub3dsZWRnZSBpbnRvIHRoZSBwcm9ncmFtLAoJCXRoZXJlZm9yZSBWaW0gZG9lcyBub3Qgc3VwcG9ydCBpdC4gIEVhY2ggbGFuZ3VhZ2UgcHJvcGVydHkKCQltdXN0IGJlIHNwZWNpZmllZCBzZXBhcmF0ZWx5LgoKTEVNTUFfUFJFU0VOVAkoSHVuc3BlbGwpCQkJCSpzcGVsbC1MRU1NQV9QUkVTRU5UKgoJCU9ubHkgbmVlZGVkIGZvciBtb3JwaG9sb2dpY2FsIGFuYWx5c2lzLgoKTUFYTkdSQU1TVUdTCShIdW5zcGVsbCkJCQkJKnNwZWxsLU1BWE5HUkFNU1VHUyoKCQlTZXQgbnVtYmVyIG9mIG4tZ3JhbSBzdWdnZXN0aW9ucy4gIE5vdCBzdXBwb3J0ZWQuCgpQU0VVRE9ST09UCShIdW5zcGVsbCkJCQkJKnNwZWxsLVBTRVVET1JPT1QqCgkJVXNlIE5FRURBRkZJWCBpbnN0ZWFkLiB8c3BlbGwtTkVFREFGRklYfAoKU1VHU1dJVEhET1RTCShIdW5zcGVsbCkJCQkJKnNwZWxsLVNVR1NXSVRIRE9UUyoKCQlBZGRzIGRvdHMgdG8gc3VnZ2VzdGlvbnMuICBWaW0gZG9lc24ndCBuZWVkIHRoaXMuCgpTWUxMQUJMRU5VTQkoSHVuc3BlbGwpCQkJCSpzcGVsbC1TWUxMQUJMRU5VTSoKCQlOb3Qgc3VwcG9ydGVkLgoKVFJZCQkoTXlzcGVsbCwgSHVuc3BlbGwsIG90aGVycykJCSpzcGVsbC1UUlkqCgkJVmltIGRvZXMgbm90IHVzZSB0aGUgVFJZIGl0ZW0sIGl0IGlzIGlnbm9yZWQuICBGb3IgbWFraW5nCgkJc3VnZ2VzdGlvbnMgdGhlIGFjdHVhbCBjaGFyYWN0ZXJzIGluIHRoZSB3b3JkcyBhcmUgdXNlZCwgdGhhdAoJCWlzIG11Y2ggbW9yZSBlZmZpY2llbnQuCgpXT1JEQ0hBUlMJKEh1bnNwZWxsKQkJCQkqc3BlbGwtV09SRENIQVJTKgoJCVVzZWQgdG8gcmVjb2duaXplIHdvcmRzLiAgVmltIGRvZXNuJ3QgbmVlZCBpdCwgYmVjYXVzZSB0aGVyZQoJCWlzIG5vIG5lZWQgdG8gc2VwYXJhdGUgd29yZHMgYmVmb3JlIGNoZWNraW5nIHRoZW0gKHVzaW5nIGEKCQl0cmllIGluc3RlYWQgb2YgYSBoYXNodGFibGUpLgoKIHZpbTp0dz03ODpzdz00OnRzPTg6ZnQ9aGVscDpub3JsOgo=