CkFwYWNoZSAyLjBhbHBoYTcgUmVsZWFzZWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlIEFwYWNoZSBHcm91cCBpcyBwbGVhc2VkIHRvIGFubm91bmNlIHRoZSByZWxlYXNlIG9mIHRoZSBzZXZlbnRoIHB1YmxpYwphbHBoYSByZWxlYXNlIG9mIEFwYWNoZSAyLjAuICAKCkFwYWNoZSAyLjAgb2ZmZXJzIG51bWVyb3VzIGVuaGFuY2VtZW50cywgaW1wcm92ZW1lbnRzIGFuZCBwZXJmb3JtYW5jZQpib29zdHMgb3ZlciB0aGUgMS4zIGNvZGViYXNlLiBUaGUgbW9zdCB2aXNpYmxlIGFuZCBub3Rld29ydGh5IGFkZGl0aW9uCmlzIHRoZSBhYmlsaXR5IHRvIHJ1biBBcGFjaGUgaW4gYSBoeWJyaWQgdGhyZWFkL3Byb2Nlc3MgbW9kZSBvbiBhbnkKcGxhdGZvcm0gdGhhdCBzdXBwb3J0cyBib3RoIHRocmVhZHMgYW5kIHByb2Nlc3Nlcy4gIFRoaXMgaGFzIHNob3duIHRvCmltcHJvdmUgdGhlIHNjYWxhYmlsaXR5IG9mIHRoZSBBcGFjaGUgSFRUUEQgc2VydmVyIHNpZ25pZmljYW50bHkgaW4Kb3VyIGVhcmx5IHRlc3RpbmcsIG9uIHNvbWUgdmVyc2lvbnMgb2YgVW5peC4gIFRoaXMgcmVsZWFzZSBhbHNvCmdyZWF0bHkgaW1wcm92ZXMgdGhlIHBlcmZvcm1hbmNlIGFuZCByb2J1c3RuZXNzIG9mIEFwYWNoZSBvbiB0aGUKTWljcm9zb2Z0IFdpbmRvd3MgT3BlcmF0aW5nIFN5c3RlbXMuICBMYXN0bHkgd2UgYXJlIHByb3VkIHRvIGFubm91bmNlCnN1cHBvcnQgZm9yIEJlT1MgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzZXJ2ZXIuCgpUaGUgbmV3ZXN0IGRldmVsb3BtZW50IGluIEFwYWNoZSAyLjAgaXMgdGhlIGFkZGl0aW9uIG9mIGlucHV0IGZpbHRlcmluZy4KVGhpcyBhbGxvd3MgbW9kdWxlcyB0byBmaWx0ZXIgZGF0YSBiZWZvcmUgdGhlIGNvcmUgc2VydmVyIHJlY2VpdmVzIGl0IGZyb20KdGhlIG5ldHdvcmsuICBUaGUgc2l4dGggYWxwaGEgaGFkIHN1cHBvcnQgZm9yIG91dHB1dCBmaWx0ZXJpbmcgb25seSwgdGhpcwphbHBoYSBhZGRzIGlucHV0IGZpbHRlcmluZyBhcyB3ZWxsLiAgVGhpcyBmZWF0dXJlIGlzIHN0aWxsIGluIGl0cyBpbmZhbmN5LCAKYW5kIGl0IGlzIGxpa2VseSB0byBjaGFuZ2UgYW5kIGV2b2x2ZSBpbiB0aGUgbmV4dCBmZXcgd2Vla3MuCgpBcGFjaGUgMi4wYTcgdW5kZXIgVU5JWCBoYXMgdW5kZXJnb25lIHNvbWUgdGVzdGluZywgYnV0IHRoZXJlIGFyZSBzb21lCmtub3duIGlzc3VlcyBpbiB0aGUgY3VycmVudCByZWxlYXNlIChoZXksIGl0IGlzIGFuICJhbHBoYSIgZm9yIGEKcmVhc29uISkuIEl0IGlzIGludGVuZGVkIGZvciBkZXZlbG9wZXJzIGFuZCBleHBlcmllbmNlZCBBcGFjaGUgSFRUUEQKYWRtaW5pc3RyYXRvcnMgdG8gcGxheSBhcm91bmQgd2l0aCBhbmQgd29yayBvbi4gSXQgaXMgbm90IGEgcHJvZHVjdGlvbgpyZWxlYXNlLiBJZiB5b3UgZG8gbm90IGZlZWwgY29tZm9ydGFibGUgY29tcGlsaW5nIGFuZCB3b3JraW5nIHdpdGgKY29kZSwgdGhlIEFwYWNoZSBHcm91cCBzdHJvbmdseSByZWNvbW1lbmRzIHRoYXQgeW91IHdhaXQgZm9yIGEgbW9yZQpzdGFibGUgYmV0YSByZWxlYXNlIGJlZm9yZSB5b3UgdHJ5IHRoaXMgdmVyc2lvbi4KCkFwYWNoZSAyLjBhNyB1bmRlciBXaW5kb3dzIGhhcyB1bmRlcmdvbmUgc29tZSB0ZXN0aW5nIGFzIHdlbGwuICBUaGVyZQphcmUga25vd24gaXNzdWVzIGluIHRoZSBjdXJyZW50IHJlbGVhc2Ugd2l0aCByZWdhcmRzIHRvIEFwYWNoZSBvbiB3aW5kb3dzCjk1IGFuZCA5OC4gIFdlIGFyZSB3b3JraW5nIHRocm91Z2ggdGhvc2UgcHJvYmxlbXMsIGFuZCBob3BlIHRvIGhhdmUgdGhlbQpmaXhlZCBmb3IgZnV0dXJlIHJlbGVhc2VzIG9mIHRoZSAyLjAgYWxwaGEuCgpUaGVyZSBhcmUgbmV3IHNuYXBzaG90cyBvZiB0aGUgQXBhY2hlIGh0dHBkIHNvdXJjZSBhdmFpbGFibGUgZXZlcnkgNgpob3VycyBmcm9tIGh0dHA6Ly9kZXYuYXBhY2hlLm9yZy9mcm9tLWN2cy9hcGFjaGUtMi4wLyAtIHBsZWFzZQpkb3dubG9hZCBhbmQgdGVzdCBpZiB5b3UgZmVlbCBicmF2ZS4gV2UgZG9uJ3QgZ3VhcmFudGVlIGFueXRoaW5nCmV4Y2VwdCB0aGF0IGl0IHdpbGwgdGFrZSB1cCBkaXNrIHNwYWNlLCBidXQgaWYgeW91IGhhdmUgdGhlIHRpbWUgYW5kCnNraWxscywgcGxlYXNlIGdpdmUgaXQgYSBzcGluIG9uIHlvdXIgcGxhdGZvcm1zLgoKQXBhY2hlIGhhcyBiZWVuIHRoZSBtb3N0IHBvcHVsYXIgd2ViIHNlcnZlciBvbiB0aGUgSW50ZXJuZXQgc2luY2UKQXByaWwgb2YgMTk5Ni4gVGhlIE1heSAyMDAwIFdXVyBzZXJ2ZXIgc2l0ZSBzdXJ2ZXkgYnkgTmV0Y3JhZnQgKHNlZToKaHR0cDovL3d3dy5uZXRjcmFmdC5jby51ay9TdXJ2ZXkvKSBmb3VuZCB0aGF0IG1vcmUgd2ViIHNlcnZlcnMgd2VyZQp1c2luZyBBcGFjaGUgdGhhbiBhbnkgb3RoZXIgc29mdHdhcmUgcnVubmluZyBvbiBtb3JlIHRoYW4gNjAlIG9mIHRoZQpJbnRlcm5ldCB3ZWIgc2VydmVycy4KCkZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgY2hlY2sgb3V0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9odHRwZC5odG1sCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMGE3CiAgKikgRml4IG1vZF9sb2dfY29uZmlnIHNvIHRoYXQgaXQgY29tcGlsZXMgY2xlYW5seSB3aXRoIEJVRkZFUkVEX0xPR1MKICAgICBbTWlrZSBBYmJvdHQgPG1qYUBzZ2kuY29tPl0KCiAgKikgUmVtb3ZlIGFwX3NlbmRfZmIuICBUaGlzIGlzIG5vIGxvbmdlciB1c2VkIGluIEFwYWNoZSwgYW5kIGl0IGRvZXNuJ3QKICAgICBtYWtlIG11Y2ggc2Vuc2UsIGJlY2F1c2UgQXBhY2hlIHVzZXMgYnVja2V0cyBpbnN0ZWFkIG9mIEJVRkZzIG5vdy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgc2VuZF90aGVfZmlsZSBub3cgZmFsbHMgYmFjayB0byBhIHJlYWQvd3JpdGUgbG9vcCBvbiBwbGF0Zm9ybXMgdGhhdAogICAgIGRvIG5vdCBoYXZlIHNlbmRmaWxlLgogICAgIFtSeWFuIEJsb29tIGFuZCBCcmlhbiBIYXZhcmRdCgogICopIEluc3RhbGwgYXBhY2hlY3RsIGNvcnJlY3RseSwgYW5kIHN1YnN0aXR1dGUgdGhlIHByb3BlciB2YWx1ZXMgc28KICAgICB0aGF0IGl0IHdvcmtzIGFnYWluLiAgW1J5YW4gQmxvb21dCgogICopIEJldHRlcig/PykgaGFuZGxlIHBsYXRmb3JtcyB0aGF0IGxhY2sgc2VuZGZpbGUoKS4KICAgICBbSmltIEphZ2llbHNraV0KCiAgKikgQVBSIG5vdyBoYXMgVVVJRCBnZW5lcmF0aW9uL2Zvcm1hdHRpbmcvcGFyc2luZyBzdXBwb3J0LgogICAgIFtHcmVnIFN0ZWluXQoKICAqKSBCZWdpbiB0aGUgaHR0cF9maWx0ZXIuICBUaGlzIGlzIGFuIGlucHV0IGZpbHRlciB0aGF0IHVuZGVyc3RhbmRzCiAgICAgdGhlIGFic29sdXRlIGJhc2ljIGFtb3VudCByZXF1aXJlZCB0byBwYXJzZSBhbiBIVFRQIFJlcXVlc3QuICBUaGUKICAgICBnb2FsIGlzIHRvIGJlIGFibGUgdG8gc3BsaXQgaGVhZGVycyBmcm9tIHJlcXVlc3QgYm9keSBiZWZvcmUgcGFzc2luZwogICAgIHRoZSBkYXRhIGJhY2sgdG8gdGhlIG90aGVyIGZpbHRlcnMuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEJyaW5nIGZvcndhcmQgZnJvbSAxLjMuMTMgdGhlIGNvbmZpZyBkaXJlY3RvcnkgaW1wbGVtZW50YXRpb24KICAgICBbSmltIEphZ2llbHNraV0KCiAgKikgaW5zdGFsbCBhcHhzIGlmIGl0IGlzIGNyZWF0ZWQKICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQWRkZWQgQVBSX0lTX1NUQVRVU19jb25kaXRpb24gdGVzdCBtYWNyb3MgdG8gZWxpbWluYXRlIGNhbm9uaWNhbCBlcnJvcgogICAgIGNvbnZlcnNpb25zLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgTm93IHRoYXQgd2UgaGF2ZSBhcF9hZGRfaW5wdXRfZmlsdGVyKCksIHJlbmFtZSBhcF9hZGRfZmlsdGVyKCkgdG8gCiAgICAgYXBfYWRkX291dHB1dF9maWx0ZXIoKS4gIFtKZWZmIFRyYXdpY2tdCgogICopIE11bHRpcGxlIGJ1aWxkIGFuZCBjb25maWd1cmF0aW9uIGZpeGVzCiAgICBCdWlsZCBwcm9jZXNzOgoKICAgICAgLWFkZCBkYXRhZGlyIGFuZCBsb2NhbHN0YXRlZGlyIHN1YnN0aXR1dGlvbnMKICAgICAgLWZpeCBsYXlvdXQgbmFtZQogICAgICAtZml4IGxvZ2ZpbGVuYW1lIG1pc3NwZWxsaW5nCiAgICAgIC1maXggZXZhbHVhdGlvbiBvZiBpbnN0YWxsYXRpb24gZGlyIHZhcmlhYmxlcyBhbmQKICAgICAgLXJlcGxhY2UgJGZvb2JhciBieSAkKGZvb2JhcikgdG8gYmUgdXNlZnVsbCBpbiB0aGUgbWFrZWZpbGUKICAgIAogICAgQ3Jvc3MgY29tcGlsZToKICAgIAogICAgICAtYWRkIHJ1bGVzIGZvciBjcm9zcy1jb21waWxpbmcgaW4gcnVsZXMubWsuIE9rYXksIHJ1bGUgdG8gY2hlY2sgZm9yCiAgICAgICAkQ0NfRk9SX0JVSUxEIGlzIHN0aWxsIG1pc3NpbmcKICAgICAgLXVzZSBDSEVDS19UT09MIGluc3RlYWQgb2YgQ0hFQ0tfUFJPRyBmb3IgcmFubGliCiAgICAgIC1hZGQgbWlzc2luZyAiQVI9QEFSQCIgdG8gc2V2ZXJhbHkgTWFrZWZpbGUuaW4ncwogICAgICAtY2FjaGUgcmVzdWx0IGZvciAic3RydWN0IHJsaW1pdCIKICAgICAgLWNvbXBpbGUgYWxsIGhlbHBlciBwcm9ncmFtcyB3aXRoIG5hdGl2ZSBhbmQgY3Jvc3MgY29tcGlsZXIKICAgICAgIGFuZCB1c2UgdGhlIG5hdGl2ZSB2ZXJzaW9uIHRvIGdlbmVyYXRlIGhlYWRlciBmaWxlCiAgICAgWyJS/GRpZ2VyIiBLdWhsbWFubiA8VGFkdUBnbXguZGU+XQoKICAqKSBQcmVwYXJlIG91ciBhdXRvY29uZiBzZXR1cCBmb3IgYXV0b2NvbmYgMi4xNGEgYW5kIGZvciBjcm9zcy0KICAgICBjb21waWxpbmcuCiAgICAgWyJS/GRpZ2VyIiBLdWhsbWFubiA8VGFkdUBnbXguZGU+XQoKICAqKSBGaXggYSBidWcgd2hlcmUgYSBjbGllbnQgd2hpY2ggb25seSBzZW5kcyBcbiB0byBkZWxpbWl0IGhlYWRlcgogICAgIGxpbmVzIChuZXRjYXQpIGdldHMgYSBzdHJhbmdlIGxvb2tpbmcgSFRUUF9OT1RfSU1QTEVNRU5URUQgCiAgICAgbWVzc2FnZS4gIFN0YXJ0IHdvcmtpbmcgb24gZWJjZGljIGNvLWV4aXN0YW5jZSB3aXRoIGlucHV0IAogICAgIGZpbHRlcmluZy4KICAgICBbV2lsbGlhbSBSb3dlLCBHcmVnIEFtZXNdCgogICopIElmIG1vZF9zbyBpcyBlbmFibGVkIGluIHRoZSBzZXJ2ZXIgYWx3YXlzIGNyZWF0ZSBsaWJleGVjLCBldmVuCiAgICAgaWYgdGhlcmUgYXJlIG5vIG1vZHVsZXMgaW5zdGFsbGVkIGluIHRoaXMgZGlyZWN0b3J5LiAgVGhpcyBpcyBhCiAgICAgcmVxdWlyZW1lbnQgZm9yIEFQWFMgdG8gd29yayBjb3JyZWN0bHkuCiAgICAgW1J5YW4gQmxvb21dCgogICopIENvbm5lY3Rpb24gb3JpZW50ZWQgb3V0cHV0IGZpbHRlcnMgYXJlIG5vdyBzdG9yZWQgaW4gdGhlIAogICAgIGNvbm5fcmVjIGluc3RlYWQgb2YgdGhlIHJlcXVlc3RfcmVjLiAgVGhpcyBhbGxvd3MgdXMgdG8gYWRkIHRoZQogICAgIG91dHB1dCBmaWx0ZXIgaW4gdGhlIHByZS1jb25uZWN0aW9uIHBoYXNlIGluc3RlYWQgb2YgdGhlCiAgICAgcG9zdF9yZWFkX3JlcXVlc3QgcGhhc2UsIHdoaWNoIGtlZXBzIHVzIGZyb20gdHJ5aW5nIHRvIHdyaXRlIGFuCiAgICAgZXJyb3IgcGFnZSBiZWZvcmUgd2UgaGF2ZSBhIGZpbHRlciB0byB3cml0ZSB0byB0aGUgbmV0d29yay4KICAgICBbUnlhbiBCbG9vbSwgSmVmZiBUcmF3aWNrLCBhbmQgR3JlZyBBbWVzXQoKICAqKSBDbGVhbmluZyB1cCBhbiBtbWFwIGJ1Y2tldCBubyBsb25nZXIgZGVsZXRlcyB0aGUgbW1hcC4gIEFuCiAgICAgbW1hcCBjYW4gYmUgdXNlZCBhY3Jvc3MgbXVsdGlwbGUgYnVja2V0cyAoZGVmYXVsdF9oYW5kbGVyIHdpdGgKICAgICBieXRlIHJhbmdlcywgbW9kX2ZpbGVfY2FjaGUsIG1vZF9tbWFwX3N0YXRpYyksIHNvIGNsZWFudXAgb2YKICAgICB0aGUgbW1hcCBpdHNlbGYgY2FuJ3QgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBidWNrZXQuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgQWRkIC5kbGwgY2FjaGluZyBkaXJlY3RpdmUgSVNBUElDYWNoZUZpbGUgdG8gbW9kX2lzYXBpLgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIFJhZGljYWwgc3VyZ2VyeSB0byBpbXByb3ZlIG1vZF9pc2FwaSBzdXBwb3J0IHVuZGVyIFdpbjMyLgogICAgIEluY2x1ZGVzIGEgbnVtYmVyIG9mIG5ld2VyIFNlcnZlclN1cHBvcnRGdW5jdGlvbiBjYWxscywgc3VwcG9ydAogICAgIGZvciBSZWFkQ2xpZW50IChpbiBvcmRlciB0byByZXRyaWV2ZSBQT1NUcyBncmVhdGVyIHRoYW4gNDhLQiksCiAgICAgYW5kIGdlbmVyYWwgYnVnIGZpeGVzIHRvIG1vcmUgcmVsaWFibHkgbG9hZCBJU0FQSSAuZGxsJ3MgYW5kCiAgICAgcHJldmVudCBsZWFraW5nIGhhbmRsZSByZXNvdXJjZXMuICBOb3RlOiBUaGVyZSBhcmUgc3RpbGwgCiAgICAgZGlzY3JlcGFuY2llcyBiZXR3ZWVuIElJUydzIGFuZCBBcGFjaGUncyBTZXJ2ZXJWYXJpYWJsZXMsIGFuZAogICAgIGFzeW5jIGNhbGxzIGFyZSBzdGlsbCBub3Qgc3VwcG9ydGVkLiAgQWRkaXRpb25hbCB3YXJuaW5ncyBhcmUKICAgICBsb2dnZWQgdG8gZmFjaWxpdGF0ZSBkZWJ1Z2dpbmcgb2YgdW5zdXBwb3J0ZWQgSVNBUEkgY2FsbHMuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQWRkIGlucHV0IGZpbHRlcmluZyB0byBBcGFjaGUuICBUaGUgYmFzaWMgaWRlYSBmb3IgdGhlIGlucHV0CiAgICAgZmlsdGVycyBpcyB0aGUgc2FtZSBhcyB0aGUgaWRlYXMgZm9yIG91dHB1dCBmaWx0ZXJzLiAgVGhlIGJpZ2dlc3QKICAgICBkaWZmZXJlbmNlIGlzIHRoYXQgaW5zdGVhZCBvZiBjYWxsaW5nIGFwX3Bhc3NfYnJpZ2FkZSwgYXBfZ2V0X2JyaWdhZGUKICAgICBzaG91bGQgYmUgY2FsbGVkLCBhbmQgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiBmb3IgdGhlIGZpbHRlciBpdHNlbGYgaXMKICAgICBkaWZmZXJlbnQuICBXaGVuIHdyaXRpbmcgYW4gb3V0cHV0IGZpbHRlciwgYSBicmlnYWRlIGlzIHBhc3NlZCBpbiwKICAgICBhbmQgZmlsdGVycyBvcGVyYXRlIGRpcmVjdGx5IG9uIHRoYXQgYnJpZ2FkZSwgd2hlbiBkb25lLCB0aGV5IGNhbGwKICAgICBhcF9wYXNzX2JyaWdhZGUuICBJbnB1dCBmaWx0ZXJzIGFyZSB0aGUgZXhhY3Qgb3Bwb3NpdGUuICBCZWNhdXNlIGlucHV0CiAgICAgaXMgbm90IGEgcHVzaCBvcGVyYXRpb24sIGZpbHRlcnMgZmlyc3QgY2FsbCBhcF9nZXRfYnJpZ2FkZS4gIFdoZW4gdGhpcwogICAgIGZ1bmN0aW9uIHJldHVybnMsIHRoZSBpbnB1dCBmaWx0ZXIgd2lsbCBiZSBsZWZ0IHdpdGggYSB2YWxpZCBicmlnYWRlLgogICAgIFRoZSBpbnB1dCBmaWx0ZXIgc2hvdWxkIHRoZW4gb3BlcmF0ZSBvbiB0aGUgYnJpZ2FkZSwgYW5kIHJldHVybi4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgRml4IGJ1aWxkaW5nIG9uIEJTRC9PUyB1c2luZyBpdHMgbmF0aXZlIG1ha2UuIFRoZSBidWlsZCBzeXN0ZW0KICAgICBmYWxscyBiYWNrIHRvIHRoZSBCU0QgLmluY2x1ZGUgZGlyZWN0aXZlIG9uIHRoYXQgaG9zdCBwbGF0Zm9ybS4KICAgICBbU2FzY2hhIFNjaHVtYW5uXQoKICAqKSBFeHBhbmQgZGJtbWFuYWdlIHRvIGFsbG93IC1kIC1tIC1zIC1wIG9wdGlvbnMgZm9yIENyeXB0LCBNRDUsCiAgICAgU0hBMSBhbmQgcGxhaW50ZXh0IHBhc3N3b3JkIGVuY29kaW5ncy4gIE1ha2UgZmVhdHVyZSB0ZXN0cyBhCiAgICAgYml0IG1vcmUgZmxleGlibGUuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBDaGFyc2V0IHRyYW5zbGF0aW9uOiBtb2RfY2hhcnNldF9saXRlIGhhbmRsZXMgb3V0cHV0IGNvbnRlbnQgCiAgICAgdHJhbnNsYXRpb24gaW4gYSBmaWx0ZXIuICBtb2RfY2hhcnNldF9saXRlIG5vIGxvbmdlciBpZ25vcmVzIAogICAgIHN1YnJlcXVlc3RzLiAgQSBidW5jaCBvZiBjcnVmdCByZWxhdGVkIHRvIEJVRkYncyBzdXBwb3J0IGZvcgogICAgIHRyYW5zbGF0aW5nIHJlc3BvbnNlIGJvZGllcyB3YXMgcmVtb3ZlZC4gIFtKZWZmIFRyYXdpY2tdCgogICopIE1vdmUgdGhlIGFkZGl0aW9uIG9mIHRoZSBDT1JFIGZpbHRlciB0byB0aGUgcG9zdF9yZWFkX3JlcXVlc3QKICAgICBob29rIGluIGh0dHBfY29yZS5jLiAgVGhpcyByZW1vdmVzIHRoZSBuZWVkIHRvIGFkZCB0aGUgZmlsdGVyIGluCiAgICAgbXVsdGlwbGUgcGxhY2VzIGFuZCBhbGxvd3MgZm9yIGFuIFNTTCBtb2R1bGUgdG8gYmUgYWRkZWQgbXVjaAogICAgIHNpbXBsZXIuIFtSeWFuIEJsb29tXQoKICAqKSBGaXggYSBzZWN1cml0eSBwcm9ibGVtIHRoYXQgYWZmZWN0cyBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zIG9mCiAgICAgbW9kX3Jld3JpdGUuIElmIHRoZSByZXN1bHQgb2YgYSBSZXdyaXRlUnVsZSBpcyBhIGZpbGVuYW1lIHRoYXQKICAgICBjb250YWlucyBleHBhbnNpb24gc3BlY2lmaWVycywgZXNwZWNpYWxseSByZWdleHAgYmFja3JlZmVyZW5jZXMKICAgICAkMC4uJDkgYW5kICUwLi4lOSwgdGhlbiBpdCBtYXkgYmUgcG9zc2libGUgZm9yIGFuIGF0dGFja2VyIHRvCiAgICAgYWNjZXNzIGFueSBmaWxlIG9uIHRoZSB3ZWIgc2VydmVyLiBbVG9ueSBGaW5jaF0KCiAgKikgRml4IGEgYnVnIHdoZXJlIGVycm9ycyB0aGF0IGFyZSBkZXRlY3RlZCBkdXJpbmcgZWFybHkgcmVxdWVzdCBwYXJzaW5nCiAgICAgZG9uJ3QgcHJvZHVjZSB2aXNpYmxlIEhUVFAgZXJyb3IgbWVzc2FnZXMgYXQgdGhlIGJyb3dzZXIsIGJlY2F1c2UKICAgICB0aGUgY29yZV9maWx0ZXIgd2Fzbid0IHByZXNlbnQuICBbR3JlZyBBbWVzXQoKICAqKSBQcm92aWRlIGFwcl9zb2NrbGVuX3QgYXMgYSBwb3J0YWJpbGl0eSBhaWQuIAogICAgIFtWaWN0b3IgIEouIE9ybGlrb3dza2ldCgogICopIE92ZXJoYXVsIG9mIGRibW1hbmFnZSB0byBhbGxvdyBhIGdyb3VwcyBhcmcgKGFzIGluIEFwYWNoZSAxLjIpCiAgICAgYXMgd2VsbCBhcyBhIGNvbW1lbnQgYXJnIHRvIHRoZSBhZGQsIGFkZHVzZXIgYW5kIHVwZGF0ZSBjbWRzLgogICAgIHVwZGF0ZSBhbGxvd3MgdGhlIHVzZXIgdG8gY2xlYXIgb3IgcHJlc2VydmUgcHcvZ3JvdXBzL2NvbW1lbnQuCiAgICAgRml4ZWQgYSBidWcgaW4gZGJtbWFuYWdlIHRoYXQgcHJldmVudGVkIHRoZSBjaGVjayBvcHRpb24gZnJvbSAKICAgICBwYXJzaW5nIGEgcGFzc3dvcmQgZm9sbG93ZWQgYnkgOmdyb3VwLi4uIHRleHQuICBDb3JyZWN0ZWQgdGhlCiAgICAgc2VlZCBjYWxjdWFsYXRpb24gZm9yIFdpbjMyIHN5c3RlbXMsIGFuZCBhZGRlZCAtbHNkYm0gc3VwcG9ydC4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBDb25maWd1cmVkIG1vZF9hdXRoX2RibSB0byBjb21waWxlIHdpdGggc2RibWxpYiB1bmRlciBXaW4zMi4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBBdm9pZCBhIHNlZ2ZhdWx0IHdoZW4gcGFyc2luZyAuaHRhY2Nlc3MgZmlsZXMuICBBbiAKICAgICB1bmluaXRpYWxpemVkIHRyZWUgcG9pbnRlciB3YXMgcGFzc2VkIHRvIGFwX2J1aWxkX2NvbmZpZygpLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIENoYW5nZSB0aGUgd2F5IHRoYXQgaW5ldF9hZGRyICYgaW5ldF9uZXR3b3JrIGFyZSBjaGVja2VkIGZvcgogICAgIGluIEFQUidzIGNvbmZpZ3VyZSBwcm9jZXNzIHRvIGFsbG93IEJlT1MgQk9ORSB0byBjb3JyZWN0bHkKICAgICBmaW5kIHRoZW0uIFdpdGggdGhpcyBjaGFuZ2UgQmVPUyBCT05FIG5vdyBidWlsZHMgZnJvbSBzb3VyY2UKICAgICB3aXRoIG5vIHByb2JsZW1zLiAgW0RhdmlkIFJlaWRdCgogICopIEZpeCBhIGJ1ZyBpbiBhcHJfY3JlYXRlX3Byb2Nlc3MoKSBmb3IgVW5peC4gIFRoZSBOVUxMIHNpZ25pZnlpbmcKICAgICB0aGUgZW5kIG9mIHRoZSBwYXJhbWV0ZXJzIHRvIGV4ZWN2ZSgpIHdhcyBzdG9yZWQgaW4gdGhlIHdyb25nCiAgICAgbG9jYXRpb24sIG92ZXJsYXlpbmcgdGhlIHN0b3JhZ2UgYmV5b25kIHRoZSBuZXdhcmdzW10gYXJyYXkgYW5kIAogICAgIGFsc28gcGFzc2luZyB1bmluaXRpYWxpemVkIHN0b3JhZ2UgdG8gZXhlY3ZlKCksIHdoaWNoIHdvdWxkIAogICAgIHNvbWV0aW1lcyBmYWlsIHdpdGggRUZBVUxULiAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IGEgYnVnIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmaWxlIGNvbnRhaW5lcnMuICBXaXRoIGEgc2VxdWVuY2UKICAgICBsaWtlIHRoaXMgaW4gdGhlIGNvbmZpZyBmaWxlCgogICAgICAgPElmTW9kdWxlIG1vZF9raWxyb3kuYz4KICAgICAgIGFueSBzdHVmZgogICAgICAgPC9JZk1vZHVsZT4KICAgICAgIDxJZk1vZHVsZSBtb2RfbG92ZWpveS5jPgogICAgICAgKGJsYW5rIGxpbmUpCiAgICAgICBhbnkgc3R1ZmYKICAgICAgIDwvSWZNb2R1bGU+CgogICAgIHRoZSBzZWNvbmQgY29udGFpbmVyIHdvdWxkIGJlIHRlcm1pbmF0ZWQgYXQgdGhlIGJsYW5rIGxpbmUgZHVlIHRvCiAgICAgc2VkaW1lbnQgaW4gdGhlIGJ1ZmZlciBmcm9tIHJlYWRpbmcgdGhlIHByaW9yIDwvSWZNb2R1bGU+IGFuZCBhbiAKICAgICBlcnJvciBtZXNzYWdlIHdvdWxkIGJlIGdlbmVyYXRlZCBmb3IgdGhlIHJlYWwgPC9JZk1vZHVsZT4gZm9yIHRoZQogICAgIHNlY29uZCBjb250YWluZXIuICBBbHNvIGR1ZSB0byB0aGlzIHByb2JsZW0sIGFueSB0d28gY2hhcmFjdGVycyAKICAgICBjb3VsZCBiZSB1c2VkIGZvciAiPC8iIGluIHRoZSBjbG9zZSBvZiBhIGNvbnRhaW5lci4gIAogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIGFwX2FkZF9maWx0ZXIgcHJvdG90eXBlIGNoYW5nZWQgdG8gcmVtb3ZlIHRoZSBjdHggcG9pbnRlci4gIFRoZQogICAgIHBvaW50ZXIgc3RpbGwgcmVtYWlucyBpbiB0aGUgZmlsdGVyIHN0cnVjdHVyZSwgYnV0IGl0IGNhbiBub3QgYmUKICAgICBhIHBhcnQgb2YgdGhlIGFwX2FkZF9maWx0ZXIgcHJvdG90eXBlLiAgVGhlIHJlYXNvbiBpcyB0aGF0IHdoZW4KICAgICB0aGUgY29yZSB1c2VzIEFkZEZpbHRlciB0byBhZGQgYSBmaWx0ZXIgdG8gdGhlIHN0YWNrIGl0IGRvZXNuJ3QKICAgICBrbm93IGhvdyB0byBhbGxvY2F0ZSB0aGUgY3R4IHBvaW50ZXIsIG9yIGV2ZW4gaG93IG11Y2ggbWVtb3J5IHNob3VsZAogICAgIGJlIGFsbG9jYXRlZC4gIFRoZSBmaWx0ZXJzIHdpbGwgaGF2ZSB0byBiZSByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZwogICAgIHRoZSBjdHggbWVtb3J5IHdoZW4gdGhleSBuZWVkIGl0LgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBZGQgYW4gQWRkRmlsdGVyIGRpcmVjdGl2ZS4gIFRoaXMgZGlyZWN0aXZlIHRha2VzIGEgbGlzdCBvZiBmaWx0ZXJzCiAgICAgdGhhdCBzaG91bGQgYmUgYWN0aXZhdGVkIGZvciB0aGUgcmVxdWVzdGVkIHJlc291cmNlLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBhcHJfc25wcmludGYoKTogR2V0IHF1YWQgZm9ybWF0IHN0cmluZ3Mgd29ya2luZyBvbiBPUy8zOTAgKGFuZCBwZXJoYXBzCiAgICAgc29tZSBvdGhlciBwbGF0Zm9ybXMpLiAgW0plZmYgVHJhd2lja10KCiAgKikgTW9kaWZ5IG1vZF9pbmNsdWRlIHRvIGJlIGEgZmlsdGVyLiAgQ3VycmVudGx5LCBpdCBoYXMgb25seSBiZWVuIHRlc3RlZAogICAgIG9uIGFjdHVhbCBmaWxlcywgYnV0IGl0IHNob3VsZCB3b3JrIGZvciBDR0kgc2NyaXB0cyB0b28uCiAgICAgW1J5YW4gQmxvb21dCgogICopIGFwcl9wdXRjKCksIGFwcl9wdXRzKCkgZm9yIFVuaXg6IGhhbmRsZSBidWZmZXJlZCBmaWxlcyBhbmQgaW50ZXJydXB0ZWQKICAgICB3cml0ZXMuICBhcHJfZmx1c2goKSBmb3IgVW5peDogaGFuZGxlIGludGVycnVwdGVkIHdyaXRlcy4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBOYW1lVmlydHVhbEhvc3QgY2FuIG5vdyB0YWtlICIqIiBhcyBhbiBhcmd1bWVudCBpbnN0ZWFkIG9mCiAgICAgYW4gSVAgYWRkcmVzcy4gVGhpcyBhbGxvd3MgeW91IHRvIGNyZWF0ZSBhIHB1cmVseSBuYW1lLWJhc2VkCiAgICAgdmlydHVhbCBob3N0aW5nIHNlcnZlciB0aGF0IGRvZXMgbm90IGhhdmUgYW55IElQIGFkZHJlc3NlcyBpbgogICAgIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgYW5kIHdoaWNoIGlnbm9yZXMgdGhlIGxvY2FsIGFkZHJlc3MKICAgICBvZiBhbnkgY29ubmVjdGlvbnMuIFBSICM1NTk1LCBQUiAjNDQ1NSBbVG9ueSBGaW5jaF0KCiAgKikgRml4IHNvbWUgY29tcGlsZSB3YXJuaW5ncyBpbiBtb2RfbW1hcF9zdGF0aWMuYwogICAgIFtNaWtlIEFiYm90dCA8bWphQHNnaS5jb20+XQoKICAqKSBGaXggY2h1bmtpbmcgcHJvYmxlbSB3aXRoIENHSSBzY3JpcHRzLiAgVGhlIGdlbmVyYWwgcHJvYmxlbSB3YXMgdGhhdAogICAgIHRoZSBDR0kgbW9kdWxlcyB3ZXJlIGFkZGluZyBhbiBFT1MgYnVja2V0IGFuZCB0aGVuIHRoZSBjb3JlIGFkZGVkIGFuCiAgICAgRU9TIGJ1Y2tldC4gIFRoZSBjaHVua2luZyBmaWx0ZXIgZmluYWxpemVzIHRoZSBjaHVua2VkIHJlc3BvbnNlIHdoZW4gaXQKICAgICBlbmNvdW50ZXJzIGFuIEVPUyBidWNrZXQuICBCZWNhdXNlIHR3byBFT1MgYnVja2V0cyB3ZXJlIHNlbnQsIHdlCiAgICAgZmluYWxpemVkIHRoZSByZXNwb25zZSB0d2ljZS4gIFRoZSBmaXggaXMgdG8gbWFrZSBzdXJlIHdlIG9ubHkgc2VuZCBvbmUKICAgICBFT1MsIGJ5IHV0aWxpemluZyBhIGZsYWcgaW4gdGhlIHJlcXVlc3RfcmVjLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBhcHJfcHV0X29zX2ZpbGUoKSBub3cgc2V0cyB1cCB0aGUgdW5nZXQgYnl0ZSBhcHByb3ByaWF0ZWx5IG9uIFVuaXgKICAgICBhbmQgV2luMzIuICBQcmV2aW91c2x5LCB0aGUgZmlyc3QgcmVhZCBmcm9tIGFuIGFwcl9maWxlX3Qgc2V0IHVwIHZpYQogICAgIGFwcl9wdXRfb3NfZmlsZSgpIHdvdWxkIHJldHVybiBhICdcMCcuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBNb2RfY2dpZCBub3cgY3JlYXRlcyBhIHNpbmdsZSBlbGVtZW50IGJ1Y2tldCBicmlnYWRlLCB3aXRoIGEgcGlwZQogICAgIGJ1Y2tldCwgaW5zdGVhZCBvZiB1c2luZyBCVUZGJ3MgYW5kIGFwX3IqLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBUFJWQVJTLmluIG5vIGxvbmdlciBvdmVyd3JpdGVzIHRoZSBFWFRSQV9MSUJTIHZhcmlhYmxlLgogICAgIFtNaWtlIEFiYm90dCA8bWphQHNnaS5jb20+XQoKICAqKSBSZW1vdmUgYXBfYm9wZW5mIGZyb20gYnVmZiBjb2RlLiAgVGhpcyByZXF1aXJlZCBtb2RpZnlpbmcgdGhlIGZpbGVfY2FjaGUKICAgICBjb2RlIHRvIHVzZSBBUFIgZmlsZSdzIGRpcmVjdGx5IGluc3RlYWQgb2YgZ29pbmcgdGhyb3VnaCBCVUZGcy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgRml4IGNvbXBpbGUgYnJlYWsgb24gc29tZSBwbGF0Zm9ybXMgZm9yIG1vZF9taW1lX21hZ2ljLmMKICAgICBbSm9obiBLLiBTdGVybGluZyA8c3RlcmxpbmdAY292YWxlbnQubmV0Pl0KCiAgKikgRml4IG1lcmdpbmcgb2YgQWRkRGVmYXVsdENoYXJzZXQgZGlyZWN0aXZlLgogICAgIFBSICM1ODcyICgxLjMpIFtKdW4gS3VyaXlhbWEgPGt1cml5YW1hQGltZ3NyYy5jby5qcD5dCgogICopIE1pbm9yIHJldmFtcCBvZiB0aGUgcmxpbWl0IHNlY3Rpb25zIG9mIGNvZGUuIFdlIG5vdyB0ZXN0CiAgICAgZXhwbGljaXRseSBmb3Igc2V0cmxpbWl0IGFuZCBnZXRybGltaXQuIEFsc28sIHVuaXhkX3NldF9ybGltaXQoKQogICAgIGlzIG5vdyAiYXZhaWxhYmxlIiBldmVuIGlmIHRoZSBwbGF0Zm9ybSBkb2Vzbid0IHN1cHBvcnQKICAgICB0aGUgcmxpbWl0IGZhbWlseSAoaXQncyBqdXN0IGEgbm9vcCB0aG91Z2gpLiBbSmltIEphZ2llbHNraV0KCiAgKikgTWlncmF0ZSB0aGUgcHJlLXNlbGVjdGlvbiBvZiB3aGljaCBNUE0gdG8gdXNlIGZvciBzcGVjaWZpYwogICAgIHBsYXRmb3JtcyB0byBoaW50cy5tNCwgd2hpY2ggY29udGFpbnMgKG9yIHNob3VsZCBjb250YWluKQogICAgIGFsbCBwbGF0Zm9ybSBzcGVjaWZpYyAiaGludHMiLiBbSmltIEphZ2llbHNraV0KCiAgKikgUmVtb3ZlIElPTHMgZnJvbSBBcGFjaGUuICBXaXRoIGZpbHRlcmluZywgSU9McyBhcmUgbm8gbG9uZ2VyIG5lY2Vzc2FyeQogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBZGQgdGFibGVzIHdpdGggbm9uLXN0cmluZy9iaW5hcnkgdmFsdWVzIHRvIEFQUi4KICAgICBbS2VuIENvYXJdCgogICopIEZpeCBzb21lIGJhZCBjYWxscyB0byBhcF9sb2dfcmVycm9yKCkgaW4gbW9kX3Jld3JpdGUuIAogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIFVwZGF0ZSBQQ1JFIHRvIHZlcnNpb24gMy4yLiAgW1J5YW4gQmxvb21dCgogICopIENoYW5nZSB0aGUgd2F5IGJ1Y2tldHMnIGRlc3Ryb3kgZnVuY3Rpb25zIGFyZSBjYWxsZWQgc28gdGhhdAogICAgIHRoZXkgY2FuIGJlIG1vcmUgZGlyZWN0bHkgdXNlZCB3aGVuIGNoYW5naW5nIHRoZSB0eXBlIG9mIGEKICAgICBidWNrZXQgaW4gcGxhY2UuIFtUb255IEZpbmNoXQoKICAqKSBBZGQgZ2VuZXJpYyBzdXBwb3J0IGZvciByZWZlcmVuY2UtY291bnRpbmcgdGhlIHJlc291cmNlcyB1c2VkIGJ5CiAgICAgYnVja2V0cywgYW5kIGFsdGVyIHRoZSBIRUFQIGFuZCBNTUFQIGJ1Y2tldHMgdG8gdXNlIGl0LiBDaGFuZ2UKICAgICB0aGUgd2F5IGJ1Y2tldHMgYXJlIGluaXRpYWxpc2VkIHRvIHN1cHBvcnQgY2hhbmdpbmcgdGhlIHR5cGUgb2YKICAgICBidWNrZXRzIGluIHBsYWNlLCBhbmQgdXNlIGl0IHdoZW4gc2V0dGluZyBhc2lkZSBUUkFOU0lFTlQgYnVja2V0cy4KICAgICBDaGFuZ2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIFRSQU5TSUVOVCBidWNrZXRzIHNvIHRoYXQgaXQgY2FuIGJlCiAgICAgbW9zdGx5IHNoYXJlZCB3aXRoIElNTU9SVEFMIGJ1Y2tldHMsIHdoaWNoIGFyZSBub3cgaW1wbGVtZW50ZWQuCiAgICAgW1RvbnkgRmluY2hdCg==