VGhpcyBpcyBteSBjb3B5IG9mIHNvbWUgaW5mb3JtYXRpb24gSSB3cm90ZSBmb3IgbW9kX3RjbCBmb3IgQXBhY2hlIDIuMCBmcm9tOiBXcm94IFByZXNzLiBJU0JOIDEtODYxMDA3LTIyLTEgQXBjaGUgMi4wLiAgSWYgeW91IHdhbnQgaXQgcHJldHR5IHByaW50ZWQgZ2V0IHRoZSBib29rLiAoTUtMKQoKVGhpbmdzIHRoYXQgYXJlIGRpZmZlcmVudCBzaW5jZSB0aGlzIHdhcyB3cml0dGVuLgoKMS4gc3VwcG9ydHMgQXBhY2hlIDIuMC40MAoyLiBmaXJzdCByZWxlYXNlIG9mIG1vZF90Y2wgMS4wLCBJJ3ZlIGJlZW4gcnVubmluZyB0aGlzIGZvciBtb250aHMgc3RhYmxlIG5vIGVycm9ycyBpbiBlcnJvcl9sb2cuCiAgIEkgZG9uJ3QgdGhpbmsgYWxsIG9mIHRoZSBmdW5jdGlvbmFsaXR5IGlzIGNvbXBsZXRlIGJ1dCBpdCdzIGRlY2VudGx5IGJyb2FkLiAgU29tZSB0aGluZ3MgYXJlCiAgIG1pc3NpbmcgbGlrZSB0aGUgYm91bmRhcnkgaW4gdGhlIHJlcXVlc3RfcmVjLCBiZWNhdXNlIGl0IGRvZXNuJ3QgZXhpc3QgaW4gQXBhY2hlIGFueW1vcmUuLi4KMy4gSSByZWNvbW1lbmQgdXNpbmcgVGNsIDguNCBzaW5jZSBpdCBzdXBwb3J0cyBXaWRlSW50ICg2NC1iaXQpIGludGVnZXJzLgo0LiBSdW5zIG9uIFNvbGFyaXMgOSBzcGFyY3Y5IEFCSSB3aGljaCBpcyB0aGUgNjQtYml0IEFCSSwgSSBhc3N1bWUgaXQgd2lsbCBydW4gb24gb3RoZXJzIGFzIHdlbGwuCiAgICh1c2VkIGdjYyAzLjEuMSB3aXRoIC1tNjQpCjUuIFlvdSBjYW4gdXNlIC0td2l0aC10Y2xkaXI9cGF0aF90b190Y2xDb25maWcuc2ggaW4gLi9jb25maWd1cmUKNi4gLi9jb25maWd1cmUgYWxzbyBhZGRzIC1SPHRjbF9saWJyYXJ5X3BhdGg+IHRvIGxpbmtlciBwaGFzZS4gIEp1c3QgaW4gY2FzZSB5b3UgZG9uJ3QgaGF2ZQogICAvdXNyL2xvY2FsL2xpYiBzZXR1cCBhcyBkZWZhdWx0LgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpNb2RfdGNsIGluY29ycG9yYXRlcyBhIFRjbCBpbnRlcnByZXRlciBpbnRvIHRoZSBBcGFjaGUgd2ViIHNlcnZlci4gIFRoaXMgd2lsbCBhbGxvdyBBcGFjaGUgdG8gcnVuIFRjbCBzY3JpcHRzIG5hdGl2ZWx5IHdpdGhvdXQgaGF2aW5nIHRvIHJlbG9hZCBhIFRjbCBpbnRlcnByZXRlciBldmVyeSB0aW1lIHRoZSBzY3JpcHQgaXMgcnVuLiAgVGhlIFRjbCBzY3JpcHRzIGFyZSBjYWNoZWQgaW4gdGhlIFRjbCBpbnRlcnByZXRlciB1bnRpbCB0aGUgc2NyaXB0IGZpbGUgbW9kaWZpY2F0aW9uIHRpbWUgY2hhbmdlcyBvciBBcGFjaGUgaXMgcmVzdGFydGVkLiAgVGhpcyBhbGxvd3MgVGNsIHNjcmlwdHMgdXNpbmcgbW9kX3RjbCBpbiBBcGFjaGUgdG8gZXhlY3V0ZSBtdWNoIGZhc3RlciB0aGFuIHRyYWRpdGlvbmFsIENHSSBzY3JpcHRzIHdoaWNoIG11c3QgaW5pdGlhbGl6ZSBhbiBpbnRlcnByZXRlciBldmVyeSB0aW1lIGEgc2NyaXB0IGlzIGV4ZWN1dGVkLiAgQWRkaXRpb25hbGx5IG1vZF90Y2wgZXhwb3J0cyB0aGUgQXBhY2hlIEFQSSB3aGljaCBhbGxvd3MgYSBwcm9ncmFtbWVyIHRvIGhhdmUgY29tcGxldGUgY29udHJvbCBvdmVyIGh0dHAgcmVxdWVzdHMgdGhhdCBDR0kgc2NyaXB0cyBjYW4gbm90IHByb3ZpZGUuCgpNb2RfdGNsIGlzIGFuIEFwYWNoZSBtb2R1bGUgaW4gaXRzIG93biByaWdodCwgYnV0IGl0IGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBnYXRld2F5IGZvciB3cml0aW5nIEFwYWNoZSBtb2R1bGVzIGluIFRjbCB2ZXJzdXMgQy4gIEV4aXN0aW5nIFRjbCBwYWNrYWdlcyB3aGV0aGVyIHdyaXR0ZW4gaW4gQyBvciBUY2wgY2FuIGJlIGVhc2lseSBpbnRlZ3JhdGVkIGludG8gbW9kX3RjbCBzY3JpcHRzLiAgVGhpcyBhbGxvd3MgYSBsYXJnZSBjb2xsZWN0aW9uIG9mIGV4aXN0aW5nIFRjbCBwYWNrYWdlcyB0byBiZSB1c2VkIHdpdGhvdXQgaGF2aW5nIHRvIHJld3JpdGUgZnVuY3Rpb25hbGl0eSBvciBpbmN1ciBhIHBlcmZvcm1hbmNlIGhpdCBieSB1c2luZyBhbiBhbHRlcm5hdGl2ZSBleGVjdXRpb24gbW9kZWwgbGlrZSBDR0kuCgpNb2RfdGNsIGlzIGRlc2lnbmVkIHRvIGJlIHBvd2VyZnVsLCBsaWdodHdlaWdodCwgYW5kIGZhc3QuICBUaGUgYWRkaXRpb25hbCBvdmVyaGVhZCBmcm9tIHRoZSBUY2wgaW50ZXJwcmV0ZXIgd2lsbCBiZSBuZWdsaWdpYmxlIHdoZW4gY29uc2lkZXJpbmcgdGhlIGZsZXhpYmlsaXR5IGFuZCBzcGVlZCBhY2hpZXZlZC4gIEluIGFkZGl0aW9uIHRoZXJlIGlzIG5vIGZsdWZmIGludm9sdmVkIHdpdGggbW9kX3RjbCwgb25seSB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBBcGFjaGUgQVBJIGFuZCBUY2wgaW50ZXJwcmV0ZXIgaXMgcHJvdmlkZWQuICBUaGUgcHJvZ3JhbW1lciBpcyBnaXZlbiB0aGUgY2hvaWNlIG9mIHdoYXQgcGFja2FnZXMgbWF5IGJlIG5lY2Vzc2FyeSBmb3IgZWFjaCBzY3JpcHQsIGZvciBleGFtcGxlIGEgcGFja2FnZSBtYXkgYmUgcmVxdWlyZWQgZm9yIGNvbW11bmljYXRpb24gd2l0aCBhIGRhdGFiYXNlLiAgVGhpcyBwcm92aWRlcyBsZXNzIHJlc291cmNlIHBvbGx1dGlvbiwgZGVwZW5kZW5jeSBvbiBhZGRpdGlvbmFsIHJlcXVpcmVkIHBhY2thZ2VzLCBhbmQgYmV0dGVyIGVmZmljaWVuY3kgaW4gdGhlIGh0dHAgcmVxdWVzdCBwcm9jZXNzLgoKQnVpbGRpbmcgYW5kIEluc3RhbGxpbmcgQXBhY2hlIHdpdGggbW9kX3RjbAoKTW9kX3RjbCBpcyBjb25maWd1cmVkIHVzaW5nIHRoZSBBcGFjaGUgMi4wIGNvbmZpZ3VyYXRpb24gc3lzdGVtLiAgTm9ybWFsbHkgYSB2YW5pbGxhIGluc3RhbGwgb2YgQXBhY2hlIGRvZXNu1XQgcmVxdWlyZSBhIHJlYnVpbGQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gc3lzdGVtLCBidXQgc2luY2UgbW9kX3RjbCByZXF1aXJlcyBsaWJyYXJpZXMgbm90IHVzdWFsbHkgYnVpbHQgaW50byBBcGFjaGUgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlYnVpbGQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdXNpbmcgR05VIGF1dG9jb25mLiAgVGhlIEdOVSBhdXRvY29uZiB0b29scyBtYXkgYWxyZWFkeSBiZSBpbnN0YWxsZWQgb24geW91ciBzeXN0ZW0gYW5kIGEgY2hlY2sgc2hvdWxkIGJlIHBlcmZvcm1lZCB0byBjb25maXJtIHRoaXMgdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmVpbnN0YWxsYXRpb24uICBJZiB0aGUgR05VIGF1dG9jb25mIHRvb2xzIGFyZSBub3QgaW5zdGFsbGVkIHRoZW4gdGhleSBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIGEgR05VIGRpc3RyaWJ1dGlvbiBzaXRlLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBjaGVjayB0aGUgR05VIGF1dG9jb25mIHdlYnNpdGUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLy4gIFBsZWFzZSBub3RlIHRoYXQgR05VIGF1dG9jb25mIGFsc28gcmVxdWlyZXMgYSByZWNlbnQgcmVsZWFzZSBvZiBhbiBtNCBtYWNybyBwcm9jZXNzb3IuICBUaGUgbmV4dCBzdGVwIGlzIHRvIGRvd25sb2FkIHRoZSBtb2RfdGNsIHNvdXJjZSBmcm9tIHRoZSBBcGFjaGUgVGNsIHByb2plY3Qgd2ViIHNpdGUgYXQgaHR0cDovL3RjbC5hcGFjaGUub3JnIG9yIGZyb20gYW5vbnltb3VzIENWUy4gIFRoZSBmb2xsb3dpbmcgQ1ZTIGNvbW1hbmRzIHdpbGwgY2hlY2tvdXQgdGhlIG1vZF90Y2wgc291cmNlIGZyb20gY3ZzLmFwYWNoZS5vcmcsIG5vIHNhbmRib3ggaXMgcmVxdWlyZWQgYXMgdGhpcyB3aWxsIGRvd25sb2FkIGFsbCB0aGUgc291cmNlIHRvIHRoZSB0Y2wtbW9kdGNsIGRpcmVjdG9yeS4gIFRoZSBDVlMgbG9naW4gcGFzc3dvcmQgaXMgYW5vbmN2cy4KCiQgY3ZzIC1kOnBzZXJ2ZXI6YW5vbmN2c0BjdnMuYXBhY2hlLm9yZzovaG9tZS9jdnNwdWJsaWMgbG9naW4KKExvZ2dpbmcgaW4gdG8gYW5vbmN2c0BjdnMuYXBhY2hlLm9yZykKQ1ZTIHBhc3N3b3JkOiA8ZW50ZXIgYW5vbmN2cz4KJCBjdnMgLWQ6cHNlcnZlcjphbm9uY3ZzQGN2cy5hcGFjaGUub3JnOi9ob21lL2N2c3B1YmxpYyBjaGVja291dCB0Y2wtbW9kdGNsCgpJZiBtb2RfdGNsIGlzIGRvd25sb2FkZWQgZnJvbSB0aGUgQXBhY2hlIFRjbCBwcm9qZWN0IHdlYiBzaXRlIHRoZW4gdGhlIHBhY2thZ2UgbXVzdCBiZSB1bi1hcmNoaXZlZCBhbmQgbW92ZWQgdG8gdGhlIEFwYWNoZSAyLjAgbW9kdWxlcyBkaXJlY3RvcnkuICBJZiBDVlMgaXMgdXNlZCB0aGUgZGlyZWN0b3J5IG11c3QgYmUgcmVuYW1lZCB0byBtb2RfdGNsIGZyb20gdGNsLW1vZHRjbCBhbmQgdGhlbiBtb3ZlZCB0byB0aGUgQXBhY2hlIDIuMCBtb2R1bGVzIGRpcmVjdG9yeS4gIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBtb2RfdGNsIHNvdXJjZSBtdXN0IGJlIG5hbWVkIG1vZF90Y2wgb3RoZXJ3aXNlIHRoZSBBcGFjaGUgY29uZmlndXJhdGlvbiBzeXN0ZW0gd2lsbCBub3QgcmVjb2duaXplIG1vZF90Y2wuICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgYXNzdW1lcyB0aGUgQXBhY2hlIDIuMCBzb3VyY2UgZGlzdHJpYnV0aW9uIGlzIGxvY2F0ZWQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdoZXJlIHRoZSBtb2RfdGNsIHNvdXJjZSB3YXMgYWNxdWlyZWQgdGhyb3VnaCBDVlMuCgokIG12IHRjbC1tb2R0Y2wgaHR0cGQtMi4wLjMyL21vZHVsZXMvbW9kX3RjbAoKTm93IHRoZSBBcGFjaGUgY29uZmlndXJhdGlvbiBzeXN0ZW0gaXMgcmVhZHkgdG8gYmUgcmVidWlsdCBhbmQgaW5jbHVkZSBtb2RfdGNsLiAgQ2hhbmdlIGRpcmVjdG9yeSB0byB0aGUgcm9vdCBsZXZlbCBvZiB0aGUgQXBhY2hlIDIuMCBzb3VyY2UgYW5kIHJlYnVpbGQgdGhlIGNvbmZpZ3VyYXRpb24gc3lzdGVtLgoKJCBjZCBodHRwZC0yLjAuMzIKJCBhdXRvY29uZgokIGF1dG9oZWFkZXIKClJ1bm5pbmcgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2l0aCB0aGUgaGVscCBmbGFnIHdpbGwgc2hvdyB0aGF0IG1vZF90Y2wgY29uZmlndXJhdGlvbiBtYWNyb3MgaGF2ZSBiZWVuIGFzc2ltaWxhdGVkIGludG8gdGhlIEFwYWNoZSBjb25maWd1cmF0aW9uIHN5c3RlbS4KCiQgLi9jb25maWd1cmUgLS1oZWxwCskKLS1kaXNhYmxlLXRjbCAgICAgICAgICAgZW1iZWRkZWQgdGNsIGludGVycHJldGVyCskKCm1vZF90Y2wgaXMgZW5hYmxlZCBieSBkZWZhdWx0IG9uY2UgdGhlIEFwYWNoZSBjb25maWd1cmF0aW9uIGhhcyBiZWVuIHJlYnVpbHQuICBJZiBpdCBpcyBuZWNlc3NhcnkgdG8gZGlzYWJsZSBtb2RfdGNsIHRoZW4gdGhpcyBtYXkgYmUgYWNjb21wbGlzaGVkIGZyb20gdGhlIC0tZGlzYWJsZS10Y2wgb3B0aW9uIHBhc3NlZCB0byB0aGUgY29uZmlndXJlIHNjcmlwdC4KClRoZSBuZXh0IHN0ZXAgaXMgdG8gY29uZmlndXJlIHRoZSBBcGFjaGUgYnVpbGQgcHJvY2VzcyBieSBydW5uaW5nIHRoZSBjb25maWd1cmUgc2NyaXB0LiAgRHVyaW5nIGNvbmZpZ3VyYXRpb24gd2Ugd2lsbCBzZWUgc3RhdHVzIG91dHB1dCwgdGhlIG1vZF90Y2wgY29uZmlndXJhdGlvbiBzdGF0dXMgb3V0cHV0IHdpbGwgbG9vayBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcuCgpjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtb2RfdGNsLi4uIHllcyAoZGVmYXVsdCkKY2hlY2tpbmcgZm9yIHRjbC5oLi4uIHllcwpjaGVja2luZyBmb3IgaW50dHlwZXMuaC4uLiB5ZXMKY2hlY2tpbmcgZm9yIGludF90eXBlcy5oLi4uIG5vCmNoZWNraW5nIGZvciBzeXMvbW1hbi5oLi4uIChjYWNoZWQpIHllcwpjaGVja2luZyBmb3IgYXNwcmludGYuLi4gbm8KY2hlY2tpbmcgZm9yIG1tYXAuLi4gKGNhY2hlZCkgeWVzCmNoZWNraW5nIGZvciB0Y2xDb25maWcuc2ggaW4gL3Vzci9sb2NhbC9saWIuLi4geWVzCmNoZWNraW5nIGZvciB0Y2wgdmVyc2lvbi4uLiA4LjMKCkl0IGlzIGltcG9ydGFudCB0byBtYWtlIHN1cmUgdGhhdCBjb25maWd1cmF0aW9uIGZvdW5kIHRoZSB0Y2wuaCBoZWFkZXIgZmlsZS4gIElmIHRoZSB0Y2wuaCBoZWFkZXIgZmlsZSB3YXMgbm90IGZvdW5kIGV4dHJhIGluY2x1ZGUgcGF0aHMgbWF5IGJlIHJlcXVpcmVkIHdoZW4gY29tcGlsaW5nIEFwYWNoZSAyLjAsIG9yIGEgVGNsIGRpc3RyaWJ1dGlvbiBtYXkgbm90IGJlIGluc3RhbGxlZC4gIElmIFRjbCBpcyBub3QgaW5zdGFsbGVkIHRoZSBUY2wgc29mdHdhcmUgY2FuIGJlIG9idGFpbmVkIGZyb20gaHR0cDovL3d3dy50Y2wudGsuICBDb25maWd1cmF0aW9uIHdpbGwgZmFpbCBpZiB0aGUgdGNsQ29uZmlnLnNoIGZpbGUgaXMgbm90IGZvdW5kIG9yIHRoZSBtYWpvciBUY2wgdmVyc2lvbiBpbnN0YWxsZWQgaXMgbGVzcyB0aGFuIDguMC4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIGxhdGVzdCBUY2wgdmVyc2lvbiBiZSB1c2VkLiAgSWYgVGNsIGlzIGluc3RhbGxlZCBhbmQgY29uZmlndXJhdGlvbiB3YXMgdW5hYmxlIHRvIGZpbmQgdGhlIHRjbENvbmZpZy5zaCBmaWxlIHRoZW4gdGhlIG1vZF90Y2wgY29uZmlndXJhdGlvbiBtYWNyb3MgbWF5IGJlIG1vZGlmaWVkLiAgQnkgZGVmYXVsdCBtb2RfdGNsIGNvbmZpZ3VyYXRpb24gYXNzdW1lcyB0aGUgdGNsQ29uZmlnLnNoIHdpbGwgYmUgZm91bmQgaW4gdGhlIGRpcmVjdG9yaWVzIC91c3IvbGliIG9yIC91c3IvbG9jYWwvbGliLiAgSWYgdGhlIFRjbCBkaXN0cmlidXRpb24gb24gdGhlIHN5c3RlbSBpcyBpbnN0YWxsZWQgaW4gYSBkaWZmZXJlbnQgbG9jYXRpb24gdGhlbiB0aGUgZmlsZSBjb25maWcubTQgaW4gdGhlIG1vZF90Y2wgZGlyZWN0b3J5IGNhbiBiZSBtb2RpZmllZCB0byBzZWFyY2ggaW4gb3RoZXIgZGlyZWN0b3JpZXMuICBJZiB0aGlzIGlzIG5lY2Vzc2FyeSB0aGVuIGNoYW5nZSBkaXJlY3RvcnkgdG8gdGhlIG1vZF90Y2wgZGlyZWN0b3J5IGFuZCBlZGl0IHRoZSBjb25maWcubTQgZmlsZS4gIEluIHRoZSBjb25maWcubTQgZmlsZSB0aGVyZSBpcyBhIHZhcmlhYmxlIGNhbGxlZCBkaXJzLiAgQXBwZW5kIGFkZGl0aW9uYWwgc2VhcmNoIHBhdGhzIHRvIHRoaXMgc3RyaW5nIHRvIGFsbG93IG1vcmUgZGlyZWN0b3JpZXMgdG8gYmUgc2VhcmNoZWQuICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgdGhlIGFkZGl0aW9uIG9mIHRoZSAvdXNyL2xvY2FsMi9saWIgZGlyZWN0b3J5LgoKyQpBQ19DSEVDS19GVU5DUyhhc3ByaW50ZiBtbWFwKQoKZGlycz0iL3Vzci9sb2NhbC9saWIgL3Vzci9saWIgL3Vzci9sb2NhbDIvbGliIgoKZm91bmQ9MArJCgpJZiBhbnkgbW9kaWZpY2F0aW9ucyBoYXZlIGJlZW4gbWFkZSB0byB0aGUgY29uZmlnLm00IGZpbGUgdGhlbiBhdXRvY29uZiBhbmQgYXV0b2hlYWRlciB3aWxsIGhhdmUgdG8gYmUgcnVuIGFnYWluLgoKQWZ0ZXIgY29uZmlndXJhdGlvbiBoYXMgY29tcGxldGVkIHRoZSBBcGFjaGUgd2ViIHNlcnZlciBjYW4gYmUgY29tcGlsZWQuICBDaGFuZ2UgZGlyZWN0b3J5IHRvIHRoZSByb290IGxldmVsIG9mIHRoZSBBcGFjaGUgMi4wIHNvdXJjZSBkaXN0cmlidXRpb24gYW5kIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBjb21tYW5kcy4KCiQgbWFrZQokIG1ha2UgaW5zdGFsbAoKVGhpcyB3aWxsIGNvbXBpbGUgQXBhY2hlIDIuMCB3aXRoIG1vZF90Y2wgYW5kIGluc3RhbGwgdGhlIGRpc3RyaWJ1dGlvbiBpbiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGF0IGNvbmZpZ3VyYXRpb24gdGltZS4gIFRoZSBBcGFjaGUgMi4wIGJpbmFyeSB3aWxsIGNvbnRhaW4gYSBzdGF0aWNhbGx5IGxpbmtlZCBtb2RfdGNsIG1vZHVsZSB3aGljaCBtYXkgYWxzbyBzdGF0aWNhbGx5IGxpbmsgVGNsIGxpYnJhcmllcyBkZXBlbmRpbmcgb24geW91ciBUY2wgaW5zdGFsbGF0aW9uLgoKQ29uZmlndXJpbmcgbW9kX3RjbCBpbiBBcGFjaGUgQ29uZmlndXJlIEZpbGVzCgpJbiBvcmRlciB0byB1c2UgbW9kX3RjbCBpbiBBcGFjaGUgMi4wIHNvbWUgbW9kX3RjbCBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMgYXJlIHJlcXVpcmVkIGluIHRoZSBBcGFjaGUgMi4wIGNvbmZpZ3VyYXRpb24gZmlsZSwgdXN1YWxseSBjYWxsZWQgaHR0cGQuY29uZi4gIE1vZF90Y2wgaXMgbWFkZSBhY3RpdmUgYnkgYWN0aXZhdGluZyBvbmUgb2YgdGhlIG1vZHVsZSBob29rIGNhbGxzLiAgVGhlcmUgYXJlIHRlbiBob29rIGNhbGxzIGluIHRvdGFsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGF2YWlsYWJsZSBob29rIGNhbGxzIGluIHRoZSBBcGFjaGUgQVBJLiAgQWxsIGhvb2tzIHJlcXVpcmUgYW4gYXJndW1lbnQgb2YgdGhlIGVudGlyZSBwaHlzaWNhbCBwYXRoIHRvIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGhvb2sgcHJvY2VkdXJlIGV4Y2VwdCB0aGUgY29udGVudCBoYW5kbGVyIGhvb2sgY2FsbGVkIFRjbF9Ib29rX0hhbmRsZXIuICBFdmVyeSBob29rIGRvZXMgcmVxdWlyZSBhbiBhcmd1bWVudCBzcGVjaWZ5aW5nIHRoZSBuYW1lIG9mIHRoZSBwcm9jZWR1cmUgdG8gYmUgY2FsbGVkLiAgTW9kX3RjbCBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMgYXJlIHZhbGlkIHdpdGhpbiBBcGFjaGUgPERpcmVjdG9yeT7JPC9EaXJlY3Rvcnk+IG9yIDxMb2NhdGlvbj7JPC9Mb2NhdGlvbj4gYmxvY2tzLgoKTW9kX3RjbCBIb29rIENvbmZpZ3VyYXRpb24gRGlyZWN0aXZlcyBpbiBPcmRlciBvZiBFeGVjdXRpb24KVGNsX0hvb2tfUG9zdF9SZWFkX1JlcXVlc3QJRW5hYmxlcyB0aGUgcG9zdCByZWFkIHJlcXVlc3QgaGFuZGxlciBmb3IgcmVxdWVzdCBzZXR1cC4KVGNsX0hvb2tfVHJhbnNsYXRlX05hbWUJRW5hYmxlcyB0aGUgdHJhbnNsYXRlIG5hbWUgaGFuZGxlciBmb3IgVVJJIHRvIGZpbGUgdHJhbnNsYXRpb24uClRjbF9Ib29rX0hlYWRlcl9QYXJzZXIJRW5hYmxlcyB0aGUgaGVhZGVyIHBhcnNlciBoYW5kbGVyIGZvciBwYXJzaW5nIGh0dHAgaGVhZGVycy4KVGNsX0hvb2tfQWNjZXNzX0NoZWNrZXIJRW5hYmxlcyB0aGUgYWNjZXNzIGNoZWNrZXIuClRjbF9Ib29rX0NoZWNrX1VzZXJfSUQJRW5hYmxlcyB0aGUgY2hlY2sgdXNlciBpZCBoYW5kbGVyLgpUY2xfSG9va19BdXRoX0NoZWNrZXIJRW5hYmxlcyB0aGUgYXV0aCBjaGVja2VyLgpUY2xfSG9va19UeXBlX0NoZWNrZXIJRW5hYmxlcyB0aGUgdHlwZSBjaGVja2VyLgpUY2xfSG9va19GaXh1cHMJRW5hYmxlcyBhIGZpeCB1cCBoYW5kbGVyLgpUY2xfSG9va19IYW5kbGVyCUVuYWJsZXMgdGhlIGNvbnRlbnQgaGFuZGxlciBmb3IgZGVsaXZlcnkgb2YgZGF0YSB0byBjbGllbnQuClRjbF9Ib29rX0xvZ19UcmFuc2FjdGlvbglFbmFibGVzIHRoZSBsb2cgdHJhbnNhY3Rpb24gaGFuZGxlci4KCkNoYW5jZXMgYXJlIHRoZSBUY2xfSG9va19IYW5kbGVyIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlIHdpbGwgYmUgdGhlIG1vc3QgY29tbW9ubHkgb25lIHVzZWQuICBUaGlzIGlzIHRoZSBoYW5kbGVyIHRoYXQgYWN0dWFsbHkgZGVsaXZlcnMgdGhlIGNvbnRlbnQgYW5kIGRvZXMgbW9zdCBvZiB0aGUgd29yay4gIFRoaXMgaGFuZGxlciBhbHNvIGRvZXMgbm90IHJlcXVpcmUgYSBmaWxlIG5hbWUgYXJndW1lbnQgcGFzc2VkIHRvIGl0LCB0aGlzIGlzIGJlY2F1c2UgbWFueSBkaWZmZXJlbnQgc2NyaXB0IGZpbGVzIG1heSBjb250YWluIGluZGl2aWR1YWwgY29udGVudCBoYW5kbGVycy4gIElmIHRoZSBvdGhlciBwaGFzZXMgb2YgcmVxdWVzdCBwcm9jZXNzaW5nIHdlcmUgYWxsb3dlZCB0byBvcGVyYXRlIHRoaXMgd2F5IHRoZSByZXF1ZXN0IHByb2Nlc3Mgd291bGQgYmUgbXVjaCBtb3JlIGNvbXBsZXgsIGFuZCBtaXhpbmcgZGlmZmVyZW50IGZpbGUgdHlwZXMgd2l0aCBtb2RfdGNsIHNjcmlwdHMgd291bGQgYmUgaW1wb3NzaWJsZS4KCkluIGFkZGl0aW9uIHRvIHRoZSBob29rIGRpcmVjdGl2ZXMgdGhlcmUgYXJlIGFsc28gY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzIGZvciBwcmUgc2V0dGluZyB2YXJpYWJsZXMgaW4gc2NyaXB0cy4gIFRoZSBUY2xfVmFyIGRpcmVjdGl2ZSBpcyB1c2VkIHdoZW4gd2Ugd2FudCB0byBzZXQgc2NhbGFyIHZhcmlhYmxlcyBvciBhcnJheSB2YXJpYWJsZXMuIFRjbF9MaXN0VmFyIGlzIHVzZWQgdG8gY3JlYXRlIGEgbGlzdC4KCjxEaXJlY3RvcnkgLz4KyQpUY2xfVmFyIG15X251bWJlciA3ClRjbF9WYXIgbXlfYXJyYXkgbXlfdmFsdWUxIDEwClRjbF9WYXIgbXlfYXJyYXkgbXlfdmFsdWUyIDIwClRjbF9MaXN0VmFyIG15X2xpc3QgMQpUY2xfTGlzdFZhciBteV9saXN0IDIKVGNsX0xpc3RWYXIgbXlfbGlzdCAzCskKPC9EaXJlY3Rvcnk+CgpJbiB0aGUgYWJvdmUgZXhhbXBsZSBteV9udW1iZXIgaXMgYSBzY2FsYXIgdmFyaWFibGUgd2l0aCB2YWx1ZSA3LCBteV9hcnJheSBpcyBhbiBhc3NvY2lhdGl2ZSBhcnJheSB3aXRoIDIgZWxlbWVudHMsIGFuZCBteV9saXN0IGlzIGEgbGlzdCB3aXRoIHZhbHVlIHsxLDIsM30uICBWYXJpYWJsZXMgc2V0IGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBhcmUgYXV0b21hdGljYWxseSBzZXQgaW4gdGhlIGNhbGxpbmcgc2NyaXB0cyBuYW1lc3BhY2UsIHNvIHRoZSBUY2wga2V5d29yZCB2YXJpYWJsZSB3aWxsIGJlIHJlcXVpcmVkIHdoZW4gdXNpbmcgdGhlc2UgdmFyaWFibGVzLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBvbmx5IGluaXRpYWxpemVkIG9uY2UgaW4gYSBmaWxlcyBuYW1lc3BhY2UuICBJZiBjb2RlIHdpdGhpbiBvbmUgb2YgdGhlIGhhbmRsZXJzIGlzIGNhbGxlZCBhbmQgbW9kaWZpZXMgdGhlIHZhcmlhYmxlcyB0aGVuIHRoZXkgd2lsbCBiZSBwZXJtYW5lbnRseSBtb2RpZmllZCB1bnRpbCBBcGFjaGUgaXMgcmVzdGFydGVkLiAgVmFyaWFibGVzIHdpbGwgcmVtYWluIHBlcnNpc3RlbnQgaW4gdGhlIFRjbCBpbnRlcnByZXRlciBldmVuIGlmIGEgc2NyaXB0IGlzIHJlbG9hZGVkIGJlY2F1c2UgaXQgd2FzIG1vZGlmaWVkLgoKVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlbW9uc3RyYXRlcyBhIHNpbXBsZSBjb25maWd1cmF0aW9uIHNldHVwIGZvciB1c2luZyBtb2RfdGNsIGluIGEgdmlydHVhbCBob3N0IGRpcmVjdGl2ZS4KCjxWaXJ0dWFsSG9zdCAxMjcuMC4wLjE+CiAgICBTZXJ2ZXJOYW1lIGFueS5ob3N0CgogICAgRG9jdW1lbnRSb290ICIvYW55Lmhvc3QiCgogICAgPERpcmVjdG9yeSAvPgogICAgICAgIE9wdGlvbnMgRm9sbG93U3ltTGlua3MKICAgICAgICBBbGxvd092ZXJyaWRlIE5vbmUKICAgIDwvRGlyZWN0b3J5PgoKICAgIDxEaXJlY3RvcnkgL2FueS5ob3N0PgojIGFsbG93IGZpbGVzIGVuZGluZyB3aXRoIHRoZSBleHRlbnN0aW9uIC50bSB0byB1c2UgbW9kX3RjbCBhcyBhIGNvbnRlbnQgaGFuZGxlcgogICAgICAgIEFkZEhhbmRsZXIgdGNsLWhhbmRsZXIgdG0KCiAgICAgICAgVGNsX0hvb2tfSGFuZGxlciBjb250ZW50X2hhbmRsZXIKICAgIDwvRGlyZWN0b3J5Pgo8L1ZpcnR1YWxIb3N0PgoKVGhpcyBjb25maWd1cmF0aW9uIGV4YW1wbGUgd2lsbCBhbGxvdyBhbnkgbWl4ZWQgZmlsZXMgaW4gdGhlIC9hbnkuaG9zdCBkaXJlY3RvcnkgYW5kIHdpbGwgZXhlY3V0ZSBhbnkgc2NyaXB0IHdpdGggYSBmaWxlbmFtZSBlbmRpbmcgaW4gLnRtIHRvIGJlIGV4ZWN1dGVkIGJ5IG1vZF90Y2wuICBUaGlzIGFsbG93cyB1cyB0byBtaXggaHRtbCBhbmQgbW9kX3RjbCBzY3JpcHRzIHRvZ2V0aGVyIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KCldyaXRpbmcgbW9kX3RjbCBTY3JpcHRzCgpPbmNlIGNvbmZpZ3VyYXRpb24gaXMgc2V0IHVwIHdlIGFyZSByZWFkeSB0byBzdGFydCB3cml0aW5nIHRoZSBhY3R1YWwgbW9kX3RjbCBzY3JpcHQgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIG5lY2Vzc2FyeSBoYW5kbGVycy4gIFVzaW5nIHRoZSBwcmV2aW91cyBjb25maWd1cmF0aW9uIGV4YW1wbGUgd2Ugd2lsbCBhc3N1bWUgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gd3JpdGUgYSBtb2RfdGNsIHNjcmlwdCBjYWxsZWQgaGVsbG8udG0gaW4gdGhlIC9hbnkuaG9zdCBkaXJlY3RvcnkuCgpuYW1lc3BhY2UgaW1wb3J0IC1mb3JjZSA6OmFwYWNoZTo6KgoKcHJvYyBjb250ZW50X2hhbmRsZXIgeyB9IHsKICAgIHZhcmlhYmxlIDo6YXBhY2hlOjpPSwoKICAgIGFwX3NlbmRfaHR0cF9oZWFkZXIKCiAgICBycHV0cyDSaGVsbG8gd29ybGQu0woKICAgIHJldHVybiAkT0sKfQoKV2hlbiB0aGlzIHNjcmlwdCBpcyBydW4gaXQgd2lsbCBwcmludCBoZWxsbyB3b3JsZCBpbiB0aGUgY2xpZW50cyBicm93c2VyLiAgVGhlcmUgYXJlIHNldmVyYWwgaXRlbXMgdG8gbm90ZSBpbiB0aGlzIHNjcmlwdC4gIE9uZSB0aGUgZmlyc3QgbGluZSBpcyBhIG5hbWVzcGFjZSBpbXBvcnQgb2YgZXZlcnl0aGluZyBpbiB0aGUgOjphcGFjaGUgbmFtZXNwYWNlIGludG8gdGhlIGN1cnJlbnQgbmFtZXNwYWNlLiAgVGhpcyBhbGxvd3MgdXMgdG8gdXNlIHRoZSBBcGFjaGUgQVBJIGZ1bmN0aW9ucyAobGlrZSBycHV0cykgd2l0aG91dCBoYXZpbmcgdG8gcHJlZml4IDo6YXBhY2hlOjouICBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGltcG9ydCB0aGUgQXBhY2hlIEFQSSBsaWtlIHRoaXMgYnV0IGl0IHdpbGwgbWFrZSBpdCBlYXNpZXIgaWYgdGhlIEFwYWNoZSBBUEkgaXMgcmVmZXJlbmNlZCBmcmVxdWVudGx5LiAgRXZlbiBpZiB0aGUgQXBhY2hlIEFQSSBpcyBpbXBvcnRlZCBpdCBpcyBzdGlsbCBuZWNlc3NhcnkgdG8gZGVjbGFyZSB2YXJpYWJsZXMgaW4gcHJvY2VkdXJlcyBmcm9tIG90aGVyIG5hbWVzcGFjZXMgKGxpa2UgOjphcGFjaGU6Ok9LKS4gIFRoZSBhcF9zZW5kX2h0dHBfaGVhZGVyIGZ1bmN0aW9uIHdpbGwgc2VuZCBodHRwIGhlYWRlcnMgdG8gdGhlIGNsaWVudCBicm93c2VyLCBldmVuIGlmIHdlIGRvbtV0IGRlZmluZSBhbnkgaGVhZGVycyBBcGFjaGUgd2lsbCBzZW5kIGRlZmF1bHQgaGVhZGVycy4gIFRoZSBycHV0cyBjb21tYW5kIG9wZXJhdGVzIGFsbW9zdCBpZGVudGljYWxseSB0byB0aGUgVGNsIGNvbW1hbmQgcHV0cywgaW5zdGVhZCBvZiB3cml0aW5nIHRvIGEgZmlsZSBkZXNjcmlwdG9yIHJwdXRzIHdyaXRlcyB0byB0aGUgY2xpZW50cyBicm93c2VyLiAgcnB1dHMgY2FuIG5vdCB3cml0ZSB0byBkaWZmZXJlbnQgZmlsZSBkZXNjcmlwdG9ycy4gIEFmdGVyIGV2ZXJ5IGhhbmRsZXIgaXMgcnVuIGl0IG11c3QgcmV0dXJuIHdpdGggYSB2YWx1ZSB0aGF0IHNpZ25pZmllcyB0aGUgb3V0Y29tZSBvZiB0aGUgcmVxdWVzdCBwaGFzZS4gIFRoZSBzZXZlbiBtb3N0IGNvbW1vbiByZXR1cm4gdmFsdWVzIGFyZTogT0ssIERFQ0xJTkVELCBET05FLCBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgSFRUUF9CQURfUkVRVUVTVCwgSFRUUF9NT1ZFRF9URU1QT1JBUklMWSwgYW5kIEhUVFBfTk9UX0ZPVU5ELgoKVGhlIEFwYWNoZSBBUEkgaW4gbW9kX3RjbAoKTm93IHRoYXQgd2UgdW5kZXJzdGFuZCB0aGUgYmFzaWNzIG9mIHdyaXRpbmcgYSBtb2RfdGNsIHNjcmlwdCB3ZSBjYW4gdGFrZSB0aGUgbmV4dCBzdGVwIGFuZCBleHBsb3JlIHRoZSBBcGFjaGUgQVBJIGluIG1vZF90Y2wuICBBbGwgQXBhY2hlIEFQSSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIHVzaW5nIHRoZSBUY2xfQ3JlYXRlT2JqQ29tbWFuZCgpIFRjbCBBUEkgZnVuY3Rpb24sIHRoaXMgaXMgd2h5IFRjbCA4LjAgaXMgcmVxdWlyZWQuICBVc2luZyBUY2wgb2JqZWN0cyBpbnN0ZWFkIG9mIHN0cmluZ3MgaW5jcmVhc2VzIHRoZSBlZmZpY2llbmN5IG9mIHRoZSByZXF1ZXN0IHBoYXNlcy4gIFRoZSBBcGFjaGUgQVBJIGltcGxlbWVudGF0aW9uIGluIG1vZF90Y2wgY2FuIGJlIGJyb2tlbiBkb25lIGFzIGZvbGxvd3MuICBBbGwgQXBhY2hlIEFQSSBwcm9jZWR1cmVzIGFyZSBkZWNsYXJlZCBpbiB0aGUgOjphcGFjaGUgbmFtZXNwYWNlLgoKaHR0cF9jb3JlLmggUHJvY2VkdXJlcwkJCmFwX2FsbG93X29wdGlvbnMJcmV0dXJucyBpbnRlZ2VyCXJlcXVpcmVzIG5vIGFyZ3VtZW50cwphcF9hbGxvd19vdmVycmlkZXMJcmV0dXJucyBpbnRlZ2VyCXJlcXVpcmVzIG5vIGFyZ3VtZW50cwphcF9kZWZhdWx0X3R5cGUJcmV0dXJucyBzdHJpbmcJcmVxdWlyZXMgbm8gYXJndW1lbnRzCmFwX2RvY3VtZW50X3Jvb3QJcmV0dXJucyBzdHJpbmcJcmVxdWlyZXMgbm8gYXJndW1lbnRzCmFwX2dldF9yZW1vdGVfaG9zdAlyZXR1cm5zIHN0cmluZwlyZXF1aXJlcyBpbnRlZ2VyIGFyZ3VtZW50CmFwX2dldF9yZW1vdGVfbG9nbmFtZQlyZXR1cm5zIHN0cmluZwlyZXF1aXJlcyBubyBhcmd1bWVudHMKYXBfY29uc3RydWN0X3VybAlyZXR1cm5zIHN0cmluZwlyZXF1aXJlcyB1cmkgc3RyaW5nIGFyZ3VtZW50CmFwX2dldF9zZXJ2ZXJfbmFtZQlyZXR1cm5zIHN0cmluZ3MJcmVxdWlyZXMgbm8gYXJndW1lbnRzCmFwX2dldF9zZXJ2ZXJfcG9ydAlyZXR1cm5zIGludGVnZXIJcmVxdWlyZXMgbm8gYXJndW1lbnRzCmFwX2dldF9saW1pdF9yZXFfYm9keQlyZXR1cm5zIGxvbmcJcmVxdWlyZXMgbm8gYXJndW1lbnRzCmFwX2dldF9saW1pdF94bWxfYm9keQlyZXR1cm5zIGludGVnZXIJcmVxdWlyZXMgbm8gYXJndW1lbnRzCmFwX2N1c3RvbV9yZXNwb25zZQlyZXR1cm5zIG5vdGhpbmcJcmVxdWlyZXMgaW50ZWdlciBhbmQgc3RyaW5nIGFyZ3VtZW50cwphcF9leGlzdHNfY29uZmlnX2RlZmluZQlyZXR1cm5zIGludGVnZXIJcmVxdWlyZXMgc3RyaW5nIGFyZ3VtZW50CmFwX2F1dGhfdHlwZQlyZXR1cm5zIHN0cmluZwlyZXF1aXJlcyBubyBhcmd1bWVudHMKYXBfYXV0aF9uYW1lCXJldHVybnMgc3RyaW5nCXJlcXVpcmVzIG5vIGFyZ3VtZW50cwphcF9zYXRpc2ZpZXMJcmV0dXJucyBpbnRlZ2VyCXJlcXVpcmVzIG5vIGFyZ3VtZW50cwphcF9yZXF1aXJlcwlyZXR1cm5zIGxpc3QJcmVxdWlyZXMgbm8gYXJndW1lbnRzCmh0dHBfbG9nLmggUHJvY2VkdXJlcwkJCmFwX2xvZ19lcnJvcglyZXR1cm5zIG5vdGhpbmdzCXJlcXVpcmVzIGxldmVsIGludGVnZXI7IHN0YXR1cyBpbnRlZ2VyIGFuZCBsb2cgc3RyaW5nIGFyZ3VtZW50cwpodHRwX3Byb3RvY29sLmggUHJvY2VkdXJlcwkJCmFwX3NlbmRfaHR0cF9oZWFkZXIJcmV0dXJucyBub3RoaW5nCXJlcXVpcmVzIG5vIGFyZ3VtZW50cwphcF9zZW5kX2h0dHBfdHJhY2UJcmV0dXJucyBpbnRlZ2VyCXJlcXVpcmVzIG5vIGFyZ3VtZW50cwphcF9zZW5kX2h0dHBfb3B0aW9ucwlyZXR1cm5zIGludGVnZXIJcmVxdWlyZXMgbm8gYXJndW1lbnRzCmFwX2ZpbmFsaXplX3JlcXVlc3RfcHJvdG9jb2wJcmV0dXJucyBub3RoaW5nCXJlcXVpcmVzIG5vIGFyZ3VtZW50cwphcF9zZW5kX2Vycm9yX3Jlc3BvbnNlCXJldHVybnMgbm90aGluZwlyZXF1aXJlcyByZWN1cnNpdmUgZXJyb3IgaW50ZWdlcgphcF9zZXRfY29udGVudF9sZW5ndGgJcmV0dXJucyBub3RoaW5nCXJlcXVpcmVzIGxlbmd0aCBpbnRlZ2VyCmFwX3NldF9rZWVwYWxpdmUJcmV0dXJucyBpbnRlZ2VyCXJlcXVpcmVzIG5vIGFyZ3VtZW50cwphcF9yYXRpb25hbGl6ZV9tdGltZQlyZXR1cm5zIGludGVnZXIJcmVxdWlyZXMgbXRpbWUgaW50ZWdlcgphcF9tYWtlX2V0YWcJcmV0dXJucyBzdHJpbmcJcmVxdWlyZXMgZm9yY2Vfd2VhayBpbnRlZ2VyCmFwX3NldF9ldGFnCXJldHVybnMgbm90aGluZwlyZXF1aXJlcyBubyBhcmd1bWVudHMKYXBfc2V0X2xhc3RfbW9kaWZpZWQJcmV0dXJucyBub3RoaW5nCXJlcXVpcmVzIG5vIGFyZ3VtZW50cwphcF9tZWV0c19jb25kaXRpb25zCXJldHVybnMgaW50ZWdlcglyZXF1aXJlIG5vIGFyZ3VtZW50cwphcF9ycHV0cwlyZXR1cm5zIG5vdGhpbmcJYWNjZXB0cyDQbm9uZXdsaW5lIG9wdGlvbjsgcmVxdWlyZXMgc3RyaW5nCmFwX3J3cml0ZQlyZXR1cm5zIG5vdGhpbmcJcmVxdWlyZXMgZGF0YQphcF9yZmx1c2gJcmV0dXJucyBub3RoaW5nCXJlcXVpcmVzIG5vIGFyZ3VtZW50cwphcF9nZXRfc3RhdHVzX2xpbmUJcmV0dXJucyBzdHJpbmcJcmVxdWlyZXMgc3RhdHVzIGludGdlcgphcF9zZXR1cF9jbGllbnRfYmxvY2sJcmV0dXJucyBpbnRlZ2VyCXJlcXVpcmVzIHJlYWQgcG9saWN5IGludGVnZXIKYXBfZ2V0X2NsaWVudF9ibG9jawlyZXR1cm5zIGludGVnZXIgYW5kIHNldHMgdmFyaWFibGUgUiB0byByZXR1cm5lZCBkYXRhCXJlcXVpcmVzIGJ1ZnNpeiBpbnRlZ2VyCmFwX2Rpc2NhcmRfcmVxdWVzdF9ib2R5CXJldHVybnMgaW50ZWdlcglyZXF1aXJlcyBubyBhcmd1bWVudHMKYXBfbm90ZV9hdXRoX2ZhaWx1cmUJcmV0dXJucyBub3RoaW5nCXJlcXVpcmVzIG5vIGFyZ3VtZW50cwphcF9ub3RlX2Jhc2ljX2F1dGhfZmFpbHVyZQlyZXR1cm5zIG5vdGhpbmcJcmVxdWlyZXMgbm8gYXJndW1lbnRzCmFwX25vdGVfZGlnZXN0X2F1dGhfZmFpbHVyZQlyZXR1cm5zIG5vdGhpbmcJcmVxdWlyZXMgbm8gYXJndW1lbnRzCmFwX2dldF9iYXNpY19hdXRoX3B3CXJldHVybnMgaW50ZWdlciBhbmQgc2V0cyB2YXJpYWJsZSBSIHRvIHN0cmluZwlyZXF1aXJlcyBubyBhcmd1bWVudHMKYXBfcGFyc2VfdXJpCXJldHVybnMgbm90aGluZwlyZXF1aXJlcyB1cmkgc3RyaW5nCmFwX21ldGhvZF9udW1iZXJfb2YJcmV0dXJucyBpbnRlZ2VyCXJlcXVpcmVzIG1ldGhvZCBzdHJpbmcKYXBfbWV0aG9kX25hbWVfb2YJcmV0dXJucyBzdHJpbmcJcmVxdWlyZXMgbWV0aG9kIGludGVnZXIKaHR0cF9yZXF1ZXN0LmgJCQphcF9pbnRlcm5hbF9yZWRpcmVjdAlyZXR1cm5zIG5vdGhpbmcJcmVxdWlyZXMgdXJpIHN0cmluZwphcF9pbnRlcm5hbF9yZWRpcmVjdF9oYW5kbGVyCXJldHVybnMgbm90aGluZwlyZXF1aXJlcyB1cmkgc3RyaW5nCmFwX3NvbWVfYXV0aF9yZXF1aXJlZAlyZXR1cm5zIGludGVnZXIJcmVxdWlyZXMgbm8gYXJndW1lbnRzCmFwX3VwZGF0ZV9tdGltZQlyZXR1cm5zIG5vdGhpbmcJcmVxdWlyZXMgZGVwZW5kZW5jeSBtdGltZSBpbnRlZ2VyCmFwX2FsbG93X21ldGhvZHMJcmV0dXJucyBub3RoaW5nCXJlcXVpcmVzIHJlc2V0IGludGdlciBhbmQgbWV0aG9kcyBzdHJpbmcKaHR0cGQuaAkJCmFwX2dldF9zZXJ2ZXJfdmVyc2lvbglyZXR1cm5zIHN0cmluZwlyZXF1aXJlcyBubyBhcmd1bWVudHMKYXBfYWRkX3ZlcnNpb25fY29tcG9uZW50CXJldHVybnMgbm8gYXJndW1lbnRzCXJlcXVpcmVzIHZlcnNpb24gc3RyaW5nCmFwX2dldF9zZXJ2ZXJfYnVpbHQJcmV0dXJucyBzdHJpbmcJcmVxdWlyZXMgbm8gYXJndW1lbnRzCnV0aWxfc2NyaXB0LmgJCQphcF9jcmVhdGVfZW52aXJvbm1lbnQJcmV0dXJucyBub3RoaW5nIGFuZCBzZXRzIHZhcmlhYmxlIGVudglyZXF1aXJlcyBubyBhcmd1bWVudHMKClRoZXJlIGFyZSBhbHNvIHNvbWUgdXRpbGl0eSBwcm9jZWR1cmVzIGRlZmluZWQgZm9yIGludGVyYWN0aW5nIHdpdGggbGFyZ2Ugb3V0cHV0LCByZWFkaW5nIFBPU1QgcmVxdWVzdHMsIGFuZCByZWFkaW5nIGFuZCBzZXR0aW5nIHZhcmlhYmxlcyBpbiBBcGFjaGUgcmVxdWVzdF9yZWMgc3RydWN0dXJlcy4gIFRoZSBmaXJzdCB1dGlsaXR5IGZ1bmN0aW9uIGlzIGFib3J0LiAgVGhlIGFib3J0IHByb2NlZHVyZSBhY2NlcHRzIGEgc3RyaW5nIGFyZ3VtZW50IHdoaWNoIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBlcnJvciBtZXNzYWdlLCBhYm9ydCByZXR1cm5zIG5vdGhpbmcgYW5kIHdpbGwgaW1tZWRpYXRlbHkgYWJvcnQgcHJvY2Vzc2luZyBvZiB0aGUgaGFuZGxlciBhbmQgcmV0dXJuIGEgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IuICBUaGUgcmVhZF9wb3N0IHByb2NlZHVyZSB3aWxsIHJlYWQgUE9TVCByZXF1ZXN0cywgaXQgYWNjZXB0cyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMgbm90aGluZy4gIHJlYWRfcG9zdCB3aWxsIHNldCBhbiBhcnJheSBuYW1lZCBwcmFtIGluIHRoZSBsb2NhbCBuYW1lc3BhY2Ugd2l0aCBhbGwgdGhlIHJlYWQgZGF0YSBmcm9tIHRoZSBQT1NULiAgVGhlcmUgaXMgYWxzbyBhIHNwZWNpYWwgcHJvY2VkdXJlIGNhbGxlZCBvdXRwdXQgd2hpY2ggaGVscHMgd3JpdGUgbGFyZ2UgYW1vdW50cyBvZiBkYXRhIHRvIGEgY2xpZW50LiAgVGhlIG91dHB1dCBwcm9jZWR1cmUgZXNzZW50aWFsbHkgY2FsbHMgcnB1dHMgZm9yIGVhY2ggbGluZSwgbXVsdGlwbGUgbGluZXMgbXVzdCBiZSBjb250YWluZWQgd2l0aGluIGN1cmx5IGJyYWNlcyAobGlrZSB0aGlzOiBvdXRwdXQgeyDJIH0pLiAgVGhlIG5leHQgdHdvIHByb2NlZHVyZXMgcmVhZCBhbmQgd3JpdGUgdmFyaWFibGVzIHRvIHRoZSByZXF1ZXN0X3JlYyBzdHJ1Y3R1cmUgaW4gdGhlIEFwYWNoZSBBUEkuICBUbyByZWFkIHJlcXVlc3RfcmVjIHZhcmlhYmxlcyB3ZSB1c2UgdGhlIGNvbW1hbmQgciwgdG8gc2V0IHJlcXVlc3RfcmVjIHZhcmlhYmxlcyB3ZSB1c2UgdGhlIGNvbW1hbmQgcl9zZXQuICBBbGwgdmFyaWFibGVzIGFyZSByZWFkYWJsZSBidXQgbm90IGFsbCB2YXJpYWJsZXMgYXJlIHdyaXRhYmxlLgoKciBQcm9jZWR1cmUgQXJndW1lbnRzCmFsbG93ZWQJUmV0dXJucyBpbnRlZ2VyCVJlcXVpcmVzIDY0LWJpdCBpbnRlZ2VyCmFsbG93ZWRfbWV0aG9kcwlSZXR1cm5zIGxpc3Qgb2Ygc3RyaW5ncwlSZXF1aXJlcyBsaXN0IG9mIHN0cmluZ3MKYWxsb3dlZF94bWV0aG9kcwlSZXR1cm5zIGxpc3Qgb2Ygc3RyaW5ncwlSZXF1aXJlcyBsaXN0IG9mIHN0cmluZ3MKYXBfYXV0aF90eXBlCVJldHVybnMgc3RyaW5nCVJlcXVpcmVzIHN0cmluZwphcmdzCVJldHVybnMgc3RyaW5nCVJlcXVpcmVzIHN0cmluZyAKYXNzYmFja3dhcmRzCVJldHVybnMgaW50ZWdlcglSZXF1aXJlcyBpbnRlZ2VyIApib3VuZGFyeQlSZXR1cm5zIHN0cmluZwlOb3Qgd3JpdGFibGUKYnl0ZXNfc2VudAlSZXR1cm5zIGludGVnZXIJTm90IHdyaXRhYmxlCmNodW5rZWQJUmV0dXJucyBpbnRlZ2VyCU5vdCB3cml0YWJsZQpjbGVuZ3RoCVJldHVybnMgbG9uZyBpbnRlZ2VyCU5vdCB3cml0YWJsZQpjb250ZW50X2VuY29kaW5nCVJldHVybnMgc3RyaW5nCVJlcXVpcmVzIHN0cmluZwpjb250ZW50X3R5cGUJUmV0dXJucyBzdHJpbmcJUmVxdWlyZXMgc3RyaW5nIAplcnJfaGVhZGVyc19vdXQJUmV0dXJucyBsaXN0IG9mIHN0cmluZ3MgYW5kIHNldHMgZXJyX2hlYWRlcnNfb3V0IGFycmF5CVJlcXVpcmVzIGhlYWRlciBuYW1lIGFuZCB2YWx1ZSBzdHJpbmcKZXhwZWN0aW5nXzEwMAlSZXR1cm5zIGludGVnZXIJTm90IHdyaXRhYmxlCmZpbGVuYW1lCVJldHVybnMgc3RyaW5nCVJlcXVpcmVzIHN0cmluZwpoYW5kbGVyCVJldHVybnMgc3RyaW5nCU5vdCB3cml0YWJsZQpoZWFkZXJzX2luCVJldHVybnMgbGlzdCBvZiBzdHJpbmdzIGFuZCBzZXRzIGhlYWRlcnNfaW4gYXJyYXkJTm90IHdyaXRhYmxlCmhlYWRlcnNfb3V0CVJldHVybnMgbGlzdCBvZiBzdHJpbmdzIGFuZCBzZXRzIGhlYWRlcnNfb3V0IGFycmF5CVJlcXVpcmVzIGhlYWRlciBuYW1lIGFuZCB2YWx1ZSBzdHJpbmcgCmhlYWRlcl9vbmx5CVJldHVybnMgaW50ZWdlcglSZXF1aXJlcyBpbnRlZ2VyIApob3N0bmFtZQlSZXR1cm5zIHN0cmluZwlOb3Qgd3JpdGFibGUKbWV0aG9kCVJldHVybnMgc3RyaW5nCU5vdCB3cml0YWJsZQptZXRob2RfbnVtYmVyCVJldHVybnMgaW50ZWdlcglOb3Qgd3JpdGFibGUKbXRpbWUJUmV0dXJucyBpbnRlZ2VyCU5vdCB3cml0YWJsZQpub3RlcwlSZXR1cm5zIGxpc3Qgb2Ygc3RyaW5ncyBhbmQgc2V0cyBub3RlcyBhcnJheQlSZXF1aXJlcyBub3RlIG5hbWUgYW5kIHZhbHVlIHN0cmluZwpub19jYWNoZQlSZXR1cm5zIGludGVnZXIJUmVxdWlyZXMgaW50ZWdlcgpub19sb2NhbF9jb3B5CVJldHVybnMgaW50ZWdlcglSZXF1aXJlcyBpbnRlZ2VyIApwYXJzZWRfdXJpCVJldHVybnMgbGlzdCBvZiBzdHJpbmdzCVJlcXVpcmVzIHN0cmluZwpwYXRoX2luZm8JUmV0dXJucyBzdHJpbmcJUmVxdWlyZXMgc3RyaW5nCnByb3RvY29sCVJldHVybnMgc3RyaW5nCVJlcXVpcmVzIHN0cmluZwpwcm90b19udW0JUmV0dXJucyBpbnRlZ2VyCVJlcXVpcmVzIGludGVnZXIKcHJveHlyZXEJUmV0dXJucyBpbnRlZ2VyCVJlcXVpcmVzIGludGVnZXIKcmFuZ2UJUmV0dXJucyBzdHJpbmcJTm90IHdyaXRhYmxlCnJlYWRfYm9keQlSZXR1cm5zIGludGVnZXIJTm90IHdyaXRhYmxlCnJlYWRfY2h1bmtlZAlSZXR1cm5zIGludGVnZXIJTm90IHdyaXRhYmxlCnJlYWRfbGVuZ3RoCVJldHVybnMgbG9uZyBpbnRlZ2VyCU5vdCB3cml0YWJsZQpyZW1haW5pbmcJUmV0dXJucyBsb25nIGludGVnZXIJTm90IHdyaXRhYmxlCnJlcXVlc3RfdGltZQlSZXR1cm5zIGxvbmcgaW50ZWdlcglOb3Qgd3JpdGFibGUKc2VudF9ib2R5Y3QJUmV0dXJucyBpbnRlZ2VyCU5vdCB3cml0YWJsZQpzdGF0dXMJUmV0dXJucyBpbnRlZ2VyCU5vdCB3cml0YWJsZQpzdGF0dXNfbGluZQlSZXR1cm5zIHN0cmluZwlOb3Qgd3JpdGFibGUKc3VicHJvY2Vzc19lbnYJUmV0dXJucyBsaXN0IG9mIHN0cmluZ3MgYW5kIHNldHMgc3VicHJvY2Vzc19lbnYgYXJyYXkJUmVxdWlyZXMgbmFtZSBhbmQgdmFsdWUgc3RyaW5nCnRoZV9yZXF1ZXN0CVJldHVybnMgc3RyaW5nCVJlcXVpcmVzIHN0cmluZyAKdW5wYXJzZWRfdXJpCVJldHVybnMgc3RyaW5nCVJlcXVpcmVzIHN0cmluZwp1cmkJUmV0dXJucyBzdHJpbmcJUmVxdWlyZXMgc3RyaW5nIAp1c2VyCVJldHVybnMgc3RyaW5nCVJlcXVpcmVzIHN0cmluZyAKdmxpc3RfdmFsaWRhdG9yCVJldHVybnMgc3RyaW5nCVJlcXVpcmVzIHN0cmluZwoKciBjb25uZWN0aW9uIFByb2NlZHVyZSBBcmd1bWVudHMKcmVtb3RlX2lwCVJldHVybnMgc3RyaW5nCU5vdCB3cml0YWJsZQpyZW1vdGVfaG9zdAlSZXR1cm5zIHN0cmluZwlOb3Qgd3JpdGFibGUKcmVtb3RlX2xvZ25hbWUJUmV0dXJucyBzdHJpbmcJTm90IHdyaXRhYmxlCmFib3J0ZWQJUmV0dXJucyBpbnRlZ2VyCU5vdCB3cml0YWJsZQprZWVwYWxpdmUJUmV0dXJucyBpbnRlZ2VyCU5vdCB3cml0YWJsZQpkb3VibGVyZXZlcnNlCVJldHVybnMgaW50ZWdlcglOb3Qgd3JpdGFibGUKa2VlcGFsaXZlcwlSZXR1cm5zIGludGVnZXIJTm90IHdyaXRhYmxlCmxvY2FsX2lwCVJldHVybnMgc3RyaW5nCU5vdCB3cml0YWJsZQpsb2NhbF9ob3N0CVJldHVybnMgc3RyaW5nCU5vdCB3cml0YWJsZQppZAlSZXR1cm5zIHN0cmluZwlOb3Qgd3JpdGFibGUKbm90ZXMJUmV0dXJucyBsaXN0IG9mIHN0cmluZ3MgYW5kIHNldHMgY29ubmVjdGlvbl9ub3RlcyBhcnJheQlSZXF1aXJlcyBub3RlIG5hbWUgYW5kIHZhbHVlIHN0cmluZwoKciBzZXJ2ZXIgUHJvY2VkdXJlIEFyZ3VtZW50cwpkZWZuX25hbWUJUmV0dXJucyBzdHJpbmcJTm90IHdyaXRhYmxlCmRlZm5fbGluZV9udW1iZXIJUmV0dXJucyBpbnRlZ2VyCU5vdCB3cml0YWJsZQpzZXJ2ZXJfYWRtaW4JUmV0dXJucyBzdHJpbmcJTm90IHdyaXRhYmxlCnNlcnZlcl9ob3N0bmFtZQlSZXR1cm5zIHN0cmluZwlOb3Qgd3JpdGFibGUKcG9ydAlSZXR1cm5zIGludGVnZXIJTm90IHdyaXRhYmxlCmVycm9yX2ZuYW1lCVJldHVybnMgc3RyaW5nCU5vdCB3cml0YWJsZQpsb2dsZXZlbAlSZXR1cm5zIHN0cmluZwlOb3Qgd3JpdGFibGUKaXNfdmlydHVhbAlSZXR1cm5zIHN0cmluZwlOb3Qgd3JpdGFibGUKYWRkcnMJUmV0dXJucyBsaXN0CU5vdCB3cml0YWJsZQp0aW1lb3V0CVJldHVybnMgaW50ZWdlcglOb3Qgd3JpdGFibGUKa2VlcF9hbGl2ZV90aW1lb3V0CVJldHVybnMgaW50ZWdlcglOb3Qgd3JpdGFibGUKa2VlcF9hbGl2ZV9tYXgJUmV0dXJucyBpbnRlZ2VyCU5vdCB3cml0YWJsZQprZWVwX2FsaXZlCVJldHVybnMgaW50ZWdlcglOb3Qgd3JpdGFibGUKcGF0aAlSZXR1cm5zIHN0cmluZwlOb3Qgd3JpdGFibGUKbmFtZXMJUmV0dXJucyBsaXN0IG9mIHN0cmluZ3MJTm90IHdyaXRhYmxlCndpbGRfbmFtZXMJUmV0dXJucyBsaXN0IG9mIHN0cmluZ3MJTm90IHdyaXRhYmxlCmxpbWl0X3JlcV9saW5lCVJldHVybnMgaW50ZWdlcglOb3Qgd3JpdGFibGUKbGltaXRfcmVxX2ZpZWxkc2l6ZQlSZXR1cm5zIGludGVnZXIJTm90IHdyaXRhYmxlCmxpbWl0X3JlcV9maWVsZHMJUmV0dXJucyBpbnRlZ2VyCU5vdCB3cml0YWJsZQoKVGhlIGZvbGxvd2luZyBzY3JpcHQgd2lsbCBpbGx1c3RyYXRlIHBvcnRpb25zIG9mIG1vZF90Y2wgdGhhdCB3aWxsIGJlIG1vc3QgY29tbW9ubHkgdXNlZC4gIFRoaXMgZmlsZSBpcyBjYWxsZWQgZXhhbXBsZS50bS4KCnByb2MgY29udGVudF9oYW5kbGVyIHsgfSB7CiAgICAgICAgdmFyaWFibGUgcHJhbQogICAgICAgIHZhcmlhYmxlIGVudgogICAgICAgIHZhcmlhYmxlIDo6YXBhY2hlOjpPSwogICAgICAgIHZhcmlhYmxlIDo6YXBhY2hlOjpNX1BPU1QKCiAgICAgICAgaWYgeyBbciBtZXRob2RfbnVtYmVyXSA9PSAkTV9QT1NUIH0gewogICAgICAgICAgICAgICAgcmVhZF9wb3N0CiAgICAgICAgfQoKICAgICAgICByX3NldCBjb250ZW50X3R5cGUgInRleHQvaHRtbCIKCiAgICAgICAgYXBfY3JlYXRlX2Vudmlyb25tZW50CiAgICAgICAgCiAgICAgICAgc2V0IGVudl9saXN0IFthcnJheSBuYW1lcyBlbnZdCiAgICAgICAgc2V0IHBybV9saXN0IFthcnJheSBuYW1lcyBwcmFtXQoKICAgICAgICBhcF9zZW5kX2h0dHBfaGVhZGVyCiAgICAgICAgCiAgICAgICAgcnB1dHMgIjxIUj48Qj5FbnZpcm9ubWVudDwvQj48QlI+PEJSPiIKICAgICAgICAKICAgICAgICBmb3JlYWNoIGkgJGVudl9saXN0IHsKICAgICAgICAgICAgICAgIHJwdXRzICIkaT0kZW52KCRpKTxCUj4iCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJwdXRzICI8SFI+PEI+UG9zdGVkIFZhcmlhYmxlczwvQj48QlI+PEJSPiIKICAgICAgICAKICAgICAgICBmb3JlYWNoIGkgJHBybV9saXN0IHsKICAgICAgICAgICAgICAgIHJwdXRzICIkaT0kcHJhbSgkaSk8QlI+IgogICAgICAgIH0KCiAgICAgICAgcnB1dHMgIjxIUj4iCgogICAgICAgIG91dHB1dCB7CiAgICAgICAgICAgICAgICA8Q0VOVEVSPgogICAgICAgICAgICAgICAgPEZPUk0gTUVUSE9EPVBPU1QgQUNUSU9OPVtyIHVyaV0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJTlBVVCBUWVBFPXRleHQgTkFNRT11c2VyX2lucHV0PgogICAgICAgICAgICAgICAgICAgICAgICA8SU5QVVQgVFlQRT1zdWJtaXQ+CiAgICAgICAgICAgICAgICA8L0ZPUk0+CiAgICAgICAgICAgICAgICA8QlI+CiAgICAgICAgICAgICAgICBbYXBfZ2V0X3NlcnZlcl92ZXJzaW9uXSwgW2FwX2dldF9zZXJ2ZXJfYnVpbHRdCiAgICAgICAgICAgICAgICA8L0NFTlRFUj4KICAgICAgICB9CgogICAgICAgIHJldHVybiAkT0sKfQoKTG9va2luZyBhdCB0aGlzIHNjcmlwdCB3ZSBzZWUgdGhhdCB0aGUgW3IgbWV0aG9kX251bWJlcl0gZnVuY3Rpb24gaXMgdXNlZnVsIGluIGRldGVybWluaW5nIHRoZSB0eXBlIG9mIHJlcXVlc3QgYmVpbmcgcHJvY2Vzc2VkLiAgTV9QT1NUIGlzIGFuIEFwYWNoZSBBUEkgY29uc3RhbnQgdGhhdCBzcGVjaWZpZXMgYSByZXF1ZXN0IGFzIGFuIGh0dHAgUE9TVCByZXF1ZXN0IHR5cGUuICBUaGVyZSBhcmUgc2V2ZXJhbCBvdGhlciByZXF1ZXN0IHR5cGVzIGRlZmluZWQgaW4gdGhlIEFwYWNoZSBBUEkgYWxzbywgdGhlIG90aGVyIG1vc3QgdXNlZnVsIG9uZSB3aWxsIGJlIE1fR0VULiAgSWYgdGhlIHJlcXVlc3QgcHJvY2Vzc2VkIGluIHRoZSBleGFtcGxlLnRtIHNjcmlwdCBpcyBhIFBPU1QgdGhlbiB3ZSBtYWtlIGEgY2FsbCB0byByZWFkX3Bvc3QgdG8gcGFyc2UgdGhlIFBPU1QgZGF0YSBhbmQgc3RvcmUgdGhlIHJlc3VsdHMgaW4gdGhlIGFycmF5IHByYW0uICBOZXh0IHdlIGluaXRpYWxpemUgdGhlIGVudmlyb25tZW50IHdpdGggYSBjYWxsIHRvIFthcF9jcmVhdGVfZW52aXJvbm1lbnRdLCB0aGlzIHdpbGwgc2V0IHVwIHRoZSBlbnYgYXJyYXkgd2l0aCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuICBOb3RpY2UgdGhhdCBBcGFjaGUgd2lsbCBhZGQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgY29ycmVzcG9uZCB0byBDR0kgcGFyYW1ldGVycywgdGhpcyBpcyB1c2VmdWwgZm9yIGVtdWxhdGluZyBDR0kgZnVuY3Rpb25hbGl0eSBhbmQgYWxsb3dzIHBvcnRpbmcgb2YgQ0dJIHNjcmlwdHMgdG8gYmUgbW9yZSBmbGV4aWJsZS4gIFRoZSBjb250ZW50X2hhbmRsZXIgaW4gZXhhbXBsZS50bSB3aWxsIGVzc2VudGlhbGx5IHByaW50IGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgYW55IHByYW0gdmFyaWFibGVzIHRoYXQgd2VyZSBzZXQgZnJvbSBhIFBPU1QgcmVxdWVzdC4gIFRoZSByZW1haW5kZXIgb2YgdGhlIHNjcmlwdCB1c2VzIHRoZSBwcm92aWRlZCBvdXRwdXQgcHJvY2VkdXJlIHRvIHNlbmQgYSBibG9jayBvZiBIVE1MIHRvIHRoZSBjbGllbnQsIG5vdGljZSB0aGF0IHByb2NlZHVyZSBjYWxscyBpbiBvdXRwdXQgd2lsbCB3b3JrIGFzIGV4cGVjdGVkLgoKQWRkaXRpb25hbCBSZXNvdXJjZXMKCk1vZF90Y2wgaXMgcGFydCBvZiB0aGUgVGNsIEFwYWNoZSBQcm9qZWN0IGxvY2F0ZWQgYXQgaHR0cDovL3RjbC5hcGFjaGUub3JnLiAgSW5mb3JtYXRpb24gYWJvdXQgdGhlIFRjbCBBcGFjaGUgUHJvamVjdCBhbmQgb3RoZXIgQXBhY2hlIG1vZHVsZXMgdXNpbmcgVGNsIGNhbiBiZSBmb3VuZCBoZXJlLiAgSW5mb3JtYXRpb24gb24gZ2VuZXJhbCBUY2wgdG9waWNzIGFuZCBkZXZlbG9wbWVudCBpcyBsb2NhdGVkIGF0IGh0dHA6Ly93d3cudGNsLnRrLgo=