ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9yeSBvZiBDaGFuZ2VzCgpWZXJzaW9uIDYuNS4yCgpEYW5pZWwgKDIxIE1hcmNoIDIwMDApOgotIFBhdWwgSGFycmluZ3RvbiA8cGF1bEBwaXp6YS5vcmc+IHF1aWNrbHkgcG9pbnRlZCBvdXQgdG8gbWUgdGhhdCA2LjUuMQogIGNyYXNoZXMgaGFyZC4gSSB1cGxvYWQgNi41LjIgbm93IGFzIHF1aWNrbHkgYXMgcG9zc2libGUhIFRoZSBwcm9ibGVtIHdhcwogIHRoZSAtRCBhZGp1c3RtZW50cyBpbiBzcmMvbWFpbi5jLCBzZWUgYWxzbyBhIHNlcGFyYXRlIDYuNS4xLXBhdGNoIG9uIHRoZQogIHdlYiBzaXRlLgoKVmVyc2lvbiA2LjUuMQoKRGFuaWVsICgyMCBNYXJjaCAyMDAwKToKLSBBbiBhbnlub21vdXMgcG9zdCBvbiBzb3VyY2Vmb3JnZSBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgYSBwb3NzaWJsZSBidWZmZXIKICBvdmVyZmxvdyBpbiB0aGUgY3VybF91bmVzY2FwZSgpIGZ1bmN0aW9uIGZvciBVUkwgY29udmVydGlvbnMuIFRoZSBtYWluCiAgcHJvYmxlbSB3aXRoIHRoaXMgYnVnIGlzIHRoYXQgdGhlIGZ0cCBkb3dubG9hZCB1c2VzIHRoYXQgZnVuY3Rpb24gYW5kIHRoaXMKICBzaW5nbGUtIGJ5dGUgb3ZlcmZsb3cgY291bGQgbGVhZCB0byB2ZXJ5IG9kZCBidWdzIChhcyBvbmUgcmVwb3J0ZWQgYnkgSmFubmUKICBKb2hhbnNzb24pLgoKRGFuaWVsICgxOSBNYXJjaCAyMDAwKToKLSBNYXJjbyBHLiBTYWx2YWdubyA8bWdzQHdoaXouY2piLm5ldD4gc3VwcGxpZWQgbWUgd2l0aCBhIHNlcmllcyBvZiBwYXRjaGVzCiAgdGhhdCBub3cgYWxsb3dzIGN1cmwgdG8gZ2V0IGNvbXBpbGVkIG9uIE9TLzIuIEl0IGV2ZW4gaW5jbHVkZXMgYSBzZWN0aW9uIGluCiAgdGhlIElOU1RBTEwgZmlsZS4gVmVyeSBuaWNlIGpvYiEKCkRhbmllbCAoMTcgTWFyY2ggMjAwMCk6Ci0gV2hhbSBCYW5nIDx3aGFtX2JhbmdAeWFob28uY29tPiAoaXMgdGhhdCBQYXNjYWwgR2F1ZGV0dGU/KSBzdXBwbGllZCBhIHBhdGNoCiAgZm9yIHRoZSBsaWIvTWFrZWZpbGUudmM2IGZpbGUuIFdlIHN0aWxsIG5lZWQgc29tZSBmaXhlcyBmb3IgdGhlCiAgY29uZmlnLXdpbjMyLmggc2luY2UgaXQgYXBwZWFycyB0aGF0IFZDKysgYW5kIG1pbmd3MzIgaGF2ZSBkaWZmZXJlbnQKICBvcGluaW9ucyBhYm91dCAoYXQgbGVhc3QpIHVuaXN0ZC5oJ3MgZXhpc3RhbmNlLgoKRGFuaWVsICgxNSBNYXJjaCAyMDAwKToKLSBJIG1vZGlmaWVkIHRoZSAtRC8tLWR1bXAtaGVhZGVyIHdvcmtpbmdzIHNvIHRoYXQgaXQgZG9lc24ndCB3cml0ZSBhbnl0aGluZwogIHRvIHRoZSBmaWxlIHVudGlsIGl0IG5lZWRzIHRvLiBUaGlzIHdheSwgeW91IGNhbiBhY3R1YWxseSB1c2UgLWIgYW5kIC1ECiAgb24gdGhlIHNhbWUgZmlsZSBpZiB5b3Ugd2FudCByZXBlYXRlZCBpbnZva2VzIHRvIHN0b3JlIGFuZCByZWFkIHRoZSBjb29raWVzCiAgaW4gdGhhdCBvbmUgc2luZ2xlIGZpbGUuCgotIFBva2VkIGFyb3VuZCBpbiBsb3RzIG9mIHRleHRzLiBBZGRlZCB0aGUgQlVHUyBmaWxlIGZvciBidWcgcmVwb3J0aW5nIHN0dWZmLgogIEFkZGVkIHRoZSBjbGFzc2ljIEhUVFAgUE9TVCBxdWVzdGlvbiB0byB0aGUgRkFRLCByZW1vdmVkIHNvbWUgI2lmZGVmIFdJTjMyCiAgc3R1ZmYgZnJvbSB0aGUgc291cmNlcyAodGhleSdyZSBjb3ZlcmVkIGJ5IHRoZSBjb25maWctd2luMzIuaCBub3cpLgoKLSBQYXNjYWwgR2F1ZGV0dGUgPHBhc2NhbEBnYXVkZXR0ZS5vcmc+IGZpeGVkIGEgbWlzc2luZyBsZGFwLmMgcHJvYmxlbSBpbiB0aGUKICBNYWtlZmlsZS52YzYgZmlsZS4gSGUgYWxzbyBhZGRyZXNzZWQgYSBwcm9ibGVtIGluIHNyYy9jb25maWctd2luMzIuaC4KCkRhbmllbCAoMTQgTWFyY2ggMjAwMCk6Ci0gUGF1bCBIYXJyaW5ndG9uIHBvaW50ZWQgb3V0IHRoYXQgdGhlICdodHRwX2NvZGUnIHZhcmlhYmxlIGluIHRoZSAtdyBvdXRwdXQKICB3YXMgbmV2ZXIgd3JpdHRlbi4gSSBmaXhlZCBpdCBub3cuCgotIEphbm5lIEpvaGFuc3NvbiA8ampAZHluYXJjLnNlPiByZXBvcnRlZCB0aGUgY29tcGxhaW50cyB0aGF0IE9wZW5CU0QgZG9lcwogIHdoZW4gZ2V0ZGF0ZS5jICNpbmNsdWRlcyBtYWxsb2MuaC4gSXQgY2xhaW1zIHN0ZGxpYi5oIHNob3VsZCBiZSBpbmNsdWRlZAogIGluc3RlYWQuIEkgYWRkZWQgI2lmZGVmIEhBVkVfTUFMTE9DX0ggY29kZSBpbiBnZXRkYXRlLnkgYW5kIHR3byBjaGVja3MgaW4KICB0aGUgY29uZmlndXJlLmluIGZvciBtYWxsb2MuaCBhbmQgc3RkbGliLmguCgpWZXJzaW9uIDYuNQoKRGFuaWVsICgxMyBNYXJjaCAyMDAwKToKLSA8Y3VybEBzcGFtLndvbHZlc2JhbmUubmV0PiBwb2ludGVkIG91dCB0aGF0IHRoZSB3YXkgY3VybCBzZW50IGNvb2tpZXMgaW4gYQogIHNpbmdsZSBsaW5lIHdhc24ndCBlbmpveWVkIGJ5IElJUzQuMCBzZXJ2ZXJzLiBJbiBteSB2aWV3LCB0aGF0IGlzIG5vdCB3aGF0CiAgdGhlIHN0YW5kYXJkcyBzYXksIGJ1dCBJIGFkZGVkIGEgd2hpdGUgc3BhY2UgYmV0d2VlbiB0aGUgbmFtZS92YWx1ZSBwYWlycyB0bwogIHBlcmhhcHMgbWFrZSB0aGVtIHdvcmsgYmV0dGVyLgoKLSBBZGRlZCB0aGUgcGVybCBjaGVjayBiYWNrIGluIHRoZSBjb25maWd1cmUuaW4gYWdhaW4gc2luY2UgdGhlIG1raGVscC5wbAogIHNjcmlwdCBuZWVkcyBpdCEKCi0gTWFkZSBzb21lIGJlYXV0aWZpY2F0aW9ucyBpbiB0aGUgY3VybCBtYW4gcGFnZS4KCkRhbmllbCAoMyBNYXJjaCAyMDAwKToKLSBK9nJuIGhlbHBlZCBtZSB1cGRhdGUgdGhlIGNvbmZpZy13aW4zMi5oIGZpbGVzIHdpdGggSEFWRV9TRVRWQlVGIGFuZAogIEhBVkVfU1RSRFVQLgoKRGFuaWVsICgzIE1hcmNoIDIwMDApOgotIFVwbG9hZGVkIHRoZSA2LjVwcmUyIHBhY2thZ2UuCgpEYW5pZWwgKDIgTWFyY2ggMjAwMCk6Ci0gUmVtb3ZlZCB0aGUgcGVybC1wcm9ncmFtcyBmcm9tIHRoZSBkaXN0cmlidXRpb24sIHRoZXkgbmV2ZXIgbWFkZSBtYW55IHBlb3BsZQogIGhhcHB5IGFuZCBJJ2xsIHN0aWxsIGtlZXAgdGhlbSBhdmFpbGFibGUgb24gdGhlIHdlYi4KCi0gQWRkZWQgdGhlIC13IGFuZCAtTiBzdHVmZiB0byB0aGUgbWFuIHBhZ2UuIERvY3VtZW50ZWQgdGhlIG5ldyBwcm9ncmVzcyBtZXRlcgogIGRpc3BsYXkgaW4gUkVBRE1FLmN1cmwuCgotIEr2cm4gSGFydHJvdGggPEpvZXJuLkhhcnRyb3RoQHRlbGVrb20uZGU+LCBDaHJpcyA8Y2JheWxpc3NAY3NjLmNvbWU+IGFuZCBVbGYKICBN9mxsZXIgZnJvbSB0aGUgb3BlbnNzbCBkZXZlbG9wbWVudCB0ZWFtIGhlbHBlZCBicmluZ2luZyBtZSB0aGUgZGV0YWlscyBmb3IKICBmaXhpbmcgYW4gT3BlblNTTCB1c2FnZSBmbGF3LiBJdCBiZWNhbWUgYXBwZWFyYW50IHdoZW4gdGhleSByZWxlYXNlZCBvcGVuc3NsCiAgMC45LjUgc2luY2UgdGhhdCBiYXJmZWQgb24gY3VybCdzIGJhZCBiZWhhdmlvdXIgKG5vdCBzZWVkaW5nIGEgcmFuZG9tIG51bWJlcgogIHRoaW5nKS4KCi0gWWV0IGFub3RoZXIgb3B0aW9uOiAtTi8tLW5vLWJ1ZmZlciBkaXNhYmxlcyBidWZmZXJpbmcgaW4gdGhlIG91dHB1dCBzdHJlYW0uCiAgUHJvYmFibHkgbW9zdCB1c2VmdWwgZm9yIHZlcnkgc2xvdyB0cmFuc2ZlcnMgd2hlbiB5b3UgcmVhbGx5IHdhbnQgdG8gZ2V0CiAgZXZlcnkgYnl0ZSBjdXJsIHJlY2VpdmVzIHdpdGhpbiBzb21lIHByZWZlcmVkIHRpbWUuIEFuZHJldyA8dG1yQGdjaS5uZXQ+CiAgc3VnZ2VzdGVkIHRoaXMuCgotIERhbWllbiBBZGFudCA8ZGFtc0B1c2EubmV0PiBtYWlsZWQgbWUgaGlzIGZpeGVzIGZvciBtYWtpbmcgY3VybCBjb21waWxlCiAgb24gVWx0cml4LgoKRGFuaWVsICgyNCBGZWJydWFyeSAyMDAwKToKLSBBcHBsaWVkIEr2cm4gSGFydHJvdGgncyBmaXhlcyBmb3IgY29uZmlnLXdpbjMyLmggYW5kIGxpYi9NYWtlZmlsZS53MzIuCgogIEkgc2hvdWxkIGFsc28gbWFrZSBhIG5vdGUgaGVyZSwgaWYgbm90aGluZyBlbHNlIHRvIG15c2VsZiwgdGhhdCB3aGVuIHVzaW5nCiAgdGhlICUtc3ludGF4IGZvciB2YXJpYWJsZXMgaW4gRE9TIGNvbW1hbmQgcHJvbXB0cywgeW91IG11c3QgdXNlIHR3byAlLQogIGxldHRlcnMgZm9yIGVhY2ggb25lIHNpbmNlIHRoYXQgaXMgYW4gZXNjYXBlIGxldHRlciB0aGVyZSEgTWF5YmUgSSBzaG91bGQKICB1c2UgYW5vdGhlciBsZXR0ZXIgaW5zdGVhZCEKCi0gQWRkZWQgbW9yZSB2YXJpYWJsZXMgdG8gLXc6CgogICdodHRwX2NvZGUnCiAgJ3RpbWVfbmFtZWxvb2t1cCcKICAndGltZV9jb25uZWN0JwogICd0aW1lX3ByZXRyYW5zZmVyJwogICd1cmxfZWZmZWN0aXZlJwoKLSBNYWRlIC13QGZpbGVuYW1lIHJlYWQgdGhlIHN5bnRheCBmcm9tIGEgZmlsZSBhbmQgLXdALSByZWFkcyB0aGUgc3ludGF4IGZyb20KICBzdGRpbiBpbiB0aGUgZ29vZCBvbGQgInN0YW5kYXJkIiBjdXJsIHdheS4KCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwMCk6Ci0gUmVsZWFzZWQgYSA2LjVwcmUxIHZlcnNpb24gdG8gZ2V0IHNvbWUgdGVzdCBhbmQgdXNlciBmZWVkYmFjay4KCkRhbmllbCAoMjEgRmVicnVhcnkgMjAwMCk6CgotIEkgYWRkZWQgdGhlIC13Ly0td3JpdGUtb3V0IGZsYWcgYW5kIHNvbWUgdmFyaWFibGVzIHRvIGdvIHdpdGggaXQuIC13IGlzIGEKICBzaW5nbGUgc3RyaW5nLCB3aGF0ZXZlciB5b3UgZW50ZXIgdGhlcmUgd2lsbCBiZSB3cml0dGVuIG91dCB3aGVuIGN1cmwgaGFzCiAgY29tcGxldGVkIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0LiBUaGVyZSBhcmUgc29tZSB2YXJpYWJsZSBzdWJzdGl0dXRpb25zIGFuZAogIHRoZXkgYXJlIHNwZWNpZmVkIGFzICcle3ZhcmlhYmxlfScgKHdpdGhvdXQgdGhlIHF1b3RlcykuIFZhcmlhYmxlcyB0aGF0CiAgZXhpc3QgYXMgb2YgdGhpcyBtb21lbnQgYXJlOgoKICAgICAgICB0b3RhbF90aW1lICAgICAtIHRvdGFsIHRyYW5zZmVyIHRpbWUgaW4gc2Vjb25kcyAod2l0aCAyIGRlY2ltYWxzKQogICAgICAgIHNpemVfZG93bmxvYWQgIC0gdG90YWwgZG93bmxvYWRlZCBhbW91bnQgb2YgYnl0ZXMKICAgICAgICBzaXplX3VwbG9hZCAgICAtIHRvdGFsIHVwbG9hZGVkIGFtb3VudCBvZiBieXRlcwogICAgICAgIHNwZWVkX2Rvd25sb2FkIC0gdGhlIGF2ZXJhZ2Ugc3BlZWQgb2YgdGhlIGVudGlyZSBkb3dubG9hZAogICAgICAgIHNwZWVkX3VwbG9hZCAgIC0gdGhlIGF2ZXJhZ2Ugc3BlZWQgb2YgdGhlIGVudGlyZSB1cGxvYWQKCiAgSSB3aWxsIG9mIGNvdXJzZSBhZGQgbW9yZSB2YXJpYWJsZXMsIGJ1dCBJIG5lZWQgaW5wdXQgb24gdGhlc2UgYW5kIG90aGVycy4KCi0gSXQgc3RydWNrIG1lIHRoYXQgdGhlIC0jIHByb2dyZXNzIGJhciB3aWxsIGJlIGhhcmQgdG8ganVzdCBhcHBseSBvbiB0aGUgbmV3CiAgcHJvZ3Jlc3MgYmFyIGNvbmNlcHQuIEkgbmVlZCBzb21lIGZlZWRiYWNrIG9uIHRoaXMgYmVmb3JlIHRoYXQnbGwgZ2V0IHJlLQogIGludHJvZHVjZWQhIDotLwoKRGFuaWVsICgxNiBGZWJydWFyeSAyMDAwKToKLSBK9nJuIEhhcnRyb3RoIGJyb3VnaHQgbWUgc29tZSBmaXhlcyBmb3IgdGhlIHByb2dyZXNzIG1ldGVyIGFuZCBJIGNvbnRpbnVlZAogIHdvcmtpbmcgb24gaXQuIEl0IHNlZW1zIHRvIHdvcmsgZm9yIGh0dHAgZG93bmxvYWQsIGh0dHAgcG9zdCwgZnRwIGRvd25sb2FkCiAgYW5kIGZ0cCB1cGxvYWQuIEl0IHNob3VsZCBiZSBhIHByZXR0eSBnb29kIHRlc3QgaXQgd29ya3MgZ2VuZXJhbGx5IGdvb2QuCgotIFN0aWxsIG5lZWQgdG8gYWRkIHRoZSAtIyBwcm9ncmVzcyBiYXIgaW50byB0aGUgbmV3IHN0eWxlIHByb2dyZXNzIGludGVyZmFjZS4KCi0gR29ubmEgaGF2ZSBhIGdvIGF0IG15IG5ldyBvdXRwdXQgb3B0aW9uIHBhcmFtZXRlciBuZXh0LgoKRGFuaWVsICgxNSBGZWJydWFyeSAyMDAwKToKLSBUaGUgcHJvZ3Jlc3MgbWV0ZXIgc3R1ZmYgaXMgc2xvd2x5IHRha2luZyBwbGFjZS4gVGhlcmUncyBtb3JlIGxlZnQgYmVmb3JlIGl0CiAgaXMgd29ya2luZyBvayBhbmQgZXZlcnl0aGluZyBpcyB0ZXN0ZWQsIGJ1dCB3ZSdyZSByZWFjaGluZyB0aGVyZS4gU2xvd2x5IQoKRGFuaWVsICgxMSBGZWJydWFyeSAyMDAwKToKLSBQYXVsIE1hcnF1aXMgPHBtYXJxdWlzQGluYW1lLmNvbT4gZml4ZWQgdGhlIGNvbmZpZyBmaWxlIHBhcnNpbmcgb2YgY3VybCB0bwogIGRlYWwgd2l0aCBhbnktbGVuZ3RoIGxpbmVzLCByZW1vdmluZyB0aGUgcHJldmlvdXMgbGltaXQgb2YgNEsuCgotIEVldHUgT2phbmVuIDxlc29qYW5lbkBqeXUuZmk+J3Mgc3VnZ2VzdGlvbiBvZiBzdXBwb3J0aW5nIHRoZSBALXN0eWxlIGZvciAtYgogIGlzIGltcGxlbWVudGVkLiBOb3cgLWJAPGZpbGVuYW1lPiB3b3JrcyBhcyB3ZWxsIGFzIHRoZSBvbGQgc3R5bGUuIC1iQC0gYWxzbwogIHNpbWlsYXJpbHkgcmVhZHMgdGhlIGNvb2tpZXMgZnJvbSBzdGRpbi4KCi0gUmVtaW5kZXI6IC1EIHNob3VsZCBub3Qgd3JpdGUgdG8gdGhlIGZpbGUgdW50aWwgaXQgbmVlZHMgdG8sIGluIHRoZSBzYW1lIHdheQogIC1vIGRvZXMuIFRoYXQgd291bGQgZW5hYmxlIGN1cmwgdG8gdXNlIC1iIGFuZCAtRCBvbiB0aGUgc2FtZSBmaWxlLi4uCgotIEVsbGlzIFByaXRjaGFyZCA8ZWxsaXNAY2l0cmlhLmNvbT4gbWFkZSBnZXRkYXRlLnkgd29yayBmb3IgTWFjT1MgWC4KCi0gUGF1bCBIYXJyaW5ndG9uIDxwYXVsQHBpenphLm9yZz4gaGVscGVkIG1lIG91dCBmaW5kaW5nIHRoZSBjcmFzaCBpbiB0aGUKICBjb29raWUgcGFyc2VyLiBIZSBhbHNvIHBvaW50ZWQgb3V0IGN1cmwncyBoYWJiaXQgb2Ygc2VuZGluZyBlbXB0eSBjb29raWVzIHRvCiAgdGhlIHNlcnZlci4KCkRhbmllbCAoOCBGZWJydWFyeSAyMDAwKToKIC0gUm9uIFphcHAgPHJ6YXBwZXJAeWFob28uY29tPiBjb3JyZWN0ZWQgYSBwcm9ibGVtIGluIHNyYy91cmxnbG9iLmMgdGhhdAogICBwcmV2ZW50ZWQgY3VybCBmcm9tIGdldHRpbmcgY29tcGlsZWQgb24gc3Vub3MgNC4gVGhlIHByb2JsZW0gaGFkIHRvIGRvCiAgIHdpdGggdGhlIGRpZmZlcmVuY2UgaW4gc3ByaW50ZigpIHJldHVybiBjb2RlIHR5cGVzLgoKIC0gVHJhbnNmZXIoKSBzaG91bGQgbm93IGJlIGFibGUgdG8gZG93bmxvYWQgYW5kIHVwbG9hZCBzaW11bHRhbmVvdXNseS4gTGV0J3MKICAgZG8gc29tZSBwcm9ncmVzcyBtZXRlciBmaXhlcyBsYXRlciB0aGlzIHdlZWsuCgpEYW5pZWwgKDMxIEphbnVhcnkgMjAwMCk6CiAtIFBhdWwgSGFycmluZ3RvbiA8cGF1bEBwaXp6YS5vcmc+IGZvdW5kIGFub3RoZXIgY29yZSBkdW1wIGluIHRoZSBjb29raWUKICAgcGFyc2VyLiBDdXJsIGRvZXNuJ3QgcHJvcGVybHkgcmVjb2duaXplIHRoZSAndmVyc2lvbicga2V5d29yZCBhbmQgSSB0aGluawogICB0aGF0IGlzIHdoYXQgY2F1c2VkIHRoaXMuIEkgbmVlZCB0byByZWZyZXNoIHNvbWUgc3BlY3Mgb24gY29va2llcyBhbmQgc2VlCiAgIHdoYXQgZWxzZSBjdXJsIGxhY2tzIHRvIGltcHJvdmUgdGhpcyBhIGJpdCBtb3JlIG9uY2UgYW5kIGZvciBhbGwuCgogICBSRkMgMjEwOSBjbGVhcmx5IHNwZWNpZmllcyBob3cgY29va2llcyBzaG91bGQgYmUgZGVhbHQgd2l0aCB3aGVuIHRoZXkgYXJlCiAgIGNvbXBsaWFudCB3aXRoIHRoYXQgc3BlYy4gSSBkb24ndCB0aGluayBtYW55IHNlcnZlcnMgYXJlIHRob3VnaC4uLgoKIC0gTWFyayBXLiBFaWNoaW4gPGVpY2hpbkB0aG9rLm9yZz4gZm91bmQgdGhhdCB3aGlsZSBjdXJsIGlzIHVwbG9hZGluZyBhIGZvcm0KICAgdG8gYSB3ZWIgc2l0ZSwgaXQgZG9lc24ndCByZWFkIGluY29taW5nIGRhdGEgd2h5IGl0J2xsIGhhbmcgYWZ0ZXIgYSB3aGlsZQogICBzaW5jZSB0aGUgc29ja2V0ICJwaXBlIiBiZWNvbWVzIGZ1bGwuCgogICBJdCB0b29rIG1lIHR3byBob3VycyB0byByZXdyaXRlIERvd25sb2FkKCkgYW5kIFVwbG9hZCgpIGludG8gdGhlIG5ldwogICBzaW5nbGUgZnVuY3Rpb24gVHJhbnNmZXIoKS4gSXQgZXZlbiBzZWVtcyB0byB3b3JrISBNb3JlIHRlc3RpbmcgaXMgcmVxdWlyZWQKICAgb2YgY291cnNlLi4uIEkgc2hvdWxkIGdldCB0aGUgaGVhZGVyLXNlbmRpbmcgdG9nZXRoZXIgaW4gYSBraW5kIG9mIHF1ZXVlCiAgIGFuZCBsZXQgdGhlbSBnZXQgInVwbG9hZGVkIiBpbiBUcmFuc2ZlcigpIGFzIHdlbGwuCgogLSBaaGliaWFvIFd1IDx3dXpiQGVyb2xzLmNvbT4gcG9pbnRlZCBvdXQgYSBjdXJsIGJ1ZyBpbiB0aGUgbG9jYXRpb246IGFyZWEsCiAgIGFsdGhvdWdoIEkgZGlkIG5vdCBnZXQgYSByZXByb2R1Y2FibGUgd2F5IHRvIGRvIHRoaXMgd2h5IEkgaGF2ZSB0byB3YWl0CiAgIHdpdGggZml4aW5nIGFueXRoaW5nLgoKIC0gQm9iIFNjaGFkZXIgPHJzY2hhZGVyQHByb2R1Y3QtZGVzLmNvbT4gc3VnZ2VzdGVkIEkgc2hvdWxkIGltcGxlbWVudCByZXN1bWUKICAgc3VwcG9ydCBmb3IgdGhlIEhUVFAgUFVUIG9wZXJhdGlvbiwgYW5kIGFzIEkgdGhpbmsgaXQgaXMgYSB2YWxpZCBzdWdnZXN0aW9uCiAgIEknbGwgd29yayBvbiBpdC4KCkRhbmllbCAoMjUgSmFudWFyeSAyMDAwKToKIC0gTSBUcmF2aXMgT2JlbmhhdXMgPFRyYXZpcy5PYmVuaGF1c0BhdWQuYWxjYXRlbC5jb20+IHBvaW50ZWQgb3V0IGEgbWFudWFsCiAgIG1peHVwIHdpdGggLXkgYW5kIC1ZIHRoYXQgd2FzIGNvcnJlY3RlZC4KCiAtIEplbnMgU2NobGV1c2VuZXIgPEplbnMuU2NobGV1c2VuZXJAZGxyLmRlPiBwb2ludGVkIG91dCBhIHByb2JsZW0gdG8gY29tcGlsZQogICBjdXJsIG9uIEFJWCA0LjEuNCBhbmQgZ2F2ZSBtZSBhIHNvbHV0aW9uLiBUaGlzIHByb2JsZW0gd2FzIGFscmVhZHkgZml4ZWQKICAgYnkgSvZybidzIHJlY2VudCAjaW5jbHVkZSBtb2RpZmljYXRpb25zIQoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDApOgogLSBPc2thciBMaWxqZWJsYWQgPG9za0BoZW0ucGFzc2FnZW4uc2U+IHBvaW50ZWQgb3V0IGFuZCBjb3JyZWN0ZWQgYSBwcm9ibGVtCiAgIGluIHRoZSBMb2NhdGlvbjogZm9sbG93aW5nIHN5c3RlbSB0aGF0IG1hZGUgY3VybCBmb2xsb3dpbmcgYSBsb2NhdGlvbjogdG8gYQogICBkaWZmZXJlbnQgcHJvdG9jb2wgdG8gZmFpbC4KCiAgIEF0IEphbnVhcnkgMzFzdCBJIHJlLWNvbnNpZGVyZWQgdGhpcyBmaXggYW5kIHRoZSBzdXJyb3VuZGluZyBzb3VyY2UgY29kZS4gSQogICBjb3VsZCBub3QgcmVhbGx5IHNlZSB0aGF0IHRoZSBwYXRjaCBkaWQgYW55IGRpZmZlcmVuY2UsIHdoeSBJIHJlbW92ZWQgaXQKICAgYWdhaW4gZm9yIGZ1cnRoZXIgcmVzZWFyY2ggYW5kIGRlYnVnZ2luZy4gKEl0IGRpc2FibGVkIGxvY2F0aW9uOiBmb2xsb3dpbmcKICAgb24gc2VydmVyIG5vdCBydW5uaW5nIG9uIGRlZmF1bHQgcG9ydHMuKQoKIC0gSvZybiBIYXJ0cm90aCA8Sm9lcm4uSGFydHJvdGhAdGVsZWtvbS5kZT4gYnJvdWdodCBhIGZpeCB0aGF0IG9uY2UgYWdhaW4KICAgbWFkZSBpdCBwb3NzaWJsZSB0byBzZWxlY3QgcHJvZ3Jlc3MgYmFyLgoKIC0gSvZybiBhbHNvIGZpeGVkIGEgZmV3IGluY2x1ZGUgcHJvYmxlbXMuCgpWZXJzaW9uIDYuNAoKRGFuaWVsICgxNyBKYW51YXJ5IDIwMDApOgogLSBCYXNlZCBvbiBzdWdnZXN0aW9ucyBmcm9tIEJq9nJuIFN0ZW5iZXJnIChiam9ybkBoYXh4Lm51KSwgSSBtYWRlIHRoZQogICBwcm9ncmVzcyBkZWFsIGJldHRlciB3aXRoIGxhcmdlciBmaWxlcyBhbmQgYWRkZWQgYSAiVGltZSIgZmllbGQgd2hpY2ggc2hvd3MKICAgdGhlIHRpbWUgc3BlbnQgb24gdGhlIGRvd25sb2FkIHNvIGZhci4KIC0gSSdtIG5vdyB1c2luZyB0aGUgQ1ZTIHJlcG9zaXRvcnkgb24gc291cmNlZm9yZ2UubmV0LCB3aGljaCBhbHNvIGFsbG93cyB3ZWIKICAgYnJvd3NpbmcuIFNlZSBodHRwOi8vY3VybC5oYXh4Lm51LgoKRGFuaWVsICgxMCBKYW51YXJ5IDIwMDApOgogLSBSZW51bWJlcmVkIHNvbWUgZW51bXMgaW4gY3VybC9jdXJsLmggc2luY2UgdGFnIG51bWJlciAzNSB3YXMgdXNlZCB0d2ljZSEKIC0gQWRkZWQgInBvc3RxdW90ZSIgc3VwcG9ydCB0byB0aGUgZnRwIHNlY3Rpb24gdGhhdCBlbmFibGVzIHBvc3QtZnRwLXRyYW5zZmVyCiAgIHF1b3RlIGNvbW1hbmRzLgogLSBOb3cgbWFkZSB0aGUgLVEvLS1xdW90ZSBwYXJhbWV0ZXIgcmVjb2duaXplICctJyBhcyBhIHByZWZpeCwgd2hpY2ggbWVhbnMKICAgdGhhdCBjb21tYW5kIHdpbGwgYmUgaXNzdWVkIEFGVEVSIGEgc3VjY2Vzc2Z1bCBmdHAgdHJhbnNmZXIuIFRoaXMgY2FuIG9mCiAgIGNvdXJzZSBiZSB1c2VkIHRvIGRlbGV0ZSBvciByZW5hbWUgYSBmaWxlIGFmdGVyIGl0IGhhcyBiZWVuIHVwbG9hZGVkIG9yCiAgIGRvd25sb2FkZWQuIFVzZSB5b3VyIGltYWdpbmF0aW9uISA7LSkKIC0gU2luY2UgSSBkbyB0aGUgbWFpbiBkZXZlbG9wbWVudCBvbiBzb2xhcmlzIDIuNiBub3csIEkgaGFkIHRvIGRvd25sb2FkIGFuZAogICBpbnN0YWxsIEdOVSBncm9mZiB0byBnZW5lcmF0ZSB0aGUgaHVnZWhlbHAuYyBmaWxlLiBUaGUgc29sYXJpcyBucm9mZiBjb3JlcwogICBvbiB0aGUgbWFuIHBhZ2UhIFNvLCBpbiBvcmRlciB0byBtYWtlIHRoZSBzb2xhcmlzIGNvbmZpZ3VyZSBzY3JpcHQgZmluZCBhCiAgIGJldHRlciByZXN1bHQgSSBtYWRlIGducm9mZiBnZXQgY2hlY2tlZCBwcmlvciB0byB0aGUgcmVndWxhciBucm9mZi4KIC0gQWRkZWQgYWxsIHRoZSBjdXJsIGV4aXQgY29kZXMgdG8gdGhlIG1hbiBwYWdlLgogLSBKaW0gR2FsbGFnaGVyIDxqbWdhbGxhZ0B1c2EubmV0PiBwcm9wZXJseSB0cmFja2VkIGRvd24gYSBidWcgaW4gYXV0b2NvbmYKICAgMi4xMy4gVGhlIEFDX0NIRUNLX0xJQigpIG1hY3JvIHdyb25nZnVsbHkgdXNlcyB0aGUgLWwgZmxhZyBiZWZvcmUgdGhlIC1MCiAgIGZsYWcgdG8gJ2xkJyB3aGljaCBjYXVzZXMgdGhlIEhQLVVYIDEwLjIwIGZsYXZvdXIgdG8gZmFpbCBvbiBhbGwgbGliY2hlY2tzCiAgIGFuZCB0aGVmb3JlIHlvdSBjYW4ndCBtYWtlIHRoZSBjb25maWd1cmUgc2NyaXB0IGZpbmQgdGhlIG9wZW5zc2wgbGlicyEKCkRhbmllbCAoMjggRGVjZW1iZXIgMTk5OSk6CiAtIFRpbSBWZXJob2V2ZW4gPGRqQHdhbGhhbGxhLnNpbi5raGsuYmU+IGNvcnJlY3RseSBpZGVudGlmaWVkIHRoYXQgY3VybAogICBkb2Vzbid0IHN1cHBvcnQgVVJMIGZvcm1hdHRlZCBmaWxlIG5hbWVzIHdoZW4gZ2V0dGluZyBmdHAuIE5vdywgdGhlcmUncyBhCiAgIHByb2JsZW0gd2l0aCBnZXR0aW5nIHZlcnkgd2VpcmQgZmlsZSBuYW1lcyBvZmYgRlRQIHNlcnZlcnMuIFJGQyA5NTkgZGVmaW5lcwogICB0aGF0IHRoZSBmaWxlIG5hbWUgc3ludGF4IHRvIHVzZSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgaW4gdGhlIG5hdGl2ZSBPUyBvZgogICB0aGUgc2VydmVyLiBTaW5jZSB3ZSBkb24ndCBrbm93IHRoZSBwZWVyIHNlcnZlciBzeXN0ZW0gd2UgY3VycmVudGx5IGp1c3QKICAgdHJhbnNsYXRlIHRoZSBVUkwgc3ludGF4IGludG8gcGxhaW4gbGV0dGVycy4gSXQgaXMgc3RpbGwgYmV0dGVyIGFuZCB3aXRoCiAgIHRoZSBzb2xhcmlzIDIuNi1zdXBwbGllZCBmdHAgc2VydmVyIGl0IHdvcmtzIHdpdGggc3BhY2VzIGluIHRoZSBmaWxlIG5hbWVzLgoKRGFuaWVsICgyNyBEZWNlbWJlciAxOTk5KToKIC0gV2hlbiBjdXJsIHBhcnNlZCBjb29raWVzIHN0cmFpZ2h0IG9mZiBhIHJlbW90ZSBzaXRlLCBpdCBjb3JydXB0ZWQgdGhlIGlucHV0CiAgIGRhdGEsIHdoaWNoLCBpZiB0aGUgZG93bmxvYWRlZCBoZWFkZXJzIHdlcmUgc3RvcmVkIG1hZGUgdmVyeSBvZGQgY2hhcmFjdGVycwogICBpbiB0aGUgc2F2ZWQgZGF0YS4gQ29ycmVjdGZ1bGx5IGlkZW50aWZpZWQgYW5kIHJlcG9ydGVkIGJ5IFBhdWwgSGFycmluZ3RvbgogICA8cGF1bEBwaXp6YS5vcmc+LgoKRGFuaWVsICgxMyBEZWNlbWJlciAxOTk5KToKIC0gR2VuZXJhbCBjbGVhbnVwcyBpbiB0aGUgbGlicmFyeSBpbnRlcmZhY2UuIFRoZXJlIGhhZCBiZWVuIHNvbWUgYmFkIGtsdWRnZXMKICAgYWRkZWQgZHVyaW5nIHRpbWVzIG9mIHN0cmVzcyBhbmQgSSBkaWQgbXkgYmVzdCB0byBjbGVhbiB0aGVtIG9mZi4gSXQgd2FzCiAgIGJvdGggcmVnYXJkaW5nIHRoZSBsaWIgQVBJIGFzIHdlbGwgYXMgaW5jbHVkZSBmaWxlIGNvbmZ1c2lvbnMuCgpEYW5pZWwgKDMgRGVjZW1iZXIgMTk5OSk6CiAtIEEgc21hbGwgLS1zdGRlcnIgYnVnIHdhcyByZXBvcnRlZCBieSBFZXR1IE9qYW5lbiA8ZXNvamFuZW5Aanl1LmZpPi4uLgoKIC0gd2hvIGFsc28gYnJvdWdodCB0aGUgc3VnZ2VzdGlvbiBvZiBleHRlbmRpbmcgdGhlIC1YIGZsYWcgdG8gZnRwIGxpc3QgYXMKICAgd2VsbC4gU28sIG5vdyBpdCBpcyBhbmQgdGhlIGxvbmcgb3B0aW9uIGlzIG5vdyAtLXJlcXVlc3QgaW5zdGVhZC4gSXQgaXMKICAgb25seSBmb3IgZnRwIGxpc3QgZm9yIG5vdyAoYW5kIHRoZSBmb3JtZXIgaHR0cCBzdHVmZiB0b28gb2YgY291cnNlKS4KCkxhcnMgSi4gQWFzIDxsYXJzYUBzaW0ubm8+ICgyNCBOb3ZlbWJlciAxOTk5KToKIC0gUGF0Y2hlZCBjdXJsIHRvIGNvbXBpbGUgYW5kIGJ1aWxkIHVuZGVyIEJlT1MuIERvZXNuJ3Qgd29yayB5ZXQgdGhvdWdoIQoKIC0gQ29ycmVjdGVkIHRoZSBNYWtlZmlsZS5hbSBmaWxlcyB0byBhbGxvdyBwdXR0aW5nIG9iamVjdCBmaWxlcyBpbgogICBkaWZmZXJlbnQgZGlyZWN0b3JpZXMgdGhhbiB0aGUgc291cmNlcy4KClZlcnNpb24gNi4zLjEKCkRhbmllbCAoMjMgTm92ZW1iZXIgMTk5OSk6CiAtIEkndmUgaGFkIHRoaXMgbWFqb3IgZGlzayBjcmFzaC4gTXkgZ29vZCBvbGQgdHJ1c3Qtd29ydGh5IHNvdXJjZSBkaXNrIGRpZWQKICAgYWxvbmcgd2l0aCB0aGUgbWFjaGluZSB0aGF0IGhvc3RlZCBpdC4gVGhhbmsgZ29vZG5lc3MgbW9zdCBvZiBhbGwgdGhlCiAgIHRoaW5ncyBJJ3ZlIGRvbmUgYXJlIGVpdGhlciBiYWNrZWQgdXAgZWxzZXdoZXJlIG9yIHN0b3JlZCBpbiB0aGlzIENWUwogICBzZXJ2ZXIhCgogLSBNaWNoYWVsIFMuIFN0ZXVlciA8bWljaGFlbEBzdGV1ZXIuY29tPiBwb2ludGVkIG91dCBhIGJ1ZyBpbiB0aGUgLUYgaGFuZGxpbmcKICAgdGhhdCBtYWRlIGN1cmwgaGFuZyBpZiB5b3UgcG9zdGVkIGFuIGVtcHR5IHZhcmlhYmxlIHN1Y2ggYXMgJy1GIG5hbWU9Jy4gSXQKICAgd2FzIG9uZSBvZiB0aG9zZSBvbGQgYnVncyB0aGF0IG5ldmVyIGhhdmUgd29ya2VkIHByb3Blcmx5Li4uCgogLSBKYXNvbiBCYWlldHRvIDxqYXNvbkBkdXJpYW5zLmNvbT4gcG9pbnRlZCBvdXQgYSBnZW5lcmFsIGZsYXcgaW4gdGhlIEhUVFAKICAgZG93bmxvYWQuIEN1cmwgZGlkbid0IGNvbXBsYWluIGlmIGl0IHdhcyBwcmVtYXR1cmVseSBhYm9ydGVkIGJlZm9yZSB0aGUKICAgZW50aXJlIGRvd25sb2FkIHdhcyBjb21wbGV0ZWQuIEl0IGRvZXMgbm93LgoKRGFuaWVsICgxOSBOb3ZlbWJlciAxOTk5KToKIC0gQ2hyaXMgTWFsdGJ5IDxjaHJpc0BhdXJlbWEuY29tPiB2ZXJ5IGFjY3VyYXRlbHkgY3JpdGljaXplZCB0aGUgbGFjayBvZgogICByZXR1cm4gY29kZSBjaGVja3Mgb24gdGhlIGZ3cml0ZSgpIGNhbGxzLiBJIGRpZCBhIHRob3JvdWdoIGNoZWNrIGZvciBhbGwKICAgb2NjdXJyZW5jZXMgYW5kIGNvcnJlY3RlZCB0aGlzLgoKRGFuaWVsICgxNyBOb3ZlbWJlciAxOTk5KToKIC0gUGF1bCBIYXJyaW5ndG9uIDxwYXVsQHBpenphLm9yZz4gcG9pbnRlZCBvdXQgdGhhdCB0aGUgLW0vLS1tYXgtdGltZSBvcHRpb24KICAgZG9lc24ndCB3b3JrIGZvciB0aGUgc2xvdyBzeXN0ZW0gY2FsbHMgbGlrZSBnZXRob3N0YnluYW1lKCkuLi4gSSBkb24ndCBoYXZlCiAgIGFueSBnb29kIGZpeCB5ZXQsIGp1c3QgYSBzbGlnaHRseSBsZXNzIGJhZCBvbmUgdGhhdCBtYWtlcyBjdXJsIGV4aXQgaGFyZAogICB3aGVuIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQuCgogLSBCam9ybiBSZWVzZSBoZWxwZWQgbWUgcG9pbnQgb3V0IGEgcG9zc2libGUgcHJvYmxlbSB0aGF0IG1pZ2h0IGJlIHRoZSByZWFzb24KICAgd2h5IFRob21hcyBIdXJzdCBleHBlcmllbmNlIHByb2JsZW1zIGluIGhpcyBBbWlnYSB2ZXJzaW9uLgoKIERhbmllbCAoMTIgTm92ZW1iZXIgMTk5OSk6CiAtIEkgZm91bmQgYSBjcmFzaCBpbiB0aGUgbmV3IGNvb2tpZSBmaWxlIHBhcnNlci4gSXQgY3Jhc2hlZCB3aGVuIHlvdSBnYXZlCiAgIGEgcGxhaW4gaHR0cCBoZWFkZXIgZmlsZSBhcyBpbnB1dC4uLgoKVmVyc2lvbiA2LjMKCiBEYW5pZWwgKDEwIE5vdmVtYmVyIDE5OTkpOgogLSBJIGtpbmQgb2YgZm91bmQgb3V0IHRoYXQgdGhlIEhUVFAgdGltZS1jb25kaXRpb25hbCBHRVRzICgteikgYXJlbid0IGFsd2F5cwogICByZXNwZWN0ZWQgYnkgdGhlIHdlYiBzZXJ2ZXIgYW5kIHRoZSBkb2N1bWVudCBpcyB0aGVyZWZvcmUgc2VudCBpbiB3aG9sZQogICBhZ2FpbiwgZXZlbiB0aG91Z2ggaXQgZG9lc24ndCBtYXRjaCB0aGUgcmVxdWVzdGVkIGNvbmRpdGlvbi4gQWZ0ZXIgcmVhZGluZwogICBzZWN0aW9uIDEzLjMuNCBvZiBSRkMgMjYxNiwgSSB0aGluayBJJ20gZG9pbmcgdGhlIHJpZ2h0IHRoaW5nIG5vdyB3aGVuIEkgZG8KICAgbXkgb3duIGNoZWNrIGFzIHdlbGwuIElmIGN1cmwgdGhpbmtzIHRoZSBjb25kaXRpb24gaXNuJ3QgbWV0LCB0aGUgdHJhbnNmZXIKICAgaXMgYWJvcnRlZCBwcmVtYXR1cmVseSAoYWZ0ZXIgYWxsIHRoZSBoZWFkZXJzIGhhdmUgYmVlbiByZWNlaXZlZCkuCgogLSBBZnRlciBjb21tZW50cyBmcm9tIFJvYmVydCBMaW5kZW4gPHJvYmVydC5saW5kZW5AcG9zdGNvbS5kZXV0c2NoZXBvc3QuZGU+IEkKICAgYWxzbyByZXdyb3RlIHNvbWUgcGFydHMgb2YgdGhlIG1hbiBwYWdlIHRvIGJldHRlciBkZXNjcmliZSBob3cgdGhlIC1GCiAgIHdvcmtzLgoKIC0gTWljaGFlbCBBbnRpIDxhbnRpQHBzaG93aW5nLmNvbT4gcHV0IHVwIGEgbmV3IGN1cmwgZG93bmxvYWQgbWlycm9yIGluCiAgIENoaW5hOiAgaHR0cDovL3d3dy5wc2hvd2luZy5jb20vY3VybC8KCiAtIEkgYWRkZWQgdGhlIGxpc3Qgb2YgZG93bmxvYWQgbWlycm9ycyB0byB0aGUgUkVBRE1FIGZpbGUKCiAtIEkgZGlkIGFkZCBtb3JlIGV4cGxhbmF0aW9ucyB0byB0aGUgbWFuIHBhZ2UKCiBEYW5pZWwgKDggTm92ZW1iZXIgMTk5OSk6CiAtIEkgbWFkZSB0aGUgLWIvLS1jb29raWUgb3B0aW9uIGNhcGFibGUgb2YgcmVhZGluZyBuZXRzY2FwZSBmb3JtYXR0ZWQgY29va2llCiAgIGZpbGVzIGFzIHdlbGwgYXMgbm9ybWFsIGh0dHAtaGVhZGVyIGZpbGVzLiBJdCBzaG91bGQgYmUgYWJsZSB0bwogICB0cmFuc3BhcmFudGx5IGZpZ3VyZSBvdXQgd2hhdCBraW5kIG9mIGZpbGUgaXQgZ290IGFzIGlucHV0LgoKIERhbmllbCAoMjkgT2N0b2JlciAxOTk5KToKIC0gQW5vdGhlciBvbmUgb2YgU2ViYXN0aWFhbiB2YW4gRXJrJ3MgaWRlYXMgKHRoYXQgaGFzIGJlZW4gcmVxdWVzdGVkIGJlZm9yZQogICBidXQgSSBzZWVtIHRvIGhhdmUgZm9yZ290dGVuIHdobyBpdCB3YXMpLCBpcyB0byBhZGQgc3VwcG9ydCBmb3IgcmFuZ2VzIGluCiAgIEZUUCBkb3dubG9hZHMuIEFzIHVzdWFsLCBvbmUgcmVxdWVzdCBpcyBqdXN0IGEgcmVxdWVzdCwgd2hlbiB0aGV5J3JlIHR3bwogICBpdCBpcyBhIGRlbWFuZC4gSSd2ZSBhZGRlZCBzaW1wbGUgc3VwcG9ydCBmb3IgWC1ZIHN0eWxlIGZldGNoZXMuIFggaGFzIHRvCiAgIGJlIHRoZSBsb3dlciBudW1iZXIsIHRob3VnaCB5b3UgbWF5IG9taXQgb25lIG9mIHRoZSBudW1iZXJzLiBVc2UgdGhlIC1yLwogICAtLXJhbmdlIHN3aXRjaCAocHJldmlvdXNseSBIVFRQLW9ubHkpLgoKIC0gU2ViYXN0aWFhbiB2YW4gRXJrIDxzZWJzdGVyQHNlYnN0ZXIuY29tPiBzdWdnZXN0ZWQgdGhhdCBjdXJsIHNob3VsZCBiZQogICBhYmxlIHRvIHNob3cgdGhlIGZpbGUgc2l6ZSBvZiBhIHNwZWNpZmllZCBmaWxlLiBJIHRoaW5rIHRoaXMgaXMgYSBzcGxlbmRpZAogICBpZGVhIGFuZCB0aGUgLUkgZmxhZyBpcyBub3cgd29ya2luZyBmb3IgRlRQLiBJdCBkaXNwbGF5cyB0aGUgZmlsZSBzaXplIGluCiAgIHRoaXMgbWFubmVyOgogICAgICAgIENvbnRlbnQtTGVuZ3RoOiBYWFhYCiAgIEFzIGl0IHJlc2VtYmxlcyBub3JtYWwgaGVhZGVycywgYW5kIGxlYXZlcyB1cyB0aGUgb3Bwb3J0dW5pdHkgdG8gYWRkIG1vcmUKICAgaW5mbyBpbiB0aGF0IGRpc3BsYXkgaWYgd2UgY2FuIGNvbWUgdXAgd2l0aCBtb3JlIGluIHRoZSBmdXR1cmUhIEl0IGFsc28KICAgbWFrZXMgc2Vuc2Ugc2luY2UgaWYgeW91IGFjY2VzcyBmdHAgdGhyb3VnaCBhIEhUVFAgcHJveHksIHlvdSdkIGdldCB0aGUKICAgZmlsZSBzaXplIHRoZSBzYW1lIHdheS4KCiAgIEkgY2hhbmdlZCB0aGUgb3JkZXIgb2YgdGhlIFFVT1RFIGNvbW1hbmQgZXhlY3VzaW9ucy4gVGhleSdyZSBub3cgZXhlY3V0ZWQKICAganVzdCBhZnRlciB0aGUgbG9naW4gYW5kIGJlZm9yZSBhbnkgb3RoZXIgY29tbWFuZC4gSSBtYWRlIHRoaXMgdG8gZW5hYmxlCiAgIHF1b3RlIGNvbW1hbmRzIHRvIHJ1biBiZWZvcmUgdGhlIC1JIHN0dWZmIGlzIGRvbmUgdG9vLgoKIC0gSSBmb3VuZCBvdXQgdGhhdCAtRC8tLWR1bXAtaGVhZGVyIGFuZCAtVi8tLXZlcnNpb24gd2VyZW4ndCBkb2N1bWVudGVkIGluCiAgIHRoZSBtYW4gcGFnZS4KCiAtIE1hbnkgSFRUUC8xLjEgc2VydmVycyBkbyBub3Qgc3VwcG9ydCByYW5nZXMuIERvbid0IGFzayBtZSB3aHkuIEkgZGlkIGFkZAogICBzb21lIHRleHQgYWJvdXQgdGhpcyBpbiB0aGUgbWFuIHBhZ2UgZm9yIHRoZSByYW5nZSBvcHRpb24uIFRoZSB0aHJlYWQgaW4KICAgdGhlIG1haWxpbmcgbGlzdCB0aGF0IHN0YXJ0ZWQgdGhpcyB3YXMgaW5pdGlhdGVkIGJ5IE1pY2hhZWwgQW50aQogICA8YW50aUBwc2hvd2luZy5jb20+LgoKIC0gSSBnZXQgcmVwb3J0cyBhYm91dCBucm9mZiBjcmFzaGVzIG9uIHNvbGFyaXMgMi42KyB3aGVuIGRpc3BsYXlpbmcgdGhlIGN1cmwKICAgbWFuIHBhZ2UuIFN3aXRjaCB0byBnbnJvZmYgaW5zdGVhZCwgaXQgaXMgcmVwb3J0ZWQgdG8gd29yayghKS4gQWRhbSBCYXJjbGF5CiAgIDxhZGFtQG96Lm9yZz4gcmVwb3J0ZWQgYW5kIGJyb3VnaHQgdGhlIHN1Z2dlc3Rpb24uCgogLSBJbiBhIGRpYWxvZ3VlIHdpdGggSm9oYW5uZXMgRy4gS3Jpc3RpbnNzb24gPGQ5OGlzQGR0ZWsuY2hhbG1lcnMuc2U+IHdlIGNhbWUKICAgdXAgd2l0aCB0aGUgaWRlYSB0byBsZXQgLUgvLS1oZWFkZXIgc3BlY2lmaWVkIGhlYWRlcnMgcmVwbGFjZSB0aGUKICAgaW50ZXJuYWxseSBnZW5lcmF0ZWQgaGVhZGVycywgaWYgeW91IGhhcHBlbmVkIHRvIHNlbGVjdCB0byBhZGQgYSBoZWFkZXIKICAgdGhhdCBjdXJsIG5vcm1hbGx5IHVzZXMgYnkgaXRzZWxmLiBUaGUgYWR2YW50YWdlIHdpdGggdGhpcyBpcyBub3QgZW50aXJlbHkKICAgb2J2aW91cywgYnV0IGluIEpvaGFubmVzJyBjYXNlIGl0IG1lYW5zIHRoYXQgaGUgY2FuIHVzZSBhbm90aGVyIEhvc3Q6IHRoYW4KICAgdGhlIG9uZSBjdXJsIHdvdWxkIHNldC4KCiBEYW5pZWwgKDI3IE9jdG9iZXIgMTk5OSk6CiAtIEpvbmdraSBTdXdhbmRpIDxKb25na2kuU3V3YW5kaUBlbmcuc3VuLmNvbT4gYnJvdWdodCBhIG5pY2UgcGF0Y2ggZm9yCiAgICh5ZXQgYW5vdGhlcikgY3Jhc2ggd2hlbiBmb2xsb3dpbmcgYSBsb2NhdGlvbjouIFRoaXMgdGltZSB5b3UgaGFkIHRvCiAgIGZvbGxvdyBhIGh0dHBzOi8vIHNlcnZlcidzIHJlZGlyZWN0IHRvIGdldCB0aGUgY29yZS4KClZlcnNpb24gNi4yCgogRGFuaWVsICgyMSBPY3RvYmVyIDE5OTkpOgogLSBJIHRoaW5rIEkgbWFuYWdlZCB0byByZW1vdmUgdGhlIHN1c3BpY2lvdXMgKG5pbCkgdGhhdCBoYXMgYmVlbiBzZWVuIGp1c3QKICAgYmVmb3JlIHRoZSAiSG9zdDoiIGluIEhUVFAgcmVxdWVzdHMgd2hlbiAtdiB3YXMgdXNlZC4KIC0gSSBmb3VuZCBvdXQgdGhhdCBpZiB5b3UgZm9sbG93ZWQgYSBsb2NhdGlvbjogd2hlbiB1c2luZyBhIHByb3h5LCB3aXRob3V0CiAgIGhhdmluZyBzcGVjaWZpZWQgaHR0cDovLyBpbiB0aGUgVVJMLCB0aGUgcHJvdG9jb2wgcGFydCB3YXMgYWRkZWQgb25jZSBhZ2FpbgogICB3aGVuIG1vdmluZyB0byB0aGUgbmV4dCBVUkwhIChUaGUgcHJvdG9jb2wgcGFydCBoYXMgdG8gYmUgYWRkZWQgdG8gdGhlCiAgIFVSTCB3aGVuIGdvaW5nIHRocm91Z2ggYSBwcm94eSBzaW5jZSBpdCBoYXMgbm8gcHJvdG9jb2wtZ3Vlc3Npbmcgc3lzdGVtCiAgIHN1Y2ggYXMgY3VybCBoYXMuKQogLSBCZW5qYW1pbiBSaXRjZXkgPHJpdGNleUB0Zm4uY29tPiByZXBvcnRlZCBhIGNvcmUgZHVtcCB1bmRlciBzb2xhcmlzIDIuNgogICB3aXRoIE9wZW5TU0wgMC45LjQuIEl0IHR1cm5lZCBvdXQgdGhpcyB3YXMgZHVlIHRvIGEgYmFkIGZyZWUoKSBpbiBtYWluLmMKICAgdGhhdCBvY2N1cnJlZCBhZnRlciB0aGUgZG93bmxvYWQgd2FzIGRvbmUgYW5kIGNvbXBsZXRlZC4KIC0gQmVuamFtaW4gZm91bmQgZnRwIGRvd25sb2FkcyB0byBzaG93IHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBkb3dubG9hZCBtZXRlcgogICB0byBnZXQgd3JpdHRlbiB0d2ljZSwgYW5kIEkgcmVtb3ZlZCB0aGF0IHByb2JsZW0uIEl0IHdhcyBpbnRyb2R1Y2VkIHdpdGgKICAgdGhlIG11bHRpcGxlIFVSTCBzdXBwb3J0LgogLSBEYW4gWml0dGVyIDxkeml0dGVyQHppdHRlci5uZXQ+IGNvcnJlY3RseSBwb2ludGVkIG91dCB0aGF0IGN1cmwgNi4xIGFuZAogICBlYXJsaWVyIHZlcnNpb25zIGRpZG4ndCBob25vciBSRkMgMjYxNiBjaGFwdGVyIDQgc2VjdGlvbiAyLCAiTWVzc2FnZQogICBIZWFkZXJzIjogIi4uLkZpZWxkIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLi4uIgogICBIVFRQIGhlYWRlciBwYXJzaW5nIGFzc3VtZWQgYSBjZXJ0YWluIGNhc2luZy4gRGFuIGFsc28gcHJvdmlkZWQgbWUgd2l0aAogICBhIHBhdGNoIHRoYXQgY29ycmVjdGVkIHRoaXMsIHdoaWNoIEkgdG9vayB0aGUgbGliZXJ0eSBvZiBlZGl0aW5nIHNsaWdodGx5LgogLSBEYW4gWml0dGVyIGFsc28gcHJvdmlkZWQgYSBuaWNlIHBhdGNoIGZvciBjb25maWcuZ3Vlc3MgdG8gYmV0dGVyIHJlY29nbml6ZQogICB0aGUgTWFjIE9TIFgKIC0gRGFuIGFsc28gY29ycmVjdGVkIGEgbWlub3IgcHJvYmxlbSBpbiB0aGUgbGliL01ha2VmaWxlIHRoYXQgY2F1c2VkIGxpbmtpbmcKICAgdG8gZmFpbCBvbiBPUyBYLgoKIERhbmllbCAoMTkgT2N0b2JlciAxOTk5KToKIC0gTGVuIE1hcmluYWNjaW8gPGxlbkBnb29kbmV0LmNvbT4gY2FtZSB1cCB3aXRoIHNvbWUgcHJvYmxlbXMgd2l0aCBjdXJsLgogICBTaW5jZSBXaW5kb3dzIGhhcyBhIGNyaXBwbGVkIHNoZWxsLCBpdCBjYW4ndCByZWRpcmVjdCBzdGRlcnIgYW5kIHRoYXQKICAgY2F1c2VzIHRyb3VibGUuIEkgYWRkZWQgLS1zdGRlcnIgdG9kYXkgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIHJlZGlyZWN0CiAgIHRoZSBzdGRlcnIgc3RyZWFtIHRvIGEgZmlsZSBvciBzdGRvdXQuCgogRGFuaWVsICgxOCBPY3RvYmVyIDE5OTkpOgogLSBUaGUgY29uZmlndXJlIHNjcmlwdCBub3cgdW5kZXJzdGFuZHMgdGhlICctLXdpdGhvdXQtc3NsJyBmbGFnLCB3aGljaCBub3cKICAgdG90YWxseSBkaXNhYmxlIFNTTC9odHRwcyBzdXBwb3J0LiBQcmV2aW91c2x5IGl0IHdhc24ndCBwb3NzaWJsZSB0byBmb3JjZQogICB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBsZWF2ZSBTU0wgYWxvbmUuIFRoZSBwcmV2aW91cyBmdW5jdGlvbmFsaXR5IGhhcwogICBiZWVuIHJldGFpbmVkLiBUcm95IEVuZ2VsIGhlbHBlZCB0ZXN0IHRoaXMgbmV3IG9uZS4KClZlcnNpb24gNi4xCgogRGFuaWVsICgxNyBPY3RvYmVyIDE5OTkpOgogLSBJIGlmZGVmJ2VkIG9yIGNvbW1lbnRlZCBhbGwgdGhlIHpsaWIgc3R1ZmYgaW4gdGhlIHNvdXJjZXMgYW5kIGNvbmZpZ3VyZQogICBzY3JpcHQuIEl0IHR1cm5lZCBvdXQgd2UgbmVlZGVkIHRvIG1vY2sgbW9yZSB3aXRoIHpsaWIgdGhhbiBJIGluaXRpYWxseQogICB0aG91Z2h0LCB0byBtYWtlIGl0IGNhcGFibGUgb2YgZG93bmxvYWRpbmcgY29tcHJlc3NlZCBIVFRQIGRvY3VtZW50cyBhbmQKICAgdW5jb21wcmVzcyB0aGVtIG9uIHRoZSBmbHkuIEkgZGlkbid0IG1lYW4gdGhlIHpsaWIgcGFydHMgb2YgY3VybCB0byBiZWNvbWUKICAgbW9yZSB0aGFuIG1pbm9yIHNvIHRoaXMgbWVhbnMgSSBoYWx0IHRoZSB6bGliIGV4cGVkaXRpb24gZm9yIG5vdyBhbmQgd2FpdAogICB1bnRpbCBzb21lb25lIGVpdGhlciB3cml0ZXMgdGhlIGNvZGUgb3IgemxpYiBnZXRzIHVwZGF0ZWQgYW5kIGJldHRlcgogICBhZGp1c3RlZCBmb3IgdGhpcyBraW5kIG9mIHVzYWdlLiAgSSB3b24ndCBnZXQgaW50byBkZXRhaWxzIGhlcmUsIGJ1dCBhCiAgIHNob3J0IGEgc3VtbWFyeSBpcyBzdWl0YWJsZToKICAgLSB6bGliIGNhbid0IGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHdoZXRoZXIgdG8gdXNlIHpsaWIgb3IgZ3ppcAogICAgIGRlY29tcHJlc3Npb24gbWV0aG9kcy4KICAgLSB6bGliIGlzIHZlcnkgbmVhdCBmb3IgcmVhZGluZyBnemlwcGVkIGZpbGVzIGZyb20gYSBmaWxlIGRlc2NyaXB0b3IsCiAgICAgYWx0aG91Z2ggbm90IGFzIG5pY2UgZm9yIHJlYWRpbmcgYnVmZmVyLWJhc2VkIGRhdGEgc3VjaCBhcyB3ZSB3b3VsZAogICAgIHdhbnQgaXQuCiAgIC0gdGhlcmUgYXJlIHN0aWxsIHNvbWUgcHJvYmxlbXMgd2l0aCB0aGUgd2luMzIgdmVyc2lvbiB3aGVuIHJlYWRpbmcgZnJvbQogICAgIGEgZmlsZSBkZXNjcmlwdG9yIGlmIHRoYXQgaXMgYSBzb2NrZXQKCiBEYW5pZWwgKDE0IE9jdG9iZXIgMTk5OSk6CiAtIE1vdmVkIHRoZSAoZXh0ZXJuYWwpIGluY2x1ZGUgZmlsZXMgZm9yIGxpYmN1cmwgaW50byBhIHN1YmRpcmVjdG9yeSBuYW1lZAogICBjdXJsIGFuZCBhZGp1c3RlZCBhbGwgI2luY2x1ZGUgbGluZXMgdG8gdXNlIDxjdXJsL1hYWFg+IHRvIG1haW50YWluIGEKICAgYmV0dGVyIG5hbWUgc3BhY2UgYW5kIGNvbnRyb2wgb2YgdGhlIGhlYWRlcnMuIFRoaXMgaGFzIGJlZW4gcmVxdWVzdGVkLgoKIERhbmllbCAoMTIgT2N0b2JlciAxOTk5KToKIC0gSSBtb2RpZmllZCB0aGUgJ21ha2V0Z3onIHNjcmlwdCB0byBwZXJmb3JtIGEgJ21ha2UnIHRvbyBiZWZvcmUgYSByZWxlYXNlCiAgIGFyY2hpdmUgaXMgcHV0IHRvZ2V0aGVyIGluIGFuIGF0dGVtcHQgdG8gbWFrZSB0aGUgdGltZSBzdGFtcHMgYmV0dGVyIGFuZAogICBob3BlZnVsbHkgYXZvaWQgdGhlIGRvdWJsZSBjb25maWd1cmUtcnVubmluZyB0aGF0IHVzZSB0byBvY2N1ci4KCiBEYW5pZWwgKDExIE9jdG9iZXIgMTk5OSk6CiAtIEFwcGxpZWQgSvZybidzIHBhdGNoZXMgdGhhdCBmaXhlcyB6bGliIGZvciBtaW5ndzMyIGNvbXBpbGVzIGFzIHdlbGwgYXMKICAgc29tZSBvdGhlciBtaXNzaW5nIHpsaWIgI2lmZGVmIGFuZCBtb3JlIHRleHQgb24gdGhlIG11bHRpcGxlIFVSTCBkb2NzIGluCiAgIHRoZSBtYW4gcGFnZS4KClZlcnNpb24gNi4xYmV0YQoKIERhbmllbCAoNiBPY3RvYmVyIDE5OTkpOgogLSBEb3VnbGFzIEUuIFdlZ3NjaGVpZCA8d2Vnc2NkQHdoaXJscG9vbC5jb20+IHNlbnQgbWUgYSBwYXRjaCB0aGF0IG1hZGUgdGhlCiAgIGV4YWN0IHNhbWUgdGhpbmcgYXMgSSBqdXN0IG1hZGU6IHRoZSAtZCBzd2l0Y2ggaXMgbm93IGNhcGFibGUgb2YgcmVhZGluZwogICBwb3N0IGRhdGEgZnJvbSBhIG5hbWVkIGZpbGUgb3Igc3RkaW4uICBVc2UgaXQgc2ltaWxhcmx5IHRvIHRoZSAtRi4gVG8gcmVhZAogICB0aGUgcG9zdCBkYXRhIGZyb20gYSBnaXZlbiBmaWxlOgoKICAgICAgICBjdXJsIC1kIEBwYXRoL3RvL2ZpbGVuYW1lIHd3dy5wb3N0c2l0ZS5jb20KCiAgIG9yIGxldCBjdXJsIHJlYWQgaXQgb3V0IGZyb20gc3RkaW46CgogICAgICAgIGN1cmwgLWQgQC0gd3d3LnBvc3RpdC5jb20KCiBK9nJuIEhhcnRyb3RoICgzIE9jdG9iZXIgMTk5OSk6CiAtIEJyb3VnaHQgc29tZSBtb3JlIHBhdGNoZXMgZm9yIG11bHRpcGxlIFVSTCBmdW5jdGlvbmFsaXR5LiBUaGUgTUlNRQogICBzZXBhcmF0aW9uIGlkZWFzIGFyZSBhbG1vc3Qgc2NyYXBwZWQgbm93LCBhbmQgYSBjdXN0b20gc2VwYXJhdG9yIGlzIGJlaW5nCiAgIHVzZWQgaW5zdGVhZC4gVGhpcyBpcyBzdGlsbCBjb21waWxlLXRpbWUgImZsYWdnZWQiLgoKIERhbmllbAogLSBVcGRhdGVkIGN1cmwuMSB3aXRoIG11bHRpcGxlIFVSTCBpbmZvLgoKIERhbmllbCAoMzAgU2VwdGVtYmVyIDE5OTkpOgogLSBGZWxpeCB2b24gTGVpdG5lciA8ZmVsaXhAY29udmVyZ2VuY2UuZGU+IGJyb3VnaHQgb3BlbnNzbC1jaGVjayBmaXhlcwogICBmb3IgY29uZmlndXJlLmluIHRvIHdvcmsgb3V0LW9mLXRoZS1ib3ggd2hlbiB0aGUgb3BlbnNzbCBmaWxlcyBhcmUKICAgaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCBkaXJzLgoKIERhbmllbCAoMjggU2VwdGVtYmVyIDE5OTkpCiAtIEFkZGVkIGxpYnogZnVuY3Rpb25hbGl0eS4gVGhpcyBzaG91bGQgZW5hYmxlIGRlY29tcHJlc3NpbmcgZ3ppcCwgY29tcHJlc3MKICAgb3IgZGVmbGF0ZSBlbmNvZGluZyBIVFRQIGRvY3VtZW50cy4gSXQgYWxzbyBtYWtlcyBjdXJsIHNlbmQgYW4gYWNjZXB0IHRoYXQKICAgaXQgYWNjZXB0cyB0aGF0IGtpbmQgb2YgZW5jb2RpbmcuIENvbXByZXNzZWQgY29udGVudHMgdXN1YWxseSBzaG9ydGVucwogICBkb3dubG9hZCB0aW1lLiBJICpuZWVkKiBzb21lb25lIHRvIHRlbGwgbWUgYSBzaXRlIHRoYXQgdXNlcyBjb21wcmVzc2VkIEhUVFAKICAgZG9jdW1lbnRzIHNvIHRoYXQgSSBjYW4gdGVzdCB0aGlzIG91dCBwcm9wZXJseS4KCiAtIEFzIGEgcmVzdWx0IG9mIHRoZSBhZGRpbmcgb2YgemxpYiBhd2FyZW5lc3MsIEkgY2hhbmdlZCB0aGUgdmVyc2lvbiBzdHJpbmcKICAgYSBsaXR0bGUuIEkgcGxhbiB0byBhZGQgb3BlbmxkYXAgdmVyc2lvbiByZXBvcnRpbmcgaW4gdGhlcmUgdG9vLgoKIERhbmllbCAoMTcgU2VwdGVtYmVyIDE5OTkpCiAtIE1hZGUgdGhlIC1GIG9wdGlvbiBhbGxvdyBzdGRpbiB3aGVuIHNwZWNpZnlpbmcgZmlsZXMuIEJ5IHVzaW5nICctJyBpbnN0ZWFkCiAgIG9mIGZpbGUgbmFtZSwgdGhlIGRhdGEgd2lsbCBiZSByZWFkIGZyb20gc3RkaW4uCgpWZXJzaW9uIDYuMAoKIERhbmllbCAoMTMgU2VwdGVtYmVyIDE5OTkpCiAtIEFkZGVkIC1YLy0taHR0cC1yZXF1ZXN0IDxyZXF1ZXN0PiB0byBlbmFibGUgYW55IEhUVFAgY29tbWFuZCB0byBiZSBzZW50LgogICBEbyBub3QgdGhhdCB5b3VyIHNlcnZlciBoYXMgdG8gc3VwcG9ydCB0aGUgZXhhY3Qgc3RyaW5nIHlvdSBlbnRlci4gVGhpcwogICBzaG91bGQgcG9zc2libHkgYSBzdHJpbmcgbGlrZSBERUxFVEUgb3IgVFJBQ0UuCgogLSBBcHBsaWVkIERvdWdsYXMnIG1pbmd3MzItZml4ZXMgZm9yIHRoZSBtYWtlZmlsZXMuCgogRGFuaWVsICgxMCBTZXB0ZW1iZXIgMTk5OSkKIC0gRG91Z2xhcyBFLiBXZWdzY2hlaWQgPHdlZ3NjZEB3aGlybHBvb2wuY29tPiBwb2ludGVkIG91dCBhIHByb2JsZW0uIEN1cmwKICAgZGlkbid0IGNoZWNrIHRoZSBGVFAgc2VydmVycyByZXR1cm4gY29kZSBwcm9wZXJseSBhZnRlciB0aGUgLS1xdW90ZQogICBjb21tYW5kcyB3ZXJlIGlzc3VlZC4gSXQgdG9vayBhbnl0aGluZyBub24gMjAwIGFzIGFuIGVycm9yLCB3aGVuIGFsbCAyWFgKICAgY29kZXMgc2hvdWxkIGJlIGFjY2VwdGVkIGFzIE9LLgoKIC0gU2VuZGluZyBjb29raWVzIHRvIHRoZSBzYW1lIHNpdGUgaW4gbXVsdGlwbGUgbGluZXMgbGlrZSBjdXJsIHVzZWQgdG8gZG8KICAgdHVybmVkIG91dCB0byBiZSBiYWQgYW5kIGJyZWFraW5nIHRoZSBjb29raWUgc3BlY3MuIEN1cmwgbm93IHNlbmRzIGFsbAogICBjb29raWVzIG9uIGEgc2luZ2xlIENvb2tpZTogbGluZS4gQ3VybCBpcyBub3QgeWV0IFJGQyAyMTA5IGNvbXBsaWFudCwgYnV0IEkKICAgZG91YnQgdGhhdCBtYW55IHNlcnZlcnMgZG8gdXNlIHRoYXQgc3ludGF4ICh5ZXQpLgoKIERhbmllbCAoOCBTZXB0ZW1iZXIgMTk5OSkKIC0gSvZybiBoZWxwZWQgbWUgbWFrZSBzdXJlIGl0IHN0aWxsIGNvbXBpbGVzIG5pY2VseSB3aXRoIG1pbmd3MzIgdW5kZXIgd2luMzIuCgogRGFuaWVsICg3IFNlcHRlbWJlciAxOTk5KQogLSBGVFAgdXBsb2FkIHRocm91Z2ggcHJveHkgaXMgbm93IHR1cm5lZCBpbnRvIGEgSFRUUCBQVVQuIFJlcXVlc3RlZCBieQogICBTdGVmYW4gS2FudGhhayA8U3RlZmFuLkthbnRoYWtAbWNocC5zaWVtZW5zLmRlPi4KCiAtIEFkZGVkIHRoZSBsZGFwIGZpbGVzIHRvIHRoZSAubTMyIG1ha2VmaWxlLgoKIERhbmllbCAoMyBTZXB0ZW1iZXIgMTk5OSkKIC0gTWFkZSBjb29raWUgbWF0Y2hpbmcgd29yayB3aGlsZSB1c2luZyBIVFRQIHByb3h5LgoKIEJqb3JuIFJlZXNlIDxicmVlc2VAbWFpbDEuc3RvZmFuZXQuZGs+ICgzMSBBdWd1c3QgMTk5OSkKIC0gUGFzc2VkIGhpcyBsZGFwOi8vIHBhdGNoLiBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyB0aGUgb3BlbmxkYXAgc2hhcmVkCiAgIGxpYnJhcnkgdG8gYmUgaW5zdGFsbGVkIGFuZCB0aGF0IExEX0xJQlJBUllfUEFUSCBwb2ludHMgdG8gdGhlCiAgIGRpcmVjdG9yeSB3aGVyZSB0aGUgbGliIHdpbGwgYmUgZm91bmQgd2hlbiBjdXJsIGlzIHJ1biB3aXRoIGEKICAgbGRhcDovLyBVUkwuCgogSvZybiBIYXJ0cm90aCA8Sm9lcm4uSGFydHJvdGhAdGVsZWtvbS5kZT4gKDMxIEF1Z3VzdCAxOTk5KQogLSBNYWRlIHRoZSBNaW5ndzMyIG1ha2VmaWxlcyBpbnRvIHNpbmdsZSBmaWxlcy4KIC0gTWFkZSBmaWxlOi8vIHdvcmsgZm9yIFdpbjMyLiBUaGUgc2FtZSBjb2RlIGlzIG5vdyB1c2VkIGZvciB1bml4IGFzIHdlbGwgZm9yCiAgIHBlcmZvcm1hbmNlIHJlYXNvbnMuCgogRG91Z2xhcyBFLiBXZWdzY2hlaWQgPHdlZ3NjZEB3aGlybHBvb2wuY29tPiAoMzAgQXVndXN0IDE5OTkpCiAtIFBhdGNoZWQgdGhlIE1pbmd3MzIgbWFrZWZpbGVzIGZvciBTU0wgYnVpbGRzLgoKIE1hdHRoZXcgQ2xhcmtlIDxjbGFtYXRAdmFuLm1hdmVzLmNhPiAoMzAgQXVndXN0IDE5OTkpCiAtIE1hZGUgYSBjb29sIHBhdGNoIGZvciBjb25maWd1cmUuaW4gdG8gYWxsb3cgLS13aXRoLXNzbCB0byBzcGVjaWZ5IHRoZQogICByb290IGRpciBvZiB0aGUgb3BlbnNzbCBpbnN0YWxsYXRpb24sIGFzIGluCgogICAgICAgIC4vY29uZmlndXJlIC0td2l0aC1zc2w9L3Vzci9zc2xfaGVyZQoKIC0gQ29ycmVjdGVkIHRoZSAncmVjb25mJyBzY3JpcHQgdG8gd29yayBiZXR0ZXIgd2l0aCBzb21lIHNoZWxscy4KCiBK9nJuIEhhcnRyb3RoIDxKb2Vybi5IYXJ0cm90aEB0ZWxla29tLmRlPiAoMjYgQXVndXN0IDE5OTkpCiAtIEZpeGVkIHRoZSBNaW5ndzMyIG1ha2VmaWxlcyBpbiBsaWIvIGFuZCBjb3JyZWN0ZWQgdGhlIGZpbGUuYyBmb3Igd2luMzIKICAgY29tcGlsZXMuCgpWZXJzaW9uIDUuMTEKCiBEYW5pZWwgKDI1IEF1Z3VzdCAxOTk5KQogLSBKb2huIFdlaXNtaWxsZXIgPGpvaG53ZWlzQGhvbWUuY29tPiBwb2ludGVkIG91dCBhIGJ1ZyBpbiB0aGUgaGVhZGVyLWxpbmUKICAgcmVhbGxvYygpIHN5c3RlbSBpbiBkb3dubG9hZC5jLgoKIC0gSSBhZGRlZCBsaWIvZmlsZS5bY2hdIHRvIG9mZmVyIGEgZmlyc3QsIHNpbXBsZSwgZmlsZTovLyBzdXBwb3J0LiBJdAogICBwcm9iYWJseSB3b24ndCBkbyBtdWNoIGdvb2Qgb24gd2luMzIgc3lzdGVtIGF0IHRoaXMgcG9pbnQsIGJ1dCBJIHNlZSBpdAogICBhcyBhIHN0YXJ0LgoKIC0gTWFkZSB0aGUgcmVsZWFzZSBhcmNoaXZlcyBnZXQgYSBNYWtlZmlsZSBpbiB0aGUgcm9vdCBkaXIsIHdoaWNoIGNhbiBiZQogICB1c2VkIHRvIHN0YXJ0IHRoZSBjb21waWxpbmcvYnVpbGRpbmcgcHJvY2VzcyBlYXNpZXIuIEkgaGF2ZW4ndCByZWFsbHkKICAgY2hhbmdlZCBhbnkgSU5TVEFMTCB0ZXh0IHlldCwgSSB3YW50ZWQgdG8gZ2V0IHNvbWUgZmVlZC1iYWNrIG9uIHRoaXMKICAgZmlyc3QuCgogRGFuaWVsICgxNyBBdWd1c3QgMTk5OSkKIC0gQW5vdGhlciBMb2NhdGlvbjogYnVnLiBDdXJsIGRpZG4ndCBkbyBwcm9wZXIgcmVsYXRpdmUgbG9jYXRpb25zIGlmIHRoZQogICBvcmlnaW5hbCBVUkwgaGFkIGNnaS1wYXJhbWV0ZXJzIHRoYXQgY29udGFpbmVkIGEgc2xhc2guIE51c3UncyBwYWdlCiAgIGFnYWluLgoKIC0gQ29ycmVjdGVkIHRoZSBOT19QUk9YWSB1c2FnZS4gSXQgaXMgYSBsaXN0IG9mIHN1YnN0cmluZ3MgdGhhdCBpZiBvbmUgb2YKICAgdGhlbSBtYXRjaGVzIHRoZSB0YWlsIG9mIHRoZSBob3N0IG5hbWUgaXQgc2hvdWxkIGNvbm5lY3QgdG8sIGN1cmwgc2hvdWxkCiAgIG5vdCB1c2UgYSBwcm94eSB0byBjb25uZWN0IHRoZXJlLiBQb2ludGVkIG91dCB0byBtZSBieSBEb3VnbGFzIEUuIFdlZ3NjaGVpZAogICA8d2Vnc2NkQHdoaXJscG9vbC5jb20+LiBJIGFsc28gY2hhbmdlZCB0aGUgUkVBRE1FIHRleHQgYSBsaXR0bGUgcmVnYXJkaW5nCiAgIHRoaXMuCgogRGFuaWVsICgxNiBBdWd1c3QgMTk5OSkKIC0gRml4ZWQgYSBtZW1vcnkgYnVnIHdpdGggaHR0cC1zZXJ2ZXJzIHRoYXQgc2VudCBMb2NhdGlvbjogdG8gYSBMb2NhdGlvbjoKICAgcGFnZS4gTnVzdSdzIHBhZ2Ugc2hvd2VkIHRoaXMgdG9vLgoKIC0gTWFkZSBjb29raWVzIHdvcmsgYSBsb3QgYmV0dGVyLiBTZXR0aW5nIHRoZSBzYW1lIGNvb2tpZSBuYW1lIHNldmVyYWwgdGltZXMKICAgdXNlZCB0byBhZGQgbW9yZSBjb29raWVzIGluc3RlYWQgb2YgcmVwbGFjaW5nIHRoZSBmb3JtZXIgb25lIHdoaWNoIGl0CiAgIHNob3VsZCd2ZS4gTnVzdSA8bnVzQGludGVyZ29yai5ybz4gYnJvdWdodCBtZSBhbiBVUkwgdGhhdCBtYWRlIHRoaXMKICAgcGFpbmZ1bGx5IHZpc2libGUuLi4KCiBUcm95ICgxNSBBdWd1c3QgMTk5OSkKIC0gQnJvdWdodCBuZXcgLnNwZWMgZmlsZXMgYXMgd2VsbCBhcyBhIHBhdGNoIGZvciBjb25maWd1cmUuaW4gdGhhdCBsZXRzIHRoZQogICBjb25maWd1cmUgc2NyaXB0IGZpbmQgdGhlIG9wZW5zc2wgZmlsZXMgYmV0dGVyLCBldmVuIHdoZW4gdGhlIGluY2x1ZGUKICAgZmlsZXMgYXJlIGluIC91c3IvaW5jbHVkZS9vcGVuc3NsCgpWZXJzaW9uIDUuMTAKCiBEYW5pZWwgKDEzIEF1Z3VzdCAxOTk5KQogLSBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYigpIGhhcyBiZWVuIG1vZGlmaWVkIGluIHRoZSAwLjkuNCB2ZXJzaW9uIG9mCiAgIE9wZW5TU0wuIE5vdyB3aHkgY291bGRuJ3QgdGhleSBzaW1wbHkgYWRkIGEgKm5ldyogZnVuY3Rpb24gaW5zdGVhZCBvZgogICBtb2RpZnlpbmcgdGhlIHBhcmFtZXRlcnMgb2YgYW4gYWxyZWFkeSBleGlzdGluZyBmdW5jdGlvbj8gVGhpcyB3YXksIHdlIGdldAogICBhIGNvbXBpbGVyIHdhcm5pbmcgaWYgY29tcGlsaW5nIHdpdGggMC45LjQgYnV0IG5vdCB3aXRoIGVhcmxpZXIuIFNvLCBJIGhhZAogICB0byBjb21lIHVwIHdpdGggYSAjaWYgY29udHJ1Y3Rpb24gdGhhdCBkZWFscyB3aXRoIHRoaXMuLi4KCiAtIE1hZGUgY3VybCBvdXRwdXQgdGhlIFNTTCB2ZXJzaW9uIG51bWJlciBnZXQgZGlzcGxheWVkIHByb3Blcmx5IHdpdGggMC45LjQuCgogVHJveSAoMTIgQXVndXN0IDE5OTkpCiAtIEFkZGVkIE1pbmdXMzIgKEdDQy0yLjk1KSBzdXBwb3J0IHVuZGVyIFdpbjMyLiBUaGUgSU5TVEFMTCBmaWxlIHdhcyBhbHNvCiAgIGEgYml0IHJlYXJyYW5nZWQuCiAKIERhbmllbCAoMTIgQXVndXN0IDE5OTkpCiAtIEkgaGFkIHRvIGNvcHkgYSBnb29kIDxhcnBhL3RlbG5ldC5oPiBpbmNsdWRlIGZpbGUgaW50byB0aGUgY3VybCBzb3VyY2UKICAgdHJlZSB0byBlbmFibGUgdGhlIHNpbGx5IHdpbjMyIHN5c3RlbXMgdG8gY29tcGlsZS4gVGhlIGRpc3RyaWJ1dGlvbiByaWdodHMKICAgYWxsb3dzIHVzIHRvIGRvIHRoYXQgYXMgbG9uZyBhcyB0aGUgZmlsZSByZW1haW5zIHVubW9kaWZpZWQuCgogLSBJIGNvcnJlY3RlZCBhIGZldyBtaW5vciB0aGluZ3MgdGhhdCBtYWRlIHRoZSBjb21waWxlciBjb21wbGFpbiB3aGVuCiAgIC1XYWxsIC1wZWRhbnRpYyB3YXMgdXNlZC4KCiAtIEknbSBtb3ZpbmcgdGhlIG9mZmljaWFsIGN1cmwgd2ViIHBhZ2UgdG8gaHR0cDovL2N1cmwuaGF4eC5udS4gSSB0aGluayBpdAogICB3aWxsIG1ha2UgaXQgZWFzaWVyIHRvIHJlbWVtYmVyIGFzIGl0IGlzIGEgbG90IHNob3J0ZXIgYW5kIGxlc3MgY3J5cHRpYy4KICAgVGhlIG9sZCBvbmUgc3RpbGwgd29ya3MgYW5kIHNob3dzIHRoZSBzYW1lIGluZm8uCgogRGFuaWVsICgxMSBBdWd1c3QgMTk5OSkKIC0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBtYWlsZWQgbWUgYW5vdGhlciBjb3JyZWN0aW9uIGZvciBOUk9GRiBpbiB0aGUKICAgY29uZmlndXJlLmluIHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgYmV0dGVyIGZvciBJUklYIHVzZXJzLgoKIERhbmllbCAoMTAgQXVndXN0IDE5OTkpCiAtIEFsYmVydCBDaGluLUEtWW91bmcgPGNoaW5hQHRoZXdyaXR0ZW53b3JkLmNvbT4gaGVscGVkIG1lIHdpdGggc29tZSBzdHVwaWQKICAgTWFrZWZpbGUgdGhpbmdzLCBhcyB3ZWxsIGFzIHNvbWUgZmlkZGxpbmcgd2l0aCB0aGUgZ2V0ZGF0ZS5jCiAgIHN0dWZmIHRoYXQgaGUgaGFkIHByb2JsZW1zIHdpdGggdW5kZXIgSFAtVVggdjEwLiBnZXRkYXRlLnkgd2lsbCBub3cgYmUKICAgY29tcGlsZWQgaW50byBnZXRkYXRlLmMgaWYgdGhlIGFwcHJvcHJpYXRlIHlhY2Mgb3IgYmlzb24gaXMgZm91bmQgYnkgdGhlCiAgIGNvbmZpZ3VyZSBzY3JpcHQuIFNpbmNlIHRoaXMgaXMgc2xpZ2h0bHkgbmV3LCB3ZSBuZWVkIHRvIHRlc3QgdGhlIG91dHB1dAogICBnZXRkYXRlLmMgd2l0aCB3aW4zMiBzeXN0ZW1zIHRvIG1ha2Ugc3VyZSBpdCBzdGlsbCBjb21waWxlcyB0aGVyZS4KCiBEYW5pZWwgKDUgQXVndXN0IDE5OTkpCiAtIEkndmUganVzdCBzZXR1cCBhIG5ldyBtYWlsaW5nIGxpc3Qgd2l0aCB0aGUgaW50ZW50aW9uIHRvIGtlZXAgZGlzY3Vzc2lvbnMKICAgYXJvdW5kIGxpYmN1cmwgZGV2ZWxvcG1lbnQgaW4gaXQuIEkgbWFpbmx5IGV4cGVjdCBpdCB0byBiZSBmb3IgdGhvdWdodHMgYW5kCiAgIGJyYWluc3Rvcm1pbmcgYXJvdW5kIGEgIm5leHQgZ2VuZXJhdGlvbiIgbGlicmFyeSwgcmF0aGVyIHRoYW4gbml0cGlja2luZwogICBhYm91dCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvciBkZXRhaWxzIGluIHRoZSBjdXJyZW50IGxpYmN1cmwuCgogICBUbyBqb2luIG91ciBoYXBweSBidW5jaCBvZiBmdXR1cmUtbG9va2luZyBnZWVrcywgZW50ZXIgJ3N1YnNjcmliZQogICA8YWRkcmVzcz4nIGluIHRoZSBib2R5IG9mIGEgbWFpbCBhbmQgc2VuZCBpdCB0bwogICBsaWJjdXJsLXJlcXVlc3RAbGlzdHNlcnYuZnRzLmZyb250ZWMuc2UuICBDdXJsIGJ1ZyByZXBvcnRzLCB0aGUgdXN1YWwgY3VybAogICB0YWxrIGFuZCBldmVyeXRoaW5nIGVsc2Ugc2hvdWxkIHN0aWxsIGJlIGtlcHQgaW4gdGhpcyBtYWlsaW5nIGxpc3QuIEkndmUKICAgc3RhcnRlZCB0byBhcmNoaXZlIHRoaXMgbWFpbGluZyBsaXN0IGFuZCBoYXZlIHB1dCB0aGUgbGliY3VybCB3ZWIgcGFnZSBhdAogICB3d3cuZnRzLmZyb250ZWMuc2UvfmRhc3QvbGliY3VybC8uCgogLSBTdGVmYW4gS2FudGhhayA8U3RlZmFuLkthbnRoYWtAbWNocC5zaWVtZW5zLmRlPiBjb250YWN0ZWQgbWUgcmVnYXJkaW5nIGEKICAgZmV3IHByb2JsZW1zIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHdoaWNoIGhlIGRpc2NvdmVyZWQgd2hlbiB0cnlpbmcgdG8KICAgbWFrZSBjdXJsIGNvbXBpbGUgYW5kIGJ1aWxkIHVuZGVyIFNpZW1lbnMgU0lOSVgtWiBWNS40MkIyMDA0IQoKIC0gTWFyY3VzIEtsZWluIDxtLmtsZWluQGluLW9scGUuZGU+IHZlcnkgYWNjdXJhdGVseSBpbmZvcm1lZCBtZSB0aGF0CiAgIHNyYy92ZXJzaW9uLmggd2FzIG5vdCBwcmVzZW50IGluIHRoZSBDVlMgcmVwb3NpdG9yeS4gT2gsIGhvdyBzaWxseS4uLgoKIC0gTGludXMgTmllbHNlbiA8TGludXMuTmllbHNlbkBzdGguZnJvbnRlYy5zZT4gcmV3cm90ZSB0aGUgdGVsbmV0Oi8vIHBhcnQgYW5kCiAgIG5vdyBjdXJsIG9mZmVycyBsaW1pdGVkIHRlbG5ldCBzdXBwb3J0LiBJZiB5b3UgcnVuIGN1cmwgbGlrZSAnY3VybAogICB0ZWxuZXQ6Ly9ob3N0JyB5b3UnbGwgZ2V0IGFsbCBvdXRwdXQgb24gdGhlIHNjcmVlbiBhbmQgY3VybCB3aWxsIHJlYWQgaW5wdXQKICAgZnJvbSBzdGRpbi4gWW91J2xsIGJlIGFibGUgdG8gbG9naW4gYW5kIHJ1biBjb21tYW5kcyBldGMsIGJ1dCBzaW5jZSB0aGUKICAgb3V0cHV0IGlzIGJ1ZmZlcmVkLCBleHBlY3QgdG8gZ2V0IGEgbGl0dGxlIHdlaXJkIG91dHB1dC4KCiAgIFRoaXMgaXMgc3RpbGwgaW4gaXRzIGluZmFuY3kgYW5kIGl0IG1pZ2h0IGdldCBjaGFuZ2VkLiBXZSBuZWVkIHlvdXIKICAgZmVlZC1iYWNrIGFuZCBpbnB1dCBpbiBob3cgdGhpcyBpcyBiZXN0IGRvbmUuCgogICBXSU4zMiBOT1RFOiBJIGJldCB3ZSdsbCBnZXQgcHJvYmxlbXMgd2hlbiB0cnlpbmcgdG8gY29tcGlsZSB0aGUgY3VycmVudAogICBsaWIvdGVsbmV0LmMgb24gd2luMzIsIGJ1dCBJIHRoaW5rIHdlIGNhbiBzb3J0IHRoZW0gb3V0IGluIHRpbWUuCgogLSBEYXZpZCBTYW5kZXJzb24gPGRhdmlkQHRyYW5zYXJjLmNvbT4gcmVwb3J0ZWQgdGhhdCBGT1JDRV9BTExPQ0FfSCBvcgogICBIQVZFX0FMTE9DQV9IIG11c3QgYmUgZGVmaW5lZCBmb3IgZ2V0ZGF0ZS5jIHRvIGNvbXBpbGUgcHJvcGVybHkgb24gSFAtVVgKICAgMTEuMC4gSSB1cGRhdGVkIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGNoZWNrIGZvciBhbGxvY2EuaCB3aGljaCBzaG91bGQKICAgbWFrZSBpdC4KCiBEYW5pZWwgKDQgQXVndXN0IDE5OTkpCiAtIEkgZmluYWxseSBnb3QgdG8gdW5kZXJzdGFuZCBNYXJjdXMgS2xlaW4ncyBmdHAgZG93bmxvYWQgcmVzdW1lIHByb2JsZW0sCiAgIHdoaWNoIHR1cm5zIG91dCB0byBiZSBkdWUgdG8gZGlmZmVyZW50IG91dHB1dHMgZnJvbSBkaWZmZXJlbnQgZnRwCiAgIHNlcnZlcnMuIEl0IG1ha2VzIGZ0cCBkb3dubG9hZCByZXN1bWluZyBhIGxpdHRsZSB0cmlja2llciwgYnV0IEkndmUgbWFkZQogICBzb21lIG1vZGlmaWNhdGlvbnMgSSByZWFsbHkgYmVsaWV2ZSB3aWxsIHdvcmsgZm9yIG1vc3QgZnRwIHNlcnZlcnMgYW5kIEkgZG8KICAgaG9wZSB5b3UgcmVwb3J0IGlmIHlvdSBoYXZlIHByb2JsZW1zIHdpdGggdGhpcyEKCiAtIEFkZGVkIHRleHQgYWJvdXQgZmlsZSB0cmFuc2ZlciByZXN1bWluZyB0byBSRUFETUUuY3VybC4KCiBEYW5pZWwgKDIgQXVndXN0IDE5OTkpCiAtIEFwcGxpZWQgYSBwcm9ncmVzcy1iYXIgcGF0Y2ggZnJvbSBMYXJzIEouIEFhcyA8bGFyc2FAc2ltLm5vPi4gSXQgb2ZmZXJzCiAgIGEgbmV3IHN0eWxlZCBwcm9ncmVzcyBiYXIgZW5hYmxlZCB3aXRoIC0jLy0tcHJvZ3Jlc3MtYmFyLiAKCiBULiBZYW1hZGEgPHRhaUBpbWFzeS5vci5qcD4gKDMwIEp1bHkgMTk5OSkKIC0gSXQgYnJlYWtzIHdpdGggc2VnZmF1bHQgd2hlbiAxKSBjdXJsIGlzIHVzaW5nIC5uZXRyYyB0byBvYnRhaW4KICAgdXNlcm5hbWUvcGFzc3dvcmQgKG9wdGlvbiAnLW4nKSwgYW5kIDIpIGlzIGF1dG8tbWF0aWNhbGx5IHJlZGlyZWN0ZWQgdG8KICAgYW5vdGhlciBsb2NhdGlvbiAob3B0aW9uICctTCcpLgoKICAgVGhlcmUgaXMgYSBzbWFsbCBidWcgaW4gbGliL3VybC5jIChibG9jayBzdGFydGluZyBmcm9tIGxpbmUgNjQxKSwgd2hpY2gKICAgdHJpZXMgdG8gdGFrZSBvdXQgdXNlcm5hbWUvcGFzc3dvcmQgZnJvbSB1c2VyLSBzdXBwbGllZCBjb21tYW5kLWxpbmUKICAgYXJndW1lbnQgKCctdScgb3B0aW9uKS4gVGhpcyBibG9jayBpcyBuZXZlciBleGVjdXRlZCBvbiBmaXJzdCBhdHRlbXB0IHNpbmNlCiAgIENPTkZfVVNFUlBXRCBiaXQgaXNuJ3Qgc2V0IGF0IGZpcnN0LCBidXQgY3VybCBsYXRlciB0dXJucyBpdCBvbiB3aGVuIGl0CiAgIGNoZWNrcyBmb3IgQ09ORl9ORVRSQyBiaXQuIFNvIHdoZW4gY3VybCB0cmllcyB0byByZWRvIGV2ZXJ5dGhpbmcgZHVlIHRvCiAgIHJlZGlyZWN0aW9uLCBpdCBzZWdmYXVsdHMgdHJ5aW5nIHRvIGFjY2VzcyAqZGF0YS0+dXNlcnB3ZC4KClZlcnNpb24gNS45LjEKCiBEYW5pZWwgKDMwIEp1bHkgMTk5OSkKIC0gU3RldmUgV2FsY2ggPHN3YWxjaEBjaXNvZnQuY29tPiBwb2ludGVkIG91dCB0aGF0IHRoZXJlIGlzIGEgbWVtb3J5IGxlYWsgaW4KICAgdGhlIGZvcm1kYXRhIGZ1bmN0aW9ucy4gSSBhZGRlZCBhIEZvcm1GcmVlKCkgZnVuY3Rpb24gdGhhdCBpcyBub3cgdXNlZCBhbmQKICAgc3VwcG9zZWQgdG8gY29ycmVjdCB0aGlzIGZsYXcuCgogLSBNYXJrIFdvdHRvbiA8bXdvdHRvbkBibGFjay51Zy5jcy51c3lkLmVkdS5hdT4gcmVwb3J0ZWQ6CiAgICdjdXJsIC1MIGh0dHBzOi8vd3d3LmN3YS5jb20uYXUvJyBjb3JlIGR1bXBzLiAgSSBtYW5hZ2VkIHRvIGN1cmUgdGhpcyBieQogICBjb3JyZWN0aW5nIHRoZSBjbGVhbnVwIHByb2NlZHVyZS4gVGhlIGJ1ZyBzZWVtcyB0byBiZSBnb25lIHdpdGggbXkgT3BlblNTTAogICAwLjkuMmIsIGFsdGhvdWdoIHN0aWxsIG9jY3VycyB3aGVuIEkgcnVuIHRoZSB+MTAwIHllYXJzIG9sZCBTU0xlYXkgMC44LjAuIEkKICAgZG9uJ3Qga25vdyB3aGV0aGVyIGl0IGlzIGN1cmwgb3IgU1NMZWF5IHRoYXQgaXMgdG8gYmxhbWUgZm9yIHRoYXQuCgogLSBNYXJjdXMgS2xlaW4gPG0ua2xlaW5AaW4tb2xwZS5kZT46CiAgIFJlcG9ydGVkIGFuIEZUUCB1cGxvYWQgcmVzdW1lIGJ1ZyB0aGF0IEkgcmVhbGx5IGNhbid0IHJlcGVhdCBub3IgdW5kZXJzdGFuZC4KICAgSSBsZWF2ZSBpdCBoZXJlIHNvIHRoYXQgaXQgd29uJ3QgYmUgZm9yZ290dGVuLgoKIERhbmllbCAoMjkgSnVseSAxOTk5KQogLSBDb3N0eWEgU2h1bHl1cGluIDxjb3N0eWFAdHJpdm5ldC5jb20+IHN1Z2dlc3RlZCBzdXBwb3J0IGZvciBsb25nZXIgVVJMcwogICB3aGVuIGZvbGxvd2luZyBMb2NhdGlvbjogYW5kIEkgY291bGQgb25seSBhZ3JlZSBhbmQgZml4IGl0IQoKIC0gTGVpZ2ggUHVyZGllIDxsZWlnaHBAZGVmY2VuLmdvdi5hdT4gZm91bmQgYSBwcm9ibGVtIGluIHRoZSB1cGxvYWQvUE9TVAogICBkZXBhcnRtZW50LiBJdCB0dXJuZWQgb3V0IHRoYXQgaHR0cC5jIGFjY2lkZW50YWx5IGNsZWFyZWQgdGhlIHBvaW50ZXIKICAgaW5zdGVhZCBvZiB0aGUgYnl0ZSBjb3VudGVyIHdoZW4gc3VwcG9zZWQgdG8uCgogLSBDb3N0eWEgU2h1bHl1cGluIDxjb3N0eWFAdHJpdm5ldC5jb20+IHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIHBvcnQKICAgbnVtYmVycyBhbmQgTG9jYXRpb246LiBJZiB5b3UgaGFkIGEgc2VydmVyIGF0IGEgbm9uLXN0YW5kYXJkIHBvcnQgdGhhdAogICByZWRpcmVjdGVkIHRvIGFuIFVSTCB1c2luZyBhIHN0YW5kYXJkIHBvcnQgbnVtYmVyLCBjdXJsIHN0aWxsIHVzZWQgdGhhdAogICBmaXJzdCBwb3J0IG51bWJlci4KCiAtIFJhbHBoIEJlY2ttYW5uIDxyYWJlQHVuaS1wYWRlcmJvcm4uZGU+IHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aGVuIHVzaW5nIGJvdGgKICAgQ09ORl9GT0xMT1dMT0NBVElPTiBhbmQgQ09ORl9GQUlMT05FUlJPUiBzaW11bHRhbmVvdXNseS4gU2luY2UgdGhlCiAgIENPTkZfRkFJTE9ORVJST1IgZXhpdHMgb24gdGhlIDMwMi1jb2RlIHRoYXQgdGhlIGZvbGxvdyBsb2NhdGlvbiBoZWFkZXIKICAgb3V0cHV0cyBpdCB3aWxsIG5ldmVyIHNob3cgYW55IGh0bWwgb24gbG9jYXRpb246IHBhZ2VzLiBJIGhhdmUgbm93IG1hZGUgaXQKICAgbG9vayBmb3IgPj00MDAgY29kZXMgaWYgQ09ORl9GT0xMT1dMT0NBVElPTiBpcyBzZXQuCgogLSAnc3RydWN0IHNsaXN0JyBpcyBub3cgcmVuYW1lZCB0byAnc3RydWN0IGN1cmxfc2xpc3QnIChhcyBzdWdnZXN0ZWQgYnkgUmFscGgKICAgQmVja21hbm4pLgoKIC0gSm9zaHVhIFN3aW5rIDxqcHN3aW5rQGhvdG1haWwuY29tPiBhbmQgUmljayBXZWx5a29jaHkgPHJpY2tAcHJheGlzLmNvbS5hdT4KICAgd2VyZSB0aGUgZmlyc3QgdG8gcG9pbnQgb3V0IHRvIG1lIHRoYXQgdGhlIGxhdGVzdCBPcGVuU1NMIHBhY2thZ2Ugbm93IGhhdmUKICAgbW92ZWQgdGhlIHN0YW5kYXJkIGluY2x1ZGUgcGF0aC4gSXQgaXMgbm93IGluCiAgIC91c3IvbG9jYWwvc3NsL2luY2x1ZGUvb3BlbnNzbCBhbmQgSSBoYXZlIG5vdyBtb2RpZmllZCB0aGUgLS1lbmFibGUtc3NsCiAgIG9wdGlvbiBmb3IgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gdXNlIHRoYXQgYXMgdGhlIHByaW1hcnkgcGF0aCwgYW5kIEkKICAgbGVhdmUgdGhlIGZvcm1lciBwYXRoIHRvbyB0byB3b3JrIHdpdGggb2xkZXIgcGFja2FnZXMgb2YgT3BlblNTTCB0b28uCgogRGFuaWVsICg5IEp1bmUgMTk5OSkKIC0gSSBmaW5hbGx5IHVuZGVyc3Rvb2QgdGhlIElSSVggcHJvYmxlbSBhbmQgbm93IGl0IHNlZW0gdG8gY29tcGlsZSBvbiBpdCEKICAgSSBhbSBnb25uYSByZW1vdmUgdGhvc2UgI2RlZmluZSBzdHJjYXNlY21wKCkgdGhpbmdzIG9uY2UgYW5kIGZvciBhbGwgbm93LgoKIERhbmllbCAoNCBKdW5lIDE5OTkpCiAtIEkgYWRqdXN0ZWQgdGhlIEZUUCByZXBseSAyMjcgcGFyc2VyIHRvIG1ha2UgdGhlIFBBU1YgY29tbWFuZCB3b3JrIGJldHRlcgogICB3aXRoIG1vcmUgZnRwIHNlcnZlcnMuIEFwcGVhcmFudGx5IHRoZSBSb3hlbiBDaGFsbGFuZ2VyIHNlcnZlciByZXBsaWVkCiAgIHNvbWV0aGluZyBjdXJsIDUuOSBjb3VsZCBkZWFsIHdpdGghIDotKCBSZXBvcnRlZCBieSBBc2hsZXkgUmVpZC1Nb250YW5hcm8KICAgPGFzaGxleUBjb21wc29jLm1hbi5hYy51az4gYW5kIE1hcmsgQnV0bGVyIDxidXRsZXJtQHhtaXNzaW9uLmNvbT4gYnJvdWdodCBhCiAgIHNvbHV0aW9uIGZvciBpdC4KCiBEYW5pZWwgKDI2IE1heSAxOTk5KQogLSBSZWFycmFuZ2VkLiBSRUFETUUgaXMgbmV3LCB0aGUgb2xkIG9uZSBpcyBub3cgUkVBRE1FLmN1cmwgYW5kIEkgYWRkZWQgYQogICBSRUFETUUubGliY3VybCB3aXRoIHRleHQgSSBnb3QgZnJvbSBSYWxwaCBCZWNrbWFubiA8cmFiZUB1bmktcGFkZXJib3JuLmRlPi4KCiAtIEkgYWxzbyB1cGRhdGVkIHRoZSBJTlNUQUxMIHRleHQuCgogRGFuaWVsICgyNSBNYXkgMTk5OSkKIC0gRGF2aWQgSm9uYXRoYW4gTG93c2t5IDxkbG93c2t5QGxlbGFuZC5zdGFuZm9yZC5lZHU+IGNvcnJlY3RseSBwb2ludGVkIG91dAogICB0aGF0IGN1cmwgZGlkbid0IHByb3Blcmx5IGRlYWwgd2l0aCBmb3JtIHBvc3Rpbmcgd2hlcmUgdGhlIHZhcmlhYmxlIAogICBzaG91bGRuJ3QgaGF2ZSBhbnkgY29udGVudCwgYXMgaW4gY3VybCAtRiAiZm9ybT0iIHd3dy5zaXRlLmNvbS4gSXQgd2FzCiAgIG5vdyBmaXhlZC4KClZlcnNpb24gNS45CgogRGFuaWVsICgyMiBNYXkgMTk5OSkKIC0gSSd2ZSBnb3QgYSBidWcgcmVwb3J0IGZyb20gQWFyb24gU2NhcmlzYnJpY2sgPGFhcm9uc2NhQGhvdG1haWwuY29tPiBpbgogICB3aGljaCBoZSBzdGF0ZXMgaGUgaGFzIHNvbWUgcHJvYmxlbXMgd2l0aCAtTCB1bmRlciBGcmVlQlNEIDMuMC4gSSBoYXZlCiAgIHByZXZpb3VzbHkgZ290IGFub3RoZXIgYnVnIHJlcG9ydCBmcm9tIFN0ZWZhbiBHcmV0aGVyCiAgIDxzdGVmYW4uZ3JldGhlckB1YnMuY29tPiB3aGljaCBwb2ludHMgYXQgYW4gZXJyb3Igd2l0aCBzaW1pbGFyIHN5bXB0aG9tcwogICB3aGVuIHVzaW5nIHdpbjMyLiBJIG1hZGUgdGhlIGFsbG9jYXRpb24gb2YgdGhlIG5ldyB1cmwgc3RyaW5nIGEgYml0IGZhc3RlcgogICBhbmQgZGlmZmVyZW50LCBkb24ndCBrbm93IGlmIGl0IGFjdHVhbGx5IGltcHJvdmVzIGFueXRoaW5nIHRob3VnaC4uLgoKIERhbmllbCAoMjAgTWF5IDE5OTkpCiAtIE1hZGUgdGhlIGNvb2tpZSBwYXJzZXIgZGVhbCB3aXRoIENSTEYgbmV3bGluZXMgdG9vLgoKIERhbmllbCAoMTkgTWF5IDE5OTkpCiAtIERvd25sb2FkKCkgZGlkbid0IHByb3Blcmx5IGRlYWwgd2l0aCBmYWlsaW5nIHJldHVybiBjb2RlcyBmcm9tIHRoZQogICBzcmVhZCgpIGZ1bmN0aW9uLiBBZGFtIENveW5lIDxhZGFtQGdhbWVzcHkuY29tPiBmb3VuZCB0aGUgcHJvYmxlbSBpbiB0aGUKICAgd2luMzIgdmVyc2lvbiwgYW5kIFRyb3kgRW5nZWwgaGVscGVkIG1lIG91dCBpc29sYXRpbmcgaXQuCgogRGFuaWVsICgxNiBNYXkgMTk5OSkKIC0gUmljaGFyZCBBZGFtcyA8UmljaGFyZEBTbGF5Zm9yZC5jb20+IHBvaW50ZWQgb3V0IGEgYnVnIEkgaW50cm9kdWNlZCBpbgogICA1LjguIC0tZHVtcC1oZWFkZXIgZG9lc24ndCB3b3JrIGFueW1vcmUhIDotLyBJIGZpeGVkIGl0IG5vdy4KCiAtIEFmdGVyIGEgc3VnZ2VzdGlvbiBieSBKb3NodWEgU3dpbmsgPGpwc3dpbmtAaG90bWFpbC5jb20+IEkgYWRkZWQgLVMgLwogICAtLXNob3ctZXJyb3IgdG8gZm9yY2UgY3VybCB0byBkaXNwbGF5IHRoZSBlcnJvciBtZXNzYWdlIGluIGNhc2Ugb2YgYW4KICAgZXJyb3IsIGV2ZW4gaWYgLXMvLS1zaWxlbnQgd2FzIHVzZWQuCgogRGFuaWVsICgxMCBNYXkgMTk5OSkKIC0gSSBtb3ZlZCB0aGUgc3R1ZmYgY29uY2VybmluZyBIVFRQLCBESUNUIGFuZCBURUxORVQgaXQgdGhlaXIgb3duIHNvdXJjZQogICBmaWxlcyBub3cuIEl0IGlzIGEgYmVnaW5uaW5nIG9uIG15IGNsZWFuLXVwIG9mIHRoZSBzb3VyY2VzIHRvIG1ha2UgdGhlbQogICBsYXllciBhbGwgdGhvc2UgcHJvdG9jb2xzIGJldHRlciB0byBlbmFibGUgbW9yZSB0byBiZSBhZGRlZCBlYXNpZXIgaW4gdGhlCiAgIGZ1dHVyZSEKCiAtIExlb24gQnJlZWR0IDxsamJAZGViaWFuLm9yZz4gc2VudCBtZSBzb21lIGZpbGVzIEkndmUgbm90IHB1dCBpbnRvIHRoZSBtYWluCiAgIGN1cmwgYXJjaGl2ZS4gVGhleSdyZSBmb3IgY3JlYXRpbmcgdGhlIERlYmlhbiBwYWNrYWdlIHRoaW5naWUuIEhlIGFsc28gc2VudAogICBtZSBhIGRlYmlhbiBwYWNrYWdlIHRoYXQgSSd2ZSBtYWRlIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgYXQgdGhlIHdlYiBwYWdlCgogRGFuaWVsICg5IE1heSAxOTk5KQogLSBNYWRlIGl0IGNvbXBpbGUgb24gY3lnd2luIHRvby4KCiBUcm95IEVuZ2VsICg3IE1heSAxOTk5KQogLSBCcm91Z2h0IGEgc2VyaWVzIG9mIHBhdGNoZXMgdG8gYWxsb3cgY3VybCB0byBjb21waWxlIHNtb290aGx5IG9uIE1TVkMrKyA2CiAgIGFnYWluIQoKIERhbmllbCAoNiBNYXkgMTk5OSkKIC0gSSBjaGFuZ2VkIHRoZSAjaWZkZWYgSEFWRV9TVFJGVElNRSBwbGFjZW1lbnQgZm9yIHRoZSAteiBjb2RlIHNvIHRoYXQgaXQKICAgd2lsbCBiZSBlYXNpZXIgdG8gZGlzY292ZXIgc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgdGhhdCBmdW5jdGlvbiBhbmQgdGh1cwogICBjYW4ndCB1c2UgLXogc3VjY2Vzc2Z1bGx5LiBNYWRlIHRoZSBzdHJmdGltZSgpIGdldCB1c2VkIGlmIFdJTjMyIGlzIGRlZmluZWQKICAgdG9vLgoKVmVyc2lvbiA1LjgKCiBEYW5pZWwgKDUgTWF5IDE5OTkpCiAtIEkndmUgaGFkIGl0IHdpdGggdGhpcyBhdXRvY29uZi9hdXRvbWFrZSBtZXNzLiBJdCBzZWVtcyB0byB3b3JrIGFsbHJpZ2h0CiAgIGZvciBtb3N0IHBlb3BsZSB3aG8gZG9uJ3QgaGF2ZSBhdXRvbWFrZSBpbnN0YWxsZWQsIGJ1dCBmb3IgdGhvc2Ugd2hvIGhhdmUKICAgdGhlcmUgYXJlIHByb2JsZW1zIGFsbCBvdmVyLgoKICAgSSd2ZSBnb3QgbGlrZSBmaXZlIGRpZmZlcmVudCBidWcgcmVwb3J0cyBvbiB0aGlzIG9ubHkgdGhlIGxhc3QKICAgd2Vlay4uLiBDbGF1ZGlvIE5ldmVzIDxjbGF1ZGlvQG5leHRpcy5jb20+IGFuZCBGZWRlcmljbyBCaWFuY2hpCiAgIDxiaWFuY2hpQHBjLWFydGUyLmFydGUudW5pcGkuaXQ+IGFuZCByb290IDxkdWdnZXJqMDAxQGhhd2FpaS5yci5jb20+IGFyZQogICBzb21lIG9mIHRoZW0gcmVwb3J0aW5nIHRoaXMuCgogICBDdXJyZW50bHksIEkgaGF2ZSBubyByZWFsbHkgZ29vZCBmaXggc2luY2UgSSB3YW50IHRvIHVzZSBhdXRvbWFrZSBteXNlbGYgdG8KICAgZ2VuZXJhdGUgdGhlIE1ha2VmaWxlLmluIGZpbGVzLiBJJ3ZlIGZvdW5kIG91dCB0aGF0IHRoZSBAU0hFTExALXByb2JsZW1zCiAgIGNhbiBvZnRlbiBiZSBmaXhlZCBieSBtYW51YWxseSBpbnZva2luZyAnYXV0b21ha2UnIGluIHRoZSBhcmNoaXZlIHJvb3QKICAgYmVmb3JlIHlvdSBydW4gLi9jb25maWd1cmUuLi4gSSd2ZSBoYWNrZWQgbXkgbWFrZXRneiBzY3JpcHQgbm93IHRvIGZpZGRsZQogICBhIGJpdCB3aXRoIHRoaXMgYW5kIG15IHRlc3RzIHNlZW0gdG8gd29yayBiZXR0ZXIgdGhhbiBiZWZvcmUgYXQgbGVhc3QhCgogRGFuaWVsICg0IE1heSAxOTk5KQogLSBta2hlbHAucGwgaGFzIGJlZW4gZG9pbmcgYmFkbHkgbGF0ZWx5LiBJIGNvcnJlY3RlZCBhIGNhc2UgcHJvYmxlbSBpbgogICB0aGUgcmVnZXhlcy4KCiAtIEkndmUgbm93IHJlbWFkZSB0aGUgLW8gb3B0aW9uIHRvIG5vdCB0b3VjaCB0aGUgZmlsZSB1bmxlc3MgaXQgbmVlZHMgdG8uCiAgIEkgaGFkIHRvIGRvIHRoaXMgdG8gbWFrZSAteiBvcHRpb24gcmVhbGx5IGZpbmUsIHNpbmNlIG5vdyB5b3UgY2FuIG1ha2UgYQogICBjdXJsIGZldGNoIGFuZCB1c2UgYSBsb2NhbCBjb3B5J3MgdGltZSB3aGVuIGRvd25sb2FkaW5nIHRvIHRoYXQgZmlsZSwgYXMKICAgaW46CgogICAgICAgIGN1cmwgLXogZHVtcCAtbyBkdW1wIHJlbW90ZS5zaXRlLmNvbS9maWxlLmh0bWwKCiAgIFRoaXMgd2lsbCBvbmx5IGdldCB0aGUgZmlsZSBpZiB0aGUgcmVtb3RlIG9uZSBpcyBuZXdlciB0aGFuIHRoZSBsb2NhbC4KICAgSSdtIGF3YXJlIHRoYXQgdGhpcyBhbHRlcnMgcHJldmlvdXMgYmVoYXZpb3VyIGEgbGl0dGxlLiBTb21lIHNjcmlwdHMgb3V0CiAgIHRoZXJlIG1heSBkZXBlbmQgb24gdGhhdCB0aGUgZmlsZSBpcyBhbHdheXMgdG91Y2hlZC4uLgoKIC0gQ29ycmVjdGVkIGEgYnVnIGluIHRoZSBTU0x2Mi92MyBzZWxlY3Rpb24uCgogLSBGZWxpeCB2b24gTGVpdG5lciA8bGVpdG5lckBtYXRoLmZ1LWJlcmxpbi5kZT4gcmVxdWVzdGVkIHRoYXQgY3VybCBzaG91bGQKICAgYmUgYWJsZSB0byBzZW5kICJJZi1Nb2RpZmllZC1TaW5jZSIgaGVhZGVycywgd2hpY2ggaW5kZWVkIGlzIGEgZmFpciBpZGVhLgogICBJIGltcGxlbWVudGVkIGl0IHJpZ2h0IGF3YXkhIFRyeSAteiA8ZXhwcmVzc2lvbj4gd2hlcmUgZXhwcmVzc2lvbiBpcyBhIGZ1bGwKICAgR05VIGRhdGUgZXhwcmVzc2lvbiBvciBhIGZpbGUgbmFtZSB0byBnZXQgdGhlIGRhdGUgZnJvbSEKCiBTdGVwaGFuIExhZ2VyaG9sbSA8c3RlcGhhbkB1bmlsb2cuc2U+ICgzMCBBcHIgMTk5OSkKIC0gUG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggdGhlIHNyYy9NYWtlZmlsZSBmb3IgRnJlZUJTRC4gVGhlIFJNIHZhcmlhYmxlCiAgIGlzbid0IHNldCBhbmQgY2F1c2VzIHRoZSBtYWtlIHRvIGZhaWwuCgogRGFuaWVsICgyNiBBcHJpbCAxOTk5KQogLSBBbSBJIHNpbGx5IG9yIHdoYXQ/IDxJcnZpbmdfV29sZmVAd29sZmUubmV0PiBwb2ludGVkIG91dCB0byBtZSB0aGF0IHRoZQogICBjdXJsIHZlcnNpb24gbnVtYmVyIHdhcyBub3Qgc2V0IHByb3Blcmx5LiBIYXNuJ3QgYmVlbiBzaW5jZSA1LjYuIFRoaXMgd2FzCiAgIGR1ZSB0byBhIGJ1ZyBpbiBteSBtYWtldGd6IHNjcmlwdCEKCiBEYXZpZCBFcmlrc3NvbiA8ZGF2aWRAMmdvb2QuY29tPiAoMjUgQXByIDE5OTkpCiAtIEZvdW5kIGEgYnVnIGluIGNvb2tpZXMuYyB0aGF0IG1hZGUgaXQgY3Jhc2ggYXQgdGltZXMuCgpWZXJzaW9uIDUuNy4xCgogRG91ZyBLYXVmbWFuIDxka2F1Zm1hbkByYWh1bC5uZXQ+ICgyMyBBcHIgMTk5OSkKIC0gQnJvdWdodCB0d28gc3Vub3MgNCBmaXhlcy4gT25lIG9mIHRoZW0gYmVpbmcgdGhlIGhvc3RpcC5jIGZpeCBtZW50aW9uZWQKICAgYmVsb3cgYW5kIHRoZSBvdGhlciBvbmUgYSBjb3JyZWN0aW9uIGluIGluY2x1ZGUvc3RkY2hlYWRlcnMuaAoKIC0gQWRkZWQgYSBwYXJhZ3JhcGggYWJvdXQgY29tcGlsaW5nIHdpdGggdGhlIFVTLXZlcnNpb24gb2Ygb3BlbnNzbCB0byB0aGUKICAgSU5TVEFMTCBmaWxlLgoKIERhbmllbAogLSBOZXcgbWFpbGluZyBsaXN0IGFkZHJlc3MuIEluZm8gdXBkYXRlZCBvbiB0aGUgd2ViIHBhZ2UgYXMgd2VsbCBhcyBpbiB0aGUKICAgUkVBRE1FIGZpbGUKCiBHcmVnIE9udWZlciA8R3JlZy5PbnVmZXJARW5nLlN1bi5DT00+ICgyMCBBcHIgMTk5OSkKIC0gaG9zdGlwLmMgZGlkbid0IGNvbXBpbGUgcHJvcGVybHkgb24gU3VuT1MgNS41LjEuCiAgIEl0IG5lZWRzIGFuICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KClZlcnNpb24gNS43CgogRGFuaWVsIChBcHIgMjAgMTk5OSkKIC0gRGVjaWRlZCB0byB1cGxvYWQgYSBub24tYmV0YSB2ZXJzaW9uIHJpZ2h0IG5vdyEKCiAtIE1hZGUgY3VybCBzdXBwb3J0IGFueS1sZW5ndGggSFRUUCBoZWFkZXJzLiBUaGUgZGVzdGluYXRpb24gYnVmZmVyIGlzIG5vdwogICBzaW1wbHkgZW5sYXJnZWQgZXZlcnkgdGltZSBpdCB0dXJucyBvdXQgdG8gYmUgdG9vIHNtYWxsIQoKIC0gQWRkZWQgdGhlIEZBUSBmaWxlIHRvIHRoZSBhcmNoaXZlLiBTdGlsbCBhIGJpdCBzbWFsbGlzaCwgYnV0IGl0IGlzIGEKICAgc3RhcnQuCgogRXJpYyBUaGVsaW4gPGVyaWNAZ2VuZXJhdGlvbi1pLmNvbT4gKDE1IEFwciAxOTk5KQogLSBNYWRlIC1EIGFjY2VwdCAnLScgaW5zdGVhZCBvZiBmaWxlbmFtZSB0byB3cml0ZSB0byBzdGRvdXQuCgpWZXJzaW9uIDUuNi4zYmV0YQoKIERhbmllbCAoQXByIDEyIDE5OTkpCgogLSBDaGFuZ2VkIHR3byAjaWZkZWYgV0lOMzIgdG8gYmV0dGVyICNpZmRlZiA8ZXJyb3Jjb2RlPiB3aGVuIGNvbm5lY3QoKWluZwogICBpbiB1cmwuYyBhbmQgZnRwLmMuIE1ha2VzIGN5Z3dpbjMyIGRlYWwgd2l0aCB0aGVtIGJldHRlciB0b28uIFdlIHNob3VsZAogICB0cnkgdG8gZ2V0IHNvbWUgZGVjZW50IHdpbjMyLXJlcGxhY2VtZW50IHRoZXJlLiBBbnlvbmU/CgogLSBUaGUgb2xkIC0zLy0tY3JsZiBvcHRpb24gaXMgbm93IE9OTFkgLS1jcmxmIQoKIC0gSSBjaGFuZ2VkIHRoZSAiU1NMIGZpeCIgdG8gYSBtb3JlIGxhbWUgb25lLCBidXQgdGhhdCBkb2Vzbid0IHJlbW92ZSBhcwogICBtdWNoIGZ1bmN0aW9uYWxpdHkuIE5vdyBJJ3ZlIGVuYWJsZWQgdGhlIGxpYiB0byBzZWxlY3Qgd2hhdCBTU0wgdmVyc2lvbiBpdAogICBzaG91bGQgdHJ5IGZpcnN0LiBBcHBlYXJhbnRseSBzb21lIG9sZGVyIFNTTC1zZXJ2ZXJzIGRvbid0IGxpa2Ugd2hlbiB5b3UKICAgdGFsayB2MyB3aXRoIHRoZW0gc28geW91IG5lZWQgdG8gYmUgYWJsZSB0byBmb3JjZSBjdXJsIHRvIHRhbGsgdjIgZnJvbSB0aGUKICAgc3RhcnQuIFRoZSBmaXggZGF0ZWQgQXByaWwgNiBhbmQgcG9zdGVkIG9uIHRoZSBtYWlsaW5nIGxpc3QgZm9yY2VkIGN1cmwgdG8KICAgdXNlIHYyIGF0IGFsbCB0aW1lcyB1c2luZyBhIG1vZGVybiBPcGVuU1NMIHZlcnNpb24sIGJ1dCB3ZSBkb24ndCByZWFsbHkKICAgd2FudCBzdWNoIGEgY3JpcHBsZWQgc29sdXRpb24uCiAKIC0gTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+IHNlbnQgbWUgYSBwYXRjaCB0aGF0IGNvcnJlY3RlZCBhIG1hdGggZXJyb3IKICAgZm9yIHRoZSAiQ3Vyci5TcGVlZCIgcHJvZ3Jlc3MgbWV0ZXIuCgogLSBFcmljIFRoZWxpbiA8ZXJpY0BnZW5lcmF0aW9uLWkuY29tPiBzZW50IG1lIGEgcGF0Y2ggdGhhdCBlbmFibGVzICctSyAtJwogICB0byByZWFkIGEgY29uZmlnIGZpbGUgZnJvbSBzdGRpbi4KCiAtIEkgZm91bmQgb3V0IHdlIGRpZG4ndCBjbG9zZSB0aGUgZmlsZSBwcm9wZXJseSBiZWZvcmUgc28gSSBhZGRlZCBpdCEKCiBEYW5pZWwgKEFwciA5IDE5OTkpCiAtIFl1IFhpbiA8aXNAaXNlZS56YS5uZXQ+IHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIGZ0cCBkb3dubG9hZCByZXN1bWUuCiAgIEl0IGRpZG4ndCB3b3JrIGF0IGFsbCEgOy1PCgogRGFuaWVsIChBcHIgNiAxOTk5KQogLSBDb3JyZWN0ZWQgdGhlIHZlcnNpb24gc3RyaW5nIHBhcnQgZ2VuZXJhdGVkIGZvciB0aGUgU1NMIHZlcnNpb24uCgogLSBJIGZvdW5kIGEgd2F5IHRvIG1ha2Ugc29tZSBvdGhlciBTU0wgcGFnZSB3b3JrIHdpdGggb3BlbnNzbCAwLjkuMSsgdGhhdAogICBwcmV2aW91c2x5IGRpZG4ndCAoc3NsZWF5IDAuOC4wIHdvcmtzIHdpdGggaXQgdGhvdWdoISkuIFRyeWluZyB0byBnZXQKICAgc29tZSByZWFsIGluZm8gZnJvbSB0aGUgT3BlblNTTCBndXlzIHRvIHNlZSBob3cgSSBzaG91bGQgZG8gdG8gYmVoYXZlIHRoZQogICBiZXN0IHdheS4gU1NMZWF5IDAuOC4wIHNob3VsZG4ndCBiZSB0aGF0IG11Y2ggaW4gdXNlIGFueXdheSB0aGVzZSBkYXlzIQoKVmVyc2lvbiA1LjYuMmJldGEKCiBEYW5pZWwgKEFwciA0IDE5OTkpCiAtIEZpbmFsbHkgaGF2ZSBjdXJsIG1vcmUgY29va2llICJhd2FyZSIuIE5vdyByZWFkIGNhcmVmdWxseS4gVGhpcyBpcyBob3cKICAgaXQgd29ya3MuCiAgIFRvIG1ha2UgY3VybCByZWFkIGNvb2tpZXMgZnJvbSBhbiBhbHJlYWR5IGV4aXN0aW5nIGZpbGUsIGluIHBsYWluIGhlYWRlci0KICAgZm9ybWF0IChsaWtlIGZyb20gdGhlIGhlYWRlcnMgb2YgYSBwcmV2aW91cyBmZXRjaCkgaW52b2tlIGN1cmwgd2l0aCB0aGUKICAgLWIgZmxhZyBsaWtlOgoKICAgICAgICBjdXJsIC1iIGZpbGUgaHR0cDovL3NpdGUvZm9vLmh0bWwKCiAgIEN1cmwgd2lsbCB0aGVuIHVzZSBhbGwgY29va2llcyBpdCBmaW5kcyBtYXRjaGluZy4gVGhlIG9sZCBzdHlsZSB0aGF0IHNldHMKICAgYSBzaW5nbGUgY29va2llIHdpdGggLWIgaXMgc3RpbGwgc3VwcG9ydGVkIGFuZCBpcyB1c2VkIGlmIHRoZSBzdHJpbmcKICAgZm9sbG93aW5nIC1iIGluY2x1ZGVzIGEgJz0nIGxldHRlciwgYXMgaW4gIi1iIG5hbWU9ZGFuaWVsIi4KCiAgIFRvIG1ha2UgY3VybCByZWFkIHRoZSBjb29raWVzIHNlbnQgaW4gY29tYmluYXRpb24gd2l0aCBhIGxvY2F0aW9uOiAod2hpY2gKICAgc2l0ZXMgb2Z0ZW4gZG8pIHBvaW50IGN1cmwgdG8gcmVhZCBhIG5vbi1leGlzdGluZyBmaWxlIGF0IGZpcnN0IChpLmUKICAgdG8gc3RhcnQgd2l0aCBubyBleGlzdGluZyBjb29raWVzKSwgbGlrZToKCiAgICAgICAgY3VybCAtYiBub3doZXJlIGh0dHA6Ly9zaXRlL3NldGNvb2tpZWFuZHJlbG9jYXRlLmh0bWwKCiAtIEFkZGVkIGEgcGFyYWdyYXBoIGluIHRoZSBUT0RPIGZpbGUgYWJvdXQgdGhlIFNTTCBwcm9ibGVtcyByZWNlbnRseQogICByZXBvcnRlZC4gRXZpZGVudGx5LCBzb21lIGtpbmQgb2YgU1NMLXByb2JsZW0gY3VybCBtYXkgbmVlZCB0byBhZGRyZXNzLgoKIC0gQmV0dGVyICJMb2NhdGlvbjoiIGZvbGxvd2luZy4KCiBEb3VnbGFzIEUuIFdlZ3NjaGVpZCA8d2Vnc2NkQHdoaXJscG9vbC5jb20+IChUdWUsIDMwIE1hciAxOTk5KQogLSBBIHN1YnNlY29uZCBkaXNwbGF5IHBhdGNoLgoKIERhbmllbCAoTWFyIDE0IDE5OTkpCiAtIEkndmUgc2VwYXJhdGVkIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBsaWJjdXJsIGFuZCBjdXJsIG5vdy4gVG8gbWFrZQogICB0aGluZ3MgYSBsaXR0bGUgZWFzaWVyLCBJIGRlY2lkZWQgdG8gc3RhcnQgdGhlIGN1cmwgbnVtYmVyaW5nIGZyb20KICAgNS42IGFuZCB0aGUgZm9ybWVyIHZlcnNpb24gbnVtYmVyIGtub3duIGFzICJjdXJsIiBpcyBub3cgdGhlIG9uZQogICBzZXQgZm9yIGxpYmN1cmwuCgogLSBSZW1vdmVkIHRoZSAnZW5hYmxlLW5vLXBhc3MnIGZyb20gY29uZmlndXJlLCBJIGRvdWJ0IGFueW9uZSB3YW50ZWQKICAgdGhhdC4KCiAtIE1hZGUgbG90cyBvZiB0aW55IGFkanVzdG1lbnRzIHRvIGNvbXBpbGUgc21vb3RobHkgd2l0aCBjeWd3aW4gdW5kZXIKICAgd2luMzIuIEl0J3MgYSBraWxsZXIgZm9yIHBvcnRpbmcgdGhpcyB0byB3aW4zMiwgYnllIGJ5ZSBWQysrISA7LSkKICAgQ29tcGlsZXMgYW5kIGJ1aWxkcyBvdXQtb2YtdGhlLWJveCBub3cuIFNlZSB0aGUgbmV3IHdvcmRpbmdzIGluCiAgIElOU1RBTEwgZm9yIGRldGFpbHMuCgogLSBCZWdpbm5pbmcgZXhwZXJpbWVudHMgd2l0aCBkb3dubG9hZGluZyBtdWx0aXBsZSBkb2N1bWVudCBmcm9tIGEgaHR0cAogICBzZXJ2ZXIgd2hpbGUgcmVtYWluaW5nIGNvbm5lY3RlZC4KClZlcnNpb24gNS42YmV0YQoKIERhbmllbCAoTWFyIDEzIDE5OTkpCiAtIFNpbmNlIEkndmUgY2hhbmdlZCBzbyBtdWNoLCBJIHRob3VnaHQgSSdkIGp1c3QgZ28gYWhlYWQgYW5kIGltcGxlbWVudAogICB0aGUgc3VnZ2VzdGlvbiBmcm9tIERvdWdsYXMgRS4gV2Vnc2NoZWlkIDx3ZWdzY2RAd2hpcmxwb29sLmNvbT4uIC1EIG9yCiAgIC0tZHVtcC1oZWFkZXIgaXMgbm93IHN0b3JpbmcgSFRUUCBoZWFkZXJzIHNlcGFyYXRlbHkgaW4gdGhlIHNwZWNpZmllZAogICBmaWxlLgoKIC0gQWRkZWQgbmV3IHRleHQgdG8gSU5TVEFMTCBvbiB3aGF0IHRvIGRvIHRvIGJ1aWxkIHRoaXMgb24gd2luMzIgbm93LgoKIC0gQWFhcmdoLiBJIGhhZCB0byB0YWtlIGEgc3RlcCBiYWNrIGFuZCBwcmVmaXggdGhlIHNoYXJlZCAjaW5jbHVkZSBmaWxlcwogICBpbiB0aGUgc291cmNlcyB3aXRoICIuLi9pbmNsdWRlLyIgdG8gcGxlYXNlIFZDKysuLi4KCiBEYW5pZWwgKE1hciAxMiAxOTk5KQogLSBTcGxpdCB0aGUgdXJsLmMgc291cmNlIGludG8gbWFueSB0aW55IHNvdXJjZXMgZm9yIGJldHRlciByZWFkYWJpbGl0eQogICBhbmQgc21hbGxlciBzaXplLgoKIERhbmllbCAoTWFyIDExIDE5OTkpCiAtIFN0YXJ0ZWQgdG8gY2hhbmdlIHN0dWZmIGZvciBhIG1vdmUgdG8gbWFrZSBsaWJjdXJsIGFuZCBhIG1vcmUgc2VwYXJhdGUKICAgY3VybCBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgdGhlIGxpYmN1cmwuIE1hZGUgdGhlIGxpYmN1cmwgc291cmNlcyBpbnRvCiAgIHRoZSBuZXcgbGliIGRpcmVjdG9yeSB3aGlsZSB0aGUgY3VybCBhcHBsaWNhdGlvbiB3aWxsIHJlbWFpbiBpbiBzcmMgYXMKICAgYmVmb3JlLiBOZXcgbWFrZWZpbGVzLCBhZGp1c3RlZCBjb25maWd1cmUgc2NyaXB0IGFuZCBzby4KCiAgIGxpYmN1cmwuYSBidWlsdCBxdWlja2x5IGFuZCBlYXNpbHkuIEkgYmV0dGVyIG1ha2UgYSBiZXR0ZXIgaW50ZXJmYWNlIHRvCiAgIHRoZSBsaWIgZnVuY3Rpb25zIHRob3VnaC4KCiAgIFRoZSBuZXcgcm9vdCBkaXIgaW5jbHVkZS8gaXMgc3VwcG9zZWQgdG8gY29udGFpbiB0aGUgcHVibGljIGluZm9ybWF0aW9uCiAgIGFib3V0IHRoZSBuZXcgbGliY3VybC4gSXQgaXMgYSBsaXR0bGUgdWdseSBzbyBmYXIgOi0pCgoKIERhbmllbCAoTWFyIDEgMTk5OSkKIC0gVG9kZCBLYXVmbWFubiA8dGthdWZtYW5uQGFkZm9yY2UuY29tPiBzZW50IG1lIGEgZ29vZCBsaW5rIHRvIE5ldHNjYXBlJ3MKICAgY29va2llIHNwZWMgYXMgd2VsbCBhcyB0aGUgaW5mbyB0aGF0IFJGQyAyMTA5IHNwZWNpZmllcyBob3cgdG8gdXNlIHRoZW0uCiAgIFRoZSBsaW5rIGlzIG5vdyBpbiB0aGUgUkVBRE1FIGFuZCB0aGUgUkZDIGluIHRoZSBSRVNPVVJDRVMuCgogRGFuaWVsIChGZWIgMjMgMTk5OSkKIC0gRmluYWxseSBtYWRlIGNvbmZpZ3VyZSBhY2NlcHQgLS13aXRoLXNzbCB0byBsb29rIGZvciBTU0wgbGlicyBhbmQgaW5jbHVkZXMKICAgaW4gdGhlICJzdGFuZGFyZCIgcGxhY2UgL3Vzci9sb2NhbC9zc2wuLi4KCiBEYW5pZWwgKEZlYiAyMiAxOTk5KQogLSBWZXJpZmllZCB0aGF0IGN1cmwgbGlua2VkIGZpbmUgd2l0aCBPcGVuU1NMIDAuOS4xYyB3aGljaCBzZWVtcyB0byBiZQogICB0aGUgbW9zdCByZWNlbnQuCgogSGVucmkgR29tZXogPGdvbWV6QHNsaWIuZnI+IChGcmkgRmViICA1IDE5OTkpCiAtIFNlbnQgaW4gYW4gdXBkYXRlZCBjdXJsLXNzbC5zcGVjLiBJIHN0aWxsIG1pc3MgdGhlIHNjcmlwdCB0aGF0IGJ1aWxkcyBhbgogICBSUE0gYXV0b21hdGljYWxseS4uLgoKVmVyc2lvbiA1LjUuMQoKIE1hcmsgQnV0bGVyIDxidXRsZXJtQHhtaXNzaW9uLmNvbT4gKDI3IEphbiAxOTk5KQogLSBDb3JyZWN0ZWQgcHJvYmxlbXMgaW4gRG93bmxvYWQoKS4KCiBEYW5pdGVsIFN0ZW5iZXJnICgyNSBKYW4gMTk5OSkKIC0gSmVyZW1pZSBQZXRpdCA8SmVyZW1pZS5QZXRpdEBEaWdpdGFsLmNvbT4gcG9pbnRlZCBvdXQgYSBmZXcgZmxhd3MgaW4gdGhlCiAgIHNvdXJjZSB0aGF0IHByZXZlbnRlZCBpdCBmcm9tIGNvbXBpbGUgd2FybmluZyBmcmVlIHdpdGggdGhlIG5hdGl2ZQogICBjb21waWxlciB1bmRlciBEaWdpdGFsIFVuaXggdjQuMGQuCgpWZXJzaW9uIDUuNQoKIERhbmllbCBTdGVuYmVyZyAoMTUgSmFuIDE5OTkpCiAtIEFkZGVkIEJqb3JucyBzbWFsbCB0ZXh0IHRvIHRoZSBSRUFETUUgYWJvdXQgdGhlIERJQ1QgcHJvdG9jb2wuCgogRGFuaWVsIFN0ZW5iZXJnICgxMSBKYW4gMTk5OSkKIC0gPGpzd2lua0Bzb2Z0Y29tLm5ldD4gcmVwb3J0ZWQgYWJvdXQgdGhlIHdpbjMyLXZlcnNpb2luOiAiRG9lc24ndCB1c2UKICAgQUxMX1BST1hZIGVudmlyb25tZW50IHZhcmlhYmxlIi4gVHVybmVkIG91dCB0byBiZSBiZWNhdXNlIG9mIHRoZSBzdGF0aWMtCiAgIGJ1ZmZlciBuYXR1cmUgb2YgdGhlIHdpbjMyIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbGxzIQoKIEJqb3JuIFJlZXNlIDxicmVlc2VAaW1hZGEub3UuZGs+ICgxMCBKYW4gMTk5OSkKIC0gSSBoYXZlIGF0dGFjaGVkIGEgc2ltcGxlIGFkZGl0aW9uIGZvciB0aGUgRElDVCBwcm90b2NvbCAoUkZDIDIyMjkpLgogICBJdCBwZXJmb3JtcyBkaWN0aW9uYXJ5IGxvb2t1cHMuIFRoZSBvdXRwdXQgc3RpbGwgbmVlZHMgdG8gYmUgYmV0dGVyCiAgIGZvcm1hdHRlZC4KCiAgIFRvIHRlc3QgaXQgdHJ5ICh0aGUgZXhhY3QgZm9ybWF0LCBhbmQgbW9yZSBleGFtcGxlcyBhcmUgZGVzY3JpYmVkIGluCiAgIHRoZSBSRkMpCgogICAgICAgIGRpY3Q6Ly9kaWN0Lm9yZy9tOmhlbGxvCiAgICAgICAgZGljdDovL2RpY3Qub3JnL206aGVsbG86OnNvdW5kZXgKCgogVmljZW50ZSBHYXJjaWEgPHZlcm90QHJlZGVzdGIuZXM+ICgxMCBKYW4gMTk5OSkKIC0gQ29ycmVjdGVkIHRoZSBwcm9ncmVzcyBtZXRlciBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gMjBNQi4KCiBEYW5pZWwgU3RlbmJlcmcgKDcgSmFuIDE5OTkpCiAtIENvcnJlY3RlZCB0aGUgLXQgYW5kIC1UIGhlbHAgdGV4dHMuIFRoZXkgY2xhaW1lZCB0byBiZSBGVFAgb25seS4KClZlcnNpb24gNS40CgogRGFuaWVsIFN0ZW5iZXJnCiAoNyBKYW4gMTk5OSkKIC0gPElydmluZ19Xb2xmZUBXb2xmZS5OZXQ+IHJlcG9ydGVkIHRoYXQgY3VybCAtcyBkaWRuJ3QgYWx3YXlzIHN1cHJlc3MgdGhlCiAgIHByb2dyZXNzIHJlcG9ydGluZy4gSXQgd2FzIHRoZSBmb3JtIHBvc3QgdGhhdCBhdXRvYW10aWNhbGx5IGFsd2F5cyBzd2l0Y2hlZAogICBpdCBvbiBhZ2Fpbi4gVGhpcyBpcyBub3cgY29ycmVjdGVkIQoKICg0IEphbiAxOTk5KQogLSBBbmRyZWFzIEtvc3R5cmthIDxhbmRyZWFzQG10Zy5jby5hdD4gc3VnZ2VzdGVkIEknZCBhZGQgUFVUIGFuZCBoZSBoZWxwZWQgbWUKICAgb3V0IHRvIHRlc3QgaXQuIElmIHlvdSB1c2UgLXQgb3IgLVQgbm93IG9uIGEgaHR0cCBvciBodHRwcyBzZXJ2ZXIsIFBVVCB3aWxsCiAgIGJlIHVzZWQgZm9yIGZpbGUgdXBsb2FkLgoKICAgSSByZW1vdmVkIHRoZSBmb3JtZXIgdXNlIG9mIC1UIHdpdGggSFRUUC4gSSBkb3VidCBhbnlvbmUgZXZlciByZWFsbHkgdXNlZAogICB0aGF0LgoKICg0IEphbiAxOTk5KQogLSBFcmlrIEphY29ic2VuIDxlcmlrQG1pbnQuY29tPiBmb3VuZCBhIHdpZHRoIGJ1ZyBpbiB0aGUgbXByaW50ZigpIGZ1bmN0aW9uLgogICBJIGNvcnJlY3RlZCBpdCBub3cuCgogKDQgSmFuIDE5OTkpCiAtIEFzIEpvaG4gVi4gQ2hvdyA8am9obmNob3dAYnJvb2tsaW5ldGVjaC5jb20+IHBvaW50ZWQgb3V0IHRvIG1lLCBjdXJsCiAgIGFjY2VwdGVkIHZlcnkgbGltaXRlZCBVUkwgc2l6ZXMuIEl0IHNob3VsZCBub3cgYWNjZXB0IHBhdGggcGFydHMgdGhhdCBhcmUKICAgdXAgdG8gYXQgbGVhc3QgNDA5NiBieXRlcy4KCiAtIFNvbWVob3cgSSBzY3Jld2VkIHVwIHdoZW4gYXBwbHlpbmcgdGhlIEFJWCBmaXggZnJvbSBHaWxiZXJ0IFJhbWlyZXosIHNvCiAgIEkgcmVkaWQgdGhhdCBub3cuCgpWZXJzaW9uIDUuM2EgKHdpbjMyIG9ubHkpCgogVHJveSBFbmdlbAogLSBDb3JyZWN0ZWQgYSB3aW4zMiBidWcgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHBhcnQuCgpWZXJzaW9uIDUuMwoKIEdpbGJlcnQgUmFtaXJleiBKci4gKDIxIERlYyAxOTk4KQogLSBJIGhhdmUgaW1wbGVtZW50ZWQgdGhlICJxdW90ZSIgZnVuY3Rpb24gb2YgRlRQIGNsaWVudHMuIEl0IGFsbG93cyB5b3UgdG8KICAgc2VuZCBhcmJpdHJhcnkgY29tbWFuZHMgdG8gdGhlIHJlbW90ZSBGVFAgc2VydmVyLiBJIGNob3NlIHRoZSAtUS8tLXF1b3RlCiAgIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCgogICBZb3UgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBxdW90ZWQgc3RyaW5nLCBhbmQgY3VybCB3aWxsIGFwcGx5IHRoZW0gaW4KICAgb3JkZXIuICBUaGlzIGlzIHdoYXQgSSB1c2UgZm9yIG15IE1WUyB1cGxvYWQ6CgogIGN1cmwgLUIgLS1jcmxmIC1RICJzaXRlIGxyZWNsPTgwIiAtUSAic2l0ZSBibGs9ODAwMCIgLVQgZmlsZSBmdHA6Ly9vczM5MC90ZXN0CgogICBDdXJsIHdpbGwgc2VuZCB0aGUgdHdvIHF1b3RlZCAic2l0ZSIgY29tbWFuZHMgaW4gdGhlIHByb3BlciBvcmRlci4KCiAtIE1hZGUgaXQgY29tcGlsZSBzbW9vdGhseSBvbiBBSVguCgogR2lsYmVydCBSYW1pcmV6IEpyLiA8Z3JhbUB2ZXJkaWN0LnV0aHNjc2EuZWR1PiAoMTggRGVjIDE5OTgpCiAtIEJyb3VnaHQgYW4gTVZTIHBhdGNoOiAtMy8tLW12cywgZm9yIGZ0cCB1cGxvYWQgdG8gdGhlIE1WUyBmdHAgc2VydmVyLgoKIFRyb3kgRW5nZWwgPHRlbmdlbEBzb25pYy5uZXQ+ICgxNyBEZWMgMTk5OCkKIC0gQnJvdWdodCBhIGNvcnJlY3Rpb24gdGhhdCBmaXhlcyB0aGUgd2luMzIgY3VybCBidWcuCgogRGFuaWVsIFN0ZW5iZXJnCiAtIEEgYnVnLCBwb2ludGVkIG91dCB0byBtZSBieSBEciBILiBULiBMZXVuZyA8aHRsMTBAY3VzLmNhbS5hYy51az4sIGNhdXNlZAogICBjdXJsIHRvIGNyYXNoIG9uIHRoZSAtQSBmbGFnIG9uIGNlcnRhaW4gc3lzdGVtcy4gQWN0dWFsbHksIGFsbCBzeXN0ZW1zCiAgIHNob3VsZCd2ZSEKCiAtIEFkZGVkIGEgZmV3IGRlZmluZXMgdG8gbWFrZSBkaXJlY3Rvcmllcy9maWxlIG5hbWVzIGdldCBidWlsZCBuaWNlciAod2l0aCBfCiAgIGluc3RlYWQgb2YgLiBhbmQgXCBpbnN0ZWFkIG9mIC8gaW4gd2luMzIpLgoKIC0gc3RldmUgPGZpc2tAcG9sYXIuYm93ZG9pbi5lZHU+IHJlcG9ydGVkIGEgd2VpcmQgYnVnIHRoYXQgb2NjdXJlZCBpZiB0aGUKICAgZnRwIHNlcnZlciByZXNwb25zZSBsaW5lIGhhZCBhIHBhcmVudGhlc2lzIG9uIHRoZSBsaW5lIGJlZm9yZSB0aGUgKHNpemUpCiAgIGluZm8uIEkgaG9wZSBpdCB3b3JrcyBiZXR0ZXIgbm93IQoKVmVyc2lvbiA1LjIuMQoKIFN0ZXZlbiBHLiBKb2huc29uIDxzdGV2ZW5qQGFsdW0ubWl0LmVkdT4gKERlYyAxNCwgMTk5OCkKIC0gQnJvdWdodCBhIGZpeCB0aGF0IGNvcnJlY3RlZCBhIGNyYXNoIGluIDUuMiBkdWUgdG8gYmFkIHRyZWF0bWVudCBvZiB0aGUKICAgZW52aXJvbm1lbnQgdmFyaWFibGVzLgoKVmVyc2lvbiA1LjIKCiBEYW5pZWwgU3RlbmJlcmcgKERlYyAxNCwgMTk5OCkKIC0gUmV3cm90ZSB0aGUgbWtoZWxwIHNjcmlwdCBhbmQgbm93LCB0aGUgbWtoZWxwLnBsIHNjcmlwdCBnZW5lcmF0ZXMgdGhlCiAgIGh1Z2VoZWxwLmMgZmlsZSBmcm9tIHRoZSBSRUFETUUgKmFuZCogdGhlIG1hbiBwYWdlIGZpbGUgY3VybC4xLiBCeSB1c2luZwogICBib3RoIGZpbGVzLCBJIG5vIGxvbmdlciBuZWVkIHRvIGhhdmUgZG91YmxlIGluZm9ybWF0aW9uIGluIGJvdGggdGhlIG1hbgogICBwYWdlIGFuZCB0aGUgUkVBRE1FIGFzIHdlbGwuIFNvLCB3aW4zMi11c2VycyB3aWxsIG9ubHkgaGF2ZSB0aGUgaHVnZWhlbHAuYwogICBmaWxlIGZvciBhbGwgaW5mbywgYnV0IHRoZW4sIHRoZXkgZG93bmxvYWQgdGhlIHBsYWluIGJpbmFyeSBtb3N0IHRpbWVzCiAgIGFueXdheS4KCiAtIGdjYzIuOC4xIHdpdGggdGhlIC1XYWxsIGZsYWcgY29tcGxhaW50cyBhIGxvdCBvbiBzdWJzY3JpcHQgaGFzIHR5cGUgYGNoYXInCiAgIGlmIEkgZG9uJ3QgZXhwbGljaXRseSB0eXBlY2FzdCB0aGUgYXJndW1lbnQgdG8gaXNkaWdpdCgpIG9yIGlzc3BhY2UoKSB0bwogICBpbnQuIFNvIEkgZGlkIHRvIGNvbXBpbGUgd2FybmluZyBmcmVlIHdpdGggdGhhdCB0b28uCgogLSBBZGRlZCBjaGVja3MgZm9yICdsb25nIGRvdWJsZScgYW5kICdsb25nIGxvbmcnIGluIHRoZSBjb25maWd1cmUgc2NyaXB0LiBJCiAgIG5lZWQgdGhvc2UgZm9yIHRoZSBtcHJpbnRmLmMgc291cmNlIHRvIGNvbXBpbGUgd2VsbCBvbiBub24gbG9uZyBsb25nCiAgIGNvbWZvcm1pbmcgc3lzdGVtcyEKClZlcnNpb24gNS4xIChub3QgcHVibGljbHkgcmVsZWFzZWQpCgogRGFuaWVsIFN0ZW5iZXJnIChEZWMgMTAsIDE5OTgpCiAtIEkgZ290IGEgcmVxdWVzdCBmb3IgYSBwcmUtY29tcGlsZWQgTlQgQWxwaGEgdmVyc2lvbi4gQW55b25lPwoKIC0gQWRkZWQgTHlueC9DRVJOIHd3dyBsaWIgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGUgc3VwcG9ydC4gVGhhdCBtZWFucyBjdXJsCiAgIG5vdyByZWFkcyBhbmQgdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXM6CgoJSFRUUF9QUk9YWSwgSFRUUFNfUFJPWFksIEZUUF9QUk9YWSwgR09QSEVSX1BST1hZCgogICBUaGV5IHNob3VsZCBiZSBzZXQgZm9yIHByb3RvY29sLXNwZWNpZmljIHByb3hpZXMuIEdlbmVyYWwgcHJveHkgc2hvdWxkIGJlCiAgIHNldCB3aXRoCgkKCUFMTF9QUk9YWQoKICAgQW5kIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgaG9zdCBuYW1lcyB0aGF0IHNob3VsZG4ndCBnbyB0aHJvdWdoIGFueQogICBwcm94eSBpcyBzZXQgaW4gKG9ubHkgYW4gYXN0ZXJpc2ssICcqJyBtYXRjaGVzIGFsbCBob3N0cykuCgoJTk9fUFJPWFkKCiAgIFRoZSB1c2FnZSBvZiB0aGUgLXgvLS1wcm94eSBmbGFnIG92ZXJyaWRlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgoKIC0gUHJveHkgY2FuIG5vdyBiZSBzcGVjaWZpZWQgd2l0aCBhIHByb2NvdG9sOi8vIHByZWZpeC4KCiAtIFdyb3RlIHRoZSBjdXJsLjEgbWFuIHBhZ2UuCgogLSBJbnRyb2R1Y2VkIGEgd2hvbGUgbmV3IGR5bmFtaWMgYnVmZmVyIHN5c3RlbSBmb3IgYWxsIHNwcmludGYoKXMuIEl0IGlzCiAgIGJhc2VkIG9uIHRoZSAqcHJpbnRmKCkgcGFja2FnZSBieSB5b3VycyB0cnVseSBhbmQgQmpvcm4gUmVlc2UuIEhvcGVmdWxseSwKICAgdGhlcmUgYXJlbid0IHRoYXQgbWFueSBidWZmZXIgb3ZlcmZsb3cgcmlza3MgbGVmdCBub3cuCgogLSBBaCwgSSBzaG91bGQgbWVudGlvbiBJJ3ZlIGNvbXBpbGVkIGFuZCBidWlsdCBjdXJsIHN1Y2Nlc3NmdWxseSB1bmRlcgogICBzb2xhcmlzIDIuNiB3aXRoIGdjYyBub3csIGdjYyAyLjcuMiB3b24ndCB3b3JrIGJ1dCAyLjguMSBkaWQgb2suCgogT3JlbiBUaXJvc2ggPG9yZW5AaGlzaG9tZS5uZXQ+IChEZWMgMywgMTk5OCkKIC0gQnJvdWdodCB0d28gLnNwZWMgZmlsZXMsIHRvIHVzZSB3aGVuIGNyZWF0aW5nIChMaW51eCkgUmVkaGF0IHN0eWxlIFJQTQogICBwYWNrYWdlcy4gVGhleSdyZSBuYW1lZCBjdXJsLnNwZWMgYW5kIGN1cmwtc3NsLnNwZWMuCgogVHJveSBFbmdlbCA8dGVuZ2VsQHNvbmljLm5ldD4KIC0gU3VwcGxpZWQgdGhlIHNyYy9NYWtlZmlsZS52YzYgZm9yIGVhc3kgY29tcGlsaW5nIHdpdGggVkMrKyB1bmRlciBXaW4zMi4KClZlcnNpb24gNS4wCgogRGFuaWVsIFN0ZW5iZXJnIChEZWMgMSwgMTk5OCkKIC0gTm90IGEgc2luZ2xlIGJ1ZyByZXBvcnQgaW4gYWdlcy4KIC0gQ29ycmVjdGVkIGdldHBhc3MuYyBhbmQgbWFpbi5jIHRvIGNvbXBpbGUgd2FybmluZyBhbmQgZXJyb3IgZnJlZSB3aXRoIHRoZQogICBXaW4zMiBWQysrIGNyYXAuCgpWZXJzaW9uIDUuMCBiZXRhIDI0CgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMjAsIDE5OTgpCgogSE9XIFRPIEJVSUxEIEEgUkVMRUFTRSBBUkNISVZFOgoKICogUHJlLXJlcXVpc2l0ZSBzb2Z0d2FyZToKICAgV2hhdAkJICAgICBUbyBidWlsZCB3aGF0ICAgICAgICAgICAgIFJlYWRzIGRhdGEgZnJvbQogICA9PT09ICAgICAgICAgICAgICA9PT09PT09PT09PT09ICAgICAgICAgICAgID09PT09PT09PT09PT09PQogICBHTlUgYXV0b21ha2UgICAgICBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNCAgIGNvbmZpZ3VyZS5pbgogICAgIEdOVSBtYWtlKDEpICAgICAgLSAiIC0KICAgICBHTlUgZ2NjKDEpICAgICAgIC0gIiAtCiAgIEdOVSBhdXRvY29uZiAgICAgIGNvbmZpZ3VyZSAgICAgICAgICAgICAgICAgY29uZmlndXJlLmluCiAgIEdOVSBhdXRvaGVhZGVyKDIpIGNvbmZpZy5oLmluCSAgICAgICBjb25maWd1cmUuaW4sIGFjY29uZmlnLmgKCiAqIE1ha2Ugc3VyZSBhbGwgZmlsZXMgdGhhdCBzaG91bGQgYmUgcGFydCBvZiB0aGUgYXJjaGl2ZSBhcmUgcHV0IGluIEZJTEVTLgoKICogUnVuICcuL21ha2V0Z3onIGFuZCBlbnRlciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgbmV3IHRvIGJlY29tZSBhcmNoaXZlLgoKICAgbWFrZXRneiBkb2VzOgoKICAgLSBFbnRlcnMgdGhlIG5ld2x5IGNyZWF0ZWQgdmVyc2lvbiBudW1iZXIgaW4gdXJsLmguCiAgIC0gKElmIHlvdSBkb24ndCBoYXZlIGF1dG9tYWtlLCB0aGlzIHNjcmlwdCB3aWxsIHdhcm4gYWJvdXQgdGhhdCwgYnV0IHVubGVzcwogICAgIHlvdSBoYXZlIGNoYW5nZWQgdGhlIE1ha2VmaWxlLmFtIGZpbGVzLCB0aGF0IGlzIG5vdGhpbmcgdG8gY2FyZSBhYm91dC4pCiAgICAgSWYgeW91IGhhdmUgaXQsIGl0J2xsIHJ1biBpdC4KICAgLSBJZiB5b3UgaGF2ZSBhdXRvY29uZiwgdGhlIGNvbmZpZ3VyZS5pbiB3aWxsIGJlIGVkaXRlZCB0byBnZXQgdGhlIG5ld2x5CiAgICAgY3JlYXRlZCB2ZXJzaW9uIG51bWJlciBhbmQgYXV0b2NvbmYgd2lsbCBiZSBydW4uCiAgIC0gQ3JlYXRlcyBhIG5ldyBkaXJlY3RvcnkgbmFtZWQgY3VybC08dmVyc2lvbj4uIChBY3R1YWxseSwgaXQgdXNlcyB0aGUgYmFzZQogICAgIG5hbWUgb2YgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHVwIHRvIHRoZSBmaXJzdCAnLScuKQogICAtIENvcGllcyBhbGwgZmlsZXMgbWVudGlvbmVkIGluIEZJTEVTIHRvIHRoZSBuZXcgZGlyZWN0b3J5LiBTYXZpbmcKICAgICBwZXJtaXNzaW9ucyBhbmQgZGlyZWN0b3J5IHN0cnVjdHVyZS4KICAgLSBVc2VzIHRhciB0byBjcmVhdGUgYW4gYXJjaGl2ZSBvZiBpdCBhbGwsIG5hbWVkIGN1cmwtPHZlcnNpb24+LnRhci5negogICAtIGd6aXBzIHRoZSBhcmNoaXZlCiAgIC0gUmVtb3ZlcyB0aGUgbmV3IGRpcmVjdG9yeSBhbmQgYWxsIGl0cyBjb250ZW50cy4KCiAqIFdoZW4gZG9uZSwgeW91IGhhdmUgYW4gYXJjaGl2ZSBzdG9yZWQgaW4geW91ciBkaXJlY3RvcnkgbmFtZWQKICAgY3VybC08dmVyc2lvbj4udGFyLmd6LgoKICAgRG9uZSEKCiAgICgxKSBUaGV5J3JlIHJlcXVpcmVkIHRvIG1ha2UgYXV0b21ha2UgcnVuIHByb3Blcmx5LgogICAoMikgSXQgaXMgZGlzdHJpYnV0ZWQgYXMgYSBwYXJ0IG9mIHRoZSBHTlUgYXV0b2NvbmYgYXJjaGl2ZS4KCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAxOCwgMTk5OCkKIC0gSSBjaGFuZ2VkIHRoZSBUQUctc3lzdGVtLiBJZiB5b3UgZXZlciB1c2VkIHVybGdldCgpIGZyb20gdGhpcyBwYWNrYWdlIGluCiAgIGFub3RoZXIgcHJvZHVjdCwgeW91IG5lZWQgdG8gcmVjb21waWxlIHdpdGggdGhlIG5ldyBoZWFkZXJzLiBJIGRpZCB0aGlzCiAgIG5ldyBzdHVmZiB0byBiZXR0ZXIgZGVhbCB3aXRoIGRpZmZlcmVudCBjb21waWxlcnMgYW5kIHN5c3RlbSB3aXRoIGRpZmZlcmVudAogICB2YXJpYWJsZSBzaXplcy4gSSB0aGluayBpdCBtYWtlcyBpdCBhIGxpdHRsZSBtb3JlIHBvcnRhYmxlLiBUaGlzIHByb3ZlcwogICB0byBjb21waWxlIHdhcm5pbmcgZnJlZSB3aXRoIHRoZSBwcm9ibGVtYXRpYyBJUklYIGNvbXBpbGVyIQogLSBXaW4zMiBjb21waWxlZCB3aXRoIGEgc2lsbHkgZXJyb3IuIENvcnJlY3RlZCBub3cuCiAtIEJyaWFuIENoYXBsaW4gPGJjaGFwbGluQGNhcGl0YWwtbWt0cy5jb20+IHJlcG9ydGVkIHlldCBhbm90aGVyIHByb2JsZW0gaW4KICAgbXVsdGlsaW5lIEZUUCByZXNwb25zZXMuIEkndmUgdHJpZWQgdG8gY29ycmVjdCBpdC4gSSBtYWlsZWQgaGltIGEgbmV3CiAgIHZlcnNpb24gYW5kIEkgaG9wZSBoZSBnZXRzIGJhY2sgc29vbiB3aXRoIHBvc2l0aXZlIGZlZWRiYWNrIQogLSBJbXByb3ZlZCB0aGUgJ21ha2V0Z3onIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdHJlZSB3aGljaCBpdCBtYWtlcwogICBhbiBhcmNoaXZlIGZyb20gaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgcmVuYW1pbmcgb2YgdGhlIGN1cnJlbnQgb25lLgogLSBNYWlsaW5nIGxpc3Qgb3BlbmVkIChzZWUgUkVBRE1FKS4KIC0gTWFkZSAtdiBtb3JlIHZlcmJvc2Ugb24gdGhlIFBBU1Ygc2VjdGlvbiBvZiBmdHAgdHJhbnNmZXJzLiBOb3cgaXQgdGVsbHMKICAgaG9zdCBuYW1lIGFuZCBJUCBvZiB0aGUgbmV3IGhvc3QgKGFuZCBwb3J0IG51bWJlcikuIEkgYWxzbyBhZGRlZCBhIHNlY3Rpb24KICAgYWJvdXQgUE9SVCB2cyBQQVNWIGluIHRoZSBSRUFETUUuCgpWZXJzaW9uIDUuMCBiZXRhIDIxCgogQW5ndXMgTWFja2F5IChOb3YgMTUsIDE5OTgpCiAtIEludHJvZHVjZWQgYXV0b21ha2Ugc3R1ZmYuCgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMTMsIDE5OTgpCiAtIEp1c3QgbWFkZSBhIHN1Y2Nlc3NmdWwgR0VUIG9mIGEgZG9jdW1lbnQgZnJvbSBhbiBTU0wtc2VydmVyIHVzaW5nIG15IG93bgogICBwcml2YXRlIGNlcnRpZmljYXRlIGZvciBhdXRoZW50aWNhdGlvbiEgVGhlIGNlcnRpZmljYXRlIGhhcyB0byBiZSBpbiBQRU0KICAgZm9ybWF0LiBZb3UgZG8gdGhhdCB0aGUgZWFzaWVzdCB3YXkgKGFsdGhvdWdoIG5vdCAqdGhhdCogZWFzeSkgYnkKICAgZG93bmxvYWRpbmcgdGhlIFNTTHllYXkgUEtDUyMxMi1wYXRjaCBieSBEciBTdGVwaGVuIE4uIEhlbnNvbiBmcm9tIGhpcyBzaXRlCiAgIGF0OiBodHRwOi8vd3d3LmRyaC1jb25zdWx0YW5jeS5kZW1vbi5jby51ay8uIFVzaW5nIGhpcyB0b29sLCB5b3UgY2FuCiAgIGNvbnZlcnQgYW55IG1vZGVybiBOZXRzY2FwZSBvciAoZXZlbikgTVNJRSBjZXJ0aWZpY2F0ZSB0byBQRU0tZm9ybWF0LiAgVXNlCiAgIGl0IHdpdGggJ2N1cmwgLUUgPGNlcnRpZmljYXRlOnBhc3N3b3JkPiBodHRwczovL3NpdGUuY29tJy4gIElmIHRoaXMgaXNuJ3QgYQogICBjb29sIGZlYXR1cmUsIHRoZW4gSSBkb24ndCBrbm93IHdoYXQgY29vbCBmZWF0dXJlcyBsb29rIGxpa2UhIDstKQogLSBXb3JraW5nIHNsb3dseSBvbiB0ZWxuZXQgY29ubmVjdGlvbnMuICNkZWZpbmUgVFJZX1RFTE5FVCB0byB0cnkgaXQgb3V0LgogICAoY3VybCAtdSB1c2VyOnBhc3N3ZCAidGVsbmV0Oi8vaG9zdC5jb20vY2F0IC5sb2dpbiIgaXMgb25lIGV4YW1wbGUpIEkgZG8KICAgaGF2ZSBwcm9ibGVtIHRvIGRlZmluZSBob3cgaXQgc2hvdWxkIHdvcmsuIFRoZSBwcmltZSBwdXJwb3NlIGZvciB0aGlzIG11c3QKICAgYmUgdG8gZ2V0ICg4Yml0IGNsZWFuKSBmaWxlcyB2aWEgdGVsbmV0LCBhbmQgaXQgcmVhbGx5IGlzbid0IHRoYXQgZWFzeSB0bwogICBnZXQgZmlsZXMgdGhpcyB3YXkuIFN0aWxsIGhhdmluZyBwcm9ibGVtcyB3aXRoIFxuIGJlaW5nIGNvbnZlcnRlZCB0byBcclxuLgoKIEFuZ3VzIE1hY2theSAoTm92IDEyLCAxOTk4KQogLSBDb3JyZWN0ZWQgYW5vdGhlciBidWcgaW4gdGhlIGxvbmcgcGFyYW1ldGVyIG5hbWUgcGFyc2VyLgogLSBNb2RpZmllZCBnZXRwYXNzLmMgKE5PVEU6IHNlZSB0aGUgc3BlY2lhbCBsaWNlbnNpbmcgaW4gdGhlIHRvcCBvZiB0aGF0CiAgIHNvdXJjZSBmaWxlKS4KCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAxMiwgMTk5OCkKIC0gV2UgbWF5IGhhdmUgcmVtb3ZlZCB0aGUgc2lsbHkgd2FybmluZ3MgZnJvbSB1cmwuYyB3aGVuIGNvbXBpbGVkIHVuZGVyIElSSVguCiAgIFRoYW5rcyBhZ2FpbiB0byBCam9ybiBSZWVzZSA8YnJlZXNlQGltYWRhLm91LmRrPiBhbmQgTWFydGluIFN0YWFlbAogICA8bWFydGluQG5ldGdyb3VwLmRrPi4KIC0gV3JvdGUgZm9ybWZpbmQucGwgd2hpY2ggaXMgYSBuZXcgcGVybCBzY3JpcHQgaW50ZW5kZWQgdG8gaGVscCB5b3UgZmluZCBvdXQKICAgaG93IGEgRk9STSBzdWJtaXNzaW9uIHNob3VsZCBiZSBkb25lLiBUaGlzIG5lZWRzIGEgbGl0dGxlIG1vcmUgd29yayB0byBnZXQKICAgcmVhbGx5IGdvb2QuCgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMTEsIDE5OTgpCiAtIE1hZGUgdGhlIEhUVFAgaGVhZGVyLWNoZWNrZXIgYWNjZXB0IHdoaXRlIHNwYWNlcyBiZWZvcmUgdGhlIEhUVFAvMS4/IGxpbmUuCiAgIEFwcGVhcmFudGx5IHNvbWUgcHJveGllcy9zaXRlcyBhZGQgc3VjaCBhdCB0aW1lcyAobXkgdGVzdCBwcm94eSBkaWQgd2hlbiBJCiAgIGRvd25sb2FkZWQgYSBnb3BoZXIgcGFnZSB3aXRoIGl0KSEKIC0gTW92ZWQgdGhlIGZvcm1lciAtaCB0byAtTSBhbmQgbWFkZSAtaCBzaG93IHRoZSBzaG9ydCBoZWxwIHRleHQgaW5zdGVhZC4gSQogICBoYWQgdG8gZW5hYmxlIGEgZm9yY2VkIGhlbHAgdGV4dCBvcHRpb24uIE5vdyBhbiBldmVuIHNob3J0ZXIgaGVscCB0ZXh0IHdpbGwKICAgYmUgcHJlc2VudGVkIHdoZW4gYW4gdW5rbm93biBvcHRpb24gYW5kIHNpbWlsYXIsIGlzIHVzZWQuCiAtIHN0ZGNoZWFkZXJzLmggZGlkbid0IHdvcmsgd2l0aCBJUklYIDYuNCBuYXRpdmUgY2MgY29tcGlsZXIuIEkgaG9wZSBteQogICBjaGFuZ2VzIGRvbid0IG1ha2Ugb3RoZXIgdmVyc2lvbnMgZ28gbnV0cyBpbnN0ZWFkLgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDEwLCAxOTk4KQogLSBBZGRlZCBhIHdlaXJkIGNoZWNrIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGNoZWNrIGZvciB0aGUgc2lsbHkgQUlYCiAgIHdhcm5pbmdzIGFib3V0IG15ICNkZWZpbmUgc3RyY2FzZWNtcCgpIHN0dWZmLiBJIGRvIHRoYXQgZGVmaW5lIHRvIHByZXZlbnQKICAgbWUgYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyB0byBhY2NpZGVudGFseSB1c2UgdGhhdCBmdW5jdGlvbiBuYW1lIGluc3RlYWQKICAgb2Ygc3RyZXF1YWwoKS4uLgogLSBJIGJ1Z2ZpeGVkIEFuZ3VzJ3MgZ2V0cGFzcy5jIHZlcnkgbGl0dGxlLgogLSBGaXhlZCB0aGUgdmVyYm9zZSBmbGFnIG5hbWVzIHRvIGdldG9wdC1zdHlsZSwgaS5lICdjdXJsIC0tbG9jJyB3aWxsIGJlCiAgIHN1ZmZpY2llbnQgaW5zdGVhZCBvZiAtLWxvY2F0aW9uIGFzICJsb2MiIGlzIGEgdW5pcXVlIHByZWZpeC4gQWxzbywgYW55dGhpbmcKICAgYWZ0ZXIgYSAnLS0nIGlzIHRyZWF0ZWQgYXMgYW4gVVJMLiBTbyBpZiB5b3UgZG8gaGF2ZSBhIGhvc3Qgd2l0aCBhIHdlZWVpcmQKICAgbmFtZSB5b3UgY2FuIGRvICdjdXJsIC0tIC1ob3N0LmNvbScuCiAtIEFub3RoZXIgZ2V0b3B0LWFkanVzdDsgY3VybCBub3cgYWNjZXB0cyBmbGFncyBhZnRlciB0aGUgVVJMIG9uIHRoZSBjb21tYW5kCiAgIGxpbmUuICdjdXJsIHd3dy5mb28uY29tIC1PJyBpcyBwZXJmZWN0bHkgdmFsaWQuCiAtIENvcnJlY3RlZCB0aGUgLmN1cmxyYyBwYXJzZXIgc28gdGhhdCBzdHJ0b2soKSBpcyBubyBsb25nZXIgdXNlZCBhbmQgSQogICBiZWxpZXZlIGl0IHdvcmtzIGJldHRlci4gRXZlbiBVUkxzIGNhbiBiZSBzcGVjaWZpZWQgaW4gaXQgbm93LgoKIEFuZ3VzIE1hY2theSAoTm92IDksIDE5OTgpCiAtIFJlcGxhY2VkIGdldHBhc3MuYyB3aXRoIGEgbmV3bHkgd3JpdHRlbiBvbmUsIG5vdCB1bmRlciBHUEwgbGljZW5zZQogLSBDaGFuZ2VkIE9TIHRvIGEgI2RlZmluZSBpbiBjb25maWcuaCBpbnN0ZWFkIG9mIGNvbXBpbGVyIGZsYWcKIC0gTWFrZWZpbGUgbm93IHVzZXMgLURIQVZFX0NPTkZJR19ICgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgOSwgMTk5OCkKIC0gT2ssIEkgZXhwYW5kZWQgdGhlIHRnei10YXJnZXQgdG8gdXBkYXRlIHRoZSB2ZXJzaW9uIHN0cmluZyBvbiBlYWNoIG9jY2F0aW9uCiAgIEkgYnVpbGQgYSByZWxlYXNlIGFyY2hpdmUhCiAtIEkgcmVhY3RlZCBvbiBBbmd1cyBNYWNrYXkncyBpbml0aWF0aXZlIGFuZCByZW1hZGUgdGhlIHBhcmFtZXRlciBwYXJzZXIgdG8KICAgYmUgbW9yZSBnZXRvcHQgY29tcGxpYW50LiBDdXJsIG5vdyBzdXBwb3J0cyAibWVyZ2VkIiBmbGFncyBhcyBpbiAKCWN1cmwgLWxzdiBmdHAuc2l0ZS5jb20KICAgRG8gbm90ZSB0aGF0IEkgaGFkIHRvIG1vdmUgdGhyZWUgc2hvcnQtbmFtZXMgb2YgdGhlIG9wdGlvbnMuIFBhcmFtZXRlcnMKICAgdGhhdCBuZWVkcyBhbiBhZGRpdGlvbmFsIHN0cmluZyBzdWNoIGFzIC14IG11c3QgYmUgc3RhbmQtYWxvbmUgb3IgdGhlCiAgIGxhc3QgaW4gYSBtZXJnZWQgc2VxdWVuY2U6CgljdXJsIC1sc3ggbXktcHJveHkgZnRwLnNpdGUuY29tCiAgIGlzIG9rLCBidXQgdXNpbmcgdGhlIGZsYWdzIGluIGEgZGlmZmVyZW50IG9yZGVyIGxpa2UgJy1seHMnIHdvdWxkIGNhdXNlCiAgIHVuZXhwZWN0ZWQgcmVzdWx0cyAoYXMgdGhlICdzJyBvcHRpb24gd291bGQgYmUgc2tpcHBlZCkuCiAtIEkndmUgY2hhbmdlZCB0aGUgaGVhZGVycyBpbiBhbGwgZmlsZXMgdGhhdCBhcmUgc3ViamVjdCB0byB0aGUgTW96UEwKICAgbGljZW5zZSwgYXMgdGhleSBhcmUgc3VwcG9zZWQgdG8gbG9vayBsaWtlIHdoZW4gY29uZm9ybWluZy4KIC0gTWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBtYWtlIHRoZSBjb25maWcuaC4gVGhlIGZvcm1lciBjb25maWcuaCBpcyBub3cKICAgc2V0dXAuaC4KIC0gVGhlIFJFU09VUkNFUyBhbmQgVE9ETyBmaWxlcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGFyY2hpdmUuCgogQW5ndXMgTWFja2F5IDxhbWFja2F5QGd1cy5tbC5vcmc+IChOb3YgNSwgMTk5OCkKIC0gRml4ZWQgZ2V0cGFzcy5jIGFuZCB2YXJpb3VzIGNvbmZpZ3VyZSBzdHVmZgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDMsIDE5OTgpCiAtIFVzZSAtSC8tLWhlYWRlciBmb3IgY3VzdG9tIEhUVFAtaGVhZGVycy4gTGV0cyB5b3UgcGFzcyBvbiB5b3VyIG93bgogICBzcGVjaWZpZWQgaGVhZGVycyB0byB0aGUgcmVtb3RlIHNlcnZlci4gSSB3b3VsZG4ndCByZWNvbW1lbmQgdHJ5aW5nIHRvIHVzZQogICBhIGhlYWRlciB3aXRoIGEgZGVmaW5lZCB1c2FnZSBhY2NvcmRpbmcgdG8gc3RhbmRhcmRzLiBVc2UgdGhpcyBmbGFnIG9uY2UKICAgZm9yIGV2ZXJ5IGN1c3RvbSBoZWFkZXIgeW91IHdhbnQgdG8gYWRkLgogLSBVc2UgLUIvLS1mdHAtYXNjaWkgdG8gZm9yY2UgZnRwIHRvIHVzZSBBU0NJSSBtb2RlIHdoZW4gdHJhbnNmZXJpbmcgZmlsZXMuCiAtIENvcnJlY3RlZCB0aGUgJ2dldGxpbmtzLnBsJyBzY3JpcHQsIEkgYWNjaWRlbnRhbGx5IGxlZnQgbXkgc2lsbHkgcHJveHkKICAgdXNhZ2UgaW4gdGhlcmUhIFNpbmNlIHRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlIC5jdXJscmMgZmlsZSwgaXQgaXMgZWFzaWVyIHRvCiAgIHdyaXRlIHNjcmlwdHMgdGhhdCB1c2UgY3VybCBzaW5jZSBwcm94aWVzIGFuZCBzdHVmZiBzaG91bGQgYmUgaW4gdGhlCiAgIC5jdXJscmMgZmlsZSBhbnl3YXkuCiAtIEludHJvZHVjaW5nIHRoZSBuZXcgLUYgZmxhZyBmb3IgSFRUUCBQT1NULiBJdCBzdXBwb3J0cyBtdWx0aXBhcnQvZm9ybS1kYXRhCiAgIHdoaWNoIG1lYW5zIGl0IGlzIGdvbm5hIGJlIHBvc3NpYmxlIHRvIHVwbG9hZCBmaWxlcyBldGMgdGhyb3VnaCBIVFRQIFBPU1QuCiAgIFNoaXJheiBLYW5nYSA8c2thbmdhQGJpZ2Zvb3QuY29tPiBhc2tlZCBmb3IgdGhlIGZlYXR1cmUgYW5kIG15IGJyb3RoZXIsCiAgIEJq9nJuIFN0ZW5iZXJnIDxCam9ybi5TdGVuYmVyZ0BzdGguZnJvbnRlYy5zZT4gaGVscGVkIG1lIGRlc2lnbiB0aGUgdXNlcgogICBpbnRlcmZhY2UgZm9yIHRoaXMgYmVhc3QuICBUaGlzIGZlYXR1cmUgcmVxdWlyZXMgcXVpdGUgc29tZSBkb2NzLAogICBzaW5jZSBpdCBoYXMgdHVybmVkIG91dCBub3Qgb25seSBxdWl0ZSBjYXBhYmxlLCBidXQgYWxzbyBjb21wbGljYXRlZCEgOi0pCiAtIEEgbm90ZSBoZXJlLCBzaW5jZSBJJ3ZlIHJlY2VpdmVkIG1haWwgYWJvdXQgaXQuIFNTTGVheSB2ZXJzaW9ucyBwcmlvciB0bwogICAwLjggd2lsbCAqbm90KiB3b3JrIHdpdGggY3VybCEKIC0gV2lsIExhbmdmb3JkIDx3aWxAbGFuZ2ZvcmQubmV0PiByZXBvcnRlZCBhIGJ1ZyB0aGF0IG9jY3VycmVkIHNpbmNlIGN1cmwKICAgZGlkIG5vdCBwcm9wZXJseSB1c2UgQ1JMRiB3aGVuIGlzc3VpbmcgZnRwIGNvbW1hbmRzLiBJIGZpeGVkIGl0LgogLSBSZWFycmFuZ2VkIHRoZSBvcmRlciBjb25maWcgZmlsZXMgYXJlIHJlYWQuIC5jdXJscmMgaXMgbm93ICphbHdheXMqIHJlYWQKICAgZmlyc3QgYW5kIGJlZm9yZSB0aGUgY29tbWFuZCBsaW5lIGZsYWdzLiAtSyBjb25maWcgZmlsZXMgdGhlbiBhY3QgYXMKICAgYWRkaXRpb25hbCBjb25maWcgaXRlbXMuCiAtIFVzZSAtcSBBUyBUSEUgRklSU1QgT1BUSU9OIHNwZWNpZmllZCB0byBwcmV2ZW50IC5jdXJscmMgZnJvbSBiZWluZyByZWFkLgogLSBZb3UgY2FuIG5vdyBkaXNhYmxlIGEgcHJveHkgYnkgdXNpbmcgLXggIiIuIFVzZWZ1bCBpZiB0aGUgLmN1cmxyYyBmaWxlCiAgIHNwZWNpZmllcyBhIHByb3h5IGFuZCB5b3Ugd2FubmEgZmV0Y2ggc29tZXRoaW5nIHdpdGhvdXQgZ29pbmcgdGhyb3VnaAogICB0aGF0LgogLSBJJ20gdGhpbmtpbmcgb2YgZHJvcHBpbmcgdGhlIC1wIHN1cHBvcnQuIEl0cyByZWFsbHkgbm90IHVzZWZ1bCBzaW5jZSBwb3J0cwogICBjb3VsZCAoYW5kIHNob3VsZD8pIGJlIHNwZWNpZmllZCBhcyA6PHBvcnQ+IGFwcGVuZGVkIG9uIHRoZSBob3N0IG5hbWUKICAgaW5zdGVhZCwgYm90aCBpbiBVUkxzIGFuZCB0byBwcm94eSBob3N0IG5hbWVzLgogLSBNYXJ0aW4gU3RhYWVsIDxtYXJ0aW5AbmV0Z3JvdXAuZGs+IHJlcG9ydHMgY3VybCAtTCBidWdzIHVuZGVyIFdpbmRvd3MgTlQKICAgKHRlc3Qgd2l0aCBVUkwgaHR0cDovL2NvbWUudG8vc2NzZGUpLiBUaGlzIGJ1ZyBpcyBub3QgcHJlc2VudCBpbiB0aGlzCiAgIHZlcnNpb24gYW55bW9yZS4KIC0gQWRkZWQgc3VwcG9ydCBmb3IgdGhlIHdlaXJkIEZUUCBVUkwgdHlwZT0gdGhpbmcuIFlvdSBjYW4gZG93bmxvYWQgYSBmaWxlCiAgIHVzaW5nIEFTQ0lJIHRyYW5zZmVyIGJ5IGFwcGVuZGluZyAiO3R5cGU9QSIgdG8gdGhlIHJpZ2h0IG9mIGl0LiBPdGhlcgogICBhdmFpbGFibGUgdHlwZXMgYXJlIHR5cGU9RCBmb3IgZGlyLWxpc3QgKE5MU1QpIGFuZCB0eXBlPUkgZm9yIGJpbmFyeQogICB0cmFuc2Zlci4gSSBjYW4ndCBzYXkgSSd2ZSBldmVyIHNlZW4gYW55b25lIHVzZSB0aGlzIGtpbmQgb2YgVVJMIHRob3VnaCEKICAgOi0pCiAtIFRyb3kgRW5nZWwgPHRlbmdlbEBwYWxsYWRpdW0ubmV0PiBwb2ludGVkIG91dCBhIGJ1ZyBpbiBteSBnZXRlbnYoIkhPTUUiKQogICB1c2FnZSBmb3Igd2luMzIgc3lzdGVtcy4gSSBpbnRyb2R1Y2UgZ2V0ZW52LmMgdG8gYmV0dGVyIGNvcGUgd2l0aAogICB0aGlzLiBNciBFbmdlbCBoZWxwcyBtZSB3aXRoIHRoZSBkZXRhaWxzIGFyb3VuZCB0aGF0Li4uCiAtIEEgbGl0dGxlIG5vdGUgdG8gbXlzZWxmIGFuZCBvdGhlcnMsIEkgc2hvdWxkIG1ha2UgdGhlIHdpbjMyLWJpbmFyeSBidWlsdAogICB3aXRoIFNTTCBzdXBwb3J0Li4uCiAtIHIteS1hLW4vbi1lLWwtcy1vLW4gPHJ5YW5AaW5jaC5jb20+IHNlbnQgbWUgY29tbWVudHMgYWJvdXQgYnVpbGRpbmcgY3VybAogICB3aXRoIFNTTCB1bmRlciBGcmVlQlNELiBTZWUgdGhlIE1ha2VmaWxlIGZvciBkZXRhaWxzLiBVc2luZyB0aGUgY29uZmlndXJlCiAgIHNjcmlwdCwgaXQgc2hvdWxkIHdvcmsgYmV0dGVyIGFuZCBhdXRvbWF0aWNhbGx5IG5vdy4uLgogLSBDbGVhbmVkIHVwIGluIHRoZSBwb3J0IG51bWJlciBtZXNzIGluIHRoZSBzb3VyY2UuIE5vIGxvbmdlciBzdG9yZXMgYW5kIHVzZXMKICAgcHJveHkgcG9ydCBudW1iZXIgc2VwYXJhdGUgZnJvbSBub3JtYWwgcG9ydCBudW1iZXIuCiAtICdjb25maWd1cmUnIHNjcmlwdCB3b3JraW5nLiBDb25maXJtZWQgY29tcGlsZXMgb246CiAgICBIb3N0ICAgICAgICAgU1NMICBDb21waWxlcgogICAgU3VuT1MgNS41ICAgIG5vICAgZ2NjCiAgICBTdW5PUyA1LjUuMSAgeWVzICBnY2MKICAgIFN1bk9TIDUuNiAgICBubyAgIGNjICAod2l0aCBnY2MsIGl0IGhhcyB0aGUgImdjYyBpbmNsdWRlIGZpbGVzIiBwcm9ibGVtKQogICAgU3VuT1MgNC4xLjMgIG5vICAgZ2NjICh3aXRob3V0IEFOU0kgQyBoZWFkZXJzKQogICAgU3VuT1MgNC4xLjIgIG5vICAgZ2NjIChuYXRpdmUgY29tcGlsZXIgZmFpbGVkKQogICAgTGludXggMi4wLjE4IG5vICAgZ2NjCiAgICBMaW51eCAyLjAuMzIgeWVzICBnY2MKICAgIExpbnV4IDIuMC4zNSBubyAgIGdjYyAod2l0aCBnbGliYykKICAgIElSSVggNi4yICAgICBubyAgIGdjYyAoY2MgY29tcGlsZXMgZ2VuZXJhdGUgYSBmZXcgd2FybmluZ3MpCiAgICBJUklYIDYuNCAgICAgbm8gICBjYyAgKGdlbmVyYXRlZCB3YXJuaW5ncyB0aG91Z2gpCiAgICBXaW4zMiAgICAgICAgbm8gICBCb3JsYW5kCiAgICBPU0Y0LjAJIG5vICAgPwoKIC0gT29vcHMuIFRoZSA1YmV0YSAoYW5kIDQuMTApIHVuZGVyIHdpbjMyIGZhaWxlZCBpZiB0aGUgSE9NRSB2YXJpYWJsZSB3YXNuJ3QKICAgc2V0LgogLSBXaGVuIHVzaW5nIGEgcHJveHksIGN1cmwgbm93IGd1ZXNzZXMgYW5kIHVzZXMgdGhlIHByb3RvY29sIHBhcnQgaW4gY2FzZXMKICAgbGlrZToKCWN1cmwgLXggcHJveHk6ODAgd3d3LnNpdGUuY29tCiAgIFByb3hpZXMgbm9ybWFsbHkgZ28gbnV0cyB1bmxlc3MgaHR0cDovLyBpcyBwcmVwZW5kZWQgdG8gdGhlIGhvc3QgbmFtZSwgc28KICAgaWYgY3VybCBpcyB1c2VkIGxpa2UgdGhpcywgaXQgZ3Vlc3NlcyBwcm90b2NvbCBhbmQgYXBwZW5kcyB0aGUgcHJvdG9jb2wKICAgc3RyaW5nIGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoZSBwcm94eS4gSXQgYWxyZWFkeSBkaWQgdGhpcyB3aGVuIHVzZWQKICAgd2l0aG91dCBwcm94eS4KIC0gQmV0dGVyIHBvcnQgdXNhZ2Ugd2l0aCBTU0wgdGhyb3VnaCBwcm94eSBub3cuIElmIHlvdSBzcGVjaWZpZWQgYSBkaWZmZXJlbnQKICAgaHR0cHMtcG9ydCB3aGVuIGFjY2Vzc2luZyB0aHJvdWdoIGEgcHJveHksIGl0IGRpZG4ndCB1c2UgdGhhdCBudW1iZXIKICAgY29ycmVjdGx5LiBJIGFsc28gcmV3cm90ZSB0aGUgY29kZSB0aGF0IHBhcnNlcyB0aGUgc3R1ZmYgcmVhZCBmcm9tIHRoZQogICBwcm94eSB3aGVuIHlvdSB3YW5uYSBjb25uZWN0IHRocm91Z2ggaXQgd2l0aCBTU0wuCiAtIEJqb3JuIFJlZXNlIDxicmVlc2VAaW1hZGEub3UuZGs+IGhlbHBlZCBtZSB3b3JrIGFyb3VuZCBvbmUgb2YgdGhlIGNvbXBpbGVyCiAgIHdhcm5pbmdzIG9uIElSSVggbmF0aXZlIGNjIGNvbXBpbGVzLgoKVmVyc2lvbiA0LjEwIChPY3QgMjYsIDE5OTgpCiBEYW5pZWwgU3RlbmJlcmcKIC0gSm9obiBBLiBCcmlzdG9yIDxqYnJpc3RvckBiZWxsc291dGgubmV0PiBzdWdnZXN0ZWQgYSBjb25maWcgZmlsZSBzd2l0Y2gsCiAgIGFuZCBzaW5jZSBJJ3ZlIGJlZW4gaGF2aW5nIHRoYXQgaWRlYSBraW5kIG9mIGluIHRoZSBiYWNrZ3JvdW5kIGZvciBhIGxvbmcKICAgdGltZSBJIHJld3JvdGUgdGhlIHBhcmFtZXRlciBwYXJzaW5nIGZ1bmN0aW9uIGEgbGl0dGxlIGFuZCBub3cgSSBpbnRyb2R1Y2UKICAgdGhlIC1LLy0tY29uZmlnIGZsYWcuIEkgYWxzbyBtYWRlIGN1cmwgKmFsd2F5cyogKHVubGVzcyAtSyBpcyB1c2VkKSB0cnkgdG8KICAgbG9hZCB0aGUgLmN1cmxyYyBmaWxlIGZvciBjb21tYW5kIGxpbmUgcGFyYW1ldGVycy4gVGhlIHN5bnRheCBmb3IgdGhlCiAgIGNvbmZpZyBmaWxlIGlzIHRoZSBzdGFuZGFyZCBjb21tYW5kIGxpbmUgYXJndW1lbnQgc3R5bGUuIERldGFpbHMgaW4gJ2N1cmwKICAgLWgnIG9yIHRoZSBSRUFETUUuCiAtIEkgcmVtb3ZlZCB0aGUgLWsgb3B0aW9uLiBLZWVwLWFsaXZlIGlzbid0IHJlYWxseSBhbnl0aGluZyBhbnlvbmUgd291bGQKICAgd2FudCB0byBlbmFibGUgd2l0aCBjdXJsIGFueXdheS4KIC0gTWFydGluIFN0YWFlbCA8TWFydGluQFN0YWFlbC5kaz4gaGVscGVkIG1lIGFkZCB0aGUgJ2lyaXgnIHRhcmdldC4gTm93CiAgICJtYWtlIGlyaXgiIHNob3VsZCBidWlsZCBjdXJsIHN1Y2Nlc3NmdWxseSBvbiBub24tZ2NjIFNHSSBtYWNoaW5lcy4KIC0gU2luZ2xlIHN3aXRjaGVzIG5vdyB0b2dnbGUgYmVoYXZpb3Vycy4gSS5lIGlmIHlvdSB1c2UgLXYgLXYgdGhlIHNlY29uZAogICB3aWxsIHN3aXRjaCBvZmYgdGhlIHZlcmJvc2UgbW9kZSB0aGUgZmlyc3Qgb25lIGVuYWJsZWQuIFRoaXMgaXMgc28gdGhhdAogICB5b3UgY2FuIGRpc2FibGUgYSBkZWZhdWx0IHNldHRpbmcgYSAuY3VybHJjIGZpbGUgZW5hYmxlcyBldGMuCgpWZXJzaW9uIDQuOSAoT2N0IDcsIDE5OTgpCiBEYW5pZWwgU3RlbmJlcmcKIC0gTWFydGluIFN0YWFlbCA8TWFydGluQFN0YWFlbC5kaz4gc3VnZ2VzdGVkIGN1cmwgd291bGQgc3VwcG9ydCBjb29raWVzLgogICBJIGFkZGVkIC1iLy0tY29va2llIHRvIGVuYWJsZSBmcmVlLXRleHQgY29va2llIGRhdGEgdG8gYmUgcGFzc2VkLiBUaGVyZSdzCiAgIGFsc28gYSBsaXR0bGUgYmx1cmIgYWJvdXQgZ2VuZXJhbCBjb29raWUgc3R1ZmYgaW4gdGhlIFJFQURNRS9oZWxwIHRleHQuCiAtIGRtaCA8ZG1oQGpldC5lcz4gc3VnZ2VzdGVkIEhUVFAgcmVzdW1lIGNhcGFiaWxpdGllcy4gQWx0aG91Z2ggeW91IGNvdWxkCiAgIG1hbnVhbGx5IGdldCBjdXJsIHRvIHJlc3VtZSBIVFRQIGRvY3VtZW50cywgSSBtYWRlIHRoZSAtYyByZXN1bWUgZmxhZyB3b3JrCiAgIGZvciBIVFRQIHRvbyAodW5sZXNzIC1yIGlzIHVzZWQgdG9vLCB3aGljaCB3b3VsZCBiZSB2ZXJ5IG9kZCBhbnl3YXkpLgogLSBBZGRlZCBjaGVja2xpbmtzLnBsIHRvIHRoZSBhcmNoaXZlLiBJdCBpcyBhIHN0aWxsIGV4cGVyaW1lbnRhbCBwZXJsIHNjcmlwdAogICB0aGF0IGNoZWNrcyBhbGwgbGlua3Mgb2YgYSB3ZWIgcGFnZSBieSB1c2luZyBjdXJsLgogLSBSZWFycmFuZ2VkIHRoZSBhcmNoaXZlIGhpZXJhcmNoeSBhIGxpdHRsZS4gQnVpbGQgdGhlIGV4ZWN1dGFibGUgaW4gdGhlCiAgIHNyYy8gZGlyIGZyb20gbm93IG9uIQogLSBWZXJzaW9uIDQuOSBhbmQgaGVyZWFmdGVyLCBpcyBubyBsb25nZXIgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCBsaWNlbnNlLgogICBJIGhhdmUgbm93IHVwZGF0ZWQgdGhlIExFR0FMIGZpbGUgZXRjIGFuZCBub3cgdGhpcyBpcyByZWxlYXNlZCB1c2luZyB0aGUKICAgTW96aWxsYSBQdWJsaWMgTGljZW5zZSB0byBhdm9pZCB0aGUgcGxhZ3VlIGtub3duIGFzICJ0aGUgR1BMIHZpcnVzIi4gWW91CiAgIG11c3QgbWFrZSB0aGUgc291cmNlIGF2YWlsYWJsZSBpZiB5b3UgZGVjaWRlIHRvIGNoYW5nZSBhbmQvb3IgcmVkaXN0cmlidXRlCiAgIGN1cmwsIGJ1dCBpZiB5b3UgZGVjaWRlIHRvIHVzZSBjdXJsIHdpdGhpbiBzb21ldGhpbmcgZWxzZSB5b3UgZG8gbm90IG5lZWQKICAgdG8gb2ZmZXIgdGhlIHdvcmxkIHRoZSBzb3VyY2UgdG8gdGhhdCB0b28uCiAtIEN1cmwgZGlkIG5vdCBsaWtlIEhUVFAgc2VydmVycyB0aGF0IHNlbnQgbm8gaGVhZGVycyBhdCBhbGwgb24gYSBHRVQKICAgcmVxdWVzdC4gIEl0IGlzIGEgdmlvbGF0aW9uIG9mIFJGQzIwNjggYnV0IGFwcGVhcmFudGx5IHNvbWUgc2VydmVycyBkbwogICB0aGF0IGFueXdheS4gIFRoYW5rcyB0byBHb3Jkb24gQmVhdG9uIDxnb3Jkb25AZXJpeC5lcmljc3Nvbi5zZT4gZm9yIHRoZQogICByZXBvcnQhCiAtIC1MLy0tbG9jYXRpb24gd2FzIGFkZGVkIGFmdGVyIGEgc3VnZ2VzdGlvbiBmcm9tIE1hcnRpbiBTdGFhZWwKICAgPE1hcnRpbkBTdGFhZWwuZGs+LiBUaGlzIG1ha2VzIGN1cmwgQVRURU1QVCB0byBmb2xsb3cgdGhlIExvY2F0aW9uOgogICByZWRpcmVjdCBpZiBvbmUgaXMgcHJlc2VudCBpbiB0aGUgSFRUUCBoZWFkZXJzLiBJZiAtaSBvciAtSSBpcyB1c2VkIHdpdGgKICAgdGhpcyBmbGFnLCB5b3Ugd2lsbCBzZWUgaGVhZGVycyBmcm9tIGFsbCBzaXRlcyB0aGUgTG9jYXRpb246IHBvaW50cyB0by4gRG8KICAgbm90ZSB0aGF0IHRoZSBmaXJzdCBzZXJ2ZXIgY2FuIHBvaW50IHRvIGEgc2Vjb25kIHRoYXQgcG9pbnRzIHRvIGEgdGhpcmQKICAgZXRjLiBJdCBzZWVtcyB0aGUgTG9jYXRpb246IHBhcmFtZXRlciAoc2FpZCB0byBiZSBhbiBBYnNvbHV0ZVVSSSBpbgogICBSRkMyMDY4KSBpc24ndCBhbHdheXMgYWJzb2x1dGUuLiA6LS8gQW55d2F5LCBJJ3ZlIG1hZGUgY3VybCBBVFRFTVBUIHRvIGRvCiAgIHRoZSBiZXN0IGl0IGNhbiB0byBkZWFsIHdpdGggdGhlIHJlYWxpdHkuCiAtIEFkZGVkIGdldGxpbmtzLnBsIHRvIHRoZSBhcmNoaXZlLiBnZXRsaW5rcy5wbCBzZWxlY3RpdmVseSBkb3dubG9hZHMKICAgZmlsZXMgdGhhdCBhIHdlYiBwYWdlIGxpbmtzIHRvLgoKVmVyc2lvbiA0LjguNAogRGFuaWVsIFN0ZW5iZXJnCiAtIEFzIEp1bGlhbiBSb21lcm8gTmlldG8gPGpyb21lcm9AYW5heWEuZXM+IHJlcG9ydGVkLCBjdXJsIHJlcG9ydGVkIHdyb25nCiAgIHZlcnNpb24gbnVtYmVyLgogLSBBcyBUZWVtdSBZbGktRWxzaWxhIDx0eWxpZWxzaUBtYWlsLnN0dWRlbnQub3VsdS5maT4gcG9pbnRlZCBvdXQsCiAgIHRoZSB3aW4zMiB2ZXJzaW9uIG9mIDQuOCAoYW5kIHByb2JhYmx5IGFsbCBvdGhlciB2ZXJzaW9ucyBmb3Igd2luMzIpCiAgIGRpZG4ndCB3b3JrIHdpdGggYmluYXJ5IGZpbGVzIHNpbmNlIEknbSB0b28gdXNlZCB0byB0aGUgVU5JWCBzdHlsZQogICBmb3BlbigpIHdoZXJlIGJpbmFyeSBhbmQgdGV4dCBkb24ndCBkaWZmZXIuLi4KIC0gUmFscGggQmVja21hbm4gPHJhYmVAdW5pLXBhZGVyYm9ybi5kZT4gYnJvdWdodCBtZSBzb21lIGNoYW5nZXMgdGhhdCBsZXRzCiAgIGN1cmwgY29tcGlsZSBlcnJvciBhbmQgd2FybmluZyBmcmVlIHdpdGggLVdhbGwgLXBlZGFudGljIHdpdGgKICAgZysrLiBJIGFsc28gdG9vayB0aGUgb3Bwb3J0dW5pdHkgdG8gY2xlYW4gb2ZmIHNvbWUgdW51c2VkIHZhcmlhYmxlcwogICBhbmQgc2ltaWxhci4KIC0gUmFscGggQmVja21hbm4gPHJhYmVAdW5pLXBhZGVyYm9ybi5kZT4gbWFkZSBtZSBhd2FyZSBvZiBhIHJlYWxseSBvZGQgYnVnCiAgIG5vdyBjb3JyZWN0ZWQuIFdoZW4gY3VybCByZWFkIGEgc2V0IG9mIGhlYWRlcnMgZnJvbSBhIEhUVFAgc2VydmVyLCBkaXZpZGVkCiAgIGludG8gbW9yZSB0aGFuIG9uZSByZWFkIGFuZCB0aGUgZmlyc3QgcmVhZCBzaG93ZWQgYSBmdWxsIGxpbmUgKmV4YWN0bHkqCiAgIChpLmUgZW5kaW5nIHdpdGggYSBuZXdsaW5lKSwgY3VybCBkaWQgbm90IGJlaGF2ZSB3ZWxsLgoKVmVyc2lvbiA0LjguMwogRGFuaWVsIFN0ZW5iZXJnCiAtIEkgd2FzIHRvbyBxdWljayB0byByZWxlYXNlIDQuOC4yIHdpdGggdG9vIGxpdHRsZSB0ZXN0aW5nLiBPbmUgb2YgdGhlCiAgIGNoYW5nZXMgaXMgbm93IHJldmVydGVkIHNsaWdodGx5IHRvIHRoZSA0LjguMSB3YXkgc2luY2UgNC44LjIgY291bGRuJ3QKICAgdXBsb2FkIGZpbGVzLiBJIHN0aWxsIHRoaW5rIGJvdGggcHJvYmxlbXMgY29ycmVjdGVkIGluIDQuOC4yIHJlbWFpbgogICBjb3JyZWN0ZWQuICBSZXBvcnRlZCBieSBKdWxpYW4gUm9tZXJvIE5pZXRvIDxqcm9tZXJvQGFuYXlhLmVzPi4KClZlcnNpb24gNC44LjIKIERhbmllbCBTdGVuYmVyZwogLSBCZXJuaGFyZCBJc2VsYm9ybiA8YmlzZWxib3JAcmhyay51bmkta2wuZGU+IHJlcG9ydGVkIHR3byBGVFAgcHJvdG9jb2wKICAgZXJyb3JzIGN1cmwgZGlkLiBUaGV5J3JlIG5vdyBjb3JyZWN0ZWQuIEJvdGggYXBwZWFyZWQgd2hlbiBnZXR0aW5nIGZpbGVzCiAgIGZyb20gYSBNUyBGVFAgc2VydmVyISA6LSkKClZlcnNpb24gNC44LjEKIERhbmllbCBTdGVuYmVyZwogLSBBZGRlZCBhIGxhc3QgdXBkYXRlIG9mIHRoZSBwcm9ncmVzcyBtZXRlciB3aGVuIHRoZSB0cmFuc2ZlciBpcyBkb25lLiBUaGUKICAgZmluYWwgb3V0cHV0IG9uIHRoZSBzY3JlZW4gZGlkbid0IGhhdmUgdG8gYmUgdGhlIGZpbmFsIHNpemUgdHJhbnNmZXJlZAogICB3aGljaCBtYWRlIGl0IHNvbWV0aW1lcyBsb29rIG9kZC4KIC0gVGhhbmtzIHRvIERhdmlkIExvbmcgPGxvbmdAcmVzZWFyY2guYmVsbC1sYWJzLmNvbT4gSSBnb3QgcmlkIG9mIGEgc2lsbHkKICAgYnVnIHRoYXQgaGFwcGVuZWQgaWYgYSBIVFRQLXBhZ2UgaGFkIG5vdGhpbmcgYnV0IGhlYWRlci4gQXBwZWFyYW50bHkKICAgU29sYXJpcyBkZWFscyB3aXRoIG5lZ2F0aXZlIHNpemVzIGluIGZ3cml0ZSgpIGNhbGxzIGEgbG90IGJldHRlciB0aGFuCiAgIExpbnV4IGRvZXMuLi4gPUItXQoKVmVyc2lvbiA0LjgKIERhbmllbCBTdGVuYmVyZwogLSBDb250aW51ZSBGVFAgZmlsZSB0cmFuc2Zlci4gLWMgaXMgdGhlIHN3aXRjaC4gTm90ZSB0aGF0IHlvdSBuZWVkIHRvCiAgIHNwZWNpZnkgYSBmaWxlIG5hbWUgaWYgeW91IHdhbm5hIHJlc3VtZSBhIGRvd25sb2FkICh5b3UgY2FuJ3QgcmVzdW1lIGEKICAgZG93bmxvYWQgc2VudCB0byBzdGRvdXQpLiBSZXN1bWluZyB1cGxvYWQgbWF5IGJlIGxpbWl0ZWQgYnkgdGhlIHNlcnZlcgogICBzaW5jZSBjdXJsIGlzIHRoZW4gdXNpbmcgdGhlIG5vbi1SRkM5NTkgY29tbWFuZCBTSVpFIHRvIGdldCB0aGUgc2l6ZSBvZgogICB0aGUgdGFyZ2V0IGZpbGUgYmVmb3JlIHVwbG9hZCBiZWdpbnMgKHRvIGZpZ3VyZSBvdXQgd2hpY2ggb2Zmc2V0IHRvCiAgIHVzZSkuIFVzZSAtQyB0byBzcGVjaWZ5IHRoZSBvZmZzZXQgeW91cnNlbGYhIC1DIGlzIGhhbmR5IGlmIHlvdSdyZSBkb2luZwogICB0aGUgb3V0cHV0IHRvIHNvbWV0aGluZyBlbHNlIGJ1dCBhIHBsYWluIGZpbGUgb3Igd2hlbiB5b3UganVzdCB3YW50IHRvIGdldAogICB0aGUgZW5kIG9mIGEgZmlsZS4KIC0gcmVjdXJzaXZlZnRwZ2V0LnBsIG5vdyBmZWF0dXJlcyBhIG1heGltdW0gcmVjdXJzaXZlIGxldmVsIGFyZ3VtZW50LgoKVmVyc2lvbiA0LjcKIERhbmllbCBTdGVuYmVyZwogLSBBZGRlZCBzdXBwb3J0IHRvIGFib3J0IGEgZG93bmxvYWQgaWYgdGhlIHNwZWVkIGlzIGJlbG93IGEgY2VydGFpbiBhbW91bnQKICAgKHNwZWVkLWxpbWl0KSBieXRlcyBwZXIgc2Vjb25kIGZvciBhIGNlcnRhaW4gKHNwZWVkLXRpbWUpIHRpbWUuCiAtIFdyb3RlIGEgcGVybCBzY3JpcHQgJ3JlY3Vyc2l2ZWZ0cGdldC5wbCcgdG8gcmVjdXJzaXZlbHkgdXNlIGN1cmwgdG8gZ2V0IGEKICAgd2hvbGUgZnRwIGRpcmVjdG9yeSB0cmVlLiBJdCBpcyBtZWFudCBhcyBhbiBleGFtcGxlIG9mIGhvdyBjdXJsIGNhbiBiZQogICB1c2VkLiAgSSBhZ3JlZSBpdCBpc24ndCB0aGUgd2lzZXN0IHRoaW5nIHRvIGRvIHRvIG1ha2UgYSBzZXBhcmF0ZSBuZXcKICAgY29ubmVjdGlvbiBmb3IgZWFjaCBmaWxlIGFuZCBkaXJlY3RvcnkgZm9yIHRoaXMuCgpWZXJzaW9uIDQuNgogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkZGVkIGEgZmlyc3QgYXR0ZW1wdCB0byBvcHRpb25hbGx5IHBhcnNlIHRoZSAubmV0cmMgZmlsZSBmb3IgbG9naW4gdXNlcgogICBhbmQgcGFzc3dvcmQuIElmIHVzZWQgd2l0aCBodHRwLCBpdCBlbmFibGVzIHVzZXIgYXV0aGVudGljYXRpb24uIC1uIGlzCiAgIHRoZSBuZXcgc3dpdGNoLgogLSBSZW1vdmVkIHRoZSBleHRyYSBuZXdsaW5lcyBvbiB0aGUgZGVmYXVsdCB1c2VyLWFnZW50IHN0cmluZy4KIC0gQ29ycmVjdGVkIHRoZSBtaXNzaW5nIGZ0cCB1cGxvYWQgZXJyb3IgbWVzc2FnZXMgd2hlbiBpdCBmYWlsZWQgd2l0aG91dCB0aGUKICAgdmVyYm9zZSBmbGFnIHNldC4gR2FyeSBXLiBTd2VhcmluZ2VuIGZvdW5kIGl0LgogLSBOb3cgdXNpbmcgYWxhcm0oKSB0byBlbmFibGUgc2Vjb25kLXByZWNpc2lvbiB0aW1lb3V0IGV2ZW4gb24gdGhlIG5hbWUKICAgcmVzb2x2aW5nL2Nvbm5lY3RpbmcgcGhhc2UuIFRoZSB0aW1lb3V0IGlzIGFsdGhvdWdoIHJlc2V0IGFmdGVyIHRoYXQgZmlyc3QKICAgc2VxdWVuY2UuIChUaGlzIHNob3VsZCBiZSBjb3JyZWN0ZWQuKSBHYXJ5IFcuIFN3ZWFyaW5nZW4gPHN3ZWFyQGFhLm5ldD4KICAgcmVwb3J0ZWQuCiAtIE5vdyBzcGVsbHMgIlVua25vd24iIHByb3Blcmx5LCBhcyBpbiAiVW5rbm93biBvcHRpb24gJ3onIi4uLiA6LSkKIC0gQWRkZWQgYnVnIHJlcG9ydCBlbWFpbCBhZGRyZXNzIGluIHRoZSBSRUFETUUuCiAtIEFkZGVkIGEgImN1cnJlbnQgc3BlZWQiIGZpZWxkIHRvIHRoZSBwcm9ncmVzcyBtZXRlci4gSXQgc2hvd3MgdGhlIGF2ZXJhZ2UKICAgc3BlZWQgdGhlIGxhc3QgNSBzZWNvbmRzLiBUaGUgb3RoZXIgc3BlZWQgZmllbGQgc2hvd3MgdGhlIGF2ZXJhZ2Ugc3BlZWQgb2YKICAgdGhlIGVudGlyZSB0cmFuc2ZlciBzbyBmYXIuCgpWZXJzaW9uIDQuNS4xCiBMaW5hcyBWZXBzdGFzCiAtIFNTTCB0aHJvdWdoIHByb3h5IGZpeAogLSBBZGRlZCAtQSB0byBhbGxvdyBVc2VyLUFnZW50OiBjaGFuZ2VzCgogRGFuaWVsIFN0ZW5iZXJnIAogLSBNYWRlIHRoZSAtQSB3b3JrIHdoZW4gU1NMLXRocm91Z2gtcHJveHkuCgpWZXJzaW9uIDQuNQogTGluYXMgVmVwc3RhcyA8bGluYXNAbGluYXMub3JnPgogLSBNb3JlIFNTTCBjb3JyZWN0aW9ucwogLSBJJ3ZlIGFkZGVkIGEgcG9ydCB0byBBSVguCiAtIHJ1bm5pbmcgU1NMIHRocm91Z2ggYSBwcm94eSBjYXVzZXMgYSBjaHVuayBvZiBjb2RlIHRvIGJlIGV4ZWN1dHJlZCB0d2ljZS4KICAgb25lIG9mIHRob3NlIGJsb2NrcyBuZWVkcyB0byBiZSBkZWxldGVkLgoKIERhbmllbCBTdGVuYmVyZwogLSBNYWRlIC1pIGFuZCAtSSB3b3JrIGFnYWluCgpWZXJzaW9uIDQuNAogTGluYXMgVmVwc3RhcyA8bGluYXNAdXMuaWJtLmNvbT4KIC0gLXggY2FuIG5vdyBhbHNvIHNwZWNpZnkgcHJveHlwb3J0IHdoZW4gdXNlZCBhcyBpbiAncHJveHlob3N0OnByb3h5cG9ydCcKIC0gU1NMIGZpeGVzCgpWZXJzaW9uIDQuMwogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkanVzdGVkIHRvIGNvbXBpbGUgdW5kZXIgd2luMzIgKFZpc3VhbEMrKyA1KS4gVGhlIC1QIHN3aXRjaCBkb2VzIG5vdAogICBzdXBwb3J0IG5ldHdvcmsgaW50ZXJmYWNlIG5hbWVzIGluIHdpbjMyLiBJIGNvdWxkbid0IGZpZ3VyZSBvdXQgaG93IQoKVmVyc2lvbiA0LjIKIExpbmFzIFZlcHN0YXMgLyBTYW1wbyBLZWxsb21ha2kKIC0gQWRkZWQgU1NMIC8gU1NMZWF5IHN1cHBvcnQgKGh0dHBzOi8vKQogLSBBZGRlZCB0aGUgLVQgdXNhZ2UgZm9yIEhUVFAgUE9TVC4KCiBEYW5pZWwgU3RlbmJlcmcKIC0gQnVnZml4ZWQgdGhlIFNTTCBpbXBsZW1lbnRhdGlvbi4KIC0gTWFkZSAtUCBhIGxvdCBiZXR0ZXIgdG8gdXNlIG90aGVyIElQIGFkZHJlc3Nlcy4gSXQgbm93IGFjY2VwdHMgYSBmb2xsb3dpbmcKICAgcGFyYW1ldGVyIHRoYXQgY2FuIGJlIGVpdGhlcgogICAgICAgIGludGVyZmFjZSAtIGkuZSAiZXRoMCIgdG8gc3BlY2lmeSB3aGljaCBpbnRlcmZhY2UncyBJUCBhZGRyZXNzIHlvdQogICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gdXNlCiAgICAgICAgSVAgYWRkcmVzcyAtIGkuZSAiMTkyLjE2OC4xMC4xIiB0byBzcGVjaWZ5IGV4YWN0IElQIG51bWJlcgogICAgICAgIGhvc3QgbmFtZSAtIGkuZSAibXkuaG9zdC5kb21haW4iIHRvIHNwZWNpZnkgbWFjaGluZQogICAgICAgICItIiAgICAgICAtIChhbnkgc2luZ2xlLWxldHRlciBzdHJpbmcpIHRvIG1ha2UgaXQgcGljayB0aGUgbWFjaGluZSdzCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdAogLSBUaGUgTWFrZWZpbGUgaXMgbm93IHJlYWR5IHRvIGNvbXBpbGUgZm9yIHNvbGFyaXMsIHN1bm9zNCBhbmQgbGludXggcmlnaHQKICAgb3V0IG9mIHRoZSBib3guCiAtIEJldHRlciBnZW5lcmF0ZWQgdmVyc2lvbiBzdHJpbmcgc2VlbiB3aXRoICdjdXJsIC1WJwoKVmVyc2lvbiA0LjEKIERhbmllbCBTdGVuYmVyZwogLSBUaGUgSVAgbnVtYmVyIHJldHVybmVkIGJ5IHRoZSBmdHAgc2VydmVyIGFzIGEgcmVwbHkgdG8gUEFTViBkb2VzIG5vIGxvbmdlcgogICBoYXZlIHRvIEROUyByZXNvbHZlLiBJbiBmYWN0LCBubyBJUC1udW1iZXItb25seSBhZGRyZXNzZXMgaGF2ZSB0byBhbnltb3JlLgogLSBCaW5kcyBiZXR0ZXIgdG8gYXZhaWxhYmxlIHBvcnQgd2hlbiAtUCBpcyB1c2VkLgogLSBOb3cgTElTVHMgLi8gaW5zdGVhZCBvZiAvIHdoZW4gdXNlZCBhcyBpbiBmdHA6Ly9mdHAuZnVuZXQuZmkvLiBUaGUgcmVhc29uCiAgIGZvciB0aGlzIGlzIHRoYXQgZXhhY3RseSB0aGF0IHNpdGUsIGZ0cC5mdW5ldC5maSwgZG9lcyBub3QgYWxsb3cgTElTVCAvCiAgIHdoaWxlIExJU1QgLi8gaXMgZmluZS4gQW55IG9iamVjdGlvbnM/CgpWZXJzaW9uIDQgKDE5OTgtMDMtMjApCiBEYW5pZWwgU3RlbmJlcmcKIC0gSSB0b29rIGFub3RoZXIgaHVnZSBzdGVwIGFuZCBjaGFuZ2VkIGJvdGggdmVyc2lvbiBudW1iZXIgYW5kIHByb2plY3QgbmFtZSEKICAgVGhlIHJlYXNvbiBmb3IgdGhlIG5ldyBuYW1lIGlzIHRoYXQgdGhlcmUgYXJlIGp1c3Qgb25lIHRvbyBtYW55IHByb2dyYW1zCiAgIG5hbWVkIHVybGdldCBhbHJlYWR5IGFuZCB0aGlzIHByb2dyYW0gYWxyZWFkeSBjYW4gYSBsb3QgbW9yZSB0aGFuIG1lcmVseQogICBnZXR0aW5nIFVSTHMsIGFuZCB0aGUgcmVhc29uIGZvciB0aGUgdmVyc2lvbiBudW1iZXIgaXMgdGhhdCBJIGRpZCBhZGQgdGhlCiAgIHByZXR0eSBiaWcgY2hhbmdlIGluIC1QIGFuZCBzaW5jZSBJIGNoYW5nZWQgbmFtZSBJIHdhbnRlZCB0byBzdGFydCB3aXRoCiAgIHNvbWV0aGluZyBmcmVzaCEKIC0gVGhlIC0tc3R5bGUgZmxhZ3MgYXJlIHdvcmtpbmcgYmV0dGVyIG5vdy4KIC0gTGlzdGluZyBkaXJlY3RvcmllcyB3aXRoIEZUUCBvZnRlbiByZXBvcnRlZCB0aGF0IHRoZSBmaWxlIHRyYW5zZmVyIHdhcwogICBpbmNvbXBsZXRlLiBXcm9uZyBhc3N1bXB0aW9ucyB3ZXJlIHRvbyBjb21tb24gZm9yIGRpcmVjdG9yaWVzLCB3aHkgbm8KICAgc2l6ZSB3aWxsIGJlIGF0dGVtcHRlZCB0byBnZXQgY29tcGFyZWQgb24gdGhlbSBmcm9tIG5vdyBvbi4KIC0gSW1wbGVtZW50ZWQgdGhlIC1QIGZsYWcgdGhhdCBsZXQncyB0aGUgZnRwIGNvbnRyb2wgaXNzdWUgYSBQT1JUIGNvbW1hbmQKICAgaW5zdGVhZCBvZiB0aGUgc3RhbmRhcmQgUEFTVi4KIC0gLWEgZm9yIGFwcGVuZGluZyBGVFAgdXBsb2FkcyB3b3Jrcy4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKVmVyc2lvbiAzLjEyCiBEYW5pZWwgU3RlbmJlcmcKIC0gRW5kLW9mLWhlYWRlciB0cmFja2luZyBzdGlsbCBsYWNrZWQgc3VwcG9ydCBmb3IgXHJcbiBvciBqdXN0IFxuIGF0IHRoZQogICBlbmQgb2YgdGhlIGxhc3QgaGVhZGVyIGxpbmUuCiBTZXJnaW8gQmFycmVzaSA8c2JhcnJlc2lAaW1pc3BhLml0PgogLSBBZGRlZCBQUk9YWSBhdXRoZW50aWNhdGlvbi4KIFJhZmFlbCBTYWd1bGEKIC0gRml4ZWQgc29tZSBsaXR0bGUgYnVncy4KClZlcnNpb24gMy4xMQogRGFuaWVsIFN0ZW5iZXJnCiAtIFRoZSBoZWFkZXIgcGFyc2luZyB3YXMgc3RpbGwgbm90IGNvcnJlY3Qgc2luY2UgdGhlIDMuMiBtb2RpZmljYXRpb24uLi4KClZlcnNpb24gMy4xMAogRGFuaWVsIFN0ZW5iZXJnCiAtIDMuNyBhbmQgMy45IHdlcmUgc2ltdWx0YW5lb3VzbHkgZGV2ZWxvcGVkIGFuZCBtZXJnZWQgaW50byB0aGlzIHZlcnNpb24uCiAtIEZUUCB1cGxvYWQgZGlkIG5vdCB3b3JrIGNvcnJlY3RseSBzaW5jZSAzLjIuCgpWZXJzaW9uIDMuOQogUmFmYWVsIFNhZ3VsYQogLSBBZGRlZCB0aGUgIi1lIDx1cmw+IC8gLS1yZWZlcmVyIDx1cmw+IiBvcHRpb24gd2hlcmUgd2UgY2FuIHNwZWNpZnkKICAgdGhlIHJlZmVyZXIgcGFnZS4gT2J2aW91c2x5LCB0aGlzIGlzIG5lY2Vzc2FyeSBvbmx5IHRvIGZvb2wgdGhlCiAgIHNlcnZlciwgYnV0Li4uCgpWZXJzaW9uIDMuNwogRGFuaWVsIFN0ZW5iZXJnCiAtIE5vdyBjaGVja3MgdGhlIGxhc3QgZXJyb3IgY29kZSBzZW50IGZyb20gdGhlIGZ0cCBzZXJ2ZXIgYWZ0ZXIgYSBmaWxlIGhhcwogICBiZWVuIHJlY2VpdmVkIG9yIHVwbG9hZGVkLiBXYXNuJ3QgZG9uZSBwcmV2aW91c2x5LgogLSBXaGVuICd1cmxnZXQgPGhvc3Q+JyBpcyB1c2VkIHdpdGhvdXQgYSAncHJvdG9jb2w6Ly8nIGZpcnN0IGluIHRoZSBob3N0IHBhcnQsCiAgIGl0IG5vdyBjaGVja3MgZm9yIGhvc3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBmdHAgb3IgZ29waGVyIGFuZCBpZiBpdCBkb2VzLAogICBpdCB1c2VzIHRoYXQgcHJvdG9jb2wgYnkgZGVmYXVsdCBpbnN0ZWFkIG9mIGh0dHAuCgpWZXJzaW9uIDMuNgogRGFuaWVsIFN0ZW5iZXJnCiAtIFNpbGx5IG1pc3Rha2UgbWFkZSB0aGUgUE9TVCBidWcuIFRoaXMgaGFzIG5vdyBhbHNvIGJlZW4gdGVzdGVkIHRvIHdvcmsgd2l0aAogICBwcm94eS4KClZlcnNpb24gMy41CiBEYW5pZWwgU3RlbmJlcmcKIC0gSGlnaGx5IGluc3BpcmVkIGJ5IFJhZmFlbCBTYWd1bGEncyBjaGFuZ2VzIHRvIHRoZSAzLjEgdGhhdCBhZGRlZCBhbiBhbG1vc3QKICAgZnVuY3Rpb25hbCBQT1NULCBJIGFwcGxpZWQgaGlzIGNoYW5nZXMgaW50byB0aGlzIHZlcnNpb24gYW5kIG1hZGUgdGhlbSB3b3JrLgogICAoSXQgc2VlbXMgUE9TVCByZXF1aXJlcyB0aGUgQ29udGVudC1UeXBlIGFuZCBDb250ZW50LUxlbmd0aCBoZWFkZXJzLikgSXQgaXMKICAgbm93IHVzYWJsZSB3aXRoIHRoZSAtZCBzd2l0Y2guCgpWZXJzaW9uIDMuMyAtIDMuNAogUGFzc2VkIHRvIGF2b2lkIGNvbmZ1c2lvbnMKClZlcnNpb24gMy4yCiBEYW5pZWwgU3RlbmJlcmcKIC0gTWFqb3IgcmV3cml0ZSBvZiB0d28gY3J1Y2lhbCBwYXJ0cyBvZiB0aGlzIGNvZGU6IHVwbG9hZCBhbmQgZG93bmxvYWQuCiAgIFRoZXkgYXJlIGJvdGggbm93IHVzaW5nIGEgc2VsZWN0KCkgc3dpdGNoLCB0aGF0IGFsbG93cyBtdWNoIGJldHRlcgogICBwcm9ncmVzcyBtZXRlciBhbmQgdGltZSBjb250cm9sLiAKIC0gYWxhcm0oKSB1c2FnZSByZW1vdmVkIGNvbXBsZXRlbHkKIC0gRlRQIGdldCBjYW4gbm93IGxpc3QgZGlyZWN0b3J5IGNvbnRlbnRzIGlmIHRoZSBwYXRoIGVuZHMgd2l0aCBhIHNsYXNoICcvJy4KICAgVXJsZ2V0IG9uIGEgZnRwLXBhdGggdGhhdCBkb2Vzbid0IGVuZCB3aXRoIGEgc2xhc2ggbWVhbnMgdXJsZ2V0IHdpbGwKICAgYXR0ZW1wdCBnZXR0aW5nIGl0IGFzIGEgZmlsZSBuYW1lLgogLSBGVFAgZGlyZWN0b3J5IHZpZXcgc3VwcG9ydHMgLWwgZm9yICJsaXN0LW9ubHkiIHdoaWNoIGxpc3RzIHRoZSBmaWxlIG5hbWVzCiAgIG9ubHkuCiAtIEFsbCBvcGVyYXRpb25zIHN1cHBvcnQgLW0gZm9yIG1heCB0aW1lIHVzYWdlIGluIHNlY29uZHMgYWxsb3dlZC4KIC0gRlRQIHVwbG9hZCBub3cgYWxsb3dzIHRoZSBzaXplIG9mIHRoZSB1cGxvYWRlZCBmaWxlIHRvIGJlIHByb3ZpZGVkLCBhbmQKICAgdGh1cyBpdCBjYW4gYmV0dGVyIGNoZWNrIGl0IGFjdHVhbGx5IHVwbG9hZGVkIHRoZSB3aG9sZSBmaWxlLiBJdCBhbHNvCiAgIG1ha2VzIHRoZSBwcm9ncmVzcyBtZXRlciBmb3IgdXBsb2FkcyBtdWNoIGJldHRlciEKIC0gTWFkZSB0aGUgcGFyYW1ldGVyIHBhcnNpbmcgZmFpbCBpbiBjYXNlcyBsaWtlICd1cmxnZXQgLXIgOTAwJyB3aGljaAogICBwcmV2aW91c2x5IHRyaWVkIHRvIGNvbm5lY3QgdG8gdGhlIGhvc3QgbmFtZWQgJzkwMCcuCgpWZXJzaW9uIDMuMQogS2plbGwgRXJpY3NvbgogLSBQb2ludGVkIG91dCBob3cgdG8gY29ycmVjdCB0aGUgMyB3YXJuaW5ncyBpbiB3aW4zMi1jb21waWxlcy4KCiBEYW5pZWwgU3RlbmJlcmcKIC0gUmVtb3ZlZCBhbGwgY2FsbHMgdG8gZXhpdCgpLgogLSBNYWRlIHRoZSBzaG9ydCBoZWxwIHRleHQgZ2V0IHdyaXR0ZW4gdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyLgogLSBNYWRlIHRoaXMgZmlsZSBpbnN0ZWFkIG9mIGtlZXBpbmcgdGhlc2UgY29tbWVudHMgaW4gdGhlIHNvdXJjZS4KIC0gTWFkZSB0d28gY2FsbGJhY2sgaG9va3MsIHRoYXQgZW5hYmxlIGV4dGVybmFsIHByb2dyYW1zIHRvIHVzZSB1cmxnZXQoKQogICBlYXNpZXIgYW5kIHRvIGdyYWIgdGhlIG91dHB1dC9vZmZlciB0aGUgaW5wdXQgZWFzaWVyLgogLSBJdCBpcyBldmlkZW50IHRoYXQgV2luMzItY29tcGlsZXMgYXJlIHBhaW5mdWwuIEkgd2F0Y2hlZCB0aGUgb3V0cHV0IGZyb20KICAgdGhlIEJvcmxhbmQgQysrIHY1IGFuZCBpdCB3YXMgYXdmdWwuIEp1c3QgaWdub3JlIGFsbCB0aG9zZSB3YXJuaW5ncy4KClZlcnNpb24gMy4wCiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRkZWQgRlRQIHVwbG9hZCBjYXBhYmlsaXRpZXMuIFRoZSBuYW1lIHVybGdldCBnZXRzIGEgYml0IHNpbGx5IG5vdwogICB3aGVuIHdlIGNhbiBwdXQgdG9vLi4uID0pCiAtIFJlc3RydWN0dXJlZCB0aGUgc291cmNlIHF1aXRlIGEgbG90LgogICBDaGFuZ2VkIHRoZSB1cmxnZXQoKSBpbnRlcmZhY2UuIFRoaXMgd2F5LCB3ZSB3aWxsIHN1cnZpdmUgY2hhbmdlcyBtdWNoCiAgIGJldHRlci4gTmV3IGZlYXR1cmVzIGNhbiBjb21lIGFuZCBvbGQgY2FuIGJlIHJlbW92ZWQgd2l0aG91dCB1cyBuZWVkaW5nCiAgIHRvIGNoYW5nZSB0aGUgaW50ZXJmYWNlLiBJJ3ZlIHdyaXR0ZW4gYSBzbWFsbCBleHBsYW5hdGlvbiBpbiB1cmxnZXQuaAogICB0aGF0IGV4cGxhaW5zIGl0LgogLSBOZXcgZmxhZ3MgaW5jbHVkZSAtdCwgLVQsIC1PIGFuZCAtaC4gVGhlIC1oIHRleHQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBuZXcKICAgbWtoZWxwIHNjcmlwdC4KClZlcnNpb24gMi45CiBSZW1jbyB2YW4gSG9vZmYKIC0gQWRkZWQgYSBmaXggdG8gbWFrZSBpdCBjb21waWxlIHNtb290aGx5IG9uIEFtaWdhIHVzaW5nIHRoZSBTQVMvQwogICBjb21waWxlci4KICAKIERhbmllbCBTdGVuYmVyZwogLSBCZWxpZXZlIGl0IG9yIG5vdCwgYnV0IHRoZSBTVFVQSUQgTm92ZWxsIHdlYiBzZXJ2ZXIgc2VlbXMgdG8gcmVxdWlyZQogICB0aGF0IHRoZSBIb3N0OiBrZXl3b3JkIGlzIHVzZWQsIHNvIHdlbGwgSSB1c2UgaXQgYW5kIEkgKHJlLWludHJvZHVjZSkgdGhlCiAgIHVybGdldCBVc2VyLUFnZW50Oi4gSSBzdGlsbCBoYXZlIHRvIGNoZWNrIHRoYXQgdGhpcyBIb3N0OiB1c2FnZSB3b3JrcyB3aXRoCiAgIHByb3hpZXMuLi4gJ0hvc3Q6JyBpcyByZXF1aXJlZCBmb3IgSFRUUC8xLjEgR0VUIGFjY29yZGluZyB0byBSRkMyMDY4LgoKVmVyc2lvbiAyLjgKIFJhZmFlbCBTYWd1bGEKIC0gc29tZSBsaXR0bGUgbW9kaWZpY2F0aW9ucwoKVmVyc2lvbiAyLjcKIERhbmllbCBTdGVuYmVyZwogLSBSZW1vdmVkIHRoZSAtbCBvcHRpb24gYW5kIGludHJvZHVjZWQgdGhlIC1mIG9wdGlvbiBpbnN0ZWFkLiBOb3cgSSdsbAogICByZXdyaXRlIHRoZSBmb3JtZXIgLWwga2x1ZGdlIGluIGFuIGV4dGVybmFsIHNjcmlwdCB0aGF0J2xsIHVzZSB1cmxnZXQgdG8KICAgZmV0Y2ggbXVsdGlwYXJ0IGZpbGVzIGxpa2UgdGhhdC4KIC0gJy1mJyBpcyBpbnRyb2R1Y2VkLCBpdCBtZWFucyBGYWlsIHdpdGhvdXQgb3V0cHV0IGluIGNhc2Ugb2YgSFRUUCBzZXJ2ZXIKICAgZXJyb3JzIChyZXR1cm4gY29kZSA+PTMwMCkuCiAtIEFkZGVkIHN1cHBvcnQgZm9yIC1yLCByYW5nZXMuIFNwZWNpZnkgd2hpY2ggcGFydCBvZiBhIGRvY3VtZW50IHlvdSAKICAgd2FudCwgYW5kIG9ubHkgdGhhdCBwYXJ0IGlzIHJldHVybmVkLiBPbmx5IHdpdGggSFRUUC8xLjEtc2VydmVycy4KIC0gU3BsaXQgdXAgdGhlIHNvdXJjZSBpbiAzIHBhcnRzLiBOb3cgYWxsIHB1cmUgVVJMIGZ1bmN0aW9ucyBhcmUgaW4KICAgdXJsZ2V0LmMgYW5kIHN0dWZmIHRoYXQgZGVhbHMgd2l0aCB0aGUgc3RhbmQtYWxvbmUgcHJvZ3JhbSBpcyBpbiBtYWluLmMuCiAtIEkgdG9vayBhIGZldyBtaW51dGVzIGFuZCB3cm90ZSBhbiBlbWJyeW8gb2YgYSBSRUFETUUgZmlsZSB0byBleHBsYWluCiAgIGEgZmV3IHRoaW5ncy4KClZlcnNpb24gMi42CiBEYW5pZWwgU3RlbmJlcmcKIC0gTWFkZSB0aGUgLWwgKGxvb3ApIHRoaW5nIHVzZSB0aGUgbmV3IENPTkZfRkFJTE9ORVJST1Igd2hpY2ggbWFrZXMKICAgdXJsZ2V0KCkgcmV0dXJuIGVycm9yIGNvZGUgaWYgbm9uLXN1Y2Nlc3NmdWwuIEl0IGFsc28gd29uJ3Qgb3V0cHV0IGFueXRoaW5nCiAgIHRoZW4uIE5vdyBmaW5hbGx5IHJlbW92ZWQgdGhlIEhUVFAgMS4wIGFuZCBlcnJvciA0MDQgZGVwZW5kZW5jaWVzLgogLSBBZGRlZCAtSSB3aGljaCB1c2VzIHRoZSBIRUFEIHJlcXVlc3QgdG8gZ2V0IHRoZSBoZWFkZXIgb25seSBmcm9tIGEKICAgaHR0cC1zZXJ2ZXIuCgpWZXJzaW9uIDIuNQogUmFmYWVsIFNhZ3VsYQogLSBNYWRlIHRoZSBwcm9ncmVzcyBtZXRlciB1c2UgSEhIOk1NOlNTIGluc3RlYWQgb2Ygb25seSBzZWNvbmRzLgoKVmVyc2lvbiAyLjQKIERhbmllbCBTdGVuYmVyZwogLSBBZGRlZCBwcm9ncmVzcyBtZXRlci4gSXQgYXBwZWFycyB3aGVuIGRvd25sb2FkaW5nID4gQlVGRkVSIFNJWkUgYW5kCiAgIG11dGUgaXMgbm90IHNlbGVjdGVkLiBJIGZvdW5kIG91dCB0aGF0IHdoZW4gZG93bmxvYWRpbmcgbGFyZ2UgZmlsZXMgZnJvbQogICByZWFsbHkgcmVhbGx5IHNsb3cgc2l0ZXMsIGl0IGlzIGRlc2lyYWJsZSB0byBrbm93IHRoZSBzdGF0dXMgb2YgdGhlCiAgIGRvd25sb2FkLiBEbyBub3RlIHRoYXQgc29tZSBkb3dubG9hZHMgYXJlIGRvbmUgdW5hd2FyaW5nIG9mIHRoZSBzaXplLCB3aGljaAogICBtYWtlcyB0aGUgcHJvZ3Jlc3MgbWV0ZXIgbGVzcyB0aHJpbGxpbmcgOykgSWYgdGhlIG91dHB1dCBpcyBzZW50IHRvIGEgdHR5LAogICB0aGUgcHJvZ3Jlc3MgbWV0ZXIgaXMgc2h1dCBvZmYuCiAtIEluY3JlYXNlZCBidWZmZXIgc2l6ZSB1c2VkIGZvciByZWFkaW5nLgogLSBBZGRlZCBsZW5ndGggY2hlY2tzIGluIHRoZSB1c2VyK3Bhc3N3ZCBwYXJzaW5nLgogLSBNYWRlIGl0IGdyb2sgdXNlcitwYXNzd2QgZm9yIEhUVFAgZmV0Y2hlcy4gVGhlIHRyaWNrIGlzIHRvIGJhc2U2NAogICBlbmNvZGUgdGhlIHVzZXIrcGFzc3dkIGFuZCBzZW5kIGFuIGV4dHJhIGhlYWRlciBsaW5lLiBSZWFkIGNoYXB0ZXIgMTEuMSBpbgogICBSRkMyMDY4IGZvciBkZXRhaWxzLiBJIGFkZGVkIGl0IHRvIGJlIHVzZWQganVzdCBsaWtlIHRoZSBmdHAgb25lLiAgVG8gZ2V0IGEKICAgaHR0cCBkb2N1bWVudCBmcm9tIGEgcGxhY2UgdGhhdCByZXF1aXJlcyB1c2VyIGFuZCBwYXNzd29yZCwgdXNlIGFuIFVSTAogICBsaWtlOgoKICAgICAgICBodHRwOi8vdXNlcjpwYXNzd2RAd3d3LnNpdGUudG8ubGVhY2gvZG9jLmh0bWwKCiAgIEkgYWxzbyBhZGRlZCB0aGUgLXUgZmxhZywgc2luY2UgV0hFTiBVU0lORyBBIFBST1hZIFlPVSBDQU4nVCBTUEVDSUZZIFRIRQogICBVU0VSIEFORCBQQVNTV09SRCBXSVRIIEhUVFAgTElLRSBUSEFULiBUaGUgLXUgZmxhZyB3b3JrcyBmb3IgZnRwIHRvbywgYnV0CiAgIG5vdCBpZiB1c2VkIHdpdGggcHJveHkuIFRvIGRvIHRoZSBzYW1lIGFzIHRoZSBhYm92ZSBvbmUsIHlvdSBjYW4gaW52b2tlOgoKICAgICAgICB1cmxnZXQgLXUgdXNlcjpwYXNzd2QgaHR0cDovL3d3dy5zaXRlLnRvLmxlYWNoL2RvYy5odG1sCgpWZXJzaW9uIDIuMwogUmFmYWVsIFNhZ3VsYQogLSBBZGRlZCAiLW8iIG9wdGlvbiAob3V0cHV0IGZpbGUpCiAtIEFkZGVkIFVSR19IVFRQX05PVF9GT1VORCByZXR1cm4gY29kZS4KICAgKERhbmllbCdzIG5vdGU6KQogICBQZXJoYXBzIHdlIHNob3VsZCBkZXRlY3QgYWxsIGtpbmRzIG9mIGVycm9ycyBhbmQgaW5zdGVhZCBvZiB3cml0aW5nIHRoYXQKICAgY3VzdG9tIHN0cmluZyBmb3IgdGhlIHBhcnRpY3VsYXIgNDA0LWVycm9yLCB1c2UgdGhlIGVycm9yIHRleHQgd2UgYWN0dWFsbHkKICAgZ2V0IGZyb20gdGhlIHNlcnZlci4gU2VlIGZ1cnRoZXIgZGV0YWlscyBpbiBSRkMyMDY4IChIVFRQIDEuMQogICBkZWZpbml0aW9uKS4gVGhlIGN1cnJlbnQgd2F5IGFsc28gcmVsaWVzIG9uIGEgSFRUUC8xLjAgcmVwbHksIHdoaWNoIG5ld2VyCiAgIHNlcnZlcnMgbWlnaHQgbm90IGRvLgogLSBMb29waW5nIG1vZGUgKCItbCIgb3B0aW9uKS4gSXQncyBlYXNpZXIgdG8gZ2V0IHZhcmlvdXMgc3BsaXQgZmlsZXMuCiAgIChEYW5pZWwncyBub3RlOikKICAgVXNlIGl0IGxpa2UgJ3VybGdldCAtbCAxIGh0dHA6Ly9mcm9tLnRoaXMuc2l0ZS9maWxlJWQuaHRtbCcsIHdoaWNoIHdpbGwKICAgbWFrZSB1cmxnZXQgdG8gYXR0ZW1wdCB0byBmZXRjaCBhbGwgZmlsZXMgbmFtZWQgZmlsZTEuaHRtbCwgZmlsZTIuaHRtbCBldGMKICAgdW50aWwgbm8gbW9yZSBmaWxlcyBhcmUgZm91bmQuIFRoaXMgaXMgb25seSBhIG1vZGlmaWNhdGlvbiBvZiB0aGUKICAgU1RBTkRfQUxPTkUgcGFydCwgbm90aGluZyBpbiB0aGUgdXJsZ2V0KCkgZnVuY3Rpb24gd2FzIG1vZGZpZmllZCBmb3IgdGhpcy4KIERhbmllbCBTdGVuYmVyZwogLSBDaGFuZ2VkIHRoZSAtaCB0byBiZSAtaSBpbnN0ZWFkLiAtaCBzaG91bGQgYmUgcHJlc2VydmVkIHRvIGhlbHAgdXNlLgogLSBCam9ybiBSZWVzZSBpbmRpY2F0ZWQgdGhhdCBCb3JsYW5kIF9taWdodF8gdXNlICdfV0lOMzInIGluc3RlYWQgb2YgdGhlCiAgIFZDKysgV0lOMzIgZGVmaW5lIGFuZCB0aGVyZWZvcmUgSSBhZGRlZCBhIGxpdHRsZSBmaXggZm9yIHRoYXQuCgpWZXJzaW9uIDIuMgogSm9oYW4gQW5kZXJzc29uCiAtIFRoZSB1cmxnZXQgZnVuY3Rpb24gZGlkbid0IHNldCB0aGUgcGF0aCB0byB1cmwgd2hlbiB1c2luZyBwcm94eS4KIC0gRml4ZWQgYnVnIHdpdGggSU1DIHByb3h5LiBOb3cgdXNpbmcgKGFsbW9zdCkgY29tcGxldGUgR0VUIGNvbW1hbmQuCiAgCiBEYW5pZWwgU3RlbmJlcmcKIC0gTWFkZSBpdCBjb21waWxlIG9uIFNvbGFyaXMuIEhhZCB0byByZW9yZ2FuaXplIHRoZSBpbmNsdWRlcyBhIGJpdC4KICAgKHNvIFdpbjMyLCBMaW51eCwgU3VuT1MgNCBhbmQgU29sYXJpcyAyIGNvbXBpbGUgZmluZS4pCiAtIE1hZGUgSm9oYW4ncyBrZWVwYWxpdmUga2V5d29yZCBvcHRpb25hbCB3aXRoIHRoZSAtayBmbGFnIChzaW5jZSBpdAogICBtYWtlcyBhIGxvdCBvZiB1cmxnZXRzIHRha2UgYSBsb3QgbG9uZ2VyIHRpbWUpLgogLSBNYWRlIGEgJy1oJyBzd2l0Y2ggaW4gY2FzZSB5b3Ugd2FudCB0aGUgSFRUUC1oZWFkZXIgaW4gdGhlIG91dHB1dC4KClZlcnNpb24gMi4xCiBEYW5pZWwgU3RlbmJlcmcgYW5kIEtqZWxsIEVyaWNzb24KIC0gV2luMzItY29tcGlsYWJsZQogLSBObyBtb3JlIGdsb2JhbCB2YXJpYWJsZXMKIC0gTXV0ZSBvcHRpb24gKG5vIG91dHB1dCBhdCBhbGwgdG8gc3RkZXJyKQogLSBGdWxsIHJhbmdlIG9mIHJldHVybiBjb2RlcyBmcm9tIHVybGdldCgpLCB3aGljaCBpcyBub3cgd3JpdHRlbiB0byBiZSBhCiAgIGZ1bmN0aW9uIGZvciBlYXN5LXRvLXVzZSBpbiBbb3RoZXJdIHByb2dyYW1zLgogLSBEZWZpbmUgU1RBTkRfQUxPTkUgdG8gY29tcGlsZSB0aGUgc3RhbmQgYWxvbmUgdXJsZ2V0IHByb2dyYW0KIC0gTm93IGNvbXBpbGVzIHdpdGggZ2NjIG9wdGlvbnMgLWFuc2kgLVdhbGwgLXBlZGFudGljIDspCgpWZXJzaW9uIDIuMAogLSBJbnRyb2R1Y2luZyBmdHAgR0VUIHN1cHBvcnQuIFRoZSBGVFAgVVJMIHR5cGUgaXMgcmVjb2duaXplZCBhbmQgdXNlZC4KIC0gUmVuYW1lZCB0aGUgcHJvamVjdCB0byAndXJsZ2V0Jy4KIC0gU3VwcG9ydHMgdGhlIHVzZXIrcGFzc3dkIGluIHRoZSBGVFAgVVJMIChvdGhlcndpc2UgaXQgdHJpZXMgYW5vbnltb3VzCiAgIGxvZ2luIHdpdGggYSB3ZWlyZCBlbWFpbCBhZGRyZXNzIGFzIHBhc3N3b3JkKS4KClZlcnNpb24gMS41CiBEYW5pZWwgU3RlbmJlcmcKIC0gVGhlIHNraXBfaGVhZGVyKCkgY3JhcCBtZXNzZWQgaXQgdXAgYmlnLXRpbWUuIEJ5IHNpbXBseSByZW1vdmluZyB0aGF0CiAgIG9uZSB3ZSBjYW4gYWxsIG9mIGEgc3VkZGVuIGRvd25sb2FkIGFueXRoaW5nIDspCiAtIE5vIGxvbmdlciByZXF1aXJlcyBhIHRyYWlsaW5nIHNsYXNoIG9uIHRoZSBVUkxzLgogLSBJZiB0aGUgZ2l2ZW4gVVJMIGlzbid0IHByZWZpeGVkIHdpdGggJ2h0dHA6Ly8nLCBIVFRQIGlzIGFzc3VtZWQgYW5kCiAgIGdpdmVuIGEgdHJ5IQogLSAndm9pZCBtYWluKCknIGlzIGhpc3RvcnkuCgpWZXJzaW9uIDEuNAogRGFuaWVsIFN0ZW5iZXJnCiAtIFRoZSBnb3BoZXIgc291cmNlIHVzZWQgdGhlIHBwYXRoIHZhcmlhYmxlIGluc3RlYWQgb2YgcGF0aCB3aGljaCBjb3VsZAogICBsZWFkIHRvIGRpc2FzdGVyLgoKVmVyc2lvbiAxLjMKIERhbmllbCBTdGVuYmVyZwogLSBXZWxsLCBJIGFkZGVkIGEgbGFtZSB0ZXh0IGFib3V0IHRoZSB0aW1lIGl0IHRvb2sgdG8gZ2V0IHRoZSBkYXRhLiBJIGFsc28KICAgZm91Z2h0IGFnYWluc3QgSm9oYW4gdG8gcHJldmVudCBoaXMgLWYgb3B0aW9uICh0byBzcGVjaWZ5IGEgZmlsZSBuYW1lCiAgIHRoYXQgc2hvdWxkIGJlIHdyaXR0ZW4gaW5zdGVhZCBvZiBzdGRvdXQpISA9KQogLSBNYWRlIGl0IHdyaXRlICdjb25uZWN0aW9uIHJlZnVzZWQnIGZvciB0aGF0IHBhcnRpY3VsYXIgY29ubmVjdCgpCiAgIHByb2JsZW0uCiAtIFJlbnVtYmVyZWQgdGhlIHZlcnNpb24uIExldCdzIG5vdCBtYWtlIHNpbGx5IDEuMC5YIHZlcnNpb25zLCB0aGlzIGlzCiAgIGEgcGxhaW4gMS4zIGluc3RlYWQuCgpWZXJzaW9uIDEuMgogSm9oYW4gQW5kZXJzc29uCiAtIERpc2NvdmVyZWQgYW5kIGZpeGVkIHRoZSBwcm9ibGVtIHdpdGggZ2V0dGluZyBiaW5hcnkgZmlsZXMuIHB1dHMoKSBpcwogICBub3cgcmVwbGFjZWQgd2l0aCBmd3JpdGUoKS4gKERhbmllbCdzIG5vdGU6IHRoaXMgYWxzbyBmaXhlZCB0aGUgYnVmZmVyCiAgIG92ZXJ3cml0ZSBwcm9ibGVtIEkgZm91bmQgaW4gdGhlIHByZXZpb3VzIHZlcnNpb24uKQoKIFJhZmFlbCBTYWd1bGEgPHNhZ3VsYUBpbmYudWZyZ3MuYnI+CiAtIExldCAiLXAiIGJlZm9yZSAiLXgiLgoKIERhbmllbCBTdGVuYmVyZyA8RGFuaWVsLlN0ZW5iZXJnQHN0aC5mcm9udGVjLnNlPgogLSBCdWdmaXhlZCB0aGUgcHJveHkgdXNhZ2UuIEl0IHNob3VsZCAqTk9UKiB1c2Ugbm9yIHN0cmlwIHRoZSBwb3J0IG51bWJlcgogICBmcm9tIHRoZSBVUkwgYnV0IHNpbXBseSBwYXNzIHRoYXQgaW5mb3JtYXRpb24gdG8gdGhlIHByb3h5LiBUaGlzIGFsc28KICAgbWFkZSB0aGUgdXNlci9wYXNzd29yZCBmaWVsZHMgcG9zc2libGUgdG8gdXNlIGluIHByb3h5IFtmdHAtXSBVUkxzLgogICAobGlrZSBpbiBmdHA6Ly91c2VyOnBhc3N3b3JkQGZ0cC5teS5zaXRlOjgwMjEvUkVBRE1FKQoKIEpvaGFuIEFuZGVyc3NvbiA8am9oYW5AaG9tZW1haWwuY29tPgogLSBJbXBsZW1lbnRlZCBIVFRQIHByb3h5IHN1cHBvcnQuCiAtIFJlY2VpdmUgYnl0ZSBjb3VudGVyIGFkZGVkLgoKIEJqb3JuIFJlZXNlIDxicmVlc2VAaW1hZGEub3UuZGs+CiAtIEltcGxlbWVudGVkIFVSTHMgKGFuZCBza2lwcGVkIHRoZSBvbGQgc3ludGF4KS4KIC0gT3V0cHV0IGlzIHdyaXR0ZW4gdG8gc3Rkb3V0LCBzbyB0byBhY2hpZXZlIHRoZSBhYm92ZSBleGFtcGxlLCBkbzoKICAgaHR0cGdldCBodHRwOi8vMTQzLjU0LjEwLjYvaW5mb19sb2dvLmdpZiA+IHRlc3QuZ2lmCgpWZXJzaW9uIDEuMQogRGFuaWVsIFN0ZW5iZXJnIDxEYW5pZWwuU3RlbmJlcmdAc3RoLmZyb250ZWMuc2U+CiAtIEFkanVzdGVkIGl0IHNsaWdodGx5IHRvIGFjY2VwdCBuYW1lZCBob3N0cyBvbiB0aGUgY29tbWFuZCBsaW5lLiBXZQogICB3b3VsZG4ndCB3YW5uYSB1c2UgSVAgbnVtYmVycyBmb3IgdGhlIHJlc3Qgb2Ygb3VyIGxpZmVzLCB3b3VsZCB3ZT8KClZlcnNpb24gMS4wCiAgUmFmYWVsIFNhZ3VsYSA8c2FndWxhQGluZi51ZnJncy5icj4KICAtIFdyb3RlIHRoZSBpbml0aWFsIGh0dHBnZXQsIHdoaWNoIHN0YXJ0ZWQgYWxsIHRoaXMhCg==