ZGlmZiAtLWdpdCBhLy5jbGFzc3BhdGggYi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDdkYzBjLi4wMDAwMDAwCi0tLSBhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08Y2xhc3NwYXRoPgotICA8Y2xhc3NwYXRoZW50cnkgZXhjbHVkaW5nPSIiIGtpbmQ9InNyYyIgcGF0aD0ic3JjXGphdmEiLz4KLSAgPGNsYXNzcGF0aGVudHJ5IG91dHB1dD0idGFyZ2V0XHRlc3QtY2xhc3NlcyIga2luZD0ic3JjIiBwYXRoPSJzcmNcdGVzdCIvPgotICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJNQVZFTl9SRVBPL2p1bml0L2phcnMvanVuaXQtMy44LjEuamFyIi8+Ci0gIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJNQVZFTl9SRVBPL2NvbW1vbnMtamV4bC9qYXJzL2NvbW1vbnMtamV4bC0xLjAuamFyIi8+Ci0gIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik1BVkVOX1JFUE8veG1sLWFwaXMvamFycy94bWwtYXBpcy0xLjAuYjIuamFyIi8+Ci0gIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik1BVkVOX1JFUE8vY29tbW9ucy1iZWFudXRpbHMvamFycy9jb21tb25zLWJlYW51dGlscy0xLjcuMC5qYXIiLz4KLSAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iTUFWRU5fUkVQTy9jb21tb25zLWNvbGxlY3Rpb25zL2phcnMvY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIi8+Ci0gIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik1BVkVOX1JFUE8vY29tbW9ucy1sb2dnaW5nL2phcnMvY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciIvPgotICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJNQVZFTl9SRVBPL2RvbTRqL2phcnMvZG9tNGotMS41LmphciIvPgotICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJNQVZFTl9SRVBPL2pheGVuL2phcnMvamF4ZW4tMS4xLWJldGEtMi5qYXIiLz4KLSAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iTUFWRU5fUkVQTy94ZXJjZXMvamFycy94ZXJjZXMtMi4yLjEuamFyIi8+Ci0gIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik1BVkVOX1JFUE8vc2VydmxldGFwaS9qYXJzL3NlcnZsZXRhcGktMi4zLmphciIvPgotICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJNQVZFTl9SRVBPL2NvbW1vbnMtY2xpL2phcnMvY29tbW9ucy1jbGktMS4wLmphciIvPgotICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJNQVZFTl9SRVBPL2NvbW1vbnMtbGFuZy9qYXJzL2NvbW1vbnMtbGFuZy0yLjAuamFyIi8+Ci0gIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik1BVkVOX1JFUE8vY29tbW9ucy1kaXNjb3ZlcnkvamFycy9jb21tb25zLWRpc2NvdmVyeS0yMDAzMDIxMS4yMTMzNTYuamFyIi8+Ci0gIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik1BVkVOX1JFUE8vZm9yZWhlYWQvamFycy9mb3JlaGVhZC0xLjAtYmV0YS01LmphciIvPgotICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJNQVZFTl9SRVBPL2pzdGwvamFycy9qc3RsLTEuMC42LmphciIvPgotICA8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJ0YXJnZXRcY2xhc3NlcyIvPgotPC9jbGFzc3BhdGg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvLmN2c2lnbm9yZSBiLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMjY1YmIuLjAwMDAwMDAKLS0tIGEvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLWJ1aWxkLnByb3BlcnRpZXMKLWRlbW9wYWdlLmh0bWwKLWRpc3QKLWpjb3ZlcmFnZS5zZXIKLWptcwotanVuaXQqLnByb3BlcnRpZXMKLWxpYgotc25hcHNob3QuYmF0Ci10YXJnZXQKLXRtcAotKi5sb2cKLSouZ3oKZGlmZiAtLWdpdCBhLy5wcm9qZWN0IGIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZDk0ZTEuLjAwMDAwMDAKLS0tIGEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08cHJvamVjdERlc2NyaXB0aW9uPgotICA8bmFtZT5jb21tb25zLWplbGx5PC9uYW1lPgotICA8Y29tbWVudD5KZWxseSBpcyBhIEphdmEgYW5kIFhNTCBiYXNlZCBzY3JpcHRpbmcgZW5naW5lLiBKZWxseSBjb21iaW5lcyB0aGUgYmVzdCBpZGVhcyBmcm9tIEpTVEwsIFZlbG9jaXR5LCBEVlNMLCBBbnQgYW5kIENvY29vbiBhbGwgdG9nZXRoZXIgaW4gYSBzaW1wbGUgeWV0IHBvd2VyZnVsIHNjcmlwdGluZyBlbmdpbmUuPC9jb21tZW50PgotICA8cHJvamVjdHM+Ci0gIDwvcHJvamVjdHM+Ci0gIDxidWlsZFNwZWM+Ci0gICAgPGJ1aWxkQ29tbWFuZD4KLSAgICAgIDxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotICAgICAgPGFyZ3VtZW50cz4KLSAgICAgIDwvYXJndW1lbnRzPgotICAgIDwvYnVpbGRDb21tYW5kPgotICA8L2J1aWxkU3BlYz4KLSAgPG5hdHVyZXM+Ci0gICAgPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0gIDwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0tFWVMgYi9LRVlTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDNiMzA3Li4wMDAwMDAwCi0tLSBhL0tFWVMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1UaGlzIGZpbGUgY29udGFpbnMgdGhlIFBHUCBrZXlzIG9mIHZhcmlvdXMgZGV2ZWxvcGVycy4KLVBsZWFzZSBkb24ndCB1c2UgdGhlbSBmb3IgZW1haWwgdW5sZXNzIHlvdSBoYXZlIHRvLiBUaGVpciBtYWluCi1wdXJwb3NlIGlzIGNvZGUgc2lnbmluZy4KLQotVXNlcnM6IHBncCA8IEtFWVMKLURldmVsb3BlcnM6IAotCXBncCAta3hhIDx5b3VyIG5hbWU+IGFuZCBhcHBlbmQgaXQgdG8gdGhpcyBmaWxlLgotCShwZ3BrIC1sbCA8eW91ciBuYW1lPiAmJiBwZ3BrIC14YSA8eW91ciBuYW1lPikgPj4gdGhpcyBmaWxlLgotICAgICAgICAoZ3BnIC0tbGlzdC1zaWdzIDx5b3VyIG5hbWU+Ci0gICAgICAgICAgICAgJiYgZ3BnIC0tYXJtb3IgLS1leHBvcnQgPHlvdXIgbmFtZT4pID4+IHRoaXMgZmlsZS4KLSAgICBVc2UgZ3BnIC0tYXJtb3VyIC0tZGV0YWNoLXNpZ24gLS1kZWZhdWx0LWtleT1ZT1VSTkFNRSBGSUxFCi0KLXB1YiAgMTAyNEQvNjg4M0M4NDYgMjAwNC0wOC0wMyBEaW9uIEdpbGxhcmQgPGRpb25AYXBhY2hlLm9yZz4KLXNpZyAzICAgICAgIDY4ODNDODQ2IDIwMDQtMDgtMDMgICBEaW9uIEdpbGxhcmQgPGRpb25AYXBhY2hlLm9yZz4KLXN1YiAgMTAyNGcvMzJFOTU5OTUgMjAwNC0wOC0wMwotc2lnICAgICAgICAgNjg4M0M4NDYgMjAwNC0wOC0wMyAgIERpb24gR2lsbGFyZCA8ZGlvbkBhcGFjaGUub3JnPgotLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi1WZXJzaW9uOiBHbnVQRyB2MS4yLjQgKEN5Z3dpbikKLQotbVFHaUJFRVBIemtSQkFDcXFIK0E5QkZCUTMvTlNPZmowRHMvOFFYcUc3RDY2bFZ4cnZheldScGpoMjVPdjdaMAotMzZ0NEpOMmdrL3ZNbDhVQ0MrdnB5c1V3b2ZXSkx6RE9XSXBZdUE1b2dUWlJueTMxNURiblRzSHNkYmtrT1E5eQotRVNraGNRWmlmQU1DMmxyTFRNaWxxeTUzWUtkK1JhYkxvajdXRWFGWGo1OXUzK0J4OFhmOWlOT1BZd0Nnek0rKwotcEUzYUZaTUZpK1NMekhGdEprNTUvVmtEL0F4SWJMS291d2pDdVlmbFFTb3ZQZ21ISmhQMnBuVkpNYTFVZ1h2OQotUFlucGpyQkJma3hEVlV4RXU3NHhaTjdBcC93c3NZckU1SzdOTUd2K1BUM2N1dG9iT1hWUHBnMy96ZWNtNDhYYgotWTdiK0N2c2sxUHRzbW50VDJWR3BMWG5LVWhHeTZFd3J6aS9XdWl4NFovemFsd0l5dmIyMzF3WHNRYzY3Z0dRbwotRFFRb0EvOW5icVlsVkJiZGU0L0VMUnV4TU9WWGdoa3cxN2d1elNaWHMrMGplMG9PbkhUQUNHNXg0Ukl3aDBDVgotc3kwZ242RDZCU1YvRUNNUnc3Ujk2UXJkUW5xT0V4akJVZGVub0lrbVREL3BoV0tvcWFuZ2lmUnRSZmxRODZnbQotVjYwek9SRjdoNDBnT3MxK1B5Z284VG1rYXJRK2o1ZmdOZi8wSGVvOGFOc2grMFJFZXJRZVJHbHZiaUJIYVd4cwotWVhKa0lEeGthVzl1UUdGd1lXTm9aUzV2Y21jK2lGNEVFeEVDQUI0RkFrRVBIemtDR3dNR0N3a0lCd01DQXhVQwotQXdNV0FnRUNIZ0VDRjRBQUNna1FxQU0vMldpRHlFYlVBZ0NndTVlOVA5b0RKRWJPOXI3bHc1U3FhOUhCdzcwQQotblJ1SVp0Z0VLVFE0WjFUcGIxMGVJNmsvSVh4OHVRRU5CRUVQSHo0UUJBRHV1M01IMG9CMnNHUkdoWEVEYTNFWgotQmRIbGpwNGFGVFNaSzZNQU1BbGl5N2VSVFNKY09SYkhyMng2UTB3Rk5CZDZyK1RTbnRXRzVOV3Jod2N4Q21RUgotSDNobGJac0Q3U1kxT3FDbGh0L1hTdi90aVJEUStvQVZUVkxxVGhFM2JrY1VZZW9WSHpnZnFUODZpMU5tR2NueQotSUpqNXI4eUJBMXNWRHlwNDJBRGlZd0FEQlFQK05xOEluVVdsaWVuS2dleFBERkF1WFhQcjlsZzZpVU1ScEVxZQotYnBxU0RocGVEVHZrbXZxMXhhVVQ5WXQrRkRYN2RiLzFkMWkzZkpUSVg3ZHlkby8yVnc3MGY3VU9ETnZXTXRRVAotdmVhRVhjaFhpSDN5NjJ3OG5ZM1pvZ01HaktINUREWHFldjJTZWxEU3ZHY1hFV3NHWnhQdnV3aDBjR3VhaHlDaQotZ1lwV0thNklTUVFZRVFJQUNRVUNRUThmUGdJYkRBQUtDUkNvQXovWmFJUElSbHRUQUo0aFplU1dUeWRzMENKZAotRU45ejY2VXBkY1phK3dDZ3lUYXlnU1VDaHRReEFwRU50ZWdnWEJZWG0rND0KLT1TaEpYCi0tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvTElDRU5TRS50eHQgYi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxZWViOS4uMDAwMDAwMAotLS0gYS9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL05PVElDRS50eHQgYi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjU5ODA1Li4wMDAwMDAwCi0tLSBhL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCmRpZmYgLS1naXQgYS9SRUFETUUudHh0IGIvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAyZjA0Yy4uMDAwMDAwMAotLS0gYS9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUplbGx5Ci09PT09PQotCi1UaGUgcHJpbWFyeSBidWlsZCB0b29sIGZvciB0aGlzIHByb2plY3QgaXMgTWF2ZW4uIAotU28gYWxsIHlvdSBzaG91bGQgbmVlZCB0byBkbyBpcyBpbnN0YWxsIE1hdmVuIGFuZCBqdXN0IHR5cGUKLQotCW1hdmVuCi0KLVNvbWUgY29tbW9uIG1hdmVuIGdvYWxzIGZvciBidWlsZGluZyBhbmQgdGVzdGluZyB0aGlzIHByb2plY3QgYXJlCi0KLQljbGVhbiAgICA6IGNsZWFucyB1cCB0aGUgYnVpbGQgc28gbmV3IGJ1aWxkcyB3aWxsIHN0YXJ0IGZyb20gZnJlc2gKLQl0ZXN0ICAgICA6IGp1c3QgcnVuIHRoZSB1bml0IHRlc3RzCi0JamFyICAgICAgOiBjb21waWxlcywgcnVucyB1bml0IHRlc3RzIGFuZCBpZiB0aGV5IHdvcmsgYnVpbGQgdGhlIGphcgotCWphdmFkb2MgIDogY3JlYXRlcyB0aGUgamF2YWRvYwotCXNpdGUgICAgIDogYnVpbGQgdGhlIGNvbXBsZXRlIGRvY3VtZW50YXRpb24gd2l0aCByZXBvcnRzLCBqYXZhZG9jIGV0YwotCWRpc3QgICAgIDogY3JlYXRlcyBhIGRpc3RyaWJ1dGlvbgotCi0KLUplbGx5IGNvbnRhaW5zIGEgbnVtYmVyIG9mIGluZGl2aWR1YWwgdGFnIGxpYnJhcmllcyB3aGljaCBjYW4gYmUgYnVpbHQgCi1ieSB0aGVtc2VsdmVzIGJ5IGNoYW5naW5nIHRvIHRoZSBkaXJlY3RvcnkgamVsbHktdGFncy9mb28gYW5kIHBlcmZvcm1pbmcgdGhlCi1hYm92ZSBjb21tYW5kcyB0byBidWlsZCB0aGUgbGlicmFyeSB5b3UncmUgaW50ZXJlc3RlZCBpbi4KLQotCQkJCi1Gb3IgbW9yZSBoZWxwIHVzaW5nIE1hdmVuIHBsZWFzZSBnbyB0bwotCi0gIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnCi0KLU1hdmVuIGFsc28gc3VwcG9ydHMgdGhlIGF1dG8tZ2VuZXJhdGlvbiBvZiBBbnQgYnVpbGQgZmlsZXMgc28KLXlvdSBtYXkgYWxzbyBiZSBhYmxlIHRvIHVzZSBBbnQgdG8gYnVpbGQgdGhlIGNvZGUuCi0KLUVuam95IQpkaWZmIC0tZ2l0IGEvYnVpbGQucHJvcGVydGllcy5zYW1wbGUgYi9idWlsZC5wcm9wZXJ0aWVzLnNhbXBsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZhZTBkYi4uMDAwMDAwMAotLS0gYS9idWlsZC5wcm9wZXJ0aWVzLnNhbXBsZQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jIAotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUyBBIE0gUCBMIEUgIEIgVSBJIEwgRCAgUCBSIE8gUCBFIFIgVCBJIEUgUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgVGhvc2UgdXNpbmcKLSNtYXZlbi51c2VybmFtZT1yZG9ua2luCi0jYXBhY2hlLmN2cz1sc2VydmVyOnJkb25raW5AY3ZzLmFwYWNoZS5vcmc6L2hvbWUvY3ZzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVpbGQueG1sIGIvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTNjOTdlLi4wMDAwMDAwCi0tLSBhL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tYnVpbGQueG1sIGdlbmVyYXRlZCBieSBtYXZlbiBmcm9tIHByb2plY3QueG1sIHZlcnNpb24gMS4wLWJldGEtNS1TTkFQU0hPVAotICBvbiBkYXRlIE9jdG9iZXIgMTggMjAwNCwgdGltZSAxNjIyLS0+Ci0KLTxwcm9qZWN0IGRlZmF1bHQ9ImphciIgbmFtZT0iY29tbW9ucy1qZWxseSIgYmFzZWRpcj0iLiI+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkZWZhdWx0dGFyZ2V0ZGlyIiB2YWx1ZT0idGFyZ2V0Ij4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYmRpciIgdmFsdWU9InRhcmdldC9saWIiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC9jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Y2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0idGVzdHJlcG9ydGRpciIgdmFsdWU9InRhcmdldC90ZXN0LXJlcG9ydHMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZGlzdGRpciIgdmFsdWU9ImRpc3QiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iamF2YWRvY2RpciIgdmFsdWU9ImRpc3QvZG9jcy9hcGkiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZmluYWwubmFtZSIgdmFsdWU9ImNvbW1vbnMtamVsbHktMS4wLWJldGEtNS1TTkFQU0hPVCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwYXRoIGlkPSJidWlsZC5jbGFzc3BhdGgiPgotICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamFyIj4KLSAgICAgIDwvaW5jbHVkZT4KLSAgICA8L2ZpbGVzZXQ+Ci0gIDwvcGF0aD4KLSAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0ibyBJbml0aWFsaXplcyBzb21lIHByb3BlcnRpZXMiPgotICAgIDxta2RpciBkaXI9IiR7bGliZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJub2dldCI+Ci0gICAgICA8ZXF1YWxzIGFyZzI9Im9ubHkiIGFyZzE9IiR7YnVpbGQuc3lzY2xhc3NwYXRofSI+Ci0gICAgICA8L2VxdWFscz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgICA8IS0tVGVzdCBpZiBKVU5JVCBpcyBwcmVzZW50IGluIEFOVCBjbGFzc3BhdGgtLT4KLQotICAgIDxhdmFpbGFibGUgcHJvcGVydHk9Ikp1bml0LnByZXNlbnQiIGNsYXNzbmFtZT0ianVuaXQuZnJhbWV3b3JrLlRlc3QiPgotICAgIDwvYXZhaWxhYmxlPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXNjcmlwdGlvbj0ibyBDb21waWxlIHRoZSBjb2RlIiBkZXBlbmRzPSJnZXQtZGVwcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHtjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvamF2YSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImJ1aWxkLmNsYXNzcGF0aCI+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICAgIDxjb3B5IHRvZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL2phdmEiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJqYXIiIGRlc2NyaXB0aW9uPSJvIENyZWF0ZSB0aGUgamFyIiBkZXBlbmRzPSJjb21waWxlLHRlc3QiPgotICAgIDxqYXIgamFyZmlsZT0iJHtkZWZhdWx0dGFyZ2V0ZGlyfS8ke2ZpbmFsLm5hbWV9LmphciIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCIgYmFzZWRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0ibyBDbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIGRpcmVjdG9yaWVzIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGlzdGRpcn0iPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgYSBkaXN0cmlidXRpb24iIGRlcGVuZHM9ImphciwgamF2YWRvYyI+Ci0gICAgPG1rZGlyIGRpcj0iZGlzdCI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29weSB0b2Rpcj0iZGlzdCI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iIGluY2x1ZGVzPSIqLmphciI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iIGluY2x1ZGVzPSJMSUNFTlNFKiwgUkVBRE1FKiI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0ibyBSdW4gdGhlIHRlc3QgY2FzZXMiIGlmPSJ0ZXN0LmZhaWx1cmUiIGRlcGVuZHM9ImludGVybmFsLXRlc3QiPgotICAgIDxmYWlsIG1lc3NhZ2U9IlRoZXJlIHdlcmUgdGVzdCBmYWlsdXJlcy4iPgotICAgIDwvZmFpbD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iaW50ZXJuYWwtdGVzdCIgaWY9Ikp1bml0LnByZXNlbnQiIGRlcGVuZHM9Imp1bml0LXByZXNlbnQsY29tcGlsZS10ZXN0cyI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8anVuaXQgZGlyPSIuLyIgZmFpbHVyZXByb3BlcnR5PSJ0ZXN0LmZhaWx1cmUiIHByaW50U3VtbWFyeT0ieWVzIiBmb3JrPSJ0cnVlIiBoYWx0b25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJiYXNlZGlyIiB2YWx1ZT0iLiI+Ci0gICAgICA8L3N5c3Byb3BlcnR5PgotICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Zm9ybWF0dGVyIHVzZWZpbGU9ImZhbHNlIiB0eXBlPSJwbGFpbiI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxwYXRoIHJlZmlkPSJidWlsZC5jbGFzc3BhdGgiPgotICAgICAgICA8L3BhdGg+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL1Rlc3QqLmphdmEiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgPC9qdW5pdD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0ianVuaXQtcHJlc2VudCIgdW5sZXNzPSJKdW5pdC5wcmVzZW50IiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8ZWNobz49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gV0FSTklORyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTwvZWNobz4KLSAgICA8ZWNobz5KdW5pdCBpc24ndCBwcmVzZW50IGluIHlvdXIgJHtBTlRfSE9NRX0vbGliIGRpcmVjdG9yeS4gVGVzdHMgbm90IGV4ZWN1dGVkLjwvZWNobz4KLSAgICA8ZWNobz49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTwvZWNobz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZS10ZXN0cyIgaWY9Ikp1bml0LnByZXNlbnQiIGRlcGVuZHM9Imp1bml0LXByZXNlbnQsY29tcGlsZSI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy90ZXN0Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPHBhdGggcmVmaWQ9ImJ1aWxkLmNsYXNzcGF0aCI+Ci0gICAgICAgIDwvcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgICA8Y29weSB0b2Rpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLyoiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamVsbHkiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhzbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5ybmciPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouZHRkIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouaHRtbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MiIGRlc2NyaXB0aW9uPSJvIEdlbmVyYXRlIGphdmFkb2MiIGRlcGVuZHM9ImdldC1kZXBzIj4KLSAgICA8bWtkaXIgZGlyPSIke2phdmFkb2NkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDx0c3RhbXA+Ci0gICAgICA8Zm9ybWF0IHBhdHRlcm49IjIwMDIteXl5eSIgcHJvcGVydHk9InllYXIiPgotICAgICAgPC9mb3JtYXQ+Ci0gICAgPC90c3RhbXA+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvcHlyaWdodCIgdmFsdWU9IkNvcHlyaWdodCAmYW1wO2NvcHk7ICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIiB2YWx1ZT0iY29tbW9ucy1qZWxseSAxLjAtYmV0YS01LVNOQVBTSE9UIEFQSSI+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgICA8amF2YWRvYyB1c2U9InRydWUiIHByaXZhdGU9InRydWUiIGRlc3RkaXI9IiR7amF2YWRvY2Rpcn0iIGF1dGhvcj0idHJ1ZSIgdmVyc2lvbj0idHJ1ZSIgc291cmNlcGF0aD0ic3JjL2phdmEiIHBhY2thZ2VuYW1lcz0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LioiPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPHBhdGggcmVmaWQ9ImJ1aWxkLmNsYXNzcGF0aCI+Ci0gICAgICAgIDwvcGF0aD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWRvYz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iZ2V0LWRlcHMiIHVubGVzcz0ibm9nZXQiIGRlcGVuZHM9ImluaXQiPgotICAgIDwhLS1Qcm94eSBzZXR0aW5ncyB3b3JrcyBvbmx5IHdpdGggYSBKREsgMS4yIGFuZCBoaWdoZXIuLS0+Ci0KLSAgICA8c2V0cHJveHk+Ci0gICAgPC9zZXRwcm94eT4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWpleGwtMS4wLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWpleGwvamFycy9jb21tb25zLWpleGwtMS4wLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veG1sLWFwaXMtMS4wLmIyLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94bWwtYXBpcy9qYXJzL3htbC1hcGlzLTEuMC5iMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtYmVhbnV0aWxzLTEuNy4wLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWJlYW51dGlscy9qYXJzL2NvbW1vbnMtYmVhbnV0aWxzLTEuNy4wLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtY29sbGVjdGlvbnMvamFycy9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1sb2dnaW5nL2phcnMvY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vZG9tNGotMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9kb200ai9qYXJzL2RvbTRqLTEuNS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2pheGVuLTEuMS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2pheGVuL2phcnMvamF4ZW4tMS4xLWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3hlcmNlcy0yLjIuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veGVyY2VzL2phcnMveGVyY2VzLTIuMi4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vc2VydmxldGFwaS0yLjMuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3NlcnZsZXRhcGkvamFycy9zZXJ2bGV0YXBpLTIuMy5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtY2xpLTEuMC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1jbGkvamFycy9jb21tb25zLWNsaS0xLjAuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWxhbmctMi4wLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWxhbmcvamFycy9jb21tb25zLWxhbmctMi4wLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1kaXNjb3ZlcnktMjAwMzAyMTEuMjEzMzU2LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWRpc2NvdmVyeS9qYXJzL2NvbW1vbnMtZGlzY292ZXJ5LTIwMDMwMjExLjIxMzM1Ni5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2ZvcmVoZWFkLTEuMC1iZXRhLTUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2ZvcmVoZWFkL2phcnMvZm9yZWhlYWQtMS4wLWJldGEtNS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2pzdGwtMS4wLjYuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2pzdGwvamFycy9qc3RsLTEuMC42LmphciI+Ci0gICAgPC9nZXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtbWF2ZW4iPgotICAgIDxnZXQgZGVzdD0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBzcmM9IiR7cmVwb30vbWF2ZW4vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8dW5qYXIgZGVzdD0iJHttYXZlbi5ob21lfSIgc3JjPSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L3VuamFyPgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzLy5jdnNpZ25vcmUgYi9qZWxseS10YWdzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMjFjODguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi10YXJnZXQKLW1hdmVuLmxvZwpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hbnQvLmN2c2lnbm9yZSBiL2plbGx5LXRhZ3MvYW50Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhOWIwODQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9hbnQvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotbWF2ZW4ubG9nCi10YXJnZXQKLXZlbG9jaXR5LmxvZwotbGliCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2FudC9idWlsZC54bWwgYi9qZWxseS10YWdzL2FudC9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MGM3MGYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9hbnQvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS1idWlsZC54bWwgZ2VuZXJhdGVkIGJ5IG1hdmVuIGZyb20gcHJvamVjdC54bWwgdmVyc2lvbiAxLjAtU05BUFNIT1QKLSAgb24gZGF0ZSBNYXkgMjQgMjAwNCwgdGltZSAyMzAxLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXIiIG5hbWU9ImNvbW1vbnMtamVsbHktdGFncy1hbnQiIGJhc2VkaXI9Ii4iPgotICA8cHJvcGVydHkgbmFtZT0iZGVmYXVsdHRhcmdldGRpciIgdmFsdWU9InRhcmdldCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJkaXIiIHZhbHVlPSJ0YXJnZXQvbGliIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXNkaXIiIHZhbHVlPSJ0YXJnZXQvY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Y2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0idGVzdHJlcG9ydGRpciIgdmFsdWU9InRhcmdldC90ZXN0LXJlcG9ydHMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZGlzdGRpciIgdmFsdWU9ImRpc3QiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iamF2YWRvY2RpciIgdmFsdWU9ImRpc3QvZG9jcy9hcGkiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZmluYWwubmFtZSIgdmFsdWU9ImNvbW1vbnMtamVsbHktdGFncy1hbnQtMS4wLVNOQVBTSE9UIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0ibyBJbml0aWFsaXplcyBzb21lIHByb3BlcnRpZXMiPgotICAgIDxta2RpciBkaXI9IiR7bGliZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJub2dldCI+Ci0gICAgICA8ZXF1YWxzIGFyZzI9Im9ubHkiIGFyZzE9IiR7YnVpbGQuc3lzY2xhc3NwYXRofSI+Ci0gICAgICA8L2VxdWFscz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249Im8gQ29tcGlsZSB0aGUgY29kZSIgZGVwZW5kcz0iZ2V0LWRlcHMiPgotICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7Y2xhc3Nlc2Rpcn0iIGRlcHJlY2F0aW9uPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSIgb3B0aW1pemU9ImZhbHNlIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIj4KLSAgICAgIDxzcmM+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL2phdmEiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9zcmM+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgICA8Y29weSB0b2Rpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy9qYXZhIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgICA8Y29weSB0b2Rpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamVsbHkiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhzbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5ybmciPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouZHRkIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouaHRtbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphciIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIHRoZSBqYXIiIGRlcGVuZHM9ImNvbXBpbGUsdGVzdCI+Ci0gICAgPGphciBqYXJmaWxlPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiIGJhc2VkaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgIDwvamFyPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249Im8gQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBkaXJlY3RvcmllcyI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iPgotICAgIDwvZGVsZXRlPgotICAgIDxkZWxldGUgZGlyPSIke2Rpc3RkaXJ9Ij4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIGEgZGlzdHJpYnV0aW9uIiBkZXBlbmRzPSJqYXIsIGphdmFkb2MiPgotICAgIDxta2RpciBkaXI9ImRpc3QiPgotICAgIDwvbWtkaXI+Ci0gICAgPGNvcHkgdG9kaXI9ImRpc3QiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2RlZmF1bHR0YXJnZXRkaXJ9IiBpbmNsdWRlcz0iKi5qYXIiPgotICAgICAgPC9maWxlc2V0PgotICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRlcz0iTElDRU5TRSosIFJFQURNRSoiPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249Im8gUnVuIHRoZSB0ZXN0IGNhc2VzIiBpZj0idGVzdC5mYWlsdXJlIiBkZXBlbmRzPSJpbnRlcm5hbC10ZXN0Ij4KLSAgICA8ZmFpbCBtZXNzYWdlPSJUaGVyZSB3ZXJlIHRlc3QgZmFpbHVyZXMuIj4KLSAgICA8L2ZhaWw+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImludGVybmFsLXRlc3QiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdHMiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdHJlcG9ydGRpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGp1bml0IGRpcj0iLi8iIGZpbHRlcnRyYWNlPSJmYWxzZSIgZmFpbHVyZXByb3BlcnR5PSJ0ZXN0LmZhaWx1cmUiIHByaW50U3VtbWFyeT0ieWVzIiBmb3JrPSJ0cnVlIiBoYWx0b25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJiYXNlZGlyIiB2YWx1ZT0iLiI+Ci0gICAgICA8L3N5c3Byb3BlcnR5PgotICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Zm9ybWF0dGVyIHVzZWZpbGU9ImZhbHNlIiB0eXBlPSJwbGFpbiI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL1Rlc3QqLmphdmEiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgPC9qdW5pdD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZS10ZXN0cyIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy90ZXN0Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamF2YWRvYyIgZGVzY3JpcHRpb249Im8gR2VuZXJhdGUgamF2YWRvYyIgZGVwZW5kcz0iamFyIj4KLSAgICA8bWtkaXIgZGlyPSIke2phdmFkb2NkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDx0c3RhbXA+Ci0gICAgICA8Zm9ybWF0IHBhdHRlcm49IjIwMDIteXl5eSIgcHJvcGVydHk9InllYXIiPgotICAgICAgPC9mb3JtYXQ+Ci0gICAgPC90c3RhbXA+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvcHlyaWdodCIgdmFsdWU9IkNvcHlyaWdodCAmYW1wO2NvcHk7ICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLWFudCAxLjAtU05BUFNIT1QgQVBJIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxqYXZhZG9jIHVzZT0idHJ1ZSIgcHJpdmF0ZT0idHJ1ZSIgZGVzdGRpcj0iJHtqYXZhZG9jZGlyfSIgYXV0aG9yPSJ0cnVlIiB2ZXJzaW9uPSJ0cnVlIiBzb3VyY2VwYXRoPSJzcmMvamF2YSIgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5hbnQuKiI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFkb2M+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImdldC1kZXBzIiB1bmxlc3M9Im5vZ2V0IiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FudC0xLjUuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vYW50L2phcnMvYW50LTEuNS4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vYW50LW9wdGlvbmFsLTEuNS4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtb3B0aW9uYWwtMS41LjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWdyYW50LTEuMC1iZXRhLTQuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtZ3JhbnQvamFycy9jb21tb25zLWdyYW50LTEuMC1iZXRhLTQuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LXRhZ3MtanVuaXQtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamVsbHkvamFycy9jb21tb25zLWplbGx5LXRhZ3MtanVuaXQtU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LXRhZ3MtdXRpbC1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktdGFncy11dGlsLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1jbGktU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtY2xpL2phcnMvY29tbW9ucy1jbGktU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamV4bC9qYXJzL2NvbW1vbnMtamV4bC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3htbC1hcGlzLTEuMC5iMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veG1sLWFwaXMvamFycy94bWwtYXBpcy0xLjAuYjIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWJlYW51dGlscy0xLjYuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtYmVhbnV0aWxzL2phcnMvY29tbW9ucy1iZWFudXRpbHMtMS42LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtY29sbGVjdGlvbnMvamFycy9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1sb2dnaW5nL2phcnMvY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vZG9tNGotMS41LWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vZG9tNGovamFycy9kb200ai0xLjUtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vamF4ZW4tMS4xLWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vamF4ZW4vamFycy9qYXhlbi0xLjEtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veGVyY2VzLTIuMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94ZXJjZXMvamFycy94ZXJjZXMtMi4yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qdW5pdC0zLjguMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vanVuaXQvamFycy9qdW5pdC0zLjguMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FudC0xLjUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC0xLjUuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtb3B0aW9uYWwtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtb3B0aW9uYWwtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtbWF2ZW4iPgotICAgIDxnZXQgZGVzdD0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBzcmM9IiR7cmVwb30vbWF2ZW4vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8dW5qYXIgZGVzdD0iJHttYXZlbi5ob21lfSIgc3JjPSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L3VuamFyPgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2FudC9tYXZlbi54bWwgYi9qZWxseS10YWdzL2FudC9tYXZlbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYjgyY2MuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9hbnQvbWF2ZW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImphdmE6amFyIj4KLQotICA8IS0tIGRlZmluZSB0aGUgY2xhc3NwYXRoIHVzZWQgdG8gcnVuIGV4YW1wbGVzIC0tPgotICA8Z29hbCBuYW1lPSJjcmVhdGUtY2xhc3NwYXRoIiBwcmVyZXFzPSJqYXZhOmNvbXBpbGUsdGVzdDpjb21waWxlIj4KLSAgICAgICAgPHBhdGggaWQ9InRlc3QuY2xhc3NwYXRoIj4KLSAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke21hdmVuLmJ1aWxkLmRlc3R9Ii8+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0idGFyZ2V0L2NsYXNzZXMiLz4KLSAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIi8+Ci0gICAgICAgICAgICA8cGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiLz4KLSAgICAgICAgPC9wYXRoPgotICA8L2dvYWw+Ci0KLSAgICA8IS0tIGRlbW9zIC0tPgotICA8Z29hbCBuYW1lPSJkZW1vOmZpbGVzZXQiIHByZXJlcXM9ImNyZWF0ZS1jbGFzc3BhdGgiCi0gICAgICAgIGRlc2NyaXB0aW9uPSJBIGRlbW8gb2YgdGhlIGZpbGVTY2FubmVyIHRhZyB0byB3YWxrIEFudCBmaWxlU2V0cyI+Ci0KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseSIgZm9yaz0ieWVzIj4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgICA8YXJnIHZhbHVlPSJzcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYW50L2ZpbGVzY2FubmVyLmplbGx5Ii8+Ci0gICAgPC9qYXZhPgotICA8L2dvYWw+Ci0KLQotICA8Z29hbCBuYW1lPSJkZW1vOmFudGphciIgcHJlcmVxcz0iY3JlYXRlLWNsYXNzcGF0aCIKLSAgICBkZXNjcmlwdGlvbj0iUnVucyBhIHNhbXBsZSB3aGljaCBjcmVhdGVzIGEgamFyIHVzaW5nIHRoZSBBbnQgdGFnIGxpYnJhcnkiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5IiBmb3JrPSJ5ZXMiPgotICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KLSAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9hbnQvZXhhbXBsZV9qYXIuamVsbHkiLz4KLSAgICA8L2phdmE+Ci0gIDwvZ29hbD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hbnQvcHJvamVjdC5wcm9wZXJ0aWVzIGIvamVsbHktdGFncy9hbnQvcHJvamVjdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDE5Y2JjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYW50L3Byb2plY3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jIAotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUCBSIE8gSiBFIEMgVCAgUCBSIE8gUCBFIFIgVCBJIEUgUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2FudC9wcm9qZWN0LnhtbCBiL2plbGx5LXRhZ3MvYW50L3Byb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTE5MzUwLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYW50L3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3Q+Ci0gIDwhLS0KLSAgICBCUklUVExFISBtdXN0IGluY2x1ZGUgJHtiYXNlZGlyfSBsb2NhdGlvbiBvciBNYXZlbiB3aWxsCi0gICAgbm90IHJ1biB0aGlzIHNjcmlwdCBvdXRzaWRlIG9mIHRoZSBiYXNlIGRpcmVjdG9yeQotICAtLT4KLSAgPGV4dGVuZD4ke2Jhc2VkaXJ9Ly4uL3RhZy1wcm9qZWN0LnhtbDwvZXh0ZW5kPgotICA8aWQ+Y29tbW9ucy1qZWxseS10YWdzLWFudDwvaWQ+Ci0gIDxuYW1lPmNvbW1vbnMtamVsbHktdGFncy1hbnQ8L25hbWU+Ci0gIDxjdXJyZW50VmVyc2lvbj4xLjEtU05BUFNIT1Q8L2N1cnJlbnRWZXJzaW9uPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5hbnQ8L3BhY2thZ2U+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICAgICAgVGhpcyBpcyBhIEplbGx5IGludGVyZmFjZSBmb3IgQW50LgotICA8L2Rlc2NyaXB0aW9uPgotICA8c2hvcnREZXNjcmlwdGlvbj5Db21tb25zIEplbGx5IEFudCBUYWcgTGlicmFyeTwvc2hvcnREZXNjcmlwdGlvbj4KLSAgCi0gIDx2ZXJzaW9ucz4KLSAgICA8dmVyc2lvbj4KLSAgICAgIDxpZD4xLjA8L2lkPgotICAgICAgPG5hbWU+MS4wPC9uYW1lPgotICAgICAgPHRhZz5DT01NT05TX0pFTExZX0FOVC0xXzA8L3RhZz4KLSAgICA8L3ZlcnNpb24+Ci0gIDwvdmVyc2lvbnM+Ci0KLSAgPCEtLSA8c2l0ZURpcmVjdG9yeT4vd3d3L2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5L3RhZ3MvYW50PC9zaXRlRGlyZWN0b3J5PgotICA8ZGlzdHJpYnV0aW9uRGlyZWN0b3J5Pi93d3cvamFrYXJ0YS5hcGFjaGUub3JnL2J1aWxkcy9qYWthcnRhLWNvbW1vbnMvamVsbHkvdGFncy9hbnQ8L2Rpc3RyaWJ1dGlvbkRpcmVjdG9yeT4KLSAgPHJlcG9zaXRvcnk+Ci0gICAgPGNvbm5lY3Rpb24+c2NtOmN2czpwc2VydmVyOmFub25jdnNAY3ZzLmFwYWNoZS5vcmc6L2hvbWUvY3ZzcHVibGljOmpha2FydGEtY29tbW9ucy9qZWxseS9qZWxseS10YWdzL2FudC88L2Nvbm5lY3Rpb24+Ci0gICAgPHVybD5odHRwOi8vY3ZzLmFwYWNoZS5vcmcvdmlld2N2cy9qYWthcnRhLWNvbW1vbnMvamVsbHkvamVsbHktdGFncy9hbnQvPC91cmw+Ci0gIDwvcmVwb3NpdG9yeT4KLSAgLS0+Ci0gICAgCi0gIDxkZXBlbmRlbmNpZXM+Ci0gIAotICAgIDwhLS0gU1RBUlQgZm9yIGNvbXBpbGF0aW9uIC0tPgotICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5hbnQ8L2lkPgotICAgICAgPHZlcnNpb24+MS41LjMtMTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+YW50K29wdGlvbmFsPC9pZD4KLSAgICAgIDx2ZXJzaW9uPjEuNS4zLTE8L3ZlcnNpb24+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGd1bXAucHJvamVjdD5hbnQ8L2d1bXAucHJvamVjdD4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+Y29tbW9ucy1ncmFudDwvaWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtYmV0YS00PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8IS0tIEVORCBmb3IgY29tcGlsYXRpb24gLS0+Ci0KLSAgICA8IS0tIFNUQVJUIGZvciB0ZXN0aW5nIC0tPgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWplbGx5PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1qZWxseS10YWdzLWp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgPHVybD5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvamVsbHkvbGlicy9qdW5pdC88L3VybD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtamVsbHk8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWplbGx5LXRhZ3MtdXRpbDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDwhLS0gRU5EIGZvciB0ZXN0aW5nIC0tPgotCi0gICAgPCEtLSBTVEFSVCBmb3IgcnVubmluZyBkZW1vcyAtLT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPmNvbW1vbnMtY2xpPC9pZD4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgIDwhLS0gRU5EIGZvciBydW5uaW5nIGRlbW9zIC0tPgotICA8L2RlcGVuZGVuY2llcz4KLSAgCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2FudC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9hbnQvQW50VGFnLmphdmEgYi9qZWxseS10YWdzL2FudC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9hbnQvQW50VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNWQ5N2IuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9hbnQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYW50L0FudFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5hbnQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuQmVhblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuTWV0aG9kVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NYXBUYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLkJlYW5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuU3RhdGljVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkludHJvc3BlY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2tBZGFwdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2tDb250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRGF0YVR5cGU7Ci0KLS8qKgotICogVGFnIHN1cHBvcnRpbmcgYW50J3MgVGFza3MgYXMgd2VsbCBhcwotICogZHluYW1pYyBydW50aW1lIGJlaGF2aW91ciBmb3IgJ3Vua25vd24nIHRhZ3MuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Ym9iQGVuZy53ZXJrZW4uY29tIj5ib2IgbWN3aGlydGVyPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICovCi1wdWJsaWMgY2xhc3MgQW50VGFnIGV4dGVuZHMgTWFwVGFnU3VwcG9ydCBpbXBsZW1lbnRzIFRhc2tTb3VyY2UgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFudFRhZy5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIGFkZFRhc2tQYXJhbVR5cGVzID0geyBTdHJpbmcuY2xhc3MgfTsKLQotICAgIC8qKiBzdG9yZSB0aGUgbmFtZSBvZiB0aGUgbWFuaWZlc3QgdGFnIGZvciBzcGVjaWFsIGhhbmRsaW5nICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVF9NQU5JRkVTVF9UQUcgPSAibWFuaWZlc3QiOwotCi0gICAgLyoqIFRoZSBuYW1lIG9mIHRoaXMgdGFnLiAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgdGFnTmFtZTsKLQotICAgIC8qKiBUaGUgZ2VuZXJhbCBvYmplY3QgdW5kZXJseWluZyB0aGlzIHRhZy4gKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IG9iamVjdDsKLQotICAgIC8qKiBUYXNrLCBpZiB0aGlzIHRhZyByZXByZXNlbnRzIGEgdGFzay4gKi8KLSAgICBwcm90ZWN0ZWQgVGFzayB0YXNrOwotCi0KLSAgICAvKiogQ29uc3RydWN0IHdpdGggYSBwcm9qZWN0IGFuZCB0YWcgbmFtZS4KLSAgICAgKgotICAgICAqICBAcGFyYW0gdGFnTmFtZSBUaGUgbmFtZSBvbiB0aGUgdGFnLgotICAgICAqLwotICAgIHB1YmxpYyBBbnRUYWcoU3RyaW5nIHRhZ05hbWUpIHsKLSAgICAgICAgdGhpcy50YWdOYW1lID0gdGFnTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIltBbnRUYWc6IG5hbWU9IiArIGdldFRhZ05hbWUoKSArICJdIjsKLSAgICB9Ci0KLSAgICAvLyBUYXNrU291cmNlIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqIFJldHJpZXZlIHRoZSBnZW5lcmFsIG9iamVjdCB1bmRlcmx5aW5nIHRoaXMgdGFnLgotICAgICAqCi0gICAgICogIEByZXR1cm4gVGhlIG9iamVjdCB1bmRlcmx5aW5nIHRoaXMgdGFnLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VGFza09iamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMub2JqZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsbG93cyBuZXN0ZWQgdGFncyB0byBzZXQgYSBwcm9wZXJ0eSBvbiB0aGUgdGFzayBvYmplY3Qgb2YgdGhpcyB0YWcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXNrUHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldFRhc2tPYmplY3QoKTsKLSAgICAgICAgaWYgKCBvYmplY3QgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIHNldEJlYW5Qcm9wZXJ0eSggb2JqZWN0LCBuYW1lLCB2YWx1ZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gZ2V0QW50UHJvamVjdCgpOwotICAgICAgICBTdHJpbmcgdGFnTmFtZSA9IGdldFRhZ05hbWUoKTsKLSAgICAgICAgT2JqZWN0IHBhcmVudE9iamVjdCA9IGZpbmRCZWFuQW5jZXN0b3IoKTsKLSAgICAgICAgT2JqZWN0IHBhcmVudFRhc2sgPSBmaW5kUGFyZW50VGFza09iamVjdCgpOwotCi0gICAgICAgIC8vIGxldHMgYXNzdW1lIHRoYXQgVGFzayBpbnN0YW5jZXMgYXJlIG5vdCBuZXN0ZWQgaW5zaWRlIG90aGVyIFRhc2sgaW5zdGFuY2VzCi0gICAgICAgIC8vIGZvciBleGFtcGxlIDxtYW5pZmVzdD4gaW5zaWRlIGEgPGphcj4gc2hvdWxkIGJlIGEgbmVzdGVkIG9iamVjdCwgd2hlcmUgYXMKLSAgICAgICAgLy8gaWYgdGhlIHBhcmVudCBpcyBub3QgYSBUYXNrIHRoZSA8bWFuaWZlc3Q+IHNob3VsZCBjcmVhdGUgYSBNYW5pZmVzdFRhc2sKLSAgICAgICAgLy8KLSAgICAgICAgLy8gYWxzbyBpdHMgcG9zc2libGUgdG8gaGF2ZSBhIHJvb3QgQW50IHRhZyB3aGljaCBpc24ndCBhIHRhc2ssIHN1Y2ggYXMgd2hlbgotICAgICAgICAvLyBkZWZpbmluZyA8ZmlsZXNldCBpZD0iLi4uIj4uLi48L2ZpbGVzZXQ+Ci0KLSAgICAgICAgT2JqZWN0IG5lc3RlZCA9IG51bGw7Ci0gICAgICAgIGlmIChwYXJlbnRPYmplY3QgIT0gbnVsbCAmJiAhKCBwYXJlbnRUYXNrIGluc3RhbmNlb2YgVGFza0NvbnRhaW5lcikgKSB7Ci0gICAgICAgICAgICBuZXN0ZWQgPSBjcmVhdGVOZXN0ZWRPYmplY3QoIHBhcmVudE9iamVjdCwgdGFnTmFtZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5lc3RlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0YXNrID0gY3JlYXRlVGFzayggdGFnTmFtZSApOwotCi0gICAgICAgICAgICBpZiAodGFzayAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoICJDcmVhdGluZyBhbiBhbnQgVGFzayBmb3IgbmFtZTogIiArIHRhZ05hbWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobSBmb2xsb3dzIHRoZSBsaWZldGltZSBvZiBhIHRhZwotICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYW50L21hbnVhbC9kZXZlbG9wLmh0bWwjd3JpdGluZ293bnRhc2sKLSAgICAgICAgICAgICAgICAvLyBraW5kbHkgcmVjb21tZW5kZWQgYnkgU3RlZmFuIEJvZGV3aWcKLQotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhbmQgc2V0IGl0cyBwcm9qZWN0IHJlZmVyZW5jZQotICAgICAgICAgICAgICAgIGlmICggdGFzayBpbnN0YW5jZW9mIFRhc2tBZGFwdGVyICkgewotICAgICAgICAgICAgICAgICAgICBzZXRPYmplY3QoICgoVGFza0FkYXB0ZXIpdGFzaykuZ2V0UHJveHkoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0T2JqZWN0KCB0YXNrICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gc2V0IHRoZSB0YXNrIElEIGlmIG9uZSBpcyBnaXZlbgotICAgICAgICAgICAgICAgIE9iamVjdCBpZCA9IGdldEF0dHJpYnV0ZXMoKS5yZW1vdmUoICJpZCIgKTsKLSAgICAgICAgICAgICAgICBpZiAoIGlkICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCAoU3RyaW5nKSBpZCwgdGFzayApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vICMjIyB3ZSBtaWdodCB3YW50IHRvIHNwb29mIGEgVGFyZ2V0IHNldHRpbmcgaGVyZQotCi0gICAgICAgICAgICAgICAgLy8gbm93IGxldHMgaW5pdGlhbGl6ZQotICAgICAgICAgICAgICAgIHRhc2suaW5pdCgpOwotCi0gICAgICAgICAgICAgICAgLy8gbm93IGxldHMgaW52b2tlIHRoZSBib2R5IHRvIGNhbGwgYWxsIHRoZSBjcmVhdGVYWFgoKSBvciBhZGRYWFgoKSBtZXRob2RzCi0gICAgICAgICAgICAgICAgU3RyaW5nIGJvZHkgPSBnZXRCb2R5VGV4dCgpOwotCi0gICAgICAgICAgICAgICAgLy8gbm93IGxldHMgc2V0IGFueSBhdHRyaWJ1dGVzIG9mIHRoaXMgdGFnLi4uCi0gICAgICAgICAgICAgICAgc2V0QmVhblByb3BlcnRpZXMoKTsKLQotICAgICAgICAgICAgICAgIC8vIG5vdyBsZXRzIHNldCB0aGUgYWRkVGV4dCgpIG9mIHRoZSBib2R5IGNvbnRlbnQsIGlmIGl0cyBhcHBsaWNhYWJsZQotICAgICAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBNZXRob2RVdGlscy5nZXRBY2Nlc3NpYmxlTWV0aG9kKCB0YXNrLmdldENsYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRUZXh0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVGFza1BhcmFtVHlwZXMgKTsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IHsgYm9keSB9OwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZSh0aGlzLnRhc2ssIGFyZ3MpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBub3cgbGV0cyBzZXQgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBjaGlsZCBlbGVtZW50cwotICAgICAgICAgICAgICAgIC8vIFhYWFg6IHRvIGRvIQotCi0gICAgICAgICAgICAgICAgLy8gbm93IHdlJ3JlIHJlYWR5IHRvIGludm9rZSB0aGUgdGFzawotICAgICAgICAgICAgICAgIC8vIFhYWDogc2hvdWxkIHdlIGNhbGwgZXhlY3V0ZSgpIG9yIHBlcmZvcm0oKT8KLSAgICAgICAgICAgICAgICB0YXNrLnBlcmZvcm0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0YXNrID09IG51bGwpIHsKLQotICAgICAgICAgICAgaWYgKG5lc3RlZCA9PSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoICJUcnlpbmcgdG8gY3JlYXRlIGEgZGF0YSB0eXBlIGZvciB0YWc6ICIgKyB0YWdOYW1lICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5lc3RlZCA9IGNyZWF0ZURhdGFUeXBlKCB0YWdOYW1lICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoICJDcmVhdGVkIG5lc3RlZCBwcm9wZXJ0eSB0YWc6ICIgKyB0YWdOYW1lICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIG5lc3RlZCAhPSBudWxsICkgewotICAgICAgICAgICAgICAgIHNldE9iamVjdCggbmVzdGVkICk7Ci0KLSAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIHRhc2sgSUQgaWYgb25lIGlzIGdpdmVuCi0gICAgICAgICAgICAgICAgT2JqZWN0IGlkID0gZ2V0QXR0cmlidXRlcygpLnJlbW92ZSggImlkIiApOwotICAgICAgICAgICAgICAgIGlmICggaWQgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoIChTdHJpbmcpIGlkLCBuZXN0ZWQgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiB3b3JrIG91dCB3aHkgd2UgYWx3YXlzIHNldCB0aGUgbmFtZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgICAgLy8gU2VlIEpFTExZLTEwNS4KLS8vICAgICAgICAgICAgICAgIHRyeXsKLS8vICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVV0aWxzLnNldFByb3BlcnR5KCBuZXN0ZWQsICJuYW1lIiwgdGFnTmFtZSApOwotLy8gICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oICJDYXVnaHQgZXhjZXB0aW9uIHNldHRpbmcgbmVzdGVkIG5hbWU6ICIgKyB0YWdOYW1lLCBlICk7Ci0vLyAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBub3cgbGV0cyBpbnZva2UgdGhlIGJvZHkKLSAgICAgICAgICAgICAgICBTdHJpbmcgYm9keSA9IGdldEJvZHlUZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBub3cgbGV0cyBzZXQgYW55IGF0dHJpYnV0ZXMgb2YgdGhpcyB0YWcuLi4KLSAgICAgICAgICAgICAgICBzZXRCZWFuUHJvcGVydGllcygpOwotCi0gICAgICAgICAgICAgICAgLy8gbm93IGxldHMgYWRkIGl0IHRvIGl0cyBwYXJlbnQKLSAgICAgICAgICAgICAgICBpZiAoIHBhcmVudE9iamVjdCAhPSBudWxsICkgewotICAgICAgICAgICAgICAgICAgICBJbnRyb3NwZWN0aW9uSGVscGVyIGloID0gSW50cm9zcGVjdGlvbkhlbHBlci5nZXRIZWxwZXIoIHBhcmVudE9iamVjdC5nZXRDbGFzcygpICk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFib3V0IHRvIHNldCB0aGU6ICIgKyB0YWdOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBwcm9wZXJ0eSBvbjogIiArIHBhcmVudE9iamVjdCArICIgdG8gdmFsdWU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXN0ZWQgKyAiIHdpdGggdHlwZTogIiArIG5lc3RlZC5nZXRDbGFzcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWguc3RvcmVFbGVtZW50KCBwcm9qZWN0LCBwYXJlbnRPYmplY3QsIG5lc3RlZCwgdGFnTmFtZS50b0xvd2VyQ2FzZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybiggIkNhdWdodCBleGNlcHRpb24gc2V0dGluZyBuZXN0ZWQ6ICIgKyB0YWdOYW1lLCBlICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBub3cgdHJ5IHRvIHNldCB0aGUgcHJvcGVydHkgZm9yIGdvb2QgbWVhc3VyZQotICAgICAgICAgICAgICAgICAgICAvLyBhcyB0aGUgc3RvcmVFbGVtZW50KCkgbWV0aG9kIGRvZXMgbm90Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNlZW0gdG8gY2FsbCBhbnkgc2V0dGVyIG1ldGhvZHMgb2Ygbm9uLVN0cmluZyB0eXBlcwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgQmVhblV0aWxzLnNldFByb3BlcnR5KCBwYXJlbnRPYmplY3QsIHRhZ05hbWUsIG5lc3RlZCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDYXVnaHQgZXhjZXB0aW9uIHRyeWluZyB0byBzZXQgcHJvcGVydHk6ICIgKyB0YWdOYW1lICsgIiBvbjogIiArIHBhcmVudE9iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cud2FybigiQ291bGQgbm90IGNvbnZlcnQgdGFnOiAiICsgdGFnTmFtZSArICIgaW50byBhbiBBbnQgdGFzaywgZGF0YSB0eXBlIG9yIHByb3BlcnR5Iik7Ci0KLSAgICAgICAgICAgICAgICAvLyBsZXRzIHRyZWF0IHRoaXMgdGFnIGFzIHN0YXRpYyBYTUwuLi4KLSAgICAgICAgICAgICAgICBTdGF0aWNUYWcgdGFnID0gbmV3IFN0YXRpY1RhZygiIiwgdGFnTmFtZSwgdGFnTmFtZSk7Ci0gICAgICAgICAgICAgICAgdGFnLnNldFBhcmVudCggZ2V0UGFyZW50KCkgKTsKLSAgICAgICAgICAgICAgICB0YWcuc2V0Qm9keSggZ2V0Qm9keSgpICk7Ci0KLSAgICAgICAgICAgICAgICB0YWcuc2V0Q29udGV4dChjb250ZXh0KTsKLQotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGdldEF0dHJpYnV0ZXMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLQotICAgICAgICAgICAgICAgICAgICB0YWcuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0YWcuZG9UYWcob3V0cHV0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFnTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudGFnTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogU2V0IHRoZSBvYmplY3QgdW5kZXJseWluZyB0aGlzIHRhZy4KLSAgICAgKgotICAgICAqICBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFByb2plY3QgZ2V0QW50UHJvamVjdCgpIHsKLSAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gQW50VGFnTGlicmFyeS5nZXRQcm9qZWN0KGNvbnRleHQpOwotICAgICAgICBpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIk5vIEFudCBQcm9qZWN0IG9iamVjdCBpcyBhdmFpbGFibGUiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwcm9wZXJ0aWVzIG9uIHRoZSBBbnQgdGFzawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJlYW5Qcm9wZXJ0aWVzKCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldFRhc2tPYmplY3QoKTsKLSAgICAgICAgaWYgKCBvYmplY3QgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIE1hcCBtYXAgPSBnZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICBmb3IgKCBJdGVyYXRvciBpdGVyID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBzZXRCZWFuUHJvcGVydHkoIG9iamVjdCwgbmFtZSwgdmFsdWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICggdmFsdWUgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIC8vIHNob3VsZCB3ZSBzZW5kIGluIG51bGw/Ci0gICAgICAgICAgICBzdXBlci5zZXRBdHRyaWJ1dGUoIG5hbWUsICIiICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIHZhbHVlIGluc3RhbmNlb2YgRXhwcmVzc2lvbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuc2V0QXR0cmlidXRlKCBuYW1lLCAoKEV4cHJlc3Npb24pIHZhbHVlKS5ldmFsdWF0ZVJlY3Vyc2UoY29udGV4dCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlci5zZXRBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJlYW5Qcm9wZXJ0eShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCAiU2V0dGluZyBiZWFuIHByb3BlcnR5IG9uOiAiKyAgb2JqZWN0ICsgIiBuYW1lOiAiICsgbmFtZSArICIgdmFsdWU6ICIgKyB2YWx1ZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgSW50cm9zcGVjdGlvbkhlbHBlciBpaCA9IEludHJvc3BlY3Rpb25IZWxwZXIuZ2V0SGVscGVyKCBvYmplY3QuZ2V0Q2xhc3MoKSApOwotCi0gICAgICAgIGlmICggdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGloLnNldEF0dHJpYnV0ZSggZ2V0QW50UHJvamVjdCgpLCBvYmplY3QsIG5hbWUudG9Mb3dlckNhc2UoKSwgKFN0cmluZykgdmFsdWUgKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmU6IG5vdCBhIHZhbGlkIHByb3BlcnR5Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBpaC5zdG9yZUVsZW1lbnQoIGdldEFudFByb2plY3QoKSwgb2JqZWN0LCB2YWx1ZSwgbmFtZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIGxldCBhbnkgZXhjZXB0aW9ucyBidWJibGUgdXAgZnJvbSBoZXJlCi0gICAgICAgICAgICAgICAgQmVhblV0aWxzLnNldFByb3BlcnR5KCBvYmplY3QsIG5hbWUsIHZhbHVlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXN0ZWQgb2JqZWN0IG9mIHRoZSBnaXZlbiBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZU5lc3RlZE9iamVjdChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbmFtZSkgewotICAgICAgICBPYmplY3QgZGF0YVR5cGUgPSBudWxsOwotICAgICAgICBpZiAoIG9iamVjdCAhPSBudWxsICkgewotICAgICAgICAgICAgSW50cm9zcGVjdGlvbkhlbHBlciBpaCA9IEludHJvc3BlY3Rpb25IZWxwZXIuZ2V0SGVscGVyKCBvYmplY3QuZ2V0Q2xhc3MoKSApOwotCi0gICAgICAgICAgICBpZiAoIGloICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGUgPSBpaC5jcmVhdGVFbGVtZW50KCBnZXRBbnRQcm9qZWN0KCksIG9iamVjdCwgbmFtZS50b0xvd2VyQ2FzZSgpICk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRhZykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGYWlsZWQgYXR0ZW1wdCB0byBjcmVhdGUgYW4gYW50IGRhdGF0eXBlIGZvciBhIGplbGx5IHRhZyIsIGJlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihiZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGRhdGFUeXBlID09IG51bGwgKSB7Ci0gICAgICAgICAgICBkYXRhVHlwZSA9IGNyZWF0ZURhdGFUeXBlKCBuYW1lICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZGF0YVR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBjcmVhdGVEYXRhVHlwZShTdHJpbmcgbmFtZSkgewotCi0gICAgICAgIE9iamVjdCBkYXRhVHlwZSA9IG51bGw7Ci0KLSAgICAgICAgQ2xhc3MgdHlwZSA9IChDbGFzcykgZ2V0QW50UHJvamVjdCgpLmdldERhdGFUeXBlRGVmaW5pdGlvbnMoKS5nZXQobmFtZSk7Ci0KLSAgICAgICAgaWYgKCB0eXBlICE9IG51bGwgKSB7Ci0KLSAgICAgICAgICAgIENvbnN0cnVjdG9yIGN0b3IgPSBudWxsOwotICAgICAgICAgICAgYm9vbGVhbiBub0FyZyA9IGZhbHNlOwotCi0gICAgICAgICAgICAvLyBEYXRhVHlwZSBjYW4gaGF2ZSBhICJubyBhcmciIGNvbnN0cnVjdG9yIG9yIHRha2UgYSBzaW5nbGUKLSAgICAgICAgICAgIC8vIFByb2plY3QgYXJndW1lbnQuCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGN0b3IgPSB0eXBlLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1swXSk7Ci0gICAgICAgICAgICAgICAgbm9BcmcgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc2UpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjdG9yID0gdHlwZS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7IFByb2plY3QuY2xhc3MgfSk7Ci0gICAgICAgICAgICAgICAgICAgIG5vQXJnID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oImRhdGF0eXBlICciICsgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBkaWRuJ3QgaGF2ZSBhIGNvbnN0cnVjdG9yIHdpdGggYW4gQW50IFByb2plY3QiLCBuc21lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChub0FyZykgewotICAgICAgICAgICAgICAgIGRhdGFUeXBlID0gY3JlYXRlRGF0YVR5cGUoY3RvciwgbmV3IE9iamVjdFswXSwgbmFtZSwgIm5vLWFyZyBjb25zdHJ1Y3RvciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YVR5cGUgPSBjcmVhdGVEYXRhVHlwZShjdG9yLCBuZXcgT2JqZWN0W10geyBnZXRBbnRQcm9qZWN0KCkgfSwgbmFtZSwgImFuIEFudCBwcm9qZWN0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGF0YVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICgoRGF0YVR5cGUpZGF0YVR5cGUpLnNldFByb2plY3QoIGdldEFudFByb2plY3QoKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRhdGFUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYW4gb2JqZWN0IGNyZWF0ZSB3aXRoIHRoZSBnaXZlbiBjb25zdHJ1Y3RvciBhbmQgYXJncy4KLSAgICAgKiBAcGFyYW0gY3RvciBhIGNvbnN0cnVjdG9yIHRvIHVzZSBjcmVhdGluZyB0aGUgb2JqZWN0Ci0gICAgICogQHBhcmFtIGFyZ3MgdGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkYXRhIHR5cGUgYmVpbmcgY3JlYXRlZAotICAgICAqIEBwYXJhbSBhcmdEZXNjcmlwdGlvbiBhIGh1bWFuIHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBhcmdzIHBhc3NlZAotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IGNyZWF0ZURhdGFUeXBlKENvbnN0cnVjdG9yIGN0b3IsIE9iamVjdFtdIGFyZ3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgYXJnRGVzY3JpcHRpb24pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9iamVjdCBkYXRhdHlwZSA9IGN0b3IubmV3SW5zdGFuY2UoYXJncyk7Ci0gICAgICAgICAgICByZXR1cm4gZGF0YXR5cGU7Ci0gICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiZGF0YXR5cGUgJyIgKyBuYW1lICsgIicgY291bGRuJ3QgYmUgY3JlYXRlZCB3aXRoICIgKyBhcmdEZXNjcmlwdGlvbiwgaWUpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJkYXRhdHlwZSAnIiArIG5hbWUgKyAiJyBjb3VsZG4ndCBiZSBjcmVhdGVkIHdpdGggIiArIGFyZ0Rlc2NyaXB0aW9uLCBpYWUpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJkYXRhdHlwZSAnIiArIG5hbWUgKyAiJyBjb3VsZG4ndCBiZSBjcmVhdGVkIHdpdGggIiArIGFyZ0Rlc2NyaXB0aW9uLCBpdGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0YXNrTmFtZQotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFRhc2sgY3JlYXRlVGFzayhTdHJpbmcgdGFza05hbWUpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVUYXNrKCB0YXNrTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChDbGFzcykgZ2V0QW50UHJvamVjdCgpLmdldFRhc2tEZWZpbml0aW9ucygpLmdldCggdGFza05hbWUgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBUYXNrIGNyZWF0ZVRhc2soU3RyaW5nIHRhc2tOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgdGFza1R5cGUpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKHRhc2tUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IG8gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbyA9IHRhc2tUeXBlLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFRhc2sgdGFzayA9IG51bGw7Ci0gICAgICAgIGlmICggbyBpbnN0YW5jZW9mIFRhc2sgKSB7Ci0gICAgICAgICAgICB0YXNrID0gKFRhc2spIG87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBUYXNrQWRhcHRlciB0YXNrQT1uZXcgVGFza0FkYXB0ZXIoKTsKLSAgICAgICAgICAgIHRhc2tBLnNldFByb3h5KCBvICk7Ci0gICAgICAgICAgICB0YXNrPXRhc2tBOwotICAgICAgICB9Ci0KLSAgICAgICAgdGFzay5zZXRQcm9qZWN0KGdldEFudFByb2plY3QoKSk7Ci0gICAgICAgIHRhc2suc2V0VGFza05hbWUodGFza05hbWUpOwotCi0gICAgICAgIHJldHVybiB0YXNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF0dGVtcHRzIHRvIGxvb2sgdXAgaW4gdGhlIHBhcmVudCBoaWVyYXJjaHkgZm9yIGEgdGFnIHRoYXQgaW1wbGVtZW50cyB0aGUKLSAgICAgKiBUYXNrU291cmNlIGludGVyZmFjZSwgd2hpY2ggcmV0dXJucyBhbiBBbnQgVGFzayBvYmplY3Qgb3IgdGhhdCBpbXBsZW1lbnRzCi0gICAgICogQmVhblNvdXJjZSBpbnRlcmZhY2Ugd2hpY2ggY3JlYXRlcyBhIGJlYW4sCi0gICAgICogb3Igd2lsbCByZXR1cm4gdGhlIHBhcmVudCB0YWcsIHdoaWNoIGlzIGFsc28gYSBiZWFuLgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZmluZEJlYW5BbmNlc3RvcigpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFRhZyB0YWcgPSBnZXRQYXJlbnQoKTsKLSAgICAgICAgd2hpbGUgKHRhZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodGFnIGluc3RhbmNlb2YgQmVhblNvdXJjZSkgewotICAgICAgICAgICAgICAgIEJlYW5Tb3VyY2UgYmVhblNvdXJjZSA9IChCZWFuU291cmNlKSB0YWc7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJlYW5Tb3VyY2UuZ2V0QmVhbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRhZyBpbnN0YW5jZW9mIFRhc2tTb3VyY2UpIHsKLSAgICAgICAgICAgICAgICBUYXNrU291cmNlIHRhc2tTb3VyY2UgPSAoVGFza1NvdXJjZSkgdGFnOwotICAgICAgICAgICAgICAgIHJldHVybiB0YXNrU291cmNlLmdldFRhc2tPYmplY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRhZyA9IHRhZy5nZXRQYXJlbnQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2Fsa3MgdGhlIGhpZXJhcmNoeSB1bnRpbCBpdCBmaW5kcyBhIHBhcmVudCBUYXNrU291cmNlIGFuZCByZXR1cm5zIGl0cyBzb3VyY2Ugb3IgcmV0dXJucyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBmaW5kUGFyZW50VGFza09iamVjdCgpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFRhZyB0YWcgPSBnZXRQYXJlbnQoKTsKLSAgICAgICAgd2hpbGUgKHRhZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodGFnIGluc3RhbmNlb2YgVGFza1NvdXJjZSkgewotICAgICAgICAgICAgICAgIFRhc2tTb3VyY2Ugc291cmNlID0gKFRhc2tTb3VyY2UpIHRhZzsKLSAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlLmdldFRhc2tPYmplY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRhZyA9IHRhZy5nZXRQYXJlbnQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYW50L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2FudC9BbnRUYWdMaWJyYXJ5LmphdmEgYi9qZWxseS10YWdzL2FudC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9hbnQvQW50VGFnTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGFlNzI3Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYW50L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2FudC9BbnRUYWdMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5hbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkNvbnZlcnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZ3JhbnQuR3JhbnRQcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ0xpYnJhcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuVGFnRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5UYWdTY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Ob0Jhbm5lckxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LkZvcm1hdHRlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0vKioKLSAqIEEgSmVsbHkgY3VzdG9tIHRhZyBsaWJyYXJ5IHRoYXQgYWxsb3dzIEFudCB0YXNrcyB0byBiZSBjYWxsZWQgZnJvbSBpbnNpZGUgSmVsbHkuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Ym9iQGVuZy53ZXJrZW4uY29tIj5ib2IgbWN3aGlydGVyPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjYgJAotICovCi1wdWJsaWMgY2xhc3MgQW50VGFnTGlicmFyeSBleHRlbmRzIFRhZ0xpYnJhcnkgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFudFRhZ0xpYnJhcnkuY2xhc3MpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9DT05URVhUX0hBTkRMRSA9ICJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuYW50LlByb2plY3QiOwotCi0gICAgc3RhdGljIHsKLQotICAgICAgICAvLyByZWdpc3RlciBzdGFuZGFyZCBjb252ZXJ0ZXJzIGZvciBBbnQgdHlwZXMKLQotCi0gICAgICAgIENvbnZlcnRVdGlscy5yZWdpc3RlcigKLSAgICAgICAgICAgIG5ldyBDb252ZXJ0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBjb252ZXJ0KENsYXNzIHR5cGUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIHZhbHVlIGluc3RhbmNlb2YgUmVmZXJlbmNlICkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChSZWZlcmVuY2UpIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCB2YWx1ZSAhPSBudWxsICkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSB2YWx1ZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2UoIHRleHQgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgUmVmZXJlbmNlLmNsYXNzCi0gICAgICAgICAgICApOwotCi0gICAgICAgIENvbnZlcnRVdGlscy5yZWdpc3RlcigKLSAgICAgICAgICAgIG5ldyBDb252ZXJ0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBjb252ZXJ0KENsYXNzIHR5cGUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIHZhbHVlIGluc3RhbmNlb2YgRW51bWVyYXRlZEF0dHJpYnV0ZSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRW51bWVyYXRlZEF0dHJpYnV0ZSkgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICkgewotICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0dGVyRWxlbWVudC5UeXBlQXR0cmlidXRlIGF0dHIgPSBuZXcgRm9ybWF0dGVyRWxlbWVudC5UeXBlQXR0cmlidXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLnNldFZhbHVlKCAoU3RyaW5nKSB2YWx1ZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgRm9ybWF0dGVyRWxlbWVudC5UeXBlQXR0cmlidXRlLmNsYXNzCi0gICAgICAgICAgICApOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQSBoZWxwZXIgbWV0aG9kIHdoaWNoIHdpbGwgYXR0ZW1wdCB0byBmaW5kIGEgcHJvamVjdCBpbiB0aGUgY3VycmVudCBjb250ZXh0Ci0gICAgICogb3IgaW5zdGFsbCBvbmUgaWYgbmVlZCBiZS4KLSAgICAgKgotICAgICAqICMjIyMgdGhpcyBtZXRob2QgY291bGQgbW92ZSB0byBhbiBBbnRVdGlscyBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByb2plY3QgZ2V0UHJvamVjdChKZWxseUNvbnRleHQgY29udGV4dCkgewotICAgICAgICBQcm9qZWN0IHByb2plY3QgPSAoUHJvamVjdCkgY29udGV4dC5maW5kVmFyaWFibGUoIFBST0pFQ1RfQ09OVEVYVF9IQU5ETEUgKTsKLSAgICAgICAgaWYgKCBwcm9qZWN0ID09IG51bGwgKSB7Ci0gICAgICAgICAgICBwcm9qZWN0ID0gY3JlYXRlUHJvamVjdChjb250ZXh0KTsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoIFBST0pFQ1RfQ09OVEVYVF9IQU5ETEUgLCBwcm9qZWN0ICk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb2plY3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgQW50IFByb2plY3QgdG8gYmUgdXNlZCBmb3IgdGhpcyBKZWxseUNvbnRleHQuCi0gICAgICoKLSAgICAgKiAjIyMjIHRoaXMgbWV0aG9kIGNvdWxkIG1vdmUgdG8gYW4gQW50VXRpbHMgY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFByb2plY3QoSmVsbHlDb250ZXh0IGNvbnRleHQsIFByb2plY3QgcHJvamVjdCkgewotICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKCBQUk9KRUNUX0NPTlRFWFRfSEFORExFLCBwcm9qZWN0ICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBoZWxwZXIgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBwcm9qZWN0Ci0gICAgICoKLSAgICAgKiAjIyMjIHRoaXMgbWV0aG9kIGNvdWxkIG1vdmUgdG8gYW4gQW50VXRpbHMgY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0IGNyZWF0ZVByb2plY3QoSmVsbHlDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgR3JhbnRQcm9qZWN0IHByb2plY3QgPSBuZXcgR3JhbnRQcm9qZWN0KCk7Ci0gICAgICAgIHByb2plY3Quc2V0UHJvcHNIYW5kbGVyKG5ldyBKZWxseVByb3BzSGFuZGxlcihjb250ZXh0KSk7Ci0KLSAgICAgICAgQnVpbGRMb2dnZXIgbG9nZ2VyID0gbmV3IE5vQmFubmVyTG9nZ2VyKCk7Ci0KLSAgICAgICAgbG9nZ2VyLnNldE1lc3NhZ2VPdXRwdXRMZXZlbCggb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdC5NU0dfSU5GTyApOwotICAgICAgICBsb2dnZXIuc2V0T3V0cHV0UHJpbnRTdHJlYW0oIFN5c3RlbS5vdXQgKTsKLSAgICAgICAgbG9nZ2VyLnNldEVycm9yUHJpbnRTdHJlYW0oIFN5c3RlbS5lcnIpOwotCi0gICAgICAgIHByb2plY3QuYWRkQnVpbGRMaXN0ZW5lciggbG9nZ2VyICk7Ci0KLSAgICAgICAgcHJvamVjdC5pbml0KCk7Ci0gICAgICAgIHByb2plY3QuZ2V0QmFzZURpcigpOwotICAgICAgICBpZiAoY29udGV4dC5nZXRDdXJyZW50VVJMKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvamVjdC5zZXRQcm9wZXJ0eSgiYW50LmZpbGUiLAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldEN1cnJlbnRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcm9qZWN0OwotICAgIH0KLQotCi0gICAgLyoqIENyZWF0ZXMgYSBuZXcgc2NyaXB0IHRvIGV4ZWN1dGUgdGhlIGdpdmVuIHRhZyBuYW1lIGFuZCBhdHRyaWJ1dGVzICovCi0gICAgcHVibGljIFRhZ1NjcmlwdCBjcmVhdGVUYWdTY3JpcHQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLSAgICAgICAgVGFnU2NyaXB0IGFuc3dlciA9IGNyZWF0ZUN1c3RvbVRhZ1NjcmlwdChuYW1lLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgaWYgKCBhbnN3ZXIgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIGFuc3dlciA9IG5ldyBUYWdTY3JpcHQoCi0gICAgICAgICAgICAgICAgbmV3IFRhZ0ZhY3RvcnkoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBUYWcgY3JlYXRlVGFnKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQW50VGFnTGlicmFyeS50aGlzLmNyZWF0ZVRhZyhuYW1lLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGEgbmV3IFRhZ1NjcmlwdCBmb3IgYW55IGN1c3RvbSwgc3RhdGljYWxseSBkZWZpbmVkIHRhZ3MsIGxpa2UgJ2ZpbGVTY2FubmVyJwotICAgICAqLwotICAgIHB1YmxpYyBUYWdTY3JpcHQgY3JlYXRlQ3VzdG9tVGFnU2NyaXB0KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGN1c3RvbSBBbnQgdGFncwotICAgICAgICBpZiAoIG5hbWUuZXF1YWxzKCJmaWxlU2Nhbm5lciIpICkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWdTY3JpcHQoCi0gICAgICAgICAgICAgICAgbmV3IFRhZ0ZhY3RvcnkoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBUYWcgY3JlYXRlVGFnKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVTY2FubmVyVGFnKG5ldyBGaWxlU2Nhbm5lcigpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBuYW1lLmVxdWFscygic2V0UHJvcGVydHkiKSApIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVGFnU2NyaXB0KAotICAgICAgICAgICAgICAgIG5ldyBUYWdGYWN0b3J5KCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVGFnIGNyZWF0ZVRhZyhTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXRQcm9wZXJ0eVRhZygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGhlbHBlciBtZXRob2Qgd2hpY2ggY3JlYXRlcyBhbiBBbnRUYWcgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBlbGVtZW50IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgVGFnIGNyZWF0ZVRhZyhTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotICAgICAgICBBbnRUYWcgdGFnID0gbmV3IEFudFRhZyggbmFtZSApOwotICAgICAgICBpZiAoIG5hbWUuZXF1YWxzKCAiZWNobyIgKSApIHsKLSAgICAgICAgICAgIHRhZy5zZXRUcmltKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGFnOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2FudC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9hbnQvRmlsZUl0ZXJhdG9yLmphdmEgYi9qZWxseS10YWdzL2FudC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9hbnQvRmlsZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyOTM3ZDMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9hbnQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYW50L0ZpbGVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYW50OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OwotCi0vKioKLSAqIDxwPjxjb2RlPkZpbGVJdGVyYXRvcjwvY29kZT4gaXMgYW4gaXRlcmF0b3Igb3ZlciBhCi0gKiBvdmVyIGEgbnVtYmVyIG9mIGZpbGVzIGZyb20gYSBjb2xsZWNpdG9uIG9mIEZpbGVTZXQgaW5zdGFuY2VzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAqLwotcHVibGljIGNsYXNzIEZpbGVJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQotICAgIC8qKiBUaGUgaXRlcmF0b3Igb3ZlciB0aGUgRmlsZVNldCBvYmplY3RzICovCi0gICAgcHJpdmF0ZSBJdGVyYXRvciBmaWxlU2V0SXRlcmF0b3I7Ci0KLSAgICAvKiogVGhlIEFudCBwcm9qZWN0ICovCi0gICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7Ci0KLSAgICAvKiogVGhlIGRpcmVjdG9yeSBzY2FubmVyICovCi0gICAgcHJpdmF0ZSBEaXJlY3RvcnlTY2FubmVyIGRzOwotCi0gICAgLyoqIFRoZSBmaWxlIG5hbWVzIGluIHRoZSBjdXJyZW50IEZpbGVTZXQgc2NhbiAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gZmlsZXM7Ci0KLSAgICAvKiogVGhlIGN1cnJlbnQgaW5kZXggaW50byB0aGUgZmlsZSBuYW1lIGFycmF5ICovCi0gICAgcHJpdmF0ZSBpbnQgZmlsZUluZGV4ID0gLTE7Ci0KLSAgICAvKiogVGhlIG5leHQgRmlsZSBvYmplY3Qgd2UnbGwgaXRlcmF0ZSBvdmVyICovCi0gICAgcHJpdmF0ZSBGaWxlIG5leHRGaWxlOwotCi0gICAgLyoqIEhhdmUgd2Ugc2V0IGEgbmV4dCBvYmplY3Q/ICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG5leHRPYmplY3RTZXQgPSBmYWxzZTsKLQotICAgIC8qKiBSZXR1cm4gb25seSBkaXJlY3Rvcmllcz8gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXRlcmF0ZURpcmVjdG9yaWVzID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgRmlsZUl0ZXJhdG9yKFByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGZpbGVTZXRJdGVyYXRvcikgewotICAgICAgICB0aGlzKCBwcm9qZWN0LCBmaWxlU2V0SXRlcmF0b3IsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZUl0ZXJhdG9yKFByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGZpbGVTZXRJdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXRlcmF0ZURpcmVjdG9yaWVzKSB7Ci0gICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0gICAgICAgIHRoaXMuZmlsZVNldEl0ZXJhdG9yID0gZmlsZVNldEl0ZXJhdG9yOwotICAgICAgICB0aGlzLml0ZXJhdGVEaXJlY3RvcmllcyA9IGl0ZXJhdGVEaXJlY3RvcmllczsKLSAgICB9Ci0KLSAgICAvLyBJdGVyYXRvciBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYW5vdGhlciBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBwcmVkaWNhdGUgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICBpZiAoIG5leHRPYmplY3RTZXQgKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBzZXROZXh0T2JqZWN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiB0aGUgbmV4dCBvYmplY3Qgd2hpY2ggbWF0Y2hlcyB0aGUgZ2l2ZW4gcHJlZGljYXRlICovCi0gICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICBpZiAoICFuZXh0T2JqZWN0U2V0ICkgewotICAgICAgICAgICAgaWYgKCFzZXROZXh0T2JqZWN0KCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG5leHRPYmplY3RTZXQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIG5leHRGaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogU2V0IG5leHRPYmplY3QgdG8gdGhlIG5leHQgb2JqZWN0LiBJZiB0aGVyZSBhcmUgbm8gbW9yZQotICAgICAqIG9iamVjdHMgdGhlbiByZXR1cm4gZmFsc2UuIE90aGVyd2lzZSwgcmV0dXJuIHRydWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldE5leHRPYmplY3QoKSB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICB3aGlsZSAoZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICggISBmaWxlU2V0SXRlcmF0b3IuaGFzTmV4dCgpICkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZpbGVTZXQgZnMgPSAoRmlsZVNldCkgZmlsZVNldEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBkcyA9IGZzLmdldERpcmVjdG9yeVNjYW5uZXIocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgZHMuc2NhbigpOwotICAgICAgICAgICAgICAgIGlmIChpdGVyYXRlRGlyZWN0b3JpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZXMgPSBkcy5nZXRJbmNsdWRlZERpcmVjdG9yaWVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCBmaWxlcy5sZW5ndGggPiAwICkgewotICAgICAgICAgICAgICAgICAgICBmaWxlSW5kZXggPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBkcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIGRzICE9IG51bGwgJiYgZmlsZXMgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICBpZiAoICsrZmlsZUluZGV4IDwgZmlsZXMubGVuZ3RoICkgewotICAgICAgICAgICAgICAgICAgICBuZXh0RmlsZSA9IG5ldyBGaWxlKCBkcy5nZXRCYXNlZGlyKCksIGZpbGVzW2ZpbGVJbmRleF0gKTsKLSAgICAgICAgICAgICAgICAgICAgbmV4dE9iamVjdFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZHMgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2FudC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9hbnQvRmlsZVNjYW5uZXIuamF2YSBiL2plbGx5LXRhZ3MvYW50L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2FudC9GaWxlU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWFkYzAxLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYW50L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2FudC9GaWxlU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5hbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLQotLyoqCi0gKiA8cD48Y29kZT5GaWxlU2Nhbm5lcjwvY29kZT4gaXMgYSBiZWFuIHdoaWNoIGFsbG93cyB0aGUgaXRlcmF0aW9uCi0gKiBvdmVyIGEgbnVtYmVyIG9mIGZpbGVzIGZyb20gYSBjb2xsZWNpdG9uIG9mIEZpbGVTZXQgaW5zdGFuY2VzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAqLwotcHVibGljIGNsYXNzIEZpbGVTY2FubmVyIHsKLQotICAgIC8qKiBGaWxlU2V0cyAqLwotICAgIHByaXZhdGUgTGlzdCBmaWxlc2V0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8qKiBUaGUgQW50IHByb2plY3QgKi8KLSAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKLQotICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3QoUHJvamVjdCBwcm9qZWN0KQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZUl0ZXJhdG9yKHByb2plY3QsIGZpbGVzZXRzLml0ZXJhdG9yKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBkaXJlY3RvcmllcygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlSXRlcmF0b3IocHJvamVjdCwgZmlsZXNldHMuaXRlcmF0b3IoKSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzRmlsZXMoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlc2V0cy5zaXplKCkgPiAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFycyBhbnkgZmlsZSBzZXRzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoaXMgc2Nhbm5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBmaWxlc2V0cy5jbGVhcigpOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBzZXQgb2YgZmlsZXMgKG5lc3RlZCBmaWxlc2V0IGF0dHJpYnV0ZSkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IHNldCkgewotICAgICAgICBmaWxlc2V0cy5hZGQoc2V0KTsKLSAgICB9Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2FudC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9hbnQvRmlsZVNjYW5uZXJUYWcuamF2YSBiL2plbGx5LXRhZ3MvYW50L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2FudC9GaWxlU2Nhbm5lclRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzZkYzcyLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYW50L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2FudC9GaWxlU2Nhbm5lclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5hbnQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5CZWFuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLS8qKgotICogQSB0YWcgd2hpY2ggY3JlYXRlcyBhIG5ldyBGaWxlU2Nhbm5lciBiZWFuIGluc3RhbmNlIHRoYXQgY2FuIGJlIHVzZWQgdG8KLSAqIGl0ZXJhdGUgb3ZlciBmaWxlU2V0cwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS42ICQKLSAqLwotcHVibGljIGNsYXNzIEZpbGVTY2FubmVyVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCBpbXBsZW1lbnRzIFRhc2tTb3VyY2UgewotCi0gICAgLyoqIFRoZSBmaWxlIHdhbGtlciB0aGF0IGdldHMgY3JlYXRlZCAqLwotICAgIHByaXZhdGUgRmlsZVNjYW5uZXIgZmlsZVNjYW5uZXI7Ci0KLSAgICAvKiogdGhlIHZhcmlhYmxlIGV4cG9ydGVkICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyOwotCi0gICAgcHVibGljIEZpbGVTY2FubmVyVGFnKEZpbGVTY2FubmVyIGZpbGVTY2FubmVyKSB7Ci0gICAgICAgIHRoaXMuZmlsZVNjYW5uZXIgPSBmaWxlU2Nhbm5lcjsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgZmlsZVNjYW5uZXIuc2V0UHJvamVjdChBbnRUYWdMaWJyYXJ5LmdldFByb2plY3QoY29udGV4dCkpOwotCi0gICAgICAgIGZpbGVTY2FubmVyLmNsZWFyKCk7Ci0KLSAgICAgICAgLy8gcnVuIHRoZSBib2R5IGZpcnN0IHRvIGNvbmZpZ3VyZSB0aGUgdGFzayB2aWEgbmVzdGVkCi0gICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLQotICAgICAgICAvLyBvdXRwdXQgdGhlIGZpbGVTY2FubmVyCi0gICAgICAgIGlmICggdmFyID09IG51bGwgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiggInZhciIgKTsKLSAgICAgICAgfQotICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKCB2YXIsIGZpbGVTY2FubmVyICk7Ci0KLSAgICB9Ci0KLSAgICAvLyBUYXNrU291cmNlIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VGFza09iamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGVTY2FubmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsbG93cyBuZXN0ZWQgdGFncyB0byBzZXQgYSBwcm9wZXJ0eSBvbiB0aGUgdGFzayBvYmplY3Qgb2YgdGhpcyB0YWcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXNrUHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJlYW5VdGlscy5zZXRQcm9wZXJ0eSggZmlsZVNjYW5uZXIsIG5hbWUsIHZhbHVlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihleCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBBbnQgdGFzawotICAgICAqLwotICAgIHB1YmxpYyBGaWxlU2Nhbm5lciBnZXRGaWxlU2Nhbm5lcigpIHsKLSAgICAgICAgcmV0dXJuIGZpbGVTY2FubmVyOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBleHBvcnRlZCBieSB0aGlzIHRhZyAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0gICAgICAgIHRoaXMudmFyID0gdmFyOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hbnQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYW50L0plbGx5UHJvcHNIYW5kbGVyLmphdmEgYi9qZWxseS10YWdzL2FudC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9hbnQvSmVsbHlQcm9wc0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkOGY1ZC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2FudC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9hbnQvSmVsbHlQcm9wc0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYW50OwotCi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5ncmFudC5EZWZhdWx0UHJvcHNIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci0KLS8qKiBJbXBsZW1lbnRhdGlvbiBvZiBhIENvbW1vbnMgR3JhbnQgPGNvZGU+cHJvcHNIYW5kbGVyPC9jb2RlPgotICogIHRvIHJlc29sdmUgdGhyb3VnaCBKZWxseSdzIGNvbnRleHQuCi0gKgotICogIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmJvYkBlbmcud2Vya2VuLmNvbSI+Qm9iIE1jV2hpcnRlcjwvYT4KLSAqICBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVwaGVuaEBjaGFzZTMwMDAuY29tIj5TdGVwaGVuIEhhYmVybWFuPC9hPgotICovCi1wdWJsaWMgY2xhc3MgSmVsbHlQcm9wc0hhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0UHJvcHNIYW5kbGVyIHsKLQotICAgIC8qKiBUaGUgSmVsbHlDb250ZXh0LiAqLwotICAgIHByaXZhdGUgSmVsbHlDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICAvKiogU2ltcGxlIGNvbnN0cnVjdG9yIHdpdGggdGhlIGNvbnRleHQgdG8gYmUgdXNlZC4KLSAgICAgKgotICAgICAqICBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSB1c2VkLgotICAgICAqLwotICAgIHB1YmxpYyBKZWxseVByb3BzSGFuZGxlcihKZWxseUNvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIC8qKiBTZXQgYW4gYW50IHByb3BlcnR5LgotICAgICAqCi0gICAgICogIEBwYXJhbSBuYW1lIFRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAqICBAcGFyYW0gdmFsdWUgVGhlIHByb3BlcnR5IHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5jb250ZXh0LnNldFZhcmlhYmxlKG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0cmlldmUgYW4gYW50IHByb3BlcnR5LgotICAgICAqCi0gICAgICogIEBwYXJhbSBuYW1lIFRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAqCi0gICAgICogIEByZXR1cm4gVGhlIHByb3BlcnR5IHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gdGhpcy5jb250ZXh0LmdldFZhcmlhYmxlKG5hbWUpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBSZXRyaWV2ZSBhbGwgYW50IHByb3BlcnRpZXMuCi0gICAgICoKLSAgICAgKiAgQHJldHVybiBBIDxjb2RlPkhhc2h0YWJsZTwvY29kZT4gb2YgYWxsIHByb3BlcnRpZXMuCi0gICAgICovCi0gICAgcHVibGljIEhhc2h0YWJsZSBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICBIYXNodGFibGUgaCA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdGhpcy5jb250ZXh0LmdldFZhcmlhYmxlTmFtZXMoKTsgaS5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHRoaXMuY29udGV4dC5nZXRWYXJpYWJsZShuYW1lKTsKLSAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS50b1N0cmluZygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBoLnB1dChuYW1lLCB2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYW50L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2FudC9TZXRQcm9wZXJ0eVRhZy5qYXZhIGIvamVsbHktdGFncy9hbnQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYW50L1NldFByb3BlcnR5VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MDBlNjguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9hbnQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYW50L1NldFByb3BlcnR5VGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmFudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogVGFnIHdoaWNoIHNldHMgYW4gYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgQW50IFRhc2sgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIG5vdCBudWxsLgotICogVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gc2V0dGluZyBwYXJhbWV0ZXJzIG9uIEFudCB0YXNrcywgb25seSBpZiB0aGV5IGhhdmUgYmVlbiBzcGVjaWZpZWQKLSAqIHZpYSBzb21lIHdlbGwgZGVmaW5lZCBwcm9wZXJ0eSwgb3RoZXJ3aXNlIGFsbG93aW5nIHRoZSBpbmJ1aWx0IGRlZmF1bHQgdG8gYmUgdXNlZC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZXRQcm9wZXJ0eVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNldFByb3BlcnR5VGFnLmNsYXNzKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBPYmplY3QgdmFsdWU7Ci0gICAgcHJpdmF0ZSBPYmplY3QgZGVmYXVsdFZhbHVlOwotCi0gICAgcHVibGljIFNldFByb3BlcnR5VGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiwgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbigibmFtZSIpOwotICAgICAgICB9Ci0gICAgICAgIFRhc2tTb3VyY2UgdGFnID0gKFRhc2tTb3VyY2UpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyggVGFza1NvdXJjZS5jbGFzcyApOwotICAgICAgICBpZiAoIHRhZyA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCAiVGhpcyB0YWcgbXVzdCBiZSBuZXN0ZWQgd2l0aGluIGFuIEFudCB0YXNrIHRhZyIgKTsKLSAgICAgICAgfQotICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXRWYWx1ZSgpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdmFsdWUgPSBnZXREZWZhdWx0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRhZy5zZXRUYXNrUHJvcGVydHkobmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lLgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIE9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBBbnQgdGFzayBwcm9wZXJ0eSB0byBzZXQuCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIEFudCB0YXNrIHByb3BlcnR5IHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgQW50IHRhc2sgcHJvcGVydHkgdG8gc2V0LgotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIEFudCB0YXNrIHByb3BlcnR5IHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdFZhbHVlLgotICAgICAqIEByZXR1cm4gT2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXREZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgdG8gYmUgdXNlZCBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGVtcHR5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoT2JqZWN0IGRlZmF1bHRWYWx1ZSkgewotICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYW50L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2FudC9UYXNrU291cmNlLmphdmEgYi9qZWxseS10YWdzL2FudC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9hbnQvVGFza1NvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmVhM2EzLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYW50L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2FudC9UYXNrU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmFudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIHRhZyB3aGljaCBwcm92aWRlcyBhbiBBbnQgVGFzayBvYmplY3Qgb24gd2hpY2ggdG8gc2V0IEFudCBEYXRhVHlwZXMgb3IgY3JlYXRlIG5lc3RlZCB0eXBlcwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS42ICQKLSAqLwotcHVibGljIGludGVyZmFjZSBUYXNrU291cmNlIHsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIEFudCBvYmplY3Qgd2hpY2ggbWF5IGJlIGFuIEFudCBUYXNrIG9yIG5lc3RlZCBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRUYXNrT2JqZWN0KCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQWxsb3dzIG5lc3RlZCB0YWdzIHRvIHNldCBhIHByb3BlcnR5IG9uIHRoZSB0YXNrIG9iamVjdCBvZiB0aGlzIHRhZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhc2tQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2FudC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9hbnQvcGFja2FnZS5odG1sIGIvamVsbHktdGFncy9hbnQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYW50L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5MWRlNC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2FudC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9hbnQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTwvaGVhZD4KLTxib2R5PgotCi0gIDxwPkEgdGFnIGxpYnJhcnkgZm9yIHVzaW5nIEFudCB0YXNrcyB3aXRoaW4gSmVsbHk8L3A+Ci0gIAotICA8cD5KZWxseSBjYW4gYmUgaW52b2tlZCBpbnNpZGUgQW50IGFuZCB0aGlzIHRhZyBsaWJyYXJ5IGFsbG93cyBBbnQgdGFza3MgdG8gYmUgaW52b2tlZCBmcm9tIGluc2lkZQotICAJSmVsbHkuIFRoaXMgYWxsb3dzIEplbGx5IHRvIGJlIHVzZWQgZm9yIG1vcmUgJ3NjcmlwdGluZycgc3R5bGUgdGFyZ2V0cywgc3VjaCBhcyBwYXJzaW5nIFhNTCBkYXRhYmFzZXMsCi0gIAl3b3JraW5nIHdpdGggY3VzdG9tIGphdmEgYmVhbnMsIGRvaW5nIFNRTCwgdGhlIHVzZSBvZiBKU1RMIGFuZCBzbyBmb3J0aC4KLSAgPC9wPgotICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYW50L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YXNrL0FudEplbGx5Q29udGV4dC5qYXZhIGIvamVsbHktdGFncy9hbnQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rhc2svQW50SmVsbHlDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MGRlN2YuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9hbnQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rhc2svQW50SmVsbHlDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YXNrOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci0KLS8qKiA8cD48Y29kZT5BbnRKZWxseUNvbnRleHQ8L2NvZGU+IHJlcHJlc2VudHMgdGhlIEplbGx5IGNvbnRleHQgZnJvbSBpbnNpZGUgQW50LjwvcD4KLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTAgJAotICAqLwotCi1wdWJsaWMgY2xhc3MgQW50SmVsbHlDb250ZXh0IGV4dGVuZHMgSmVsbHlDb250ZXh0IHsKLQotICAgIC8qKiBUaGUgQW50IHByb2plY3Qgd2hpY2ggY29udGFpbnMgdGhlIHZhcmlhYmxlcyAqLwotICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OwotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQW50SmVsbHlDb250ZXh0LmNsYXNzKTsKLQotICAgIHB1YmxpYyBBbnRKZWxseUNvbnRleHQoUHJvamVjdCBwcm9qZWN0LCBKZWxseUNvbnRleHQgcGFyZW50SmVsbHlDb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKCBwYXJlbnRKZWxseUNvbnRleHQgKTsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHZhcmlhYmxlIG5hbWUgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhcmlhYmxlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIC8vIGxvb2sgaW4gcGFyZW50IGZpcnN0Ci0gICAgICAgIE9iamVjdCBhbnN3ZXIgPSBzdXBlci5nZXRWYXJpYWJsZShuYW1lKTsKLSAgICAgICAgaWYgKGFuc3dlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhbnN3ZXIgPSBwcm9qZWN0LmdldFByb3BlcnR5KG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyggIkxvb2tpbmcgdXAgdmFyaWFibGU6ICIgKyBuYW1lICsgIiBhbnN3ZXI6ICIgKyBhbnN3ZXIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhbnN3ZXI7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiB2YXJpYWJsZSBuYW1lICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyaWFibGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCAiU2V0dGluZyB2YXJpYWJsZTogIiArIG5hbWUgKyAiIHRvOiAiICsgdmFsdWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLnNldFZhcmlhYmxlKCBuYW1lLCB2YWx1ZSApOwotCi0gICAgICAgIC8vIG9ubHkgZXhwb3J0IHN0cmluZyB2YWx1ZXMgYmFjayB0byBBbnQ/Ci0gICAgICAgIGlmICggdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgKSB7Ci0gICAgICAgICAgICBwcm9qZWN0LnNldFByb3BlcnR5KG5hbWUsIChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBSZW1vdmVzIHRoZSBnaXZlbiB2YXJpYWJsZSAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVZhcmlhYmxlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyLnJlbW92ZVZhcmlhYmxlKCBuYW1lICk7Ci0gICAgICAgIHByb2plY3Quc2V0UHJvcGVydHkobmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhbiBJdGVyYXRvciBvdmVyIHRoZSBjdXJyZW50IHZhcmlhYmxlIG5hbWVzIGluIHRoaXMKLSAgICAgKiBjb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldFZhcmlhYmxlTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYXJpYWJsZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIE1hcCBvZiB2YXJpYWJsZXMgaW4gdGhpcyBzY29wZQotICAgICAqLwotICAgIHB1YmxpYyBNYXAgZ2V0VmFyaWFibGVzKCkgewotICAgICAgICAvLyB3ZSBzaG91bGQgYWRkIGFsbCB0aGUgUHJvamVjdCdzIHByb3BlcnRpZXMKLSAgICAgICAgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCBwcm9qZWN0LmdldFByb3BlcnRpZXMoKSApOwotCi0gICAgICAgIC8vIG92ZXJyaWRlIGFueSBsb2NhbCBwcm9wZXJ0aWVzCi0gICAgICAgIG1hcC5wdXRBbGwoIHN1cGVyLmdldFZhcmlhYmxlcygpICk7Ci0gICAgICAgIHJldHVybiBtYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgTWFwIG9mIHZhcmlhYmxlcyB0byB1c2UKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhcmlhYmxlcyhNYXAgdmFyaWFibGVzKSB7Ci0gICAgICAgIHN1cGVyLnNldFZhcmlhYmxlcyh2YXJpYWJsZXMpOwotCi0gICAgICAgIC8vIGV4cG9ydCBhbnkgQW50IHByb3BlcnRpZXMKLSAgICAgICAgZm9yICggSXRlcmF0b3IgaXRlciA9IHZhcmlhYmxlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmICggdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgKSB7Ci0gICAgICAgICAgICAgICAgcHJvamVjdC5zZXRQcm9wZXJ0eShrZXksIChTdHJpbmcpdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgY2hpbGQgb2YgdGhpcyBjb250ZXh0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEplbGx5Q29udGV4dCBjcmVhdGVDaGlsZENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQW50SmVsbHlDb250ZXh0KHByb2plY3QsIHRoaXMpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hbnQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rhc2svSmVsbHlUYXNrLmphdmEgYi9qZWxseS10YWdzL2FudC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFzay9KZWxseVRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmYjUyMC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2FudC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFzay9KZWxseVRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhc2s7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuU2NyaXB0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnBhcnNlci5YTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYW50LkFudFRhZ0xpYnJhcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLQotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiA8cD48Y29kZT5KZWxseVRhc2s8L2NvZGU+IGlzIGFuIEFudCB0YXNrIHdoaWNoIHdpbGwKLSAqIHJ1biBhIGdpdmVuIEplbGx5IHNjcmlwdC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCi0gKi8KLQotcHVibGljIGNsYXNzIEplbGx5VGFzayBleHRlbmRzIFRhc2sgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEplbGx5LmNsYXNzKTsKLQotICAgIC8qKiBUaGUgSmVsbHlDb250ZXh0IHRvIHVzZSAqLwotICAgIHByaXZhdGUgSmVsbHlDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICAvKiogVGhlIFVSTCBvZiB0aGUgc2NyaXB0IHRvIGV4ZWN1dGUgKi8KLSAgICBwcml2YXRlIFVSTCB1cmw7Ci0KLSAgICAvKiogVGhlIFVSTCBvZiB0aGUgcm9vdCBjb250ZXh0IGZvciBvdGhlciBzY3JpcHRzICovCi0gICAgcHJpdmF0ZSBVUkwgcm9vdENvbnRleHQ7Ci0KLSAgICAvKiogVGhlIFhNTCBvdXRwdXQgKi8KLSAgICBwcml2YXRlIFhNTE91dHB1dCB4bWxPdXRwdXQ7Ci0KLSAgICAvKiogVGhlIGZpbGUgd2hlcmUgb3V0cHV0IGlzIGdvaW5nICovCi0gICAgcHJpdmF0ZSBGaWxlIG91dHB1dDsKLQotICAgIC8vIFRhc2sgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBFeGN1dGVzIHRoZSBKZWxseSBzY3JpcHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxvZyggIlJ1bm5pbmcgc2NyaXB0OiAiICsgZ2V0VXJsKCkgKTsKLSAgICAgICAgICAgIGlmICggb3V0cHV0ICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCAiU2VuZGluZyBvdXRwdXQgdG86ICIgKyBvdXRwdXQgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU2NyaXB0IHNjcmlwdCA9IGNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgICAgIEplbGx5Q29udGV4dCBjb250ZXh0ID0gZ2V0SmVsbHlDb250ZXh0KCk7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKCAicHJvamVjdCIsIGdldFByb2plY3QoKSApOwotICAgICAgICAgICAgc2NyaXB0LnJ1biggY29udGV4dCwgZ2V0WE1MT3V0cHV0KCkgKTsKLSAgICAgICAgICAgIGdldFhNTE91dHB1dCgpLmZsdXNoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgZ2V0TG9jYXRpb24oKSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2NyaXB0IFVSTCB0byB1c2UgYXMgYW4gYWJzb2x1dGUgVVJMIG9yIGEgcmVsYXRpdmUgZmlsZW5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTY3JpcHQoU3RyaW5nIHNjcmlwdCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFVybChyZXNvbHZlVVJMKHNjcmlwdCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBVUkwgZ2V0VXJsKCkgewotICAgICAgICByZXR1cm4gdXJsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNjcmlwdCBVUkwgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXJsKFVSTCB1cmwpIHsKLSAgICAgICAgdGhpcy51cmwgPSB1cmw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2NyaXB0IGZpbGUgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICBzZXRVcmwoIGZpbGUudG9VUkwoKSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG91dHB1dCB0byBnZW5lcmF0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChGaWxlIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5vdXRwdXQgPSBvdXRwdXQ7Ci0gICAgICAgIHhtbE91dHB1dCA9IFhNTE91dHB1dC5jcmVhdGVYTUxPdXRwdXQoIG5ldyBGaWxlV3JpdGVyKCBvdXRwdXQgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBYTUxPdXRwdXQgZ2V0WE1MT3V0cHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHhtbE91dHB1dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB4bWxPdXRwdXQgPSBYTUxPdXRwdXQuY3JlYXRlWE1MT3V0cHV0KCBTeXN0ZW0ub3V0ICk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHhtbE91dHB1dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBYTUxPdXRwdXQgdXNlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhNTE91dHB1dChYTUxPdXRwdXQgeG1sT3V0cHV0KSB7Ci0gICAgICAgIHRoaXMueG1sT3V0cHV0ID0geG1sT3V0cHV0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvb3QgY29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBVUkwgZ2V0Um9vdENvbnRleHQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHJvb3RDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJvb3RDb250ZXh0ID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpKS50b1VSTCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByb290Q29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSByb290IGNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSb290Q29udGV4dChVUkwgcm9vdENvbnRleHQpIHsKLSAgICAgICAgdGhpcy5yb290Q29udGV4dCA9IHJvb3RDb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBjb250ZXh0IHRvIHVzZQotICAgICAqLwotICAgIHB1YmxpYyBKZWxseUNvbnRleHQgZ2V0SmVsbHlDb250ZXh0KCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHRha2Ugb2ZmIHRoZSBuYW1lIG9mZiB0aGUgVVJMCi0gICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGdldFVybCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpbnQgaWR4ID0gdGV4dC5sYXN0SW5kZXhPZignLycpOwotICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIGlkeCArIDEpOwotICAgICAgICAgICAgSmVsbHlDb250ZXh0IHBhcmVudENvbnRleHQgPSAgbmV3IEplbGx5Q29udGV4dChnZXRSb290Q29udGV4dCgpLCBuZXcgVVJMKHRleHQpKTsKLSAgICAgICAgICAgIGNvbnRleHQgPSBuZXcgQW50SmVsbHlDb250ZXh0KGdldFByb2plY3QoKSAsIHBhcmVudENvbnRleHQpOwotCi0gICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgQW50IHRhZyBsaWJyYXJ5Ci0gICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyVGFnTGlicmFyeSggImplbGx5OmFudCIsIG5ldyBBbnRUYWdMaWJyYXJ5KCkgKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udGV4dDsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBDb21waWxlcyB0aGUgc2NyaXB0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFNjcmlwdCBjb21waWxlU2NyaXB0KCkgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLSAgICAgICAgWE1MUGFyc2VyIHBhcnNlciA9IG5ldyBYTUxQYXJzZXIoKTsKLQotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhcnNlci5zZXRDb250ZXh0KGdldEplbGx5Q29udGV4dCgpKTsKLSAgICAgICAgICAgIHNjcmlwdCA9IHBhcnNlci5wYXJzZShnZXRVcmwoKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHNjcmlwdCA9IHNjcmlwdC5jb21waWxlKCk7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNvbXBpbGVkIHNjcmlwdDogIiArIGdldFVybCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2NyaXB0OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgVVJMIGZvciB0aGUgcmVsYXRpdmUgZmlsZSBuYW1lIG9yIGFic29sdXRlIFVSTAotICAgICAqLwotICAgIHByb3RlY3RlZCBVUkwgcmVzb2x2ZVVSTChTdHJpbmcgbmFtZSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IGdldFByb2plY3QoKS5yZXNvbHZlRmlsZShuYW1lKTsKLSAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmaWxlLnRvVVJMKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBVUkwobmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hbnQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rhc2svcGFja2FnZS5odG1sIGIvamVsbHktdGFncy9hbnQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rhc2svcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTVlNjk0Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYW50L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YXNrL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci0KLSAgPHA+QSBjb2xsZWN0aW9uIG9mIEFudCB0YXNrcyBmb3Igd29ya2luZyB3aXRoIEplbGx5LjwvcD4KLSAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2FudC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYW50L1Rlc3RKZWxseS5qYXZhIGIvamVsbHktdGFncy9hbnQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2FudC9UZXN0SmVsbHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAxODVmMS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2FudC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYW50L1Rlc3RKZWxseS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuYW50OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmp1bml0LkplbGx5VGVzdFN1aXRlOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIHRvIHJ1biBqZWxseSB0ZXN0IGNhc2VzIGFzIHBhcnQgb2YgQW50J3MgSlVuaXQgdGVzdHMKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0SmVsbHkgZXh0ZW5kcyBKZWxseVRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUZXN0UnVubmVyLnJ1biggc3VpdGUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVUZXN0U3VpdGUoVGVzdEplbGx5LmNsYXNzLCAic3VpdGUuamVsbHkiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2FudC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYW50L2J1aWxkLnhtbCBiL2plbGx5LXRhZ3MvYW50L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9hbnQvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTI3ZTI3Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYW50L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9hbnQvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImVjaG9Gb28iIG5hbWU9ImFudC10ZXN0IiBiYXNlZGlyPSIuIj4KLQotICA8cHJvcGVydHkgbmFtZT0iZm9vNS4xIiB2YWx1ZT0iJHtmb281fSIvPgotCi0gIDx0YXJnZXQgbmFtZT0id3JpdGVGb28zQmFyMyI+Ci0gICAgPGVjaG8gbWVzc2FnZT0iZm9vMyA9IGJhcjMiIGZpbGU9InRlc3QucHJvcGVydGllcyIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InJlYWRXcml0ZUZvbzQuMUZvbzQiPgotICAgIDxlY2hvIG1lc3NhZ2U9ImZvbzQuMSA9ICR7Zm9vNH0iIGZpbGU9InRlc3QucHJvcGVydGllcyIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InJlYWRXcml0ZUZvbzUuMUZvbzVJblN0YXJ0Ij4KLSAgICA8ZWNobyBtZXNzYWdlPSJmb281LjEgPSAke2ZvbzUuMX0iIGZpbGU9InRlc3QucHJvcGVydGllcyIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImVjaG9Gb28iPgotICAgIDxlY2hvIG1lc3NhZ2U9IiR7Zm9vfSIvPgotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYW50L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9hbnQvZXhhbXBsZV9qYXIuamVsbHkgYi9qZWxseS10YWdzL2FudC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYW50L2V4YW1wbGVfamFyLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTg4YTZlLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYW50L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9hbnQvZXhhbXBsZV9qYXIuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxucz0iamVsbHk6YW50Ij4KLQotICA8ajpzZXQgdmFyPSJqYXJuYW1lIiB2YWx1ZT0idGFyZ2V0L2FudHRlc3QuamFyIi8+Ci0gIAotICA8ZWNobz4KLSAgICAgIEFib3V0IHRvIGNyZWF0ZSBqYXI6ICR7amFybmFtZX0KLSAgPC9lY2hvPgotCi0gICAgPGphcgotICAgICAgamFyZmlsZT0iJHtqYXJuYW1lfSIKLSAgICAgIGJhc2VkaXI9InRhcmdldC9jbGFzc2VzIj4KLQotICAgICAgPG1ldGFpbmYgZGlyPSIuIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iTElDRU5TRS50eHQiLz4KLSAgICAgIDwvbWV0YWluZj4KLSAgICAgIDxtYW5pZmVzdD4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdWlsdC1CeSIgdmFsdWU9IiR7dXNlci5uYW1lfSIvPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkNyZWF0ZWQtQnkiIHZhbHVlPSJBcGFjaGUgSmFrYXJ0YSBNYXZlbiIvPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlBhY2thZ2UiIHZhbHVlPSIke3BvbS5wYWNrYWdlfSIvPgotICAgICAgICA8c2VjdGlvbiBuYW1lPSJteVNlY3Rpb24iPgotICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iU3BlY2lmaWNhdGlvbi1UaXRsZSIgdmFsdWU9IlNvbWUgVGl0bGUiLz4KLSAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlNwZWNpZmljYXRpb24tVmVyc2lvbiIgdmFsdWU9IjEuMSIvPgotICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iU3BlY2lmaWNhdGlvbi1WZW5kb3IiIHZhbHVlPSJBcGFjaGUiLz4KLSAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcGxlbWVudGF0aW9uLVRpdGxlIiB2YWx1ZT0iU29tZSBpbXBsZW1lbnRhdGlvbiB0aXRsZSIvPgotICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVmVyc2lvbiIgdmFsdWU9IjEuMSIvPgotICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVmVuZG9yIiB2YWx1ZT0iQXBhY2hlIi8+Ci0gICAgICAgIDwvc2VjdGlvbj4KLSAgICAgIDwvbWFuaWZlc3Q+Ci0gICAgPC9qYXI+Ci08L2o6amVsbHk+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2FudC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYW50L2V4YW1wbGVfdGFza3MuamVsbHkgYi9qZWxseS10YWdzL2FudC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYW50L2V4YW1wbGVfdGFza3MuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZDBkMjguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9hbnQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2FudC9leGFtcGxlX3Rhc2tzLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM9ImplbGx5OmFudCI+Ci0gIExldHMgc3RhcnQgYnkgY2FsbGluZyB0aGUgZWNobyB0YXNrCi0gICAgCi0gIDwhLS0gdGhpcyBleGFtcGxlIGF0dGVtcHRzIHRvIGludm9rZSBzb21lIEFudCB0YXNrcyAtLT4KLSAgPGVjaG8gbWVzc2FnZT0iSW52b2tpbmcgdGhlIGVjaG8gdGFzayBmcm9tIGluc2lkZSBKZWxseTsgdGhlIE1hdmVuIHJlcG9zaXRvcnkgaXMgJHtsaWIucmVwb30iLz4gICAgICAgICAgCi0KLSAgPGVjaG8+Ci0gICAgICBNYXZlbiBob21lIGlzICR7bWF2ZW4uaG9tZX0KLSAgPC9lY2hvPgotCi0gIGNsYXNzcGF0aDogJHtwcm9qZWN0LmdldFJlZmVyZW5jZSgndGVzdC5jbGFzc3BhdGgnKX0KLQotICA8IS0tIGxldHMgdHJ5IGludm9rZSBhIHByb2dyYW0gLS0+Ci0gIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5IiBmb3JrPSJ5ZXMiPgotICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgPGFyZyB2YWx1ZT0ic3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Nob3dfYXJncy5qZWxseSIvPiAKLSAgICA8YXJnIHZhbHVlPSJvbmUiLz4gCi0gICAgPGFyZyB2YWx1ZT0idHdvIi8+IAotICAgIDxhcmcgdmFsdWU9InRocmVlIi8+IAotICA8L2phdmE+Ci0KLSAgV2Ugc2hvdWxkIGJlIGJhY2sgdG8gdGhlIEplbGx5IHNjcmlwdCBhZ2FpbiBub3cuLi4gICAgCi08L2o6amVsbHk+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2FudC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYW50L2ZpbGVzY2FubmVyLmplbGx5IGIvamVsbHktdGFncy9hbnQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2FudC9maWxlc2Nhbm5lci5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzYjc0Yy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2FudC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYW50L2ZpbGVzY2FubmVyLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uDQotICANCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICANCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICANCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiIHhtbG5zPSJqZWxseTphbnQiPg0KLQ0KLSAgPGZpbGVTY2FubmVyIHZhcj0ic2Nhbm5lciI+DQotICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiIGluY2x1ZGVzPSIqKi8qLmplbGx5Ii8+DQotICA8L2ZpbGVTY2FubmVyPg0KLSAgICANCi0gIEl0ZXJhdGluZyB0aHJvdWdoIGJ1aWxkIGZpbGVzDQotICANCi0gIDxqOmZvckVhY2ggdmFyPSJmaWxlIiBpdGVtcz0iJHtzY2FubmVyLml0ZXJhdG9yKCl9Ij4NCi0gIA0KLSAgICA8IS0tIGhlcmUgd2UgY291bGQgcGFyc2UgdGhlIGZpbGUgb3IgcHJvY2VzcyBpdCBpbiBzb21lIHdheSAtLT4NCi0gICAgPCEtLSBzdWNoIGFzIGJ5IGNhbGxpbmcgPGFudD4gd2l0aCB0aGUgZ2l2ZW4gYnVpbGQueG1sIGZpbGUgLS0+DQotICAgICAgDQotICAgIEZvdW5kICR7ZmlsZS5hYnNvbHV0ZVBhdGh9DQotICA8L2o6Zm9yRWFjaD4NCi0NCi0gIDxmaWxlU2Nhbm5lciB2YXI9ImRpcnNjYW5uZXIiPg0KLSAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0IiBpbmNsdWRlcz0ib3JnL2FwYWNoZS9jb21tb25zL2plbGx5LyoqIi8+DQotICA8L2ZpbGVTY2FubmVyPg0KLQ0KLSAgSXRlcmF0aW5nIHRocm91Z2ggdGVzdCBkaXJlY3Rvcmllcw0KLQ0KLSAgPGo6Zm9yRWFjaCB2YXI9ImRpciIgaXRlbXM9IiR7ZGlyc2Nhbm5lci5kaXJlY3RvcmllcygpfSI+DQotICAgIDwhLS0gaGVyZSB3ZSBjb3VsZCBwcm9jZXNzIHRoZSBkaXJlY3RvcnkgaW4gc29tZSB3YXkgLS0+DQotICAgIDwhLS0gc3VjaCBhcyBjcmVhdGluZyBhIHNpbWlsYXIgZGlyZWN0b3J5IGluIGEgZGlmZmVyZW50IGJhc2UgcGF0aCAtLT4NCi0gICAgICANCi0gICAgRm91bmQgJHtkaXIuYWJzb2x1dGVQYXRofQ0KLSAgPC9qOmZvckVhY2g+DQotDQotPC9qOmplbGx5Pg0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYW50L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9hbnQvamVsbHl1bml0LmplbGx5IGIvamVsbHktdGFncy9hbnQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2FudC9qZWxseXVuaXQuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YjFhYTguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9hbnQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2FudC9qZWxseXVuaXQuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxuczp0ZXN0PSJqZWxseTpqdW5pdCIgeG1sbnM6YW50PSJqZWxseTphbnQiPgotCi0gIDxhbnQ6ZmlsZVNjYW5uZXIgdmFyPSJzY2FubmVyIj4KLSAgICA8YW50OmZpbGVzZXQgZGlyPSJzcmMvdGVzdCIgaW5jbHVkZXM9IioqL3N1aXRlLmplbGx5Ii8+Ci0gIDwvYW50OmZpbGVTY2FubmVyPgotCi0gICAgPGo6aWYgdGVzdD0iJHtlbXB0eSBvdXRwdXRmaWxlfSI+Ci0gICAgICAgICAgICA8ajpzZXQgdmFyPSJvdXRwdXRmaWxlIiB2YWx1ZT0idGFyZ2V0L2plbGx5dW5pdC54bWwiLz4KLSAgPC9qOmlmPgotICAKLSAgPGFudDplY2hvPlJ1bm5pbmcgYWxsIEplbGx5VW5pdCB0ZXN0cyBhbmQgZ2VuZXJhdGluZyBmaWxlICR7b3V0cHV0ZmlsZX08L2FudDplY2hvPgotICAgICAgCi0gICAgPGo6ZmlsZSBuYW1lPSIke291dHB1dGZpbGV9Ij4KLSAgICAgICAgPHRlc3RzPgotICAgICAgICAgIDxqOmZvckVhY2ggdmFyPSJmaWxlIiBpdGVtcz0iJHtzY2FubmVyLml0ZXJhdG9yKCl9Ij4KLSAgICAKLSAgICAgICAgICAgICAgPGo6c2V0IHZhcj0idXJpIiB2YWx1ZT0iJHtmaWxlLnRvVVJMKCkudG9TdHJpbmcoKX0iLz4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxzdWl0ZSB1cmk9IiR7dXJpfSI+Ci0gICAgICAgICAgICAgICAgICA8ajppbmNsdWRlIHVyaT0iJHt1cml9Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXN0OnJ1bi8+ICAgICAgCi0gICAgICAgICAgICAgICAgPC9zdWl0ZT4gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICA8L2o6Zm9yRWFjaD4KLSAgICAgICAgPC90ZXN0cz4KLSAgICA8L2o6ZmlsZT4gICAgICAgIAotPC9qOmplbGx5PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYW50L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9hbnQvc2FtcGxlLnR4dCBiL2plbGx5LXRhZ3MvYW50L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9hbnQvc2FtcGxlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5NGI4Ny4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2FudC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYW50L3NhbXBsZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1oZWxsbyBAZm9vQCBob3cgYXJlIHlvdT8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2FudC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYW50L3Nob3dfcHJvcGVydGllcy5qZWxseSBiL2plbGx5LXRhZ3MvYW50L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9hbnQvc2hvd19wcm9wZXJ0aWVzLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTU5YzczLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYW50L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9hbnQvc2hvd19wcm9wZXJ0aWVzLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSI+Ci0KLTxodG1sPgotICA8Ym9keT4KLQotICAgIDxoMT5BbnQgcHJvcGVydGllczwvaDE+Ci0KLSAgICA8cD5UaGUgcHJvamVjdCBuYW1lIGlzIDxiPjxqOmV4cHIgdmFsdWU9IiR7cHJvamVjdC5uYW1lfSIvPjwvYj4KLSAgICA8L3A+Ci0KLSAgICA8dGFibGU+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0aD5UYXJnZXRzPC90aD4KLSAgICAgIDwvdHI+Ci0KLSAgICAgIDxqOmZvckVhY2ggdmFyPSJpdGVyIiBpdGVtcz0iJHtwcm9qZWN0LnRhcmdldHN9Ij4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD48ajpleHByIHZhbHVlPSIke2l0ZXIua2V5fSIvPjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L2o6Zm9yRWFjaD4KLSAgICA8L3RhYmxlPgotCi0gICAgPHRhYmxlPgotICAgICAgPHRyPgotICAgICAgICA8dGg+UHJvcGVydHkgTmFtZTwvdGg+Ci0gICAgICAgIDx0aD5Qcm9wZXJ0eSBWYWx1ZTwvdGg+Ci0gICAgICA8L3RyPgotCi0gICAgICA8ajpmb3JFYWNoIHZhcj0iaXRlciIgaXRlbXM9IiR7cHJvamVjdC5nZXRQcm9wZXJ0aWVzKCl9Ij4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD48ajpleHByIHZhbHVlPSIke2l0ZXIua2V5fSIvPjwvdGQ+Ci0gICAgICAgICAgPHRkPjxqOmV4cHIgdmFsdWU9IiR7aXRlci52YWx1ZX0iLz48L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC9qOmZvckVhY2g+Ci0gICAgPC90YWJsZT4KLQotICA8L2JvZHk+Ci0KLTwvaHRtbD4KLQotPC9qOmplbGx5PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hbnQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2FudC9zdWl0ZS5qZWxseSBiL2plbGx5LXRhZ3MvYW50L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9hbnQvc3VpdGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZjJkMmYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9hbnQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2FudC9zdWl0ZS5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08dGVzdDpzdWl0ZSAKLSAgICB4bWxuczpqPSJqZWxseTpjb3JlIiAKLSAgICB4bWxuczp0ZXN0PSJqZWxseTpqdW5pdCIgCi0gICAgeG1sbnM6dXRpbD0iamVsbHk6dXRpbCIgCi0gICAgeG1sbnM9ImplbGx5OmFudCI+Ci0KLSAgPGo6c2V0IHZhcj0iZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYW50Ii8+Ci0KLTx0ZXN0OmNhc2UgbmFtZT0id3JpdGUiPgotCi0gIDxwcm9wZXJ0eSBuYW1lPSJmb28yIiB2YWx1ZT0iYmFyMiIvPgotCi0gIDx0ZXN0OmFzc2VydEVxdWFscwotICAgIGV4cGVjdGVkPSJiYXIyIgotICAgIGFjdHVhbD0iJHtmb28yfSIKLSAgLz4KLQotPC90ZXN0OmNhc2U+Ci0KLTx0ZXN0OmNhc2UgbmFtZT0icmVhZFdyaXRlIj4KLSAgCi0gIDxqOnNldCB2YXI9ImZvbzEiIHZhbHVlPSJiYXIxIi8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9ImZvbzEuMSIgdmFsdWU9IiR7Zm9vMX0iLz4KLQotICA8dGVzdDphc3NlcnRFcXVhbHMKLSAgICBleHBlY3RlZD0iYmFyMSIKLSAgICBhY3R1YWw9IiR7Zm9vMS4xfSIKLSAgLz4KLQotPC90ZXN0OmNhc2U+Ci0KLTx0ZXN0OmNhc2UgbmFtZT0id3JpdGVJbiI+Ci0KLSAgPGFudCAKLSAgICBkaXI9IiR7ZGlyfSIKLSAgICB0YXJnZXQ9IndyaXRlRm9vM0JhcjMiCi0gIC8+Ci0KLSAgPHByb3BlcnR5IGZpbGU9IiR7ZGlyfS90ZXN0LnByb3BlcnRpZXMiLz4KLQotICA8dGVzdDphc3NlcnRFcXVhbHMKLSAgICBleHBlY3RlZD0iYmFyMyIKLSAgICBhY3R1YWw9IiR7Zm9vM30iCi0gIC8+Ci0KLTwvdGVzdDpjYXNlPgotCi08dGVzdDpjYXNlIG5hbWU9InJlYWRXcml0ZUluIj4KLQotICA8ajpzZXQgdmFyPSJmb280IiB2YWx1ZT0iYmFyNCIvPgotCi0gIDxhbnQgCi0gICAgZGlyPSIke2Rpcn0iCi0gICAgdGFyZ2V0PSJyZWFkV3JpdGVGb280LjFGb280IgotICAvPgotCi0gIDxwcm9wZXJ0eSBmaWxlPSIke2Rpcn0vdGVzdC5wcm9wZXJ0aWVzIi8+Ci0KLSAgPHRlc3Q6YXNzZXJ0RXF1YWxzCi0gICAgZXhwZWN0ZWQ9ImJhcjQiCi0gICAgYWN0dWFsPSIke2ZvbzQuMX0iCi0gIC8+Ci0KLTwvdGVzdDpjYXNlPgotCi08dGVzdDpjYXNlIG5hbWU9InN0YXJ0VXBSZWFkV3JpdGUiPgotCi0gIDxqOnNldCB2YXI9ImZvbzUiIHZhbHVlPSJiYXI1Ii8+Ci0KLSAgPGFudAotICAgIGRpcj0iJHtkaXJ9IgotICAgIHRhcmdldD0icmVhZFdyaXRlRm9vNS4xRm9vNUluU3RhcnQiCi0gIC8+Ci0KLSAgPHByb3BlcnR5IGZpbGU9IiR7ZGlyfS90ZXN0LnByb3BlcnRpZXMiLz4KLQotICA8dGVzdDphc3NlcnRFcXVhbHMKLSAgICBleHBlY3RlZD0iYmFyNSIKLSAgICBhY3R1YWw9IiR7Zm9vNS4xfSIKLSAgLz4KLQotPC90ZXN0OmNhc2U+Ci0KLTx0ZXN0OmNhc2UgbmFtZT0iY29weSI+Ci0KLSAgICA8bWtkaXIgZGlyPSIke2Jhc2VkaXJ9L3RhcmdldC90bXAvYW50LXRlc3RzIi8+Ci0gICAgCi0gIDxjb3B5Ci0gICAgICBvdmVyd3JpdGU9InRydWUiCi0gICAgZmlsZT0iJHtiYXNlZGlyfS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYW50L3NhbXBsZS50eHQiCi0gICAgdG9maWxlPSIke2Jhc2VkaXJ9L3RhcmdldC90bXAvYW50LXRlc3RzL291dHB1dC50eHQiPgotICAgIDxmaWx0ZXJzZXQ+Ci0gICAgICA8ZmlsdGVyIHRva2VuPSJmb28iIHZhbHVlPSJiYXIiLz4KLSAgICA8L2ZpbHRlcnNldD4KLSAgPC9jb3B5PgotICAKLSAgPHV0aWw6bG9hZFRleHQgdmFyPSJ0ZXh0IiBmaWxlPSIke2Jhc2VkaXJ9L3RhcmdldC90bXAvYW50LXRlc3RzL291dHB1dC50eHQiLz4KLSAgPGRlbGV0ZSBmaWxlPSIke2Jhc2VkaXJ9L3RhcmdldC90bXAvYW50LXRlc3RzL291dHB1dC50eHQiLz4KLSAgCi0gIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iaGVsbG8gYmFyIGhvdyBhcmUgeW91PyIgYWN0dWFsPSIke3RleHQudHJpbSgpfSIvPgotCi08L3Rlc3Q6Y2FzZT4KLQotPHRlc3Q6Y2FzZSBuYW1lPSJjb3B5V2l0aFJlZmVyZW5jZSI+Ci0KLSAgICA8bWtkaXIgZGlyPSIke2Jhc2VkaXJ9L3RhcmdldC90bXAvYW50LXRlc3RzIi8+Ci0KLSAgICA8ZmlsdGVyc2V0IGlkPSJteUZpbHRlciI+Ci0gICAgICAgIDxmaWx0ZXIgdG9rZW49ImZvbyIgdmFsdWU9ImJhciIvPgotICAgIDwvZmlsdGVyc2V0PgotICAgIAotICA8Y29weQotICAgICAgb3ZlcndyaXRlPSJ0cnVlIgotICAgIGZpbGU9IiR7YmFzZWRpcn0vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2FudC9zYW1wbGUudHh0IgotICAgIHRvZmlsZT0iJHtiYXNlZGlyfS90YXJnZXQvdG1wL2FudC10ZXN0cy9vdXRwdXQudHh0Ij4KLSAgICA8ZmlsdGVyc2V0IHJlZmlkPSJteUZpbHRlciIvPgotICA8L2NvcHk+Ci0gIAotICA8dXRpbDpsb2FkVGV4dCB2YXI9InRleHQiIGZpbGU9IiR7YmFzZWRpcn0vdGFyZ2V0L3RtcC9hbnQtdGVzdHMvb3V0cHV0LnR4dCIvPgotICA8ZGVsZXRlIGZpbGU9IiR7YmFzZWRpcn0vdGFyZ2V0L3RtcC9hbnQtdGVzdHMvb3V0cHV0LnR4dCIvPgotICAKLSAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJoZWxsbyBiYXIgaG93IGFyZSB5b3U/IiBhY3R1YWw9IiR7dGV4dC50cmltKCl9Ii8+Ci0KLTwvdGVzdDpjYXNlPgotCi0KLTx0ZXN0OmNhc2UgbmFtZT0icGFyYWxsZWxDb3B5Ij4KLQotICAgIDxta2RpciBkaXI9IiR7YmFzZWRpcn0vdGFyZ2V0L3RtcC9hbnQtdGVzdHMiLz4KLSAgICAKLSAgICA8cGFyYWxsZWw+Ci0gICAgICAgIDxjb3B5Ci0gICAgICAgICAgICBvdmVyd3JpdGU9InRydWUiCi0gICAgICAgICAgICBmaWxlPSIke2Jhc2VkaXJ9L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9hbnQvc2FtcGxlLnR4dCIKLSAgICAgICAgICAgIHRvZmlsZT0iJHtiYXNlZGlyfS90YXJnZXQvdG1wL2FudC10ZXN0cy9vdXRwdXQudHh0Ij4KLSAgICAgICAgICAgIDxmaWx0ZXJzZXQ+Ci0gICAgICAgICAgICAgICAgPGZpbHRlciB0b2tlbj0iZm9vIiB2YWx1ZT0iYmFyIi8+Ci0gICAgICAgICAgICA8L2ZpbHRlcnNldD4KLSAgICAgICAgPC9jb3B5PgotICAgICAgICA8ZWNobz5QZXJmb3JtaW5nIGNvcHkgaW4gcGFyYWxsZWw8L2VjaG8+Ci0gICAgPC9wYXJhbGxlbD4KLSAgCi0gIDx1dGlsOmxvYWRUZXh0IHZhcj0idGV4dCIgZmlsZT0iJHtiYXNlZGlyfS90YXJnZXQvdG1wL2FudC10ZXN0cy9vdXRwdXQudHh0Ii8+Ci0gIDxkZWxldGUgZmlsZT0iJHtiYXNlZGlyfS90YXJnZXQvdG1wL2FudC10ZXN0cy9vdXRwdXQudHh0Ii8+Ci0gIAotICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9ImhlbGxvIGJhciBob3cgYXJlIHlvdT8iIGFjdHVhbD0iJHt0ZXh0LnRyaW0oKX0iLz4KLQotPC90ZXN0OmNhc2U+Ci0KLTx0ZXN0OmNhc2UgbmFtZT0icGFyYWxsZWxDb3B5V2l0aFJlZmVyZW5jZSI+Ci0KLSAgICA8bWtkaXIgZGlyPSIke2Jhc2VkaXJ9L3RhcmdldC90bXAvYW50LXRlc3RzIi8+Ci0KLSAgICA8ZmlsdGVyc2V0IGlkPSJteUZpbHRlciI+Ci0gICAgICAgIDxmaWx0ZXIgdG9rZW49ImZvbyIgdmFsdWU9ImJhciIvPgotICAgIDwvZmlsdGVyc2V0PgotCi0gICAgPHBhcmFsbGVsPgotICAgICAgICA8Y29weQotICAgICAgICAgICAgb3ZlcndyaXRlPSJ0cnVlIgotICAgICAgICAgICAgZmlsZT0iJHtiYXNlZGlyfS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYW50L3NhbXBsZS50eHQiCi0gICAgICAgICAgICB0b2ZpbGU9IiR7YmFzZWRpcn0vdGFyZ2V0L3RtcC9hbnQtdGVzdHMvb3V0cHV0LnR4dCI+Ci0gICAgICAgICAgICA8ZmlsdGVyc2V0IHJlZmlkPSJteUZpbHRlciIvPgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDxlY2hvPlBlcmZvcm1pbmcgY29weSBpbiBwYXJhbGxlbDwvZWNobz4KLSAgICA8L3BhcmFsbGVsPiAgICAKLSAgCi0gIDx1dGlsOmxvYWRUZXh0IHZhcj0idGV4dCIgZmlsZT0iJHtiYXNlZGlyfS90YXJnZXQvdG1wL2FudC10ZXN0cy9vdXRwdXQudHh0Ii8+Ci0gIDxkZWxldGUgZmlsZT0iJHtiYXNlZGlyfS90YXJnZXQvdG1wL2FudC10ZXN0cy9vdXRwdXQudHh0Ii8+Ci0gIAotICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9ImhlbGxvIGJhciBob3cgYXJlIHlvdT8iIGFjdHVhbD0iJHt0ZXh0LnRyaW0oKX0iLz4KLQotPC90ZXN0OmNhc2U+Ci0KLQotCi08dGVzdDpjYXNlIG5hbWU9InN0YXJ0VXBSZWFkV3JpdGUiPgotCi0gIDxqOnNldCB2YXI9ImZvbyIgdmFsdWU9InNldHRpbmcgdGhlIG1lc3NhZ2Ugd29ya2VkISIvPgotCi0gICAgPGVjaG8+Ci0gICAgICAgIDxzZXRQcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iJHtmb299Ii8+Ci0gIDwvZWNobz4KLSAgCi0gICAgPGVjaG8+Ci0gICAgICAgIDxzZXRQcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iJHtiYXJ9IiBkZWZhdWx0PSJ0aGUgZGVmYXVsdCBhbHNvIHdvcmtlZCIvPgotICA8L2VjaG8+Ci0KLSAgICA8IS0tIGhhdmVuJ3QgdGhvdWdodCBvZiBhIG5lYXQgd2F5IHRvIHRlc3QgdGhpcyB5ZXQuLi4gLS0+ICAKLTwvdGVzdDpjYXNlPgotCi08dGVzdDpjYXNlIG5hbWU9Im5lc3RlZFRhc2siPgotCi0gICAgPGo6aW5jbHVkZSB1cmk9InRhc2svZXhhbXBsZS5qZWxseSIvPgotICAgIAotPC90ZXN0OmNhc2U+Ci0KLTx0ZXN0OmNhc2UgbmFtZT0ic2V0UHJvcGVydHkiPgotCi0gICAgPHRhc2tkZWYKLSAgICAgIG5hbWU9Im5lc3RlZCIKLSAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5hbnQudGFzay5EdW1teVRhc2siPgotICAgIDwvdGFza2RlZj4KLQotICAgIDxuZXN0ZWQ+Ci0gICAgICAgIDxzZXRQcm9wZXJ0eSBuYW1lPSJmb3JjZSIgdmFsdWU9InRydWUiLz4KLSAgICA8L25lc3RlZD4KLSAgICAKLSAgICA8ajpjYXRjaCB2YXI9ImV4Ij4KLSAgICAgICAgPG5lc3RlZD4KLSAgICAgICAgICAgIDxzZXRQcm9wZXJ0eSBuYW1lPSJmb3JjZSIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDwvbmVzdGVkPgotICAgIDwvajpjYXRjaD4gICAgICAgIAotICAgIAotICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2V4ICE9IG51bGx9Ij5XZSBzaG91bGQgaGF2ZSBjcmVhdGVkIGFuIGV4Y2VwdGlvbjwvdGVzdDphc3NlcnQ+Ci0gICAgCi08L3Rlc3Q6Y2FzZT4KLQotPC90ZXN0OnN1aXRlPgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hbnQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2FudC90YWcvRHVtbXlUYWcuamF2YSBiL2plbGx5LXRhZ3MvYW50L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9hbnQvdGFnL0R1bW15VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MjUwMjAuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9hbnQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2FudC90YWcvRHVtbXlUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5hbnQudGFnOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuQmVhblNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5hbnQuQW50VGFnTGlicmFyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotCi0vKioKLSAqIEEgbW9jayB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgdGVzdGluZyB0aGUgQW50IG5lc3RlZCBwcm9wZXJ0aWVzIGJlaGF2aW91cgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS45ICQKLSAqLwotcHVibGljIGNsYXNzIER1bW15VGFnIGV4dGVuZHMgVGFnU3VwcG9ydCBpbXBsZW1lbnRzIEJlYW5Tb3VyY2UgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKER1bW15VGFnLmNsYXNzKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHZhcjsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBjYWxsZWRDcmVhdGVwYXRoOwotICAgIHByaXZhdGUgYm9vbGVhbiBjYWxsZWRTZXRDbGFzc3BhdGg7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGNhbGxlZFNldEZsYWc7Ci0KLSAgICBwcml2YXRlIFBhdGggY2xhc3NwYXRoOwotICAgIHByaXZhdGUgYm9vbGVhbiBmbGFnOwotCi0gICAgcHVibGljIER1bW15VGFnKCkgewotICAgIH0KLQotICAgIC8vIEJlYW5Tb3VyY2UgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKCkgewotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoISBjYWxsZWRTZXRGbGFnKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IoImNhbGwgdG8gc2V0RmxhZygpIHdhcyBub3QgbWFkZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FsbGVkQ3JlYXRlcGF0aCA9IGZhbHNlOwotICAgICAgICBjYWxsZWRTZXRDbGFzc3BhdGggPSBmYWxzZTsKLQotICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0KLSAgICAgICAgaWYgKCEgY2FsbGVkQ3JlYXRlcGF0aCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKCJjYWxsIHRvIGNyZWF0ZUNsYXNzcGF0aCgpIHdhcyBub3QgbWFkZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEgY2FsbGVkU2V0Q2xhc3NwYXRoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IoImNhbGwgdG8gc2V0Q2xhc3NwYXRoKCkgd2FzIG5vdCBtYWRlIik7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nLmluZm8oICJDYWxsZWQgd2l0aCBjbGFzc3BhdGg6ICIgKyBjbGFzc3BhdGggKTsKLQotICAgICAgICBpZiAodmFyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUodmFyLCBjbGFzc3BhdGgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQW50IFRhc2stbGlrZSBuZXN0ZWQgcHJvcGVydHkgbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKLSAgICAgICAgbG9nLmluZm8oImNhbGxlZCBjcmVhdGVDbGFzc3BhdGgoKSIpOwotICAgICAgICBjYWxsZWRDcmVhdGVwYXRoID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIG5ldyBQYXRoKCBBbnRUYWdMaWJyYXJ5LmdldFByb2plY3QoY29udGV4dCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoUGF0aCBjbGFzc3BhdGgpIHsKLSAgICAgICAgbG9nLmluZm8oImNhbGxlZCBzZXRDbGFzc3BhdGgoKSIpOwotICAgICAgICBjYWxsZWRTZXRDbGFzc3BhdGggPSB0cnVlOwotICAgICAgICB0aGlzLmNsYXNzcGF0aCA9IGNsYXNzcGF0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGbGFnKGJvb2xlYW4gZmxhZykKLSAgICB7Ci0gICAgICAgIGxvZy5pbmZvKCJjYWxsZWQgc2V0RmxhZygpIik7Ci0gICAgICAgIGNhbGxlZFNldEZsYWcgPSB0cnVlOwotICAgICAgICB0aGlzLmZsYWcgPSBmbGFnOwotCi0gICAgfQotCi0gICAgLy8gVGFnIHByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0gICAgICAgIHRoaXMudmFyID0gdmFyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYW50L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9hbnQvdGFnL015VGFnTGlicmFyeS5qYXZhIGIvamVsbHktdGFncy9hbnQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2FudC90YWcvTXlUYWdMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYmExZTYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9hbnQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2FudC90YWcvTXlUYWdMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5hbnQudGFnOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ0xpYnJhcnk7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBUYWdsaWIuCi0gKiBUaGlzIGNvdWxkIGJlIGNyZWF0ZWQgdmlhIEplbGx5IHNjcmlwdCwgb3IgY291bGQgbG9hZCB0aGUgbWFwcGluZyBvZgotICogdGFnIG5hbWVzIHRvIGJlYW4gY2xhc3NlcyBmcm9tIHByb3BlcnRpZXMgZmlsZSBldGMgIGJ1dCBpcyBpbXBsZW1lbnRlZCBpbiBKYXZhCi0gKiBjb2RlIGZvciBzaW1wbGljaXR5Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjggJAotICovCi1wdWJsaWMgY2xhc3MgTXlUYWdMaWJyYXJ5IGV4dGVuZHMgVGFnTGlicmFyeSB7Ci0KLSAgICBwdWJsaWMgTXlUYWdMaWJyYXJ5KCkgewotICAgICAgICByZWdpc3RlclRhZyggImR1bW15IiwgRHVtbXlUYWcuY2xhc3MgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2FudC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYW50L3RhZy9UZXN0SmVsbHkuamF2YSBiL2plbGx5LXRhZ3MvYW50L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9hbnQvdGFnL1Rlc3RKZWxseS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWYzZGUwLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYW50L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9hbnQvdGFnL1Rlc3RKZWxseS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuYW50LnRhZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qdW5pdC5KZWxseVRlc3RTdWl0ZTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyB0byBydW4gamVsbHkgdGVzdCBjYXNlcyBhcyBwYXJ0IG9mIEFudCdzIEpVbml0IHRlc3RzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjggJAotICovCi1wdWJsaWMgY2xhc3MgVGVzdEplbGx5IGV4dGVuZHMgSmVsbHlUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oIHN1aXRlKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3JlYXRlVGVzdFN1aXRlKFRlc3RKZWxseS5jbGFzcywgInN1aXRlLmplbGx5Iik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hbnQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2FudC90YWcvc3VpdGUuamVsbHkgYi9qZWxseS10YWdzL2FudC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYW50L3RhZy9zdWl0ZS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiMWZiOC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2FudC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYW50L3RhZy9zdWl0ZS5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLg0KLSAgDQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgDQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08dGVzdDpzdWl0ZSANCi0gICAgeG1sbnM6aj0iamVsbHk6Y29yZSIgDQotICAgIHhtbG5zOnRlc3Q9ImplbGx5Omp1bml0IiANCi0gICAgeG1sbnM9ImplbGx5OmFudCINCi0gICAgeG1sbnM6bXk9ImplbGx5Om9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5hbnQudGFnLk15VGFnTGlicmFyeSI+DQotDQotICAgIDx0ZXN0OmNhc2UgbmFtZT0ibmVzdGVkQ2xhc3NwYXRoIj4NCi0gICAgICAgICAgICANCi0gICAgICAgIDxteTpkdW1teSB2YXI9InBhdGgiIGZsYWc9InRydWUiPg0KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSJ0YXJnZXQvY2xhc3NlcyIvPg0KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0idGFyZ2V0L3Rlc3QtY2xhc3NlcyIvPg0KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9teTpkdW1teT4gICAgICAgICAgICANCi0gICAgDQotICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtwYXRoICE9IG51bGx9Ii8+DQotICAgICAgICANCi0gICAgPC90ZXN0OmNhc2U+DQotDQotPC90ZXN0OnN1aXRlPg0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYW50L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9hbnQvdGFzay9EdW1teVRhc2suamF2YSBiL2plbGx5LXRhZ3MvYW50L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9hbnQvdGFzay9EdW1teVRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlkZTAwYi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2FudC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYW50L3Rhc2svRHVtbXlUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuYW50LnRhc2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotCi0vKgotCi08dGFza2RlZgotICAgbmFtZT0ibmVzdGVkIgotICAgY2xhc3NuYW1lPSJqZWxseWJ1Zy5OZXN0ZWRUYXNrIgotPgotICAgPGNsYXNzcGF0aD4KLSAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSJzb21ld2hlcmUiLz4KLSAgIDwvY2xhc3NwYXRoPgotPC90YXNrZGVmPgotCi08bmVzdGVkPgotICAgPGRpbmcvPgotICAgPGRhbmcvPgotICAgPGRvbmcvPgotICAgPGhpcGhvcC8+Ci0gICA8d29udHN0b3AvPgotICAgPHRpbGx5b3Vkcm9wLz4KLSAgIDxoaXBIb3AvPgotICAgPHdvbnRTdG9wLz4KLSAgIDx0aWxsWW91RHJvcC8+Ci08L25lc3RlZD4KLQotQW50OgotICAgW25lc3RlZF0gYQotICAgW25lc3RlZF0gYgotICAgW25lc3RlZF0gYwotICAgW25lc3RlZF0gZAotICAgW25lc3RlZF0gZQotICAgW25lc3RlZF0gZgotICAgW25lc3RlZF0gZwotICAgW25lc3RlZF0gaAotICAgW25lc3RlZF0gaQotCi1NYXZlbi9KZWxseToKLWEKLWIKLWMKLWQKLWUKLWYKLWcKLWgKLWkKLQotKi8KLQotLyoqCi0gKiBBIHNhbXBsZSBUYXNrIHRvIHRlc3Qgb3V0IHRoZSBBbnQgaW50cm9zcGVjdGlvbiBsb2dpYwotICoKLSAqIEBhdXRob3IgQXNsYWsgSGVsbGVz+HkgKGFzbGFrLmhlbGxlc295QGJla2subm8pCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBEdW1teVRhc2sgZXh0ZW5kcyBUYXNrIHsKLSAgICBwcml2YXRlIGludCBpID0gMDsKLSAgICBwcml2YXRlIFN0cmluZ1tdIG1lc3NhZ2VzID0geyAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiIH07Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZvcmNlOwotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghZm9yY2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU2hvdWxkIGhhdmUgc2V0IGZvcmNlIHRvIGJlIHRydWUhIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVGhpbmd5IGNyZWF0ZURpbmcoKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlRGluZzogIiArIG1lc3NhZ2VzW2krK10pOwotICAgICAgICByZXR1cm4gbmV3IFRoaW5neSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZERhbmcoVGhpbmd5IHRoaW5neSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFkZERhbmc6ICIgKyBtZXNzYWdlc1tpKytdKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkRG9uZyhUaGluZ3kgdGhpbmd5KSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWRkQ29uZmlndXJlZERvbmc6ICIgKyBtZXNzYWdlc1tpKytdKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGhpbmd5IGNyZWF0ZUhpcEhvcCgpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGVIaXBIb3A6ICIgKyBtZXNzYWdlc1tpKytdKTsKLSAgICAgICAgcmV0dXJuIG5ldyBUaGluZ3koKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRXb250U3RvcChUaGluZ3kgdGhpbmd5KSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWRkV29udFN0b3A6ICIgKyBtZXNzYWdlc1tpKytdKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkVGlsbFlvdURyb3AoVGhpbmd5IHRoaW5neSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFkZENvbmZpZ3VyZWRUaWxsWW91RHJvcDogIiArIG1lc3NhZ2VzW2krK10pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRm9yY2UoKSB7Ci0gICAgICAgIHJldHVybiBmb3JjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZShib29sZWFuIGZvcmNlKSB7Ci0gICAgICAgIHRoaXMuZm9yY2UgPSBmb3JjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRoaW5neSB7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYW50L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9hbnQvdGFzay9leGFtcGxlLmplbGx5IGIvamVsbHktdGFncy9hbnQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2FudC90YXNrL2V4YW1wbGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OGFiNTQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9hbnQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2FudC90YXNrL2V4YW1wbGUuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseQotICAgIHhtbG5zOmo9ImplbGx5OmNvcmUiIAotICAgIHhtbG5zPSJqZWxseTphbnQiPgotCi0gICAgPHRhc2tkZWYKLSAgICAgIG5hbWU9Im5lc3RlZCIKLSAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5hbnQudGFzay5EdW1teVRhc2siPgotICAgIDwvdGFza2RlZj4KLSAgICAKLSAgICA8bmVzdGVkIGZvcmNlPSJ0cnVlIj4KLSAgIDxkaW5nLz4KLSAgIDxkYW5nLz4KLSAgIDxkb25nLz4KLSAgIDxoaXBob3AvPgotICAgPHdvbnRzdG9wLz4KLSAgIDx0aWxseW91ZHJvcC8+Ci0gICA8aGlwSG9wLz4KLSAgIDx3b250U3RvcC8+Ci0gICA8dGlsbFlvdURyb3AvPgotICAgIDwvbmVzdGVkPgotICAgIAotPC9qOmplbGx5PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hbnQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2FudC90eXBvVGVzdC5qZWxseSBiL2plbGx5LXRhZ3MvYW50L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9hbnQvdHlwb1Rlc3QuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MTZlMWIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9hbnQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2FudC90eXBvVGVzdC5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiIHhtbG5zPSJqZWxseTphbnQiPgotICBMZXRzIHN0YXJ0IGJ5IGNhbGxpbmcgdGhlIGVjaG8gdGFzawotICAgIAotICA8IS0tIHRoaXMgZXhhbXBsZSBhdHRlbXB0cyB0byBpbnZva2Ugc29tZSBBbnQgdGFza3MgLS0+Ci0gIDxlY2hvIG1lc3NhZ2U9Ikludm9raW5nIHRoZSBlY2hvIHRhc2sgZnJvbSBpbnNpZGUgSmVsbHk7IHRoZSBNYXZlbiByZXBvc2l0b3J5IGlzICR7bGliLnJlcG99Ii8+ICAgICAgICAgIAotCi0gIDxlY2hvPgotICAgICAgTWF2ZW4gaG9tZSBpcyAke21hdmVuLmhvbWV9Ci0gIDwvZWNobz4KLQotICA8IS0tIGxldHMgdHJ5IGludm9rZSBhIHByb2dyYW0gLS0+Ci0gIDwhLS0gdHlwZW8gb24gdGhlIG5leHQgbGluZSAtLT4KLSAgPGphdmEgY2xhc3NuYW09Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseSIgZm9yaz0ieWVzIj4KLSAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgotICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9zaG93X2FyZ3MuamVsbHkiLz4gCi0gICAgPGFyZyB2YWx1ZT0ib25lIi8+IAotICAgIDxhcmcgdmFsdWU9InR3byIvPiAKLSAgICA8YXJnIHZhbHVlPSJ0aHJlZSIvPiAKLSAgPC9qYXZhPgotCi0gIFdlIHNob3VsZCBiZSBiYWNrIHRvIHRoZSBKZWxseSBzY3JpcHQgYWdhaW4gbm93Li4uICAgIAotPC9qOmplbGx5PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hbnQveGRvY3MvY2hhbmdlcy54bWwgYi9qZWxseS10YWdzL2FudC94ZG9jcy9jaGFuZ2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThiNzdkYS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2FudC94ZG9jcy9jaGFuZ2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0gLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkNoYW5nZXM8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLSAgPGJvZHk+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4xLVNOQVBTSE9UIiBkYXRlPSJpbiBDVlMiPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImZpeCI+VXBncmFkZSBkZXBlbmRlbmNpZXMgdG8gc3RvcCBmYWlsaW5nIHRlc3RzPC9hY3Rpb24+Ci0gICAgPC9yZWxlYXNlPgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMCIgZGF0ZT0iMjAwNC0wOS0xMCI+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0iYWRkIj5Jbml0aWFsIHJlbGVhc2U8L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2FudC94ZG9jcy9pbmRleC54bWwgYi9qZWxseS10YWdzL2FudC94ZG9jcy9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MWJiZGIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9hbnQveGRvY3MvaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+QW50IFRhZyBMaWJyYXJ5PC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0KLSAgPGJvZHk+Ci0gICAgPHNlY3Rpb24gbmFtZT0iT3ZlcnZpZXciPgotICAgICAgPHA+Ci0gICAgICAgIFRoaXMgaXMgYSBKZWxseSBpbnRlcmZhY2UgZm9yIEFudC4gSXQgYWxsb3dzIGFueSBBbnQgdGFzayBvciBkYXRhdHlwZSB0byBiZSBleGVjdXRlZCBieSBKZWxseS4gCi0gICAgICAgIEl0IGFsc28gcHJvdmlkZXMgc29tZSBleHRyYSA8YSBocmVmPSJ0YWdzLmh0bWwiPnRhZ3M8L2E+IHRvIG1ha2Ugd29ya2luZyB3aXRoIEFudCBmcm9tIEplbGx5IGVhc2llci4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYW50L3hkb2NzL25hdmlnYXRpb24ueG1sIGIvamVsbHktdGFncy9hbnQveGRvY3MvbmF2aWdhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OWQ5YTUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9hbnQveGRvY3MvbmF2aWdhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IG5hbWU9IkFudCBUYWcgTGlicmFyeSI+Ci0KLSAgPHRpdGxlPkFudCBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gIAotICA8Ym9keT4KLSAgICA8bWVudSBuYW1lPSJBbnQgVGFnIExpYnJhcnkiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgICAgICAgICAgIGhyZWY9Ii9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJUYWdzIiAgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZ3MuaHRtbCIvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hbnRsci8uY3ZzaWdub3JlIGIvamVsbHktdGFncy9hbnRsci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2EyY2RhLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYW50bHIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotdGFyZ2V0Ci1tYXZlbi5sb2cKLXZlbG9jaXR5LmxvZwpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hbnRsci9idWlsZC54bWwgYi9qZWxseS10YWdzL2FudGxyL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ1NzBiOS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2FudGxyL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tYnVpbGQueG1sIGdlbmVyYXRlZCBieSBtYXZlbiBmcm9tIHByb2plY3QueG1sIHZlcnNpb24gMS4wLVNOQVBTSE9UCi0gIG9uIGRhdGUgTWF5IDI0IDIwMDQsIHRpbWUgMjMwMS0tPgotPHByb2plY3QgZGVmYXVsdD0iamFyIiBuYW1lPSJjb21tb25zLWplbGx5LXRhZ3MtYW50bHIiIGJhc2VkaXI9Ii4iPgotICA8cHJvcGVydHkgbmFtZT0iZGVmYXVsdHRhcmdldGRpciIgdmFsdWU9InRhcmdldCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJkaXIiIHZhbHVlPSJ0YXJnZXQvbGliIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXNkaXIiIHZhbHVlPSJ0YXJnZXQvY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Y2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0idGVzdHJlcG9ydGRpciIgdmFsdWU9InRhcmdldC90ZXN0LXJlcG9ydHMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZGlzdGRpciIgdmFsdWU9ImRpc3QiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iamF2YWRvY2RpciIgdmFsdWU9ImRpc3QvZG9jcy9hcGkiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZmluYWwubmFtZSIgdmFsdWU9ImNvbW1vbnMtamVsbHktdGFncy1hbnRsci0xLjAtU05BUFNIT1QiPgotICA8L3Byb3BlcnR5PgotICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlc2NyaXB0aW9uPSJvIEluaXRpYWxpemVzIHNvbWUgcHJvcGVydGllcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im5vZ2V0Ij4KLSAgICAgIDxlcXVhbHMgYXJnMj0ib25seSIgYXJnMT0iJHtidWlsZC5zeXNjbGFzc3BhdGh9Ij4KLSAgICAgIDwvZXF1YWxzPgotICAgIDwvY29uZGl0aW9uPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXNjcmlwdGlvbj0ibyBDb21waWxlIHRoZSBjb2RlIiBkZXBlbmRzPSJnZXQtZGVwcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHtjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvamF2YSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICAgIDxjb3B5IHRvZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL2phdmEiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICAgIDxjb3B5IHRvZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qZWxseSI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueHNsIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnJuZyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5kdGQiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5odG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamFyIiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgdGhlIGphciIgZGVwZW5kcz0iY29tcGlsZSx0ZXN0Ij4KLSAgICA8amFyIGphcmZpbGU9InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCIgYmFzZWRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0ibyBDbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIGRpcmVjdG9yaWVzIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGlzdGRpcn0iPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgYSBkaXN0cmlidXRpb24iIGRlcGVuZHM9ImphciwgamF2YWRvYyI+Ci0gICAgPG1rZGlyIGRpcj0iZGlzdCI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29weSB0b2Rpcj0iZGlzdCI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iIGluY2x1ZGVzPSIqLmphciI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iIGluY2x1ZGVzPSJMSUNFTlNFKiwgUkVBRE1FKiI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0ibyBSdW4gdGhlIHRlc3QgY2FzZXMiIGlmPSJ0ZXN0LmZhaWx1cmUiIGRlcGVuZHM9ImludGVybmFsLXRlc3QiPgotICAgIDxmYWlsIG1lc3NhZ2U9IlRoZXJlIHdlcmUgdGVzdCBmYWlsdXJlcy4iPgotICAgIDwvZmFpbD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iaW50ZXJuYWwtdGVzdCIgZGVwZW5kcz0iY29tcGlsZS10ZXN0cyI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8anVuaXQgZGlyPSIuLyIgZmFpbHVyZXByb3BlcnR5PSJ0ZXN0LmZhaWx1cmUiIHByaW50U3VtbWFyeT0ieWVzIiBmb3JrPSJ0cnVlIiBoYWx0b25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJiYXNlZGlyIiB2YWx1ZT0iLiI+Ci0gICAgICA8L3N5c3Byb3BlcnR5PgotICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Zm9ybWF0dGVyIHVzZWZpbGU9ImZhbHNlIiB0eXBlPSJwbGFpbiI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL1Rlc3QqLmphdmEiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgPC9qdW5pdD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZS10ZXN0cyIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy90ZXN0Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamF2YWRvYyIgZGVzY3JpcHRpb249Im8gR2VuZXJhdGUgamF2YWRvYyIgZGVwZW5kcz0iamFyIj4KLSAgICA8bWtkaXIgZGlyPSIke2phdmFkb2NkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDx0c3RhbXA+Ci0gICAgICA8Zm9ybWF0IHBhdHRlcm49IjIwMDIteXl5eSIgcHJvcGVydHk9InllYXIiPgotICAgICAgPC9mb3JtYXQ+Ci0gICAgPC90c3RhbXA+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvcHlyaWdodCIgdmFsdWU9IkNvcHlyaWdodCAmYW1wO2NvcHk7ICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLWFudGxyIDEuMC1TTkFQU0hPVCBBUEkiPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPGphdmFkb2MgdXNlPSJ0cnVlIiBwcml2YXRlPSJ0cnVlIiBkZXN0ZGlyPSIke2phdmFkb2NkaXJ9IiBhdXRob3I9InRydWUiIHZlcnNpb249InRydWUiIHNvdXJjZXBhdGg9InNyYy9qYXZhIiBwYWNrYWdlbmFtZXM9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmFudGxyLioiPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhZG9jPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJnZXQtZGVwcyIgdW5sZXNzPSJub2dldCIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnRscmFsbC0yLjcuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vYW50bHIvamFycy9hbnRscmFsbC0yLjcuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamV4bC1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZXhsL2phcnMvY29tbW9ucy1qZXhsLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veG1sLWFwaXMtMS4wLmIyLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94bWwtYXBpcy9qYXJzL3htbC1hcGlzLTEuMC5iMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtYmVhbnV0aWxzLTEuNi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1iZWFudXRpbHMvamFycy9jb21tb25zLWJlYW51dGlscy0xLjYuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1jb2xsZWN0aW9ucy9qYXJzL2NvbW1vbnMtY29sbGVjdGlvbnMtMi4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWxvZ2dpbmcvamFycy9jb21tb25zLWxvZ2dpbmctMS4wLjMuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9kb200ai0xLjUtYmV0YS0yLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9kb200ai9qYXJzL2RvbTRqLTEuNS1iZXRhLTIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qYXhlbi0xLjEtYmV0YS0yLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qYXhlbi9qYXJzL2pheGVuLTEuMS1iZXRhLTIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS94ZXJjZXMtMi4yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3hlcmNlcy9qYXJzL3hlcmNlcy0yLjIuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2p1bml0LTMuOC4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qdW5pdC9qYXJzL2p1bml0LTMuOC4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vYW50LTEuNS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vYW50L2phcnMvYW50LTEuNS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FudC1vcHRpb25hbC0xLjUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC1vcHRpb25hbC0xLjUuamFyIj4KLSAgICA8L2dldD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iaW5zdGFsbC1tYXZlbiI+Ci0gICAgPGdldCBkZXN0PSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIHNyYz0iJHtyZXBvfS9tYXZlbi9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDx1bmphciBkZXN0PSIke21hdmVuLmhvbWV9IiBzcmM9IiR7dXNlci5ob21lfS9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiPgotICAgIDwvdW5qYXI+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYW50bHIvbWF2ZW4ueG1sIGIvamVsbHktdGFncy9hbnRsci9tYXZlbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5N2FkYjMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9hbnRsci9tYXZlbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgZGVmYXVsdD0iamF2YTpqYXIiPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2FudGxyL3Byb2plY3QucHJvcGVydGllcyBiL2plbGx5LXRhZ3MvYW50bHIvcHJvamVjdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDE5Y2JjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYW50bHIvcHJvamVjdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMgCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQIFIgTyBKIEUgQyBUICBQIFIgTyBQIEUgUiBUIEkgRSBTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYW50bHIvcHJvamVjdC54bWwgYi9qZWxseS10YWdzL2FudGxyL3Byb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2I3ZWQ4Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYW50bHIvcHJvamVjdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0PgotICA8ZXh0ZW5kPiR7YmFzZWRpcn0vLi4vdGFnLXByb2plY3QueG1sPC9leHRlbmQ+Ci0gIDxpZD5jb21tb25zLWplbGx5LXRhZ3MtYW50bHI8L2lkPgotICA8bmFtZT5jb21tb25zLWplbGx5LXRhZ3MtYW50bHI8L25hbWU+Ci0gIDxjdXJyZW50VmVyc2lvbj4xLjA8L2N1cnJlbnRWZXJzaW9uPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5hbnRscjwvcGFja2FnZT4KLQotICA8ZGVzY3JpcHRpb24+Ci0gICAgICBUaGlzIGlzIGEgSmVsbHkgaW50ZXJmYWNlIGZvciBBbnRsci4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPHNob3J0RGVzY3JpcHRpb24+Q29tbW9ucyBKZWxseSBBbnRsciBUYWcgTGlicmFyeTwvc2hvcnREZXNjcmlwdGlvbj4KLSAgCi0gIDx2ZXJzaW9ucz4KLSAgICA8dmVyc2lvbj4KLSAgICAgIDxpZD4xLjA8L2lkPgotICAgICAgPG5hbWU+MS4wPC9uYW1lPgotICAgICAgPHRhZz5DT01NT05TX0pFTExZX0FOVExSLTFfMDwvdGFnPgotICAgIDwvdmVyc2lvbj4KLSAgPC92ZXJzaW9ucz4KLSAgICAKLSAgPGRlcGVuZGVuY2llcz4KLQotICAgIDwhLS0gU1RBUlQgZm9yIGNvbXBpbGF0aW9uIC0tPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPmFudGxyPC9pZD4KLSAgICAgIDx2ZXJzaW9uPjIuNy4xPC92ZXJzaW9uPgotICAgICAgPGphcj5hbnRscmFsbC0yLjcuMS5qYXI8L2phcj4KLSAgICA8L2RlcGVuZGVuY3k+IC0tPgotICAgIAotICAgIDwhLS0gRU5EIGZvciBjb21waWxhdGlvbiAtLT4KLSAgICAKLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hbnRsci9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9hbnRsci9BbnRsclRhZy5qYXZhIGIvamVsbHktdGFncy9hbnRsci9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9hbnRsci9BbnRsclRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGQyZDAxLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYW50bHIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYW50bHIvQW50bHJUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYW50bHI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IGFudGxyLlRvb2w7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQW50bHJUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0Ci17Ci0gICAgcHJpdmF0ZSBMaXN0IGdyYW1tYXJzOwotICAgIHByaXZhdGUgRmlsZSBvdXRwdXREaXI7Ci0KLSAgICBwdWJsaWMgQW50bHJUYWcoKQotICAgIHsKLSAgICAgICAgdGhpcy5ncmFtbWFycyA9IG5ldyBBcnJheUxpc3QoIDEgKTsKLSAgICB9Ci0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEV2YWx1YXRlIHRoZSBib2R5IHRvIHJlZ2lzdGVyIGFsbCB0aGUgdmFyaW91cyBnb2FscyBhbmQgcHJlL3Bvc3QgY29uZGl0aW9ucwotICAgICAqIHRoZW4gcnVuIGFsbCB0aGUgY3VycmVudCB0YXJnZXRzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoZmluYWwgWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoIHRoaXMub3V0cHV0RGlyID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiggIm91dHB1dERpciIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludm9rZUJvZHkoIG91dHB1dCApOwotCi0gICAgICAgIEl0ZXJhdG9yIGdyYW1tYXJJdGVyID0gdGhpcy5ncmFtbWFycy5pdGVyYXRvcigpOwotICAgICAgICBTdHJpbmcgZWFjaEdyYW1tYXIgPSBudWxsOwotCi0gICAgICAgIFN0cmluZyBzb3VyY2VEaXIgPSAoU3RyaW5nKSBnZXRDb250ZXh0KCkuZ2V0VmFyaWFibGUoICJtYXZlbi5hbnRsci5zcmMuZGlyIiApOwotICAgICAgICBGaWxlIGdyYW1tYXIgPSBudWxsOwotCi0gICAgICAgIHdoaWxlICggZ3JhbW1hckl0ZXIuaGFzTmV4dCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgZWFjaEdyYW1tYXIgPSAoKFN0cmluZykgZ3JhbW1hckl0ZXIubmV4dCgpKS50cmltKCk7Ci0KLSAgICAgICAgICAgIGdyYW1tYXIgPSBuZXcgRmlsZSggc291cmNlRGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoR3JhbW1hciApOwotCi0gICAgICAgICAgICBGaWxlIGdlbmVyYXRlZCA9IGdldEdlbmVyYXRlZEZpbGUoIGdyYW1tYXIuZ2V0UGF0aCgpICk7Ci0KLSAgICAgICAgICAgIGlmICggZ2VuZXJhdGVkLmV4aXN0cygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIGdlbmVyYXRlZC5sYXN0TW9kaWZpZWQoKSA+IGdyYW1tYXIubGFzdE1vZGlmaWVkKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBtb3JlIHJlY2VudCwgc2tpcC4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCAhIGdlbmVyYXRlZC5nZXRQYXJlbnRGaWxlKCkuZXhpc3RzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSBuZXcgU3RyaW5nW10KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICItbyIsCi0gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5nZXRQYXJlbnRGaWxlKCkuZ2V0UGF0aCgpLAotICAgICAgICAgICAgICAgICAgICBncmFtbWFyLmdldFBhdGgoKSwKLSAgICAgICAgICAgICAgICB9OwotCi0gICAgICAgICAgICBTZWN1cml0eU1hbmFnZXIgb2xkU20gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIoIE5vRXhpdFNlY3VyaXR5TWFuYWdlci5JTlNUQU5DRSApOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUb29sLm1haW4oIGFyZ3MgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggISBlLmdldE1lc3NhZ2UoKS5lcXVhbHMoICJleGl0Vk0tMCIgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlciggb2xkU20gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBGaWxlIGdldEdlbmVyYXRlZEZpbGUoU3RyaW5nIGdyYW1tYXIpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRmlsZSBncmFtbWFyRmlsZSA9IG5ldyBGaWxlKCBncmFtbWFyICk7Ci0KLSAgICAgICAgU3RyaW5nIGdlbmVyYXRlZEZpbGVOYW1lID0gbnVsbDsKLQotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gIiI7Ci0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZ3JhbW1hcikpOwotCi0gICAgICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsaW5lID0gbGluZS50cmltKCk7Ci0gICAgICAgICAgICAgICAgaW50IGV4dGVuZHNJbmRleCA9IGxpbmUuaW5kZXhPZigiIGV4dGVuZHMgIik7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgiY2xhc3MgIikgJiYgIGV4dGVuZHNJbmRleCA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZEZpbGVOYW1lID0gbGluZS5zdWJzdHJpbmcoNiwgZXh0ZW5kc0luZGV4KS50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICggbGluZS5zdGFydHNXaXRoKCAicGFja2FnZSIgKSApIHsKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgPSBsaW5lLnN1YnN0cmluZyggOCApLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJVbmFibGUgdG8gZGV0ZXJtaW5lIGdlbmVyYXRlZCBjbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGdlbmVyYXRlZEZpbGVOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZSBnZW5GaWxlID0gbnVsbDsKLQotICAgICAgICBpZiAoICIiLmVxdWFscyggcGFja2FnZU5hbWUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdlbkZpbGUgPSBuZXcgRmlsZSggZ2V0T3V0cHV0RGlyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZEZpbGVOYW1lICsgIi5qYXZhIiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VQYXRoID0gcGFja2FnZU5hbWUucmVwbGFjZSggJy4nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3JDaGFyICk7Ci0KLSAgICAgICAgICAgIHBhY2thZ2VQYXRoID0gcGFja2FnZVBhdGgucmVwbGFjZSggJzsnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLnNlcGFyYXRvckNoYXIgKTsKLQotICAgICAgICAgICAgZ2VuRmlsZSA9IG5ldyBGaWxlKCBuZXcgRmlsZSggZ2V0T3V0cHV0RGlyKCksIHBhY2thZ2VQYXRoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkRmlsZU5hbWUgKyAiLmphdmEiICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZ2VuRmlsZTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZEdyYW1tYXIoU3RyaW5nIGdyYW1tYXIpCi0gICAgewotICAgICAgICB0aGlzLmdyYW1tYXJzLmFkZCggZ3JhbW1hciApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dERpcihGaWxlIG91dHB1dERpcikKLSAgICB7Ci0gICAgICAgIHRoaXMub3V0cHV0RGlyID0gb3V0cHV0RGlyOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldE91dHB1dERpcigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5vdXRwdXREaXI7Ci0gICAgfQotfQotCi1jbGFzcyBOb0V4aXRTZWN1cml0eU1hbmFnZXIgZXh0ZW5kcyBTZWN1cml0eU1hbmFnZXIKLXsKLSAgICBzdGF0aWMgZmluYWwgTm9FeGl0U2VjdXJpdHlNYW5hZ2VyIElOU1RBTkNFID0gbmV3IE5vRXhpdFNlY3VyaXR5TWFuYWdlcigpOwotCi0gICAgcHJpdmF0ZSBOb0V4aXRTZWN1cml0eU1hbmFnZXIoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtaXNzaW9uKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjaGVja0V4aXQoaW50IHN0YXR1cykKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbiggImV4aXRWTS0iICsgc3RhdHVzICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hbnRsci9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9hbnRsci9BbnRsclRhZ0xpYnJhcnkuamF2YSBiL2plbGx5LXRhZ3MvYW50bHIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYW50bHIvQW50bHJUYWdMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExM2EzYzMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9hbnRsci9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9hbnRsci9BbnRsclRhZ0xpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYW50bHI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnTGlicmFyeTsKLQotLyoqIEltcGxlbWVudHMgdGFncyB0aGF0IGFyZSB1c2VmdWwgZm9yIHdvcmtpbmcgd2l0aCBBTlRMUi4KLSAqCi0gKiAgQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Ym9iQGVuZy53ZXJrZW4uY29tIj5ib2IgbWN3aGlydGVyPC9hPgotICogIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAqLwotcHVibGljIGNsYXNzIEFudGxyVGFnTGlicmFyeSBleHRlbmRzIFRhZ0xpYnJhcnkKLXsKLSAgICBwdWJsaWMgQW50bHJUYWdMaWJyYXJ5KCkgewotICAgICAgICByZWdpc3RlclRhZygiYW50bHIiLCBBbnRsclRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJncmFtbWFyIiwgR3JhbW1hclRhZy5jbGFzcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hbnRsci9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9hbnRsci9HcmFtbWFyVGFnLmphdmEgYi9qZWxseS10YWdzL2FudGxyL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2FudGxyL0dyYW1tYXJUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYyOWU0Yi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2FudGxyL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2FudGxyL0dyYW1tYXJUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5hbnRscjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgR3JhbW1hclRhZyBleHRlbmRzIFRhZ1N1cHBvcnQKLXsKLSAgICBwdWJsaWMgR3JhbW1hclRhZygpCi0gICAgewotICAgIH0KLQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIHZvaWQgZG9UYWcoZmluYWwgWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgZ3JhbW1hciA9IGdldEJvZHlUZXh0KCk7Ci0KLSAgICAgICAgQW50bHJUYWcgYW50bHIgPSAoQW50bHJUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyggQW50bHJUYWcuY2xhc3MgKTsKLQotICAgICAgICBpZiAoIGFudGxyID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICI8Z3JhbW1hcj4gc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoaW4gYW4gPGFudGxyPiBibG9jay4iICk7Ci0gICAgICAgIH0KLQotICAgICAgICBhbnRsci5hZGRHcmFtbWFyKCBncmFtbWFyICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hbnRsci9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9hbnRsci9wYWNrYWdlLmh0bWwgYi9qZWxseS10YWdzL2FudGxyL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2FudGxyL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBlMGE2MS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2FudGxyL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2FudGxyL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci0KLSAgPHA+QSB0YWcgbGlicmFyeSBmb3Igd29ya2luZyB3aXRoIHRoZSAKLSAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbnRsci5vcmcvIj5BbnRscjwvYT4gbGlicmFyeQotICA8L3A+Ci0gIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hbnRsci9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9hbnRsci9zYW1wbGUuamVsbHkgYi9qZWxseS10YWdzL2FudGxyL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2FudGxyL3NhbXBsZS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZhNjQwZS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2FudGxyL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2FudGxyL3NhbXBsZS5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM6YW50bHI9ImplbGx5OmFudGxyIj4KLQotICAgIDwhLS0gc29tZSBzYW1wbGUgc2NyaXB0cyB3b3VsZCBiZSBhIGdvb2QgaWRlYSAtLT4KLQotPC9qZWxseT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2FudGxyL3hkb2NzL2NoYW5nZXMueG1sIGIvamVsbHktdGFncy9hbnRsci94ZG9jcy9jaGFuZ2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhNjRhZi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2FudGxyL3hkb2NzL2NoYW5nZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLSAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSAtLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+Q2hhbmdlczwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotICA8Ym9keT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjAiIGRhdGU9IjIwMDQtMDktMTAiPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImFkZCI+SW5pdGlhbCByZWxlYXNlPC9hY3Rpb24+Ci0gICAgPC9yZWxlYXNlPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hbnRsci94ZG9jcy9pbmRleC54bWwgYi9qZWxseS10YWdzL2FudGxyL3hkb2NzL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1NDc0Mi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2FudGxyL3hkb2NzL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkFudGxyIFRhZyBMaWJyYXJ5PC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0KLSAgPGJvZHk+Ci0gICAgPHNlY3Rpb24gbmFtZT0iT3ZlcnZpZXciPgotICAgICAgPHA+Ci0gICAgICAgIFRoaXMgaXMgYSBKZWxseSBpbnRlcmZhY2UgZm9yIEFudGxyLiBTZWUgdGhlIDxhIGhyZWY9InRhZ3MuaHRtbCI+dGFnczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICA8L3A+Ci0gICAgPC9zZWN0aW9uPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2FudGxyL3hkb2NzL25hdmlnYXRpb24ueG1sIGIvamVsbHktdGFncy9hbnRsci94ZG9jcy9uYXZpZ2F0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzMDdlMS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2FudGxyL3hkb2NzL25hdmlnYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBuYW1lPSJBbnRsciBUYWcgTGlicmFyeSI+Ci0KLSAgPHRpdGxlPkFudGxyIFRhZyBMaWJyYXJ5PC90aXRsZT4KLSAgCi0gIDxib2R5PgotICAgIDxtZW51IG5hbWU9IkFudGxyIFRhZyBMaWJyYXJ5Ij4KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICAgICAgICAgICBocmVmPSIvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iVGFncyIgICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWdzLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYXZhbG9uLy5jdnNpZ25vcmUgYi9qZWxseS10YWdzL2F2YWxvbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGQzMWY3Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYXZhbG9uLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLW1hdmVuLmxvZwotdGFyZ2V0Ci12ZWxvY2l0eS5sb2cKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYXZhbG9uL2J1aWxkLnhtbCBiL2plbGx5LXRhZ3MvYXZhbG9uL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFjYjA5OS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2F2YWxvbi9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLWJ1aWxkLnhtbCBnZW5lcmF0ZWQgYnkgbWF2ZW4gZnJvbSBwcm9qZWN0LnhtbCB2ZXJzaW9uIDEuMC1TTkFQU0hPVAotICBvbiBkYXRlIE1heSAyNCAyMDA0LCB0aW1lIDIzMDEtLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImphciIgbmFtZT0iY29tbW9ucy1qZWxseS10YWdzLWF2YWxvbiIgYmFzZWRpcj0iLiI+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkZWZhdWx0dGFyZ2V0ZGlyIiB2YWx1ZT0idGFyZ2V0Ij4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYmRpciIgdmFsdWU9InRhcmdldC9saWIiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC9jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cmVwb3J0ZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtcmVwb3J0cyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0ZGlyIiB2YWx1ZT0iZGlzdCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jZGlyIiB2YWx1ZT0iZGlzdC9kb2NzL2FwaSI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJmaW5hbC5uYW1lIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLWF2YWxvbi0xLjAtU05BUFNIT1QiPgotICA8L3Byb3BlcnR5PgotICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlc2NyaXB0aW9uPSJvIEluaXRpYWxpemVzIHNvbWUgcHJvcGVydGllcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im5vZ2V0Ij4KLSAgICAgIDxlcXVhbHMgYXJnMj0ib25seSIgYXJnMT0iJHtidWlsZC5zeXNjbGFzc3BhdGh9Ij4KLSAgICAgIDwvZXF1YWxzPgotICAgIDwvY29uZGl0aW9uPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXNjcmlwdGlvbj0ibyBDb21waWxlIHRoZSBjb2RlIiBkZXBlbmRzPSJnZXQtZGVwcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHtjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvamF2YSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICAgIDxjb3B5IHRvZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL2phdmEiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICAgIDxjb3B5IHRvZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qZWxseSI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueHNsIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnJuZyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5kdGQiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5odG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamFyIiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgdGhlIGphciIgZGVwZW5kcz0iY29tcGlsZSx0ZXN0Ij4KLSAgICA8amFyIGphcmZpbGU9InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCIgYmFzZWRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0ibyBDbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIGRpcmVjdG9yaWVzIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGlzdGRpcn0iPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgYSBkaXN0cmlidXRpb24iIGRlcGVuZHM9ImphciwgamF2YWRvYyI+Ci0gICAgPG1rZGlyIGRpcj0iZGlzdCI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29weSB0b2Rpcj0iZGlzdCI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iIGluY2x1ZGVzPSIqLmphciI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iIGluY2x1ZGVzPSJMSUNFTlNFKiwgUkVBRE1FKiI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0ibyBSdW4gdGhlIHRlc3QgY2FzZXMiIGlmPSJ0ZXN0LmZhaWx1cmUiIGRlcGVuZHM9ImludGVybmFsLXRlc3QiPgotICAgIDxmYWlsIG1lc3NhZ2U9IlRoZXJlIHdlcmUgdGVzdCBmYWlsdXJlcy4iPgotICAgIDwvZmFpbD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iaW50ZXJuYWwtdGVzdCIgZGVwZW5kcz0iY29tcGlsZS10ZXN0cyI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8anVuaXQgZGlyPSIuLyIgZmFpbHVyZXByb3BlcnR5PSJ0ZXN0LmZhaWx1cmUiIHByaW50U3VtbWFyeT0ieWVzIiBmb3JrPSJ0cnVlIiBoYWx0b25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJiYXNlZGlyIiB2YWx1ZT0iLiI+Ci0gICAgICA8L3N5c3Byb3BlcnR5PgotICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Zm9ybWF0dGVyIHVzZWZpbGU9ImZhbHNlIiB0eXBlPSJwbGFpbiI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL1Rlc3QqLmphdmEiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgPC9qdW5pdD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZS10ZXN0cyIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy90ZXN0Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamF2YWRvYyIgZGVzY3JpcHRpb249Im8gR2VuZXJhdGUgamF2YWRvYyIgZGVwZW5kcz0iamFyIj4KLSAgICA8bWtkaXIgZGlyPSIke2phdmFkb2NkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDx0c3RhbXA+Ci0gICAgICA8Zm9ybWF0IHBhdHRlcm49IjIwMDIteXl5eSIgcHJvcGVydHk9InllYXIiPgotICAgICAgPC9mb3JtYXQ+Ci0gICAgPC90c3RhbXA+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvcHlyaWdodCIgdmFsdWU9IkNvcHlyaWdodCAmYW1wO2NvcHk7ICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLWF2YWxvbiAxLjAtU05BUFNIT1QgQVBJIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxqYXZhZG9jIHVzZT0idHJ1ZSIgcHJpdmF0ZT0idHJ1ZSIgZGVzdGRpcj0iJHtqYXZhZG9jZGlyfSIgYXV0aG9yPSJ0cnVlIiB2ZXJzaW9uPSJ0cnVlIiBzb3VyY2VwYXRoPSJzcmMvamF2YSIgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuYXZhbG9uLioiPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhZG9jPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJnZXQtZGVwcyIgdW5sZXNzPSJub2dldCIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hdmFsb24tZnJhbWV3b3JrLTQuMS4zLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hdmFsb24tZnJhbWV3b3JrL2phcnMvYXZhbG9uLWZyYW1ld29yay00LjEuMy5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtY2xpLVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWNsaS9qYXJzL2NvbW1vbnMtY2xpLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZXhsLVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWpleGwvamFycy9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS94bWwtYXBpcy0xLjAuYjIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3htbC1hcGlzL2phcnMveG1sLWFwaXMtMS4wLmIyLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1iZWFudXRpbHMtMS42LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWJlYW51dGlscy9qYXJzL2NvbW1vbnMtYmVhbnV0aWxzLTEuNi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtY29sbGVjdGlvbnMtMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWNvbGxlY3Rpb25zL2phcnMvY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWxvZ2dpbmctMS4wLjMuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtbG9nZ2luZy9qYXJzL2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2RvbTRqLTEuNS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2RvbTRqL2phcnMvZG9tNGotMS41LWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2pheGVuLTEuMS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2pheGVuL2phcnMvamF4ZW4tMS4xLWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3hlcmNlcy0yLjIuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veGVyY2VzL2phcnMveGVyY2VzLTIuMi4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vanVuaXQtMy44LjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2p1bml0L2phcnMvanVuaXQtMy44LjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vYW50LW9wdGlvbmFsLTEuNS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vYW50L2phcnMvYW50LW9wdGlvbmFsLTEuNS5qYXIiPgotICAgIDwvZ2V0PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJpbnN0YWxsLW1hdmVuIj4KLSAgICA8Z2V0IGRlc3Q9IiR7dXNlci5ob21lfS9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgc3JjPSIke3JlcG99L21hdmVuL21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPHVuamFyIGRlc3Q9IiR7bWF2ZW4uaG9tZX0iIHNyYz0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC91bmphcj4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hdmFsb24vbWF2ZW4ueG1sIGIvamVsbHktdGFncy9hdmFsb24vbWF2ZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGJlNTIxLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYXZhbG9uL21hdmVuLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXZhOmphciI+Ci0KLSAgPCEtLSBkZWZpbmUgdGhlIGNsYXNzcGF0aCB1c2VkIHRvIHJ1biBleGFtcGxlcyAtLT4KLSAgPGdvYWwgbmFtZT0iY3JlYXRlLWNsYXNzcGF0aCIgcHJlcmVxcz0iamF2YTpjb21waWxlLHRlc3Q6Y29tcGlsZSI+Ci0gICAgICAgIDxwYXRoIGlkPSJ0ZXN0LmNsYXNzcGF0aCI+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHttYXZlbi5idWlsZC5kZXN0fSIvPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9InRhcmdldC9jbGFzc2VzIi8+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0idGFyZ2V0L3Rlc3QtY2xhc3NlcyIvPgotICAgICAgICAgICAgPHBhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0gICAgICAgIDwvcGF0aD4KLSAgPC9nb2FsPgotCi0gICAgPCEtLSBkZW1vcyAtLT4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hdmFsb24vcHJvamVjdC5wcm9wZXJ0aWVzIGIvamVsbHktdGFncy9hdmFsb24vcHJvamVjdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDE5Y2JjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYXZhbG9uL3Byb2plY3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jIAotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUCBSIE8gSiBFIEMgVCAgUCBSIE8gUCBFIFIgVCBJIEUgUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2F2YWxvbi9wcm9qZWN0LnhtbCBiL2plbGx5LXRhZ3MvYXZhbG9uL3Byb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODkzNWQyLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYXZhbG9uL3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdD4KLSAgPGV4dGVuZD4ke2Jhc2VkaXJ9Ly4uL3RhZy1wcm9qZWN0LnhtbDwvZXh0ZW5kPgotICA8aWQ+Y29tbW9ucy1qZWxseS10YWdzLWF2YWxvbjwvaWQ+Ci0gIDxuYW1lPmNvbW1vbnMtamVsbHktdGFncy1hdmFsb248L25hbWU+Ci0gIDxjdXJyZW50VmVyc2lvbj4xLjA8L2N1cnJlbnRWZXJzaW9uPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuYXZhbG9uPC9wYWNrYWdlPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgVGhpcyBpcyBhIEplbGx5IGxpYnJhcnkgZm9yIEF2YWxvbgotICA8L2Rlc2NyaXB0aW9uPgotICA8c2hvcnREZXNjcmlwdGlvbj5UaGlzIGlzIGEgSmVsbHkgbGlicmFyeSBmb3IgQXZhbG9uPC9zaG9ydERlc2NyaXB0aW9uPgotICAKLSAgPHZlcnNpb25zPgotICAgIDx2ZXJzaW9uPgotICAgICAgPGlkPjEuMDwvaWQ+Ci0gICAgICA8bmFtZT4xLjA8L25hbWU+Ci0gICAgICA8dGFnPkNPTU1PTlNfSkVMTFlfQVZBTE9OLTFfMDwvdGFnPgotICAgIDwvdmVyc2lvbj4KLSAgPC92ZXJzaW9ucz4KLQotICA8ZGVwZW5kZW5jaWVzPgotCi0gICAgPCEtLSBTVEFSVCBmb3IgY29tcGlsYXRpb24gLS0+Ci0gIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPmF2YWxvbi1mcmFtZXdvcms8L2lkPgotICAgICAgPHZlcnNpb24+NC4xLjM8L3ZlcnNpb24+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGd1bXAucHJvamVjdD5hdmFsb24tZnJhbWV3b3JrLWFwaTwvZ3VtcC5wcm9qZWN0PgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgCi0gICAgPCEtLSBTVEFSVCBmb3IgcnVubmluZyBkZW1vcyAtLT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPmNvbW1vbnMtY2xpPC9pZD4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgIDwhLS0gRU5EIGZvciBydW5uaW5nIGRlbW9zIC0tPgotICA8L2RlcGVuZGVuY2llcz4KLSAgCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2F2YWxvbi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYXZhbG9uL0plbGx5U2VydmljZS5qYXZhIGIvamVsbHktdGFncy9hdmFsb24vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2F2YWxvbi9KZWxseVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNjYzJiYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2F2YWxvbi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYXZhbG9uL0plbGx5U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuYXZhbG9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotLy8gQXZhbG9uCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotLy8gSmVsbHkKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlNjcmlwdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKioKLSAqIEFuIEF2YWxvbiBiYXNlZCBzZXJ2aWNlIGZvciBleGVjdXRpbmcgSmVsbHkgc2NyaXB0cy4gVGhlCi0gKiBzZXJ2aWNlIGFsbG93cyBleGVjdXRpbmcgYSBzY3JpcHQgYmFzZWQgb24gYSBuYW1lIGFzIHdlbGwKLSAqIGFzIGJ5IGEgVVJMLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnJvYmVydEBidWxsLWVudGVycHJpc2VzLmNvbSI+Um9iZXJ0IE1jSW50b3NoPC9hPgotICogQHZlcnNpb24gMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmVsbHlTZXJ2aWNlIHsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIGEgbmFtZWQgc2NyaXB0IHdpdGggdGhlIHN1cHBsaWVkCi0gICAgICogTWFwIG9mIHBhcmFtZXRlcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW1zIFBhcmFtZXRlcnMgdG8gYmUgc3VwcGxpZWQgdG8gdGhlIHNjcmlwdAotICAgICAqIEByZXR1cm4gQWxsIG9mIHRoZSB2YXJpYWJsZXMgZnJvbSB0aGUgSmVsbHlDb250ZXh0Ci0gICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgdGhlIHNjcmlwdCByYWlzZXMgc29tZSBraW5kIG9mIGV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nCi0gICAgICovCi0gICAgcHVibGljIE1hcCBydW5OYW1lZFNjcmlwdCggU3RyaW5nIG5hbWUsIE1hcCBwYXJhbXMgKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgYSBuYW1lZCBzY3JpcHQgd2l0aCB0aGUgc3VwcGxpZWQKLSAgICAgKiBNYXAgb2YgcGFyYW1ldGVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBzY3JpcHQgdG8gcnVuCi0gICAgICogQHBhcmFtIHBhcmFtcyBQYXJhbWV0ZXJzIHRvIGJlIHN1cHBsaWVkIHRvIHRoZSBzY3JpcHQKLSAgICAgKiBAcGFyYW0gb3V0cHV0IGlzIHRoZSBYTUxPdXRwdXQgZm9yIGFueSBvdXRwdXQgdG8gYmUgc2VudAotICAgICAqIEByZXR1cm4gQWxsIG9mIHRoZSB2YXJpYWJsZXMgZnJvbSB0aGUgSmVsbHlDb250ZXh0Ci0gICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgdGhlIHNjcmlwdCByYWlzZXMgc29tZSBraW5kIG9mIGV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nCi0gICAgICovCi0gICAgcHVibGljIE1hcCBydW5OYW1lZFNjcmlwdCggU3RyaW5nIG5hbWUsIE1hcCBwYXJhbXMsIFhNTE91dHB1dCBvdXRwdXQgKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgYSBuYW1lZCBzY3JpcHQgd2l0aCB0aGUgc3VwcGxpZWQKLSAgICAgKiBNYXAgb2YgcGFyYW1ldGVycyBhbmQgc2VuZCB0aGUgb3V0cHV0IG9mIHRoZSBzY3JpcHQKLSAgICAgKiB0byB0aGUgc3VwcGxpZWQgb3V0cHV0IHN0cmVhbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBzY3JpcHQgdG8gcnVuCi0gICAgICogQHBhcmFtIHBhcmFtcyBQYXJhbWV0ZXJzIHRvIGJlIHN1cHBsaWVkIHRvIHRoZSBzY3JpcHQKLSAgICAgKiBAcGFyYW0gb3V0IGlzIHRoZSBvdXRwdXRTdHJlYW0gZm9yIG91dHB1dCB0byBiZSBzZW50Ci0gICAgICogQHJldHVybiBBbGwgb2YgdGhlIHZhcmlhYmxlcyBmcm9tIHRoZSBKZWxseUNvbnRleHQKLSAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiB0aGUgc2NyaXB0IHJhaXNlcyBzb21lIGtpbmQgb2YgZXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIHJ1bk5hbWVkU2NyaXB0KCBTdHJpbmcgbmFtZSwgTWFwIHBhcmFtcywgT3V0cHV0U3RyZWFtIG91dCApIHRocm93cyBFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSdW5zIGEgc2NyaXB0IGZyb20gdGhlIHN1cHBsaWVkIHVybAotICAgICAqCi0gICAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBzY3JpcHQKLSAgICAgKiBAcGFyYW0gcGFyYW1zIFBhcmFtZXRlcnMgdG8gYmUgc3VwcGxpZWQgdG8gdGhlIHNjcmlwdAotICAgICAqIEBwYXJhbSBvdXRwdXQgaXMgdGhlIFhNTE91dHB1dCB3aGVyZSBvdXRwdXQgb2YgdGhlIHNjcmlwdCB3aWxsIGdvCi0gICAgICogQHJldHVybiBBbGwgb2YgdGhlIHZhcmlhYmxlcyBmcm9tIHRoZSBKZWxseUNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIHJ1blNjcmlwdCggU3RyaW5nIHVybCwgTWFwIHBhcmFtcywgWE1MT3V0cHV0IG91dHB1dCApIHRocm93cyBFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSdW5zIGEgc2NyaXB0IGZyb20gdGhlIHN1cHBsaWVkIHVybCBhbmQgc2VuZHMgdGhlIG91dHB1dCBvZiB0aGUgc2NyaXB0IHRvCi0gICAgICogdGhlIHN1cHBsaWVkIE91dHB1dFN0cmVhbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgc2NyaXB0Ci0gICAgICogQHBhcmFtIHBhcmFtcyBQYXJhbWV0ZXJzIHRvIGJlIHN1cHBsaWVkIHRvIHRoZSBzY3JpcHQKLSAgICAgKiBAcGFyYW0gb3V0IFRoZSBPdXRwdXRTdHJlYW0gdG8gc2VuZCB0aGUgb3V0cHV0IG9mIHRoZSBzY3JpcHQgdG8KLSAgICAgKiBAcmV0dXJuIEFsbCBvZiB0aGUgdmFyaWFibGVzIGZyb20gdGhlIEplbGx5Q29udGV4dAotICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIHRoZSBzY3JpcHQgcmFpc2VzIHNvbWUga2luZCBvZiBleGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZwotICAgICAqLwotICAgIHB1YmxpYyBNYXAgcnVuU2NyaXB0KCBTdHJpbmcgdXJsLCBNYXAgcGFyYW1zLCBPdXRwdXRTdHJlYW0gb3V0ICkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJ1bnMgYSBzY3JpcHQgZnJvbSB0aGUgc3VwcGxpZWQgdXJsCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIHNjcmlwdAotICAgICAqIEBwYXJhbSBwYXJhbXMgUGFyYW1ldGVycyB0byBiZSBzdXBwbGllZCB0byB0aGUgc2NyaXB0Ci0gICAgICogQHJldHVybiBBbGwgb2YgdGhlIHZhcmlhYmxlcyBmcm9tIHRoZSBKZWxseUNvbnRleHQKLSAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiB0aGUgc2NyaXB0IHJhaXNlcyBzb21lIGtpbmQgb2YgZXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIHJ1blNjcmlwdCggU3RyaW5nIHVybCwgTWFwIHBhcmFtcyApIHRocm93cyBFeGNlcHRpb247Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hdmFsb24vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2F2YWxvbi9KZWxseVNlcnZpY2VJbXBsLmphdmEgYi9qZWxseS10YWdzL2F2YWxvbi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYXZhbG9uL0plbGx5U2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0YjZlOC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2F2YWxvbi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYXZhbG9uL0plbGx5U2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmF2YWxvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLS8vIEF2YWxvbgotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLS8vIEplbGx5Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5TY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqCi0gKiBBbiBBdmFsb24gYmFzZWQgc2VydmljZSBmb3IgZXhlY3V0aW5nIEplbGx5IHNjcmlwdHMuIFRoZQotICogc2VydmljZSBhbGxvd3MgZXhlY3V0aW5nIGEgc2NyaXB0IGJhc2VkIG9uIGEgbmFtZSBhcyB3ZWxsCi0gKiBhcyBieSBhIFVSTC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpyb2JlcnRAYnVsbC1lbnRlcnByaXNlcy5jb20iPlJvYmVydCBNY0ludG9zaDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAqLwotcHVibGljIGNsYXNzIEplbGx5U2VydmljZUltcGwgaW1wbGVtZW50cyBKZWxseVNlcnZpY2UsIENvbmZpZ3VyYWJsZSB7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbV9jb25maWd1cmVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBNYXAgbV9zY3JpcHRzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBKZWxseVNlcnZpY2UuCi0gICAgICovCi0gICAgcHVibGljIEplbGx5U2VydmljZUltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuYXZhbG9uLkplbGx5U2VydmljZS5ydW5OYW1lZFNjcmlwdChTdHJpbmcsIE1hcCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIHJ1bk5hbWVkU2NyaXB0KCBTdHJpbmcgbmFtZSwgTWFwIHBhcmFtcyApIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcnVuTmFtZWRTY3JpcHQobmFtZSwgcGFyYW1zLCBjcmVhdGVYTUxPdXRwdXQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuYXZhbG9uLkplbGx5U2VydmljZS5ydW5OYW1lZFNjcmlwdChTdHJpbmcsIE1hcCwgWE1MT3V0cHV0KQotICAgICAqLwotICAgIHB1YmxpYyBNYXAgcnVuTmFtZWRTY3JpcHQoIFN0cmluZyBuYW1lLCBNYXAgcGFyYW1zLCBYTUxPdXRwdXQgb3V0cHV0ICkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmKCAhbV9zY3JpcHRzLmNvbnRhaW5zS2V5KCBuYW1lICkgKQotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5RXhjZXB0aW9uKCAiTm8gc2NyaXB0IGV4aXN0cyBmb3Igc2NyaXB0IG5hbWUgWyIgKyBuYW1lICsgIl0iICk7Ci0KLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IChTY3JpcHQpbV9zY3JpcHRzLmdldCggbmFtZSApOwotICAgICAgICBKZWxseUNvbnRleHQgY29udGV4dCA9IGNyZWF0ZUplbGx5Q29udGV4dCgpOwotCi0gICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGVzKCBwYXJhbXMgKTsKLQotICAgICAgICBzY3JpcHQucnVuKCBjb250ZXh0LCBvdXRwdXQgKTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0VmFyaWFibGVzKCk7Ci0gICAgfQotCi0gICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmF2YWxvbi5KZWxseVNlcnZpY2UucnVuTmFtZWRTY3JpcHQoU3RyaW5nLCBNYXAsIE91dHB1dFN0cmVhbSkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIHJ1bk5hbWVkU2NyaXB0KCBTdHJpbmcgbmFtZSwgTWFwIHBhcmFtcywgT3V0cHV0U3RyZWFtIG91dCApIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBYTUxPdXRwdXQgeG1sT3V0cHV0ID0gWE1MT3V0cHV0LmNyZWF0ZVhNTE91dHB1dCggb3V0ICk7Ci0gICAgICAgIE1hcCBhbnN3ZXIgPSBydW5OYW1lZFNjcmlwdChuYW1lLCBwYXJhbXMsIHhtbE91dHB1dCk7Ci0gICAgICAgIHhtbE91dHB1dC5mbHVzaCgpOwotICAgICAgICByZXR1cm4gYW5zd2VyOwotICAgIH0KLQotICAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5hdmFsb24uSmVsbHlTZXJ2aWNlLnJ1blNjcmlwdChTdHJpbmcsIE1hcCwgWE1MT3V0cHV0KQotICAgICAqLwotICAgIHB1YmxpYyBNYXAgcnVuU2NyaXB0KCBTdHJpbmcgdXJsLCBNYXAgcGFyYW1zLCBYTUxPdXRwdXQgb3V0cHV0ICkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFVSTCBhY3R1YWxVcmwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICBhY3R1YWxVcmwgPSBuZXcgVVJMKCB1cmwgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHggKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlFeGNlcHRpb24oICJDb3VsZCBub3QgZmluZCBzY3JpcHQgYXQgVVJMIFsiICsgdXJsICsgIl06ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHguZ2V0TWVzc2FnZSgpLCB4ICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdXAgdGhlIGNvbnRleHQKLSAgICAgICAgSmVsbHlDb250ZXh0IGNvbnRleHQgPSBjcmVhdGVKZWxseUNvbnRleHQoKTsKLSAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZXMoIHBhcmFtcyApOwotCi0gICAgICAgIC8vIFJ1biB0aGUgc2NyaXB0Ci0gICAgICAgIGNvbnRleHQucnVuU2NyaXB0KHVybCwgb3V0cHV0KTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0VmFyaWFibGVzKCk7Ci0gICAgfQotCi0gICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmF2YWxvbi5KZWxseVNlcnZpY2UucnVuU2NyaXB0KFN0cmluZywgTWFwLCBPdXRwdXRTdHJlYW0pCi0gICAgICovCi0gICAgcHVibGljIE1hcCBydW5TY3JpcHQoIFN0cmluZyB1cmwsIE1hcCBwYXJhbXMsIE91dHB1dFN0cmVhbSBvdXQgKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MT3V0cHV0IHhtbE91dHB1dCA9IFhNTE91dHB1dC5jcmVhdGVYTUxPdXRwdXQoIG91dCApOwotICAgICAgICBNYXAgYW5zd2VyID0gcnVuU2NyaXB0KHVybCwgcGFyYW1zLCB4bWxPdXRwdXQpOwotICAgICAgICB4bWxPdXRwdXQuZmx1c2goKTsKLSAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICB9Ci0KLSAgICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuYXZhbG9uLkplbGx5U2VydmljZS5ydW5TY3JpcHQoU3RyaW5nLCBNYXApCi0gICAgICovCi0gICAgcHVibGljIE1hcCBydW5TY3JpcHQoIFN0cmluZyB1cmwsIE1hcCBwYXJhbXMgKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHJ1blNjcmlwdCh1cmwsIHBhcmFtcywgY3JlYXRlWE1MT3V0cHV0KCkpOwotICAgIH0KLQotCi0gICAgLy8gQ29uZmlndXJhYmxlIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSAgICAvKioKLSAgICAgKiA8cD5Db25maWd1cmVzIHRoZSBKZWxseSBTZXJ2aWNlIHdpdGggbmFtZWQgc2NyaXB0cy48L3A+Ci0gICAgICoKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBsb29rcyBsaWtlOgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiAmbHQ7amVsbHkmZ3Q7PGJyIC8+Ci0gICAgICogJm5ic3A7Jm5ic3A7Jmx0O3NjcmlwdCZndDs8YnIgLz4KLSAgICAgKiAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7bmFtZSZndDtzY3JpcHQgbmFtZSZsdDsvbmFtZSZndDs8YnIgLz4KLSAgICAgKiAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7dXJsIHZhbGlkYXRlPSJmYWxzZSImZ3Q7dXJsIHRvIHNjcmlwdCBmaWxlJmx0Oy91cmwmZ3Q7PGJyIC8+Ci0gICAgICogJm5ic3A7Jm5ic3A7Jmx0Oy9zY3JpcHQmZ3Q7PGJyIC8+Ci0gICAgICogJmx0Oy9qZWxseSZndDs8YnIgLz4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogICBXaGVyZSBlYWNoICZsdDtzY3JpcHQmZ3Q7IGVsZW1lbnQgZGVmaW5lcyBhIHNlcGVyYXRlIHNjcmlwdC4gVGhlIHZhbGlkYXRlIGF0dHJpYnV0ZQotICAgICAqICAgb24gdGhlIHVybCB0YWcgaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvIGZhbHNlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWcgVGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgKiBAZXhjZXB0aW9uIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoIENvbmZpZ3VyYXRpb24gY29uZmlnICkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiggbV9jb25maWd1cmVkICkKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCAiY29uZmlndXJlIG1heSBvbmx5IGJlIGV4ZWN1dGVkIG9uY2UiICk7Ci0KLSAgICAgICAgaWYoICEiamVsbHkiLmVxdWFscyggY29uZmlnLmdldE5hbWUoKSApICkKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCAiRXhwZWN0ZWQgPGplbGx5PiBidXQgZ290ICIgKyBjb25maWcuZ2V0TmFtZSgpICk7Ci0KLSAgICAgICAgLy8gQ29uZmlndXJlIG5hbWVkIHNjcmlwdHMKLSAgICAgICAgQ29uZmlndXJhdGlvbltdIHNjcmlwdHMgPSBjb25maWcuZ2V0Q2hpbGRyZW4oICJzY3JpcHRzIiApOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjcmlwdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gY29uZmlnLmdldENoaWxkKCAibmFtZSIgKS5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICAvLyBUcnkgdG8gbG9hZCBhbmQgY29tcGlsZSB0aGUgc2NyaXB0Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN0cmluZyBzY3JpcHROYW1lID0gY29uZmlnLmdldENoaWxkKCAidXJsIiApLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGxvYWQgdGhlIHNjcmlwdCB2aWEgZmlsZSwgdGhlbiBieSBVUkwsIHRoZW4gYnkgY2xhc3Nsb2FkZXIKLSAgICAgICAgICAgICAgICBVUkwgdXJsID0gbnVsbDsKLSAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSggc2NyaXB0TmFtZSApOwotICAgICAgICAgICAgICAgIGlmKCBmaWxlLmV4aXN0cygpICkgewotICAgICAgICAgICAgICAgICAgICB1cmwgPSBmaWxlLnRvVVJMKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gbmV3IFVSTCggc2NyaXB0TmFtZSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWZ1ZSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAvLyBMYXN0IHRyeSwgdmlhIGNsYXNzbG9hZGVyCi0gICAgICAgICAgICAgICAgICAgICAgdXJsID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSggc2NyaXB0TmFtZSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gQWxsIGF0ZW1wdHMgZmFpbGVkLi4uCi0gICAgICAgICAgICAgICAgaWYoIHVybCA9PSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oICJDb3VsZCBub3QgZmluZCBzY3JpcHQgWyIgKyBzY3JpcHROYW1lICsgIl0iICk7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHNjcmlwdCBhbmQgc3RvcmUgaXQKLSAgICAgICAgICAgICAgICBKZWxseSBqZWxseSA9IG5ldyBKZWxseSgpOwotICAgICAgICAgICAgICAgIGplbGx5LnNldFVybCggdXJsICk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiB2YWxpZGF0ZSA9IGNvbmZpZy5nZXRDaGlsZCggInVybCIgKS5nZXRBdHRyaWJ1dGVBc0Jvb2xlYW4oICJ2YWxpZGF0ZSIsICBmYWxzZSApOwotICAgICAgICAgICAgICAgIGplbGx5LnNldFZhbGlkYXRlWE1MKCB2YWxpZGF0ZSApOwotICAgICAgICAgICAgICAgIFNjcmlwdCBzY3JpcHQgPSBqZWxseS5jb21waWxlU2NyaXB0KCk7Ci0KLSAgICAgICAgICAgICAgICBtX3NjcmlwdHMucHV0KCBuYW1lLCBzY3JpcHQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBUaHJvd2FibGUgdCApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiggIkNvdWxkIG5vdCBsb2FkIHNjcmlwdCBbIiArIG5hbWUgKyAiXTogIiArIHQuZ2V0TWVzc2FnZSgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBKZWxseUNvbnRleHQgaW5zdGFuY2UuIERlcml2ZWQgY2xhc3NlcwotICAgICAqIGNvdWxkIG92ZXJsb2FkIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgYSBjdXN0b20gSmVsbHlDb250ZXh0IGluc3RhbmNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBKZWxseUNvbnRleHQgY3JlYXRlSmVsbHlDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gbmV3IEplbGx5Q29udGV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBYTUxPdXRwdXQgdG8gZ2l2ZSB0byBzY3JpcHRzIGFzIHRoZXkgcnVuLgotICAgICAqIERlcml2ZWQgY2xhc3NlcyBjb3VsZCBvdmVybG9hZCB0aGlzIG1ldGhvZCwgc3VjaCBhcyB0byBwaXBlIG91dHB1dCB0bwotICAgICAqIHNvbWUgbG9nIGZpbGUgZXRjLgotICAgICAqLwotICAgIHByb3RlY3RlZCBYTUxPdXRwdXQgY3JlYXRlWE1MT3V0cHV0KCkgewotICAgICAgICAvLyBvdXRwdXQgd2lsbCBqdXN0IGJlIGlnbm9yZWQKLSAgICAgICAgcmV0dXJuIG5ldyBYTUxPdXRwdXQoKTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hdmFsb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYXZhbG9uL3NhbXBsZS5qZWxseSBiL2plbGx5LXRhZ3MvYXZhbG9uL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2F2YWxvbi9zYW1wbGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YmQ2NmQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9hdmFsb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYXZhbG9uL3NhbXBsZS5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM6YXZhbG9uPSJqZWxseTphdmFsb24iPgotCi0gICAgPCEtLSBzb21lIHNhbXBsZSBzY3JpcHRzIHdvdWxkIGJlIGEgZ29vZCBpZGVhIC0tPgotCi08L2plbGx5PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYXZhbG9uL3hkb2NzL2NoYW5nZXMueG1sIGIvamVsbHktdGFncy9hdmFsb24veGRvY3MvY2hhbmdlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYTY0YWYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9hdmFsb24veGRvY3MvY2hhbmdlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tIAotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotIC0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5DaGFuZ2VzPC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0gIDxib2R5PgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMCIgZGF0ZT0iMjAwNC0wOS0xMCI+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0iYWRkIj5Jbml0aWFsIHJlbGVhc2U8L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2F2YWxvbi94ZG9jcy9pbmRleC54bWwgYi9qZWxseS10YWdzL2F2YWxvbi94ZG9jcy9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhOGU0YzYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9hdmFsb24veGRvY3MvaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+QXZhbG9uIEludGVncmF0aW9uPC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0KLSAgPGJvZHk+Ci0gICAgPHNlY3Rpb24gbmFtZT0iT3ZlcnZpZXciPgotICAgICAgPHA+Ci0gICAgICAgIFRoaXMgcHJvdmlkZXMgYW4gQXZhbG9uIFNlcnZpY2UgZm9yIGV4ZWN1dGluZyBKZWxseSBzY3JpcHRzLgotICAgICAgPC9wPgotICAgIDwvc2VjdGlvbj4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9hdmFsb24veGRvY3MvbmF2aWdhdGlvbi54bWwgYi9qZWxseS10YWdzL2F2YWxvbi94ZG9jcy9uYXZpZ2F0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgxOWE0OC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2F2YWxvbi94ZG9jcy9uYXZpZ2F0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgbmFtZT0iQXZhbG9uIEludGVncmF0aW9uIj4KLQotICA8dGl0bGU+QXZhbG9uIEludGVncmF0aW9uPC90aXRsZT4KLSAgCi0gIDxib2R5PgotICAgIDxtZW51IG5hbWU9IkF2YWxvbiBJbnRlZ3JhdGlvbiI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgICAgICAgICAgaHJlZj0iL2luZGV4Lmh0bWwiLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYmVhbi8uY3ZzaWdub3JlIGIvamVsbHktdGFncy9iZWFuLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNGRiOTMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9iZWFuLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWp1bml0Ki5wcm9wZXJ0aWVzCi10YXJnZXQKLW1hdmVuLmxvZwotdmVsb2NpdHkubG9nCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JlYW4vYnVpbGQueG1sIGIvamVsbHktdGFncy9iZWFuL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU4YWZmYS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JlYW4vYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS1idWlsZC54bWwgZ2VuZXJhdGVkIGJ5IG1hdmVuIGZyb20gcHJvamVjdC54bWwgdmVyc2lvbiAxLjAtU05BUFNIT1QKLSAgb24gZGF0ZSBNYXkgMjQgMjAwNCwgdGltZSAyMzAxLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXIiIG5hbWU9ImNvbW1vbnMtamVsbHktdGFncy1iZWFuIiBiYXNlZGlyPSIuIj4KLSAgPHByb3BlcnR5IG5hbWU9ImRlZmF1bHR0YXJnZXRkaXIiIHZhbHVlPSJ0YXJnZXQiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0ibGliZGlyIiB2YWx1ZT0idGFyZ2V0L2xpYiI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L2NsYXNzZXMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0idGVzdGNsYXNzZXNkaXIiIHZhbHVlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RyZXBvcnRkaXIiIHZhbHVlPSJ0YXJnZXQvdGVzdC1yZXBvcnRzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImRpc3RkaXIiIHZhbHVlPSJkaXN0Ij4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImphdmFkb2NkaXIiIHZhbHVlPSJkaXN0L2RvY3MvYXBpIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImZpbmFsLm5hbWUiIHZhbHVlPSJjb21tb25zLWplbGx5LXRhZ3MtYmVhbi0xLjAtU05BUFNIT1QiPgotICA8L3Byb3BlcnR5PgotICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlc2NyaXB0aW9uPSJvIEluaXRpYWxpemVzIHNvbWUgcHJvcGVydGllcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im5vZ2V0Ij4KLSAgICAgIDxlcXVhbHMgYXJnMj0ib25seSIgYXJnMT0iJHtidWlsZC5zeXNjbGFzc3BhdGh9Ij4KLSAgICAgIDwvZXF1YWxzPgotICAgIDwvY29uZGl0aW9uPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXNjcmlwdGlvbj0ibyBDb21waWxlIHRoZSBjb2RlIiBkZXBlbmRzPSJnZXQtZGVwcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHtjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvamF2YSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICAgIDxjb3B5IHRvZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL2phdmEiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICAgIDxjb3B5IHRvZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qZWxseSI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueHNsIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnJuZyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5kdGQiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5odG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamFyIiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgdGhlIGphciIgZGVwZW5kcz0iY29tcGlsZSx0ZXN0Ij4KLSAgICA8amFyIGphcmZpbGU9InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCIgYmFzZWRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0ibyBDbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIGRpcmVjdG9yaWVzIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGlzdGRpcn0iPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgYSBkaXN0cmlidXRpb24iIGRlcGVuZHM9ImphciwgamF2YWRvYyI+Ci0gICAgPG1rZGlyIGRpcj0iZGlzdCI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29weSB0b2Rpcj0iZGlzdCI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iIGluY2x1ZGVzPSIqLmphciI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iIGluY2x1ZGVzPSJMSUNFTlNFKiwgUkVBRE1FKiI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0ibyBSdW4gdGhlIHRlc3QgY2FzZXMiIGlmPSJ0ZXN0LmZhaWx1cmUiIGRlcGVuZHM9ImludGVybmFsLXRlc3QiPgotICAgIDxmYWlsIG1lc3NhZ2U9IlRoZXJlIHdlcmUgdGVzdCBmYWlsdXJlcy4iPgotICAgIDwvZmFpbD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iaW50ZXJuYWwtdGVzdCIgZGVwZW5kcz0iY29tcGlsZS10ZXN0cyI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8anVuaXQgZGlyPSIuLyIgZmFpbHVyZXByb3BlcnR5PSJ0ZXN0LmZhaWx1cmUiIHByaW50U3VtbWFyeT0ieWVzIiBmb3JrPSJ0cnVlIiBoYWx0b25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJiYXNlZGlyIiB2YWx1ZT0iLiI+Ci0gICAgICA8L3N5c3Byb3BlcnR5PgotICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Zm9ybWF0dGVyIHVzZWZpbGU9ImZhbHNlIiB0eXBlPSJwbGFpbiI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL1Rlc3QqLmphdmEiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgPC9qdW5pdD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZS10ZXN0cyIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy90ZXN0Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamF2YWRvYyIgZGVzY3JpcHRpb249Im8gR2VuZXJhdGUgamF2YWRvYyIgZGVwZW5kcz0iamFyIj4KLSAgICA8bWtkaXIgZGlyPSIke2phdmFkb2NkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDx0c3RhbXA+Ci0gICAgICA8Zm9ybWF0IHBhdHRlcm49IjIwMDIteXl5eSIgcHJvcGVydHk9InllYXIiPgotICAgICAgPC9mb3JtYXQ+Ci0gICAgPC90c3RhbXA+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvcHlyaWdodCIgdmFsdWU9IkNvcHlyaWdodCAmYW1wO2NvcHk7ICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLWJlYW4gMS4wLVNOQVBTSE9UIEFQSSI+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgICA8amF2YWRvYyB1c2U9InRydWUiIHByaXZhdGU9InRydWUiIGRlc3RkaXI9IiR7amF2YWRvY2Rpcn0iIGF1dGhvcj0idHJ1ZSIgdmVyc2lvbj0idHJ1ZSIgc291cmNlcGF0aD0ic3JjL2phdmEiIHBhY2thZ2VuYW1lcz0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYmVhbi4qIj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0idGFyZ2V0LyR7ZmluYWwubmFtZX0uamFyIj4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWRvYz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iZ2V0LWRlcHMiIHVubGVzcz0ibm9nZXQiIGRlcGVuZHM9ImluaXQiPgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamVsbHkvamFycy9jb21tb25zLWplbGx5LVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS10YWdzLWxvZy1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktdGFncy1sb2ctU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LXRhZ3MtanVuaXQtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamVsbHkvamFycy9jb21tb25zLWplbGx5LXRhZ3MtanVuaXQtU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamV4bC9qYXJzL2NvbW1vbnMtamV4bC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3htbC1hcGlzLTEuMC5iMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veG1sLWFwaXMvamFycy94bWwtYXBpcy0xLjAuYjIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWJlYW51dGlscy0xLjYuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtYmVhbnV0aWxzL2phcnMvY29tbW9ucy1iZWFudXRpbHMtMS42LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtY29sbGVjdGlvbnMvamFycy9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1sb2dnaW5nL2phcnMvY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vZG9tNGotMS41LWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vZG9tNGovamFycy9kb200ai0xLjUtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vamF4ZW4tMS4xLWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vamF4ZW4vamFycy9qYXhlbi0xLjEtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veGVyY2VzLTIuMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94ZXJjZXMvamFycy94ZXJjZXMtMi4yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qdW5pdC0zLjguMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vanVuaXQvamFycy9qdW5pdC0zLjguMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FudC0xLjUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC0xLjUuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtb3B0aW9uYWwtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtb3B0aW9uYWwtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtbWF2ZW4iPgotICAgIDxnZXQgZGVzdD0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBzcmM9IiR7cmVwb30vbWF2ZW4vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8dW5qYXIgZGVzdD0iJHttYXZlbi5ob21lfSIgc3JjPSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L3VuamFyPgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JlYW4vbWF2ZW4ueG1sIGIvamVsbHktdGFncy9iZWFuL21hdmVuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3YWRiMy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JlYW4vbWF2ZW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImphdmE6amFyIj4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZWFuL3Byb2plY3QucHJvcGVydGllcyBiL2plbGx5LXRhZ3MvYmVhbi9wcm9qZWN0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMTljYmMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9iZWFuL3Byb2plY3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jIAotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUCBSIE8gSiBFIEMgVCAgUCBSIE8gUCBFIFIgVCBJIEUgUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JlYW4vcHJvamVjdC54bWwgYi9qZWxseS10YWdzL2JlYW4vcHJvamVjdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMzBkMzkuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9iZWFuL3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdD4KLSAgPGV4dGVuZD4ke2Jhc2VkaXJ9Ly4uL3RhZy1wcm9qZWN0LnhtbDwvZXh0ZW5kPgotICA8aWQ+Y29tbW9ucy1qZWxseS10YWdzLWJlYW48L2lkPgotICA8bmFtZT5jb21tb25zLWplbGx5LXRhZ3MtYmVhbjwvbmFtZT4KLSAgPGN1cnJlbnRWZXJzaW9uPjEuMC4xLVNOQVBTSE9UPC9jdXJyZW50VmVyc2lvbj4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYmVhbjwvcGFja2FnZT4KLQotICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgVGhlIEplbGx5IEJlYW4gVGFnIExpYnJhcnkKLSAgPC9kZXNjcmlwdGlvbj4KLSAgPHNob3J0RGVzY3JpcHRpb24+Q29tbW9ucyBKZWxseSBCZWFuIFRhZyBMaWJyYXJ5PC9zaG9ydERlc2NyaXB0aW9uPgotICAKLSAgPHZlcnNpb25zPgotICAgIDx2ZXJzaW9uPgotICAgICAgPGlkPjEuMDwvaWQ+Ci0gICAgICA8bmFtZT4xLjA8L25hbWU+Ci0gICAgICA8dGFnPkNPTU1PTlNfSkVMTFlfQkVBTi0xXzA8L3RhZz4KLSAgICA8L3ZlcnNpb24+Ci0gIDwvdmVyc2lvbnM+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLQotICAgIDwhLS0gU1RBUlQgZm9yIHRlc3QtLT4KLSAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWplbGx5PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1qZWxseS10YWdzLWxvZzwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgIDx1cmw+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5L2xpYnMvbG9nLzwvdXJsPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1qZWxseTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtamVsbHktdGFncy1qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgIDx1cmw+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5L2xpYnMvanVuaXQvPC91cmw+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPCEtLSBFTkQgZm9yIHRlc3QgLS0+Ci0KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZWFuL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW4vQmVhblByb3BlcnR5VGFnLmphdmEgYi9qZWxseS10YWdzL2JlYW4vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbi9CZWFuUHJvcGVydHlUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM5YTNjZi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JlYW4vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbi9CZWFuUHJvcGVydHlUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYmVhbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5NZXRob2RVdGlsczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKioKLSAqIENyZWF0ZXMgYSBuZXN0ZWQgcHJvcGVydHkgdmlhIGNhbGxpbmcgYSBiZWFucyBjcmVhdGVGb28oKSBtZXRob2QgdGhlbgotICogZWl0aGVyIGNhbGxpbmcgdGhlIHNldEZvbyh2YWx1ZSkgb3IgYWRkRm9vKHZhbHVlKSBtZXRob2RzIGluIGEgc2ltaWxhciB3YXkKLSAqIHRvIGhvdyBBbnQgdGFncyBjb25zdHJ1Y3QgdGhlbXNlbHZlcy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAYXV0aG9yIENocmlzdGlhbiBTZWxsCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuUHJvcGVydHlUYWcgZXh0ZW5kcyBCZWFuVGFnIHsKLQotICAgIC8qKiBlbXB0eSBhcmd1bWVudHMgY29uc3RhbnQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUkdTID0ge307Ci0KLSAgICAvKiogZW1wdHkgYXJndW1lbnQgdHlwZXMgY29uc3RhbnQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEVNUFRZX0FSR19UWVBFUyA9IHt9OwotCi0gICAgLyoqIHRoZSBuYW1lIG9mIHRoZSBjcmVhdGUgbWV0aG9kICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlTWV0aG9kTmFtZTsKLQotCi0gICAgcHVibGljIEJlYW5Qcm9wZXJ0eVRhZyhTdHJpbmcgdGFnTmFtZSkgewotICAgICAgICBzdXBlcihPYmplY3QuY2xhc3MsIHRhZ05hbWUpOwotCi0gICAgICAgIGlmICh0YWdOYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgY3JlYXRlTWV0aG9kTmFtZSA9ICJjcmVhdGUiCi0gICAgICAgICAgICAgICAgKyB0YWdOYW1lLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkKLSAgICAgICAgICAgICAgICArIHRhZ05hbWUuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBieSBjYWxsaW5nIGEgY3JlYXRlIG1ldGhvZCBvbiB0aGUgcGFyZW50IGJlYW4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IG5ld0luc3RhbmNlKENsYXNzIHRoZUNsYXNzLCBNYXAgYXR0cmlidXRlcywgWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IHBhcmVudE9iamVjdCA9IGdldFBhcmVudE9iamVjdCgpOwotICAgICAgICBpZiAocGFyZW50T2JqZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIG5vdyBsZXRzIHRyeSBjYWxsIHRoZSBjcmVhdGUgbWV0aG9kLi4uCi0gICAgICAgICAgICBDbGFzcyBwYXJlbnRDbGFzcyA9IHBhcmVudE9iamVjdC5nZXRDbGFzcygpOwotICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGZpbmRDcmVhdGVNZXRob2QocGFyZW50Q2xhc3MpOwotICAgICAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2UocGFyZW50T2JqZWN0LCBFTVBUWV9BUkdTKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggImZhaWxlZCB0byBpbnZva2UgbWV0aG9kOiAiICsgbWV0aG9kICsgIiBvbiBiZWFuOiAiICsgcGFyZW50T2JqZWN0ICsgIiByZWFzb246ICIgKyBlLCBlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgdGFnQ2xhc3MgPSB0aGVDbGFzczsKLSAgICAgICAgICAgICAgICBpZih0YWdDbGFzcyA9PSBPYmplY3QuY2xhc3MpCi0gICAgICAgICAgICAgICAgICAgIHRhZ0NsYXNzID0gZmluZEFkZE1ldGhvZENsYXNzKHBhcmVudENsYXNzKTsKLSAgICAgICAgICAgICAgICBpZih0YWdDbGFzcyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oInVuYWJsZSB0byBpbmZlciBlbGVtZW50IGNsYXNzIGZvciB0YWcgIitnZXRUYWdOYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKHRhZ0NsYXNzLCBhdHRyaWJ1dGVzLCBvdXRwdXQpIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIlRoZSAiICsgZ2V0VGFnTmFtZSgpICsgIiB0YWcgbXVzdCBiZSBuZXN0ZWQgd2l0aGluIGEgdGFnIHdoaWNoIG1hcHMgdG8gYSBCZWFuU291cmNlIGltcGxlbWVudG9yIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZmluZHMgdGhlIHBhcmFtZXRlciB0eXBlIG9mIHRoZSBmaXJzdCBwdWJsaWMgbWV0aG9kIGluIHRoZSBwYXJlbnQgY2xhc3Mgd2hvc2UgbmFtZQotICAgICAqIG1hdGNoZXMgdGhlIGFkZHt0YWcgbmFtZX0gcGF0dGVybiwgd2hvc2UgcmV0dXJuIHR5cGUgaXMgdm9pZCBhbmQgd2hpY2ggdGFrZXMKLSAgICAgKiBvbmUgYXJndW1lbnQgb25seS4KLSAgICAgKiBAcGFyYW0gcGFyZW50Q2xhc3MKLSAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcyBvZiB0aGUgZmlyc3QgYW5kIG9ubHkgcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENsYXNzIGZpbmRBZGRNZXRob2RDbGFzcyhDbGFzcyBwYXJlbnRDbGFzcykgewotICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gcGFyZW50Q2xhc3MuZ2V0TWV0aG9kcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotICAgICAgICAgICAgaWYoTW9kaWZpZXIuaXNQdWJsaWMobWV0aG9kLmdldE1vZGlmaWVycygpKSkgewotICAgICAgICAgICAgICAgIENsYXNzW10gYXJncyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhhZGRNZXRob2ROYW1lKQotICAgICAgICAgICAgICAgICAgICAgICYmIGphdmEubGFuZy5Wb2lkLlRZUEUuZXF1YWxzKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgJiYgYXJncy5sZW5ndGggPT0gMQotICAgICAgICAgICAgICAgICAgICAgICYmICFqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmVxdWFscyhhcmdzWzBdKQotICAgICAgICAgICAgICAgICAgICAgICYmICFhcmdzWzBdLmlzQXJyYXkoKQotICAgICAgICAgICAgICAgICAgICAgICYmICFhcmdzWzBdLmlzUHJpbWl0aXZlKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmdzWzBdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBNZXRob2QgdG8gY3JlYXRlIGEgbmV3IHByb3BlcnR5IG9iamVjdAotICAgICAqLwotICAgIHByb3RlY3RlZCBNZXRob2QgZmluZENyZWF0ZU1ldGhvZChDbGFzcyB0aGVDbGFzcykgewotICAgICAgICBpZiAoY3JlYXRlTWV0aG9kTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWV0aG9kVXRpbHMuZ2V0QWNjZXNzaWJsZU1ldGhvZCgKLSAgICAgICAgICAgIHRoZUNsYXNzLCBjcmVhdGVNZXRob2ROYW1lLCBFTVBUWV9BUkdfVFlQRVMKLSAgICAgICAgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JlYW4vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbi9CZWFuVGFnLmphdmEgYi9qZWxseS10YWdzL2JlYW4vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbi9CZWFuVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMGUzMTEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9iZWFuL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW4vQmVhblRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5iZWFuOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkJlYW5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLk1ldGhvZFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLkJlYW5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuQ29sbGVjdGlvblRhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5jb3JlLlVzZUJlYW5UYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBDcmVhdGVzIGEgYmVhbiBmb3IgdGhlIGdpdmVuIHRhZyB3aGljaCBpcyB0aGVuIGVpdGhlciBvdXRwdXQgYXMgYSB2YXJpYWJsZQotICogb3IgY2FuIGJlIGFkZGVkIHRvIGEgcGFyZW50IHRhZy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAYXV0aG9yIENocmlzdGlhbiBTZWxsCi0gKiBAdmVyc2lvbiAgICRSZXZpc2lvbjogMS4xMSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuVGFnIGV4dGVuZHMgVXNlQmVhblRhZyB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQmVhblRhZy5jbGFzcyk7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX0FSR1VNRU5UUyA9IHt9OwotCi0gICAgLyoqIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjcmVhdGUgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0YWdOYW1lOwotCi0gICAgLyoqIHRoZSBuYW1lIG9mIHRoZSBhZGRlciBtZXRob2QgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGFkZE1ldGhvZE5hbWU7Ci0KLSAgICAvKiogaWYgcHJlc2VudCB0aGlzIGlzIHVzZWQgdG8gY2FsbCBhIGRvaXQgbWV0aG9kIHdoZW4gdGhlIGJlYW4gaXMgY29uc3RydWN0ZWQgKi8KLSAgICBwcml2YXRlIE1ldGhvZCBpbnZva2VNZXRob2Q7Ci0KLQotICAgIHB1YmxpYyBCZWFuVGFnKCkgewotICAgICAgICB0aGlzKG51bGwsICJiZWFuIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIEJlYW5UYWcoQ2xhc3MgZGVmYXVsdENsYXNzLCBTdHJpbmcgdGFnTmFtZSkgewotICAgICAgICB0aGlzKGRlZmF1bHRDbGFzcywgdGFnTmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIEJlYW5UYWcoQ2xhc3MgZGVmYXVsdENsYXNzLCBTdHJpbmcgdGFnTmFtZSwgTWV0aG9kIGludm9rZU1ldGhvZCkgewotICAgICAgICBzdXBlcihkZWZhdWx0Q2xhc3MpOwotICAgICAgICB0aGlzLnRhZ05hbWUgPSB0YWdOYW1lOwotICAgICAgICB0aGlzLmludm9rZU1ldGhvZCA9IGludm9rZU1ldGhvZDsKLQotICAgICAgICBpZiAodGFnTmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGFkZE1ldGhvZE5hbWUgPSAiYWRkIgotICAgICAgICAgICAgICAgICsgdGFnTmFtZS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpCi0gICAgICAgICAgICAgICAgKyB0YWdOYW1lLnN1YnN0cmluZygxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGxvY2FsIG5hbWUgb2YgdGhlIFhNTCB0YWcgdG8gd2hpY2ggdGhpcyB0YWcgaXMgYm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhZ05hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0YWdOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE91dHB1dCB0aGUgdGFnIGFzIGEgbmFtZWQgdmFyaWFibGUuIElmIHRoZSBwYXJlbnQgYmVhbiBoYXMgYW4gYWRkZXIgb3Igc2V0dGVyCi0gICAgICogbWV0aG9kIHRoZW4gaW52b2tlIHRoYXQgdG8gcmVnaXN0ZXIgdGhpcyBiZWFuIHdpdGggaXRzIHBhcmVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQmVhbihTdHJpbmcgdmFyLCBPYmplY3QgYmVhbikgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHZhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhciwgYmVhbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3cgbGV0cyB0cnkgc2V0IHRoZSBwYXJlbnQgcHJvcGVydHkgdmlhIGNhbGxpbmcgdGhlIGFkZGVyIG9yIHRoZSBzZXR0ZXIgbWV0aG9kCi0gICAgICAgIGlmIChiZWFuICE9IG51bGwpIHsKLSAgICAgICAgICAgIFRhZyBwYXJlbnQgPSB0aGlzOwotCi0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJlYW5Tb3VyY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgQmVhblNvdXJjZSBzb3VyY2UgPSAoQmVhblNvdXJjZSkgcGFyZW50OwotICAgICAgICAgICAgICAgICAgICBPYmplY3QgcGFyZW50T2JqZWN0ID0gc291cmNlLmdldEJlYW4oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE9iamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50T2JqZWN0IGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBwYXJlbnRPYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi5hZGQoYmVhbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZXRzIHNlZSBpZiB0aGVyZSdzIGEgc2V0dGVyIG1ldGhvZC4uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBmaW5kQWRkTWV0aG9kKHBhcmVudE9iamVjdC5nZXRDbGFzcygpLCBiZWFuLmdldENsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBhcmdzID0geyBiZWFuIH07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlKHBhcmVudE9iamVjdCwgYXJncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICJmYWlsZWQgdG8gaW52b2tlIG1ldGhvZDogIiArIG1ldGhvZCArICIgb24gYmVhbjogIiArIHBhcmVudE9iamVjdCArICIgcmVhc29uOiAiICsgZSwgZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlYW5VdGlscy5zZXRQcm9wZXJ0eShwYXJlbnRPYmplY3QsIHRhZ05hbWUsIGJlYW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiQ2Fubm90IHByb2Nlc3MgbnVsbCBiZWFuIGZvciB0YWc6ICIgKyBwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb25UYWcpIHsKLSAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvblRhZyB0YWcgPSAoQ29sbGVjdGlvblRhZykgcGFyZW50OwotICAgICAgICAgICAgICAgICAgICB0YWcuYWRkSXRlbShiZWFuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGludm9rZU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IHsgYmVhbiB9OwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGludm9rZU1ldGhvZC5pbnZva2UoYmVhbiwgRU1QVFlfQVJHVU1FTlRTKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggImZhaWxlZCB0byBpbnZva2UgbWV0aG9kOiAiICsgaW52b2tlTWV0aG9kICsgIiBvbiBiZWFuOiAiICsgYmVhbiArICIgcmVhc29uOiAiICsgZSwgZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCAmJiB2YXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvL3dhcm4gaWYgdGhlIGJlYW4gZ2V0cyBsb3N0IGluIHNwYWNlCi0gICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCAiQ291bGQgbm90IGFkZCBiZWFuIHRvIHBhcmVudCBmb3IgYmVhbjogIiArIGJlYW4gKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kcyB0aGUgTWV0aG9kIHRvIGFkZCB0aGUgbmV3IGJlYW4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWV0aG9kIGZpbmRBZGRNZXRob2QoQ2xhc3MgYmVhbkNsYXNzLCBDbGFzcyB2YWx1ZUNsYXNzKSB7Ci0gICAgICAgIGlmIChhZGRNZXRob2ROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIENsYXNzW10gYXJnVHlwZXMgPSB7IHZhbHVlQ2xhc3MgfTsKLSAgICAgICAgcmV0dXJuIE1ldGhvZFV0aWxzLmdldEFjY2Vzc2libGVNZXRob2QoCi0gICAgICAgICAgICBiZWFuQ2xhc3MsIGFkZE1ldGhvZE5hbWUsIGFyZ1R5cGVzCi0gICAgICAgICk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXJlbnQgYmVhbiBvYmplY3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFBhcmVudE9iamVjdCgpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJlYW5Tb3VyY2UgdGFnID0gKEJlYW5Tb3VyY2UpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyhCZWFuU291cmNlLmNsYXNzKTsKLSAgICAgICAgaWYgKHRhZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGFnLmdldEJlYW4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JlYW4vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbi9CZWFuVGFnTGlicmFyeS5qYXZhIGIvamVsbHktdGFncy9iZWFuL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW4vQmVhblRhZ0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc5YmJmYS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JlYW4vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbi9CZWFuVGFnTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYmVhbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLk1ldGhvZFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdMaWJyYXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLlRhZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuVGFnU2NyaXB0OwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotLyoqIERlc2NyaWJlcyB0aGUgVGFnbGliLiBUaGlzIGNsYXNzIGNvdWxkIGJlIGdlbmVyYXRlZCBieSBYRG9jbGV0Ci0gICoKLSAgKiBAYXV0aG9yIFRoZW8gTmllbWVpamVyCi0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjcgJAotICAqLwotcHVibGljIGNsYXNzIEJlYW5UYWdMaWJyYXJ5IGV4dGVuZHMgVGFnTGlicmFyeSB7Ci0KLSAgICAvKiogU3luY2hyb25pemVkIG1hcCBvZiB0YWcgbmFtZXMgdG8gYmVhbiBjbGFzc2VzICovCi0gICAgcHJpdmF0ZSBNYXAgYmVhblR5cGVzID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgLyoqIFN5bmNocm9uaXplZCBtYXAgb2YgdGFnIG5hbWVzIHRvIGludm9rZSBtZXRob2RzICovCi0gICAgcHJpdmF0ZSBNYXAgaW52b2tlTWV0aG9kcyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgIHB1YmxpYyBCZWFuVGFnTGlicmFyeSgpIHsKLSAgICAgICAgcmVnaXN0ZXJUYWdGYWN0b3J5KAotICAgICAgICAgICAgImJlYW5kZWYiLAotICAgICAgICAgICAgbmV3IFRhZ0ZhY3RvcnkoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIFRhZyBjcmVhdGVUYWcoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCZWFuZGVmVGFnKEJlYW5UYWdMaWJyYXJ5LnRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvd3MgdGFncyB0byByZWdpc3RlciBuZXcgYmVhbiB0eXBlcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQmVhbihTdHJpbmcgbmFtZSwgQ2xhc3MgdHlwZSkgewotICAgICAgICBiZWFuVHlwZXMucHV0KG5hbWUsIHR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsbG93cyB0YWdzIHRvIHJlZ2lzdGVyIG5ldyBiZWFuIHR5cGVzIHdpdGggYW4gYXNzb2NpYXRlZCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckJlYW4oU3RyaW5nIG5hbWUsIENsYXNzIHR5cGUsIE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgcmVnaXN0ZXJCZWFuKG5hbWUsIHR5cGUpOwotICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludm9rZU1ldGhvZHMucHV0KG5hbWUsIG1ldGhvZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpbnZva2VNZXRob2RzLnJlbW92ZShuYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsbG93cyB0YWdzIHRvIHJlZ2lzdGVyIG5ldyBiZWFuIHR5cGVzIHdpdGggYW4gYXNzb2NpYXRlZCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckJlYW4oU3RyaW5nIG5hbWUsIENsYXNzIHR5cGUsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSBNZXRob2RVdGlscy5nZXRBY2Nlc3NpYmxlTWV0aG9kKAotICAgICAgICAgICAgdHlwZSwgbWV0aG9kTmFtZSwgQmVhbmRlZlRhZy5FTVBUWV9BUkdVTUVOVF9UWVBFUwotICAgICAgICApOwotICAgICAgICByZWdpc3RlckJlYW4obmFtZSwgdHlwZSwgbWV0aG9kKTsKLSAgICB9Ci0KLSAgICAvLyBUYWdMaWJyYXJ5IGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBUYWdTY3JpcHQgY3JlYXRlVGFnU2NyaXB0KAotICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzCi0gICAgKSB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotCi0gICAgICAgIC8vIGNoZWNrIGZvciBzdGFuZGFyZCB0YWdzIGZpcnN0Ci0gICAgICAgIFRhZ1NjcmlwdCBhbnN3ZXIgPSBzdXBlci5jcmVhdGVUYWdTY3JpcHQobmFtZSwgYXR0cmlidXRlcyk7Ci0gICAgICAgIGlmIChhbnN3ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGxldHMgdHJ5IGEgZHluYW1pYyB0YWcKLSAgICAgICAgcmV0dXJuIG5ldyBUYWdTY3JpcHQoIGNyZWF0ZVRhZ0ZhY3RvcnkobmFtZSwgYXR0cmlidXRlcykgKTsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBUYWdGYWN0b3J5IGZvciBhIGdpdmVuIHRhZyBhdHRyaWJ1dGUgYW5kIGF0dHJpYnV0ZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVGFnRmFjdG9yeSBjcmVhdGVUYWdGYWN0b3J5KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBUYWdGYWN0b3J5KCkgewotICAgICAgICAgICAgcHVibGljIFRhZyBjcmVhdGVUYWcoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlQmVhblRhZyhuYW1lLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgVGFnIGNyZWF0ZUJlYW5UYWcoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLSAgICAgICAgLy8gaXMgdGhlIG5hbWUgYm91bmQgdG8gYSBzcGVjaWZpYyBjbGFzcwotICAgICAgICBDbGFzcyBiZWFuVHlwZSA9IGdldEJlYW5UeXBlKG5hbWUsIGF0dHJpYnV0ZXMpOwotICAgICAgICBpZiAoYmVhblR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgTWV0aG9kIGludm9rZU1ldGhvZCA9IChNZXRob2QpIGludm9rZU1ldGhvZHMuZ2V0KG5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBCZWFuVGFnKGJlYW5UeXBlLCBuYW1lLCBpbnZva2VNZXRob2QpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaXRzIGEgcHJvcGVydHkgdGFnCi0gICAgICAgIHJldHVybiBuZXcgQmVhblByb3BlcnR5VGFnKG5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbGFzcyBnZXRCZWFuVHlwZShTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgIHJldHVybiAoQ2xhc3MpIGJlYW5UeXBlcy5nZXQobmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZWFuL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW4vQmVhbmRlZlRhZy5qYXZhIGIvamVsbHktdGFncy9iZWFuL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW4vQmVhbmRlZlRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTc3ZTkwLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYmVhbi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZWFuL0JlYW5kZWZUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYmVhbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5NZXRob2RVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudXRpbC5DbGFzc0xvYWRlclV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0KLS8qKgotICogQmluZHMgYSBKYXZhIGJlYW4gdG8gdGhlIGdpdmVuIG5hbWVkIEplbGx5IHRhZyBzbyB0aGF0IHRoZSBhdHRyaWJ1dGVzIG9mCi0gKiB0aGUgdGFnIHNldCB0aGUgYmVhbiBwcm9wZXJ0aWVzLi4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuZGVmVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQmVhbmRlZlRhZy5jbGFzcyk7Ci0KLSAgICAvKiogQW4gZW1wdHkgTWFwIGFzIEkgdGhpbmsgQ29sbGVjdGlvbnMuRU1QVFlfTUFQIGlzIG9ubHkgSkRLIDEuMyBvbndhcmRzICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIEVNUFRZX01BUCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzW10gRU1QVFlfQVJHVU1FTlRfVFlQRVMgPSB7fTsKLQotICAgIC8qKiB0aGUgbmFtZSBvZiB0aGUgdGFnIHRvIGNyZWF0ZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKiogdGhlIEphdmEgY2xhc3MgbmFtZSB0byB1c2UgZm9yIHRoZSB0YWcgKi8KLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7Ci0KLSAgICAvKiogdGhlIG5hbWUgb2YgdGhlIGludm9rZSBtZXRob2QgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtZXRob2ROYW1lOwotCi0gICAgLyoqIHRoZSBDbGFzc0xvYWRlciB1c2VkIHRvIGxvYWQgYmVhbnMgKi8KLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOwotCi0gICAgLyoqIHRoZSBsaWJyYXJ5IGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIG5ldyBiZWFuIHRhZyAqLwotICAgIHByaXZhdGUgQmVhblRhZ0xpYnJhcnkgbGlicmFyeTsKLQotICAgIHB1YmxpYyBCZWFuZGVmVGFnKEJlYW5UYWdMaWJyYXJ5IGxpYnJhcnkpIHsKLSAgICAgICAgdGhpcy5saWJyYXJ5ID0gbGlicmFyeTsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotCi0gICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCJuYW1lIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbigiY2xhc3NOYW1lIik7Ci0gICAgICAgIH0KLQotICAgICAgICBDbGFzcyB0aGVDbGFzcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGVDbGFzcyA9IENsYXNzTG9hZGVyVXRpbHMubG9hZENsYXNzKGNsYXNzTmFtZSwgY2xhc3NMb2FkZXIsIGdldENvbnRleHQoKS5nZXRVc2VDb250ZXh0Q2xhc3NMb2FkZXIoKSwgZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCAiQ291bGQgbm90IGxvYWQgY2xhc3M6ICIgKyBjbGFzc05hbWUgKyAiIGV4Y2VwdGlvbjogIiArIGUsIGUgKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgY2xhc3M6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBjbGFzc05hbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiIHVzaW5nIENsYXNzTG9hZGVyOiAiCi0gICAgICAgICAgICAgICAgICAgICsgY2xhc3NMb2FkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWV0aG9kIGludm9rZU1ldGhvZCA9IGdldEludm9rZU1ldGhvZCh0aGVDbGFzcyk7Ci0KLSAgICAgICAgLy8gQHRvZG8gc2hvdWxkIHdlIGFsbG93IHRoZSB2YXJpYWJsZSBuYW1lIHRvIGJlIHNwZWNpZmllZD8KLSAgICAgICAgbGlicmFyeS5yZWdpc3RlckJlYW4obmFtZSwgdGhlQ2xhc3MsIGludm9rZU1ldGhvZCk7Ci0gICAgfQotCi0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB0YWcgdG8gY3JlYXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEphdmEgY2xhc3MgbmFtZSB0byB1c2UgZm9yIHRoZSB0YWcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBDbGFzc0xvYWRlciB0byB1c2UgdG8gbG9hZCB0aGUgY2xhc3MuCi0gICAgICogSWYgbm8gdmFsdWUgaXMgc2V0IHRoZW4gdGhlIGN1cnJlbnQgdGhyZWFkcyBjb250ZXh0IGNsYXNzCi0gICAgICogbG9hZGVyIGlzIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLSAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIENsYXNzTG9hZGVyIHRvIHVzZSB0byBsb2FkIGNsYXNzZXMKLSAgICAgKiAgb3Igd2lsbCB1c2UgdGhlIHRocmVhZCBjb250ZXh0IGxvYWRlciBpZiBub25lIGlzIHNwZWNpZmllZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7Ci0gICAgICAgIHJldHVybiBDbGFzc0xvYWRlclV0aWxzLmdldENsYXNzTG9hZGVyKGNsYXNzTG9hZGVyLCB0cnVlLCBnZXRDbGFzcygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1ldGhvZE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWV0aG9kTmFtZS4KLSAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSBUaGUgbWV0aG9kTmFtZSB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRob2ROYW1lKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0gICAgICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHByb3RlY3RlZCBNZXRob2QgZ2V0SW52b2tlTWV0aG9kKENsYXNzIHRoZUNsYXNzKSB7Ci0gICAgICAgIGlmIChtZXRob2ROYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGxldHMgbG9va3VwIHRoZSBtZXRob2QgbmFtZQotICAgICAgICAgICAgcmV0dXJuIE1ldGhvZFV0aWxzLmdldEFjY2Vzc2libGVNZXRob2QodGhlQ2xhc3MsIG1ldGhvZE5hbWUsIEVNUFRZX0FSR1VNRU5UX1RZUEVTKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JlYW4vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbi9wYWNrYWdlLmh0bWwgYi9qZWxseS10YWdzL2JlYW4vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5Yzc0ZWMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9iZWFuL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW4vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxodG1sPgotPGhlYWQ+Ci08L2hlYWQ+Ci08Ym9keT4KLQotICA8cD4KLSAgCUEgdGFnIGxpYnJhcnkgZm9yIG1hcHBpbmcgdGFncyB0byBiZWFucyB1c2luZyBhIHNpbWlsYXIgYXBwcm9hY2ggdG8gQW50LgotICA8L3A+Ci0gIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZWFuL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW4vQ3VzdG9tZXIuamF2YSBiL2plbGx5LXRhZ3MvYmVhbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZWFuL0N1c3RvbWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNmYzYTQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9iZWFuL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW4vQ3VzdG9tZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmJlYW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBIHNhbXBsZSBiZWFuIHRoYXQgd2UgY2FuIGNvbnN0cnVjdCB2aWEgSmVsbHkgdGFncwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbWVyIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb247Ci0gICAgcHJpdmF0ZSBMaXN0IG9yZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCi0gICAgcHVibGljIEN1c3RvbWVyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBDdXN0b21lcihTdHJpbmcgbmFtZSkgewotICAgICAgICBzZXROYW1lKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDdXN0b21lcihTdHJpbmcgbmFtZSwgU3RyaW5nIGxvY2F0aW9uKSB7Ci0gICAgICAgIHNldE5hbWUobmFtZSk7Ci0gICAgICAgIHNldExvY2F0aW9uKGxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ3VzdG9tZXIoU3RyaW5nIG5hbWUsIFN0cmluZyBsb2NhdGlvbiwgT3JkZXIgYW5PcmRlcikgewotICAgICAgICBzZXROYW1lKG5hbWUpOwotICAgICAgICBzZXRMb2NhdGlvbihsb2NhdGlvbik7Ci0gICAgICAgIGFkZE9yZGVyKGFuT3JkZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBDdXN0b21lcihDdXN0b21lciBjdXN0KSB7Ci0gICAgICAgIHNldE5hbWUoY3VzdC5nZXROYW1lKCkpOwotICAgICAgICBzZXRMb2NhdGlvbihjdXN0LmdldExvY2F0aW9uKCkpOwotICAgICAgICBMaXN0IGxpc3QgPSBjdXN0LmdldE9yZGVycygpOwotICAgICAgICBpZihudWxsICE9IGxpc3QpIHsKLSAgICAgICAgICAgIGZvcihJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIGFkZE9yZGVyKChPcmRlcilpdGVyLm5leHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICJbbmFtZT0iICsgbmFtZSArICI7bG9jYXRpb249IiArIGxvY2F0aW9uICsgIl0iOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgT3JkZXIgb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIE9yZGVyIGNyZWF0ZU9yZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IE9yZGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0T3JkZXJzKCkgewotICAgICAgICByZXR1cm4gb3JkZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE9yZGVyKE9yZGVyIG9yZGVyKSB7Ci0gICAgICAgIG9yZGVycy5hZGQob3JkZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZU9yZGVyKE9yZGVyIG9yZGVyKSB7Ci0gICAgICAgIG9yZGVycy5yZW1vdmUob3JkZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxvY2F0aW9uLgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGxvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUuCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxvY2F0aW9uLgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgbG9jYXRpb24gdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JlYW4vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbi9DdXN0b21lclRhZy5qYXZhIGIvamVsbHktdGFncy9iZWFuL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW4vQ3VzdG9tZXJUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E2OTdiMy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JlYW4vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbi9DdXN0b21lclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5iZWFuOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZS5Vc2VCZWFuVGFnOwotCi0vKioKLSAqIEEgZmlyc3QtY2xhc3MgdGFnIHdoaWNoIGlzIHVzZWQgdG8gZGVtb25zdHJhdGUgdXNpbmcgdGhlIGJlYW4gdGFnIGxpYnJhcnkKLSAqIGluIGNvbmp1bmN0aW9uIHdpdGggYW4gZXhpc3RpbmcgdGFnIGxpYnJhcnkuIFRoZSBvbmx5IHJlcXVpcmVtZW50IGlzIHRoYXQKLSAqIHdlIGltcGxlbWVudCB0aGUgQmVhblNvdXJjZSBpbnRlcmZhY2UsIGFuZCB0aGF0IHRoZSBiZWFuIHJldHVybmVkIGZyb20gdGhlCi0gKiBnZXRCZWFuKCkgbWV0aG9kIHN1cHBsaWVzIHRoZSBhcHByb3ByaWF0ZSBjcmVhdGVbbmVzdGVkIHRhZyBuYW1lXSBhbmQvb3IKLSAqIGFkZFtuZXN0ZWQgdGFnIG5hbWVdIG1ldGhvZHMuCi0gKgotICogQGF1dGhvciBDaHJpc3RpYW4gU2VsbAotICogQHZlcnNpb24gQ3VzdG9tZXJUYWcuamF2YSx2IDEuMSAyMDAzLzAxLzIxIDE1OjE2OjMyIGpzdHJhY2hhbiBFeHAKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbWVyVGFnIGV4dGVuZHMgVXNlQmVhblRhZyB7Ci0gICAgcHVibGljIEN1c3RvbWVyVGFnKCkgewotICAgICAgICBzdXBlcihDdXN0b21lci5jbGFzcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZWFuL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW4vTWFuYWdlci5qYXZhIGIvamVsbHktdGFncy9iZWFuL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW4vTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGIwN2NiLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYmVhbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZWFuL01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYmVhbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBBIHNhbXBsZSBiZWFuIHRoYXQgd2UgY2FuIGNvbnN0cnVjdCB2aWEgSmVsbHkgdGFncwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAqLwotcHVibGljIGNsYXNzIE1hbmFnZXIgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1hbmFnZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBMaXN0IGN1c3RvbWVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIGJvb2xlYW4gaW52b2tlZCA9IGZhbHNlOwotCi0gICAgcHVibGljIE1hbmFnZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiW2N1c3RvbWVycz0iICsgY3VzdG9tZXJzICsgIl0iOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBpbnZva2UgbWV0aG9kIHdoaWNoIGlzIGNhbGxlZCB3aGVuIHRoZSBiZWFuIGlzIGNvbnN0cnVjdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBpbnZva2VkID0gdHJ1ZTsKLQotICAgICAgICBsb2cuaW5mbygiSW52b2tlZCB0aGUgcnVuKCkgbWV0aG9kIHdpdGggY3VzdG9tZXJzOiAiICsgY3VzdG9tZXJzKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBMaXN0IGdldEN1c3RvbWVycygpIHsKLSAgICAgICAgcmV0dXJuIGN1c3RvbWVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDdXN0b21lcihDdXN0b21lciBjdXN0b21lcikgewotICAgICAgICBjdXN0b21lcnMuYWRkKGN1c3RvbWVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVDdXN0b21lcihDdXN0b21lciBjdXN0b21lcikgewotICAgICAgICBjdXN0b21lcnMucmVtb3ZlKGN1c3RvbWVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ludm9rZWQoKSB7Ci0gICAgICAgIHJldHVybiBpbnZva2VkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGludm9rZWQuCi0gICAgICogQHBhcmFtIGludm9rZWQgVGhlIGludm9rZWQgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW52b2tlZChib29sZWFuIGludm9rZWQpIHsKLSAgICAgICAgdGhpcy5pbnZva2VkID0gaW52b2tlZDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYmVhbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZWFuL015QmVhblRhZ0xpYnJhcnkuamF2YSBiL2plbGx5LXRhZ3MvYmVhbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZWFuL015QmVhblRhZ0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzNTJhOS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JlYW4vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbi9NeUJlYW5UYWdMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmJlYW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5iZWFuLkJlYW5UYWdMaWJyYXJ5OwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgVGFnbGliLgotICogVGhpcyBjb3VsZCBiZSBjcmVhdGVkIHZpYSBKZWxseSBzY3JpcHQsIG9yIGNvdWxkIGxvYWQgdGhlIG1hcHBpbmcgb2YKLSAqIHRhZyBuYW1lcyB0byBiZWFuIGNsYXNzZXMgZnJvbSBwcm9wZXJ0aWVzIGZpbGUgZXRjICBidXQgaXMgaW1wbGVtZW50ZWQgaW4gSmF2YQotICogY29kZSBmb3Igc2ltcGxpY2l0eQotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uIDEuMgotICovCi1wdWJsaWMgY2xhc3MgTXlCZWFuVGFnTGlicmFyeSBleHRlbmRzIEJlYW5UYWdMaWJyYXJ5IHsKLQotICAgIHB1YmxpYyBNeUJlYW5UYWdMaWJyYXJ5KCkgewotICAgICAgICByZWdpc3RlckJlYW4oICJjdXN0b21lciIsIEN1c3RvbWVyLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCAibXlDb250YWluZXIiLCBNeUNvbnRhaW5lclRhZy5jbGFzcyApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYmVhbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZWFuL015Q29udGFpbmVyVGFnLmphdmEgYi9qZWxseS10YWdzL2JlYW4vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbi9NeUNvbnRhaW5lclRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDI4YjZiLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYmVhbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZWFuL015Q29udGFpbmVyVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmJlYW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuQ29sbGVjdGlvblRhZzsKLQotLyoqCi0gKiBBIHNpbXBsZSB0YWcgd2hpY2ggZGVtb25zdHJhdGVzIGhvdyB0byBwcm9jZXNzIGJlYW5zIGdlbmVyaWNhbGx5LgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICAkUmV2aXNpb246IDEuNCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBNeUNvbnRhaW5lclRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgaW1wbGVtZW50cyBDb2xsZWN0aW9uVGFnIHsKLQotICAgIHByaXZhdGUgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByaXZhdGUgU3RyaW5nIHZhcjsKLQotICAgIHB1YmxpYyBNeUNvbnRhaW5lclRhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhciwgbGlzdCk7Ci0gICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0gICAgLy8gQ29sbGVjdGlvblRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBhZGRJdGVtKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBsaXN0LmFkZCh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWYXIoKSB7Ci0gICAgICAgIHJldHVybiB2YXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFyLgotICAgICAqIEBwYXJhbSB2YXIgVGhlIHZhciB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYmVhbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZWFuL015VGFnTGlicmFyeS5qYXZhIGIvamVsbHktdGFncy9iZWFuL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW4vTXlUYWdMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmM2FlZmQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9iZWFuL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW4vTXlUYWdMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmJlYW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnTGlicmFyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5UYWdGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLlRhZ1NjcmlwdDsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci0KLS8qKgotICogQSBub3JtYWwgdGFnIGxpYnJhcnkgd2hpY2ggd2lsbCB1c2UgYSBCZWFuVGFnIHRvIGNyZWF0ZSBiZWFucyBidXQgdGhpcyB0YWcKLSAqIGxpYnJhcnkgZG9lcyBub3QgZGVyaXZlIGZyb20gQmVhblRhZ0xpYnJhcnkgYW5kIHNvIGRvZXMgbm90IGhhdmUgYSAmbHQ7Ci0gKiBiZWFuZGVmJmd0OyB0YWcKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBNeVRhZ0xpYnJhcnkgZXh0ZW5kcyBUYWdMaWJyYXJ5IHsKLQotICAgIHB1YmxpYyBNeVRhZ0xpYnJhcnkoKSB7Ci0gICAgfQotCi0KLSAgICAvLyBUYWdMaWJyYXJ5IGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBUYWdTY3JpcHQgY3JlYXRlVGFnU2NyaXB0KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgVGFnRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFRhZ0ZhY3RvcnkoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgVGFnIGNyZWF0ZVRhZyhTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVCZWFuVGFnKG5hbWUsIGF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICByZXR1cm4gbmV3IFRhZ1NjcmlwdCggZmFjdG9yeSApOwotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIFRhZyBmb3IgdGhlIGdpdmVuIHRhZyBhbmQgYXR0cmlidXRlcy4gSWYgdGhpcwotICAgICAqIHRhZyBtYXRjaGVzIGEgcm9vdCBiZWFuLCB0aGVuIGEgQmVhblRhZyB3aWxsIGJlIGNyZWF0ZWQsIG90aGVyd2lzZSBhCi0gICAgICogQmVhblByb3BlcnR5VGFnIGlzIGNyZWF0ZWQgdG8gbWFrZSBhIG5lc3RlZCBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVGFnIGNyZWF0ZUJlYW5UYWcoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLSAgICAgICAgLy8gaXMgdGhlIG5hbWUgYm91bmQgdG8gYSBzcGVjaWZpYyBjbGFzcwotICAgICAgICBDbGFzcyBiZWFuVHlwZSA9IGdldEJlYW5UeXBlKG5hbWUsIGF0dHJpYnV0ZXMpOwotICAgICAgICBpZiAoYmVhblR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBCZWFuVGFnKGJlYW5UeXBlLCBuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGl0cyBhIHByb3BlcnR5IHRhZwotICAgICAgICByZXR1cm4gbmV3IEJlYW5Qcm9wZXJ0eVRhZyhuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGJlYW4gY2xhc3MgdGhhdCB3ZSBzaG91bGQgdXNlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCBuYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBpcyB0aGUgWE1MIGVsZW1lbnQgbmFtZQotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRoZSBYTUwgYXR0cmlidXRlcwotICAgICAqIEByZXR1cm4gQ2xhc3MgdGhlIGJlYW4gY2xhc3MgdG8gdXNlIGZvciB0aGlzIGVsZW1lbnQgb3IgbnVsbCBpZiB0aGUgdGFnCi0gICAgICogaXMgYSBuZXN0ZWQgcHJvcGVydHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0QmVhblR5cGUoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotICAgICAgICBpZiAobmFtZS5lcXVhbHMoICJjdXN0b21lciIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ3VzdG9tZXIuY2xhc3M7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZWFuL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW4vT3JkZXIuamF2YSBiL2plbGx5LXRhZ3MvYmVhbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZWFuL09yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNTk5ZTUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9iZWFuL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW4vT3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmJlYW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBBIHNhbXBsZSBiZWFuIHRoYXQgd2UgY2FuIGNvbnN0cnVjdCB2aWEgSmVsbHkgdGFncwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIE9yZGVyIHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhPcmRlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIFByb2R1Y3QgcHJvZHVjdDsKLSAgICBwcml2YXRlIGludCBhbW91bnQ7Ci0gICAgcHJpdmF0ZSBkb3VibGUgcHJpY2U7Ci0KLSAgICBwdWJsaWMgT3JkZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJPcmRlclthbW91bnQ9IiArIGFtb3VudCArICI7cHJpY2U9IiArIHByaWNlICsgIjtwcm9kdWN0PSIgKyBwcm9kdWN0ICsgIl0iOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBQcm9kdWN0Ci0gICAgcHVibGljIFByb2R1Y3QgY3JlYXRlUHJvZHVjdCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcm9kdWN0KCk7Ci0gICAgfQotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgYWRkUHJvZHVjdChQcm9kdWN0IHByb2R1Y3QpCi0gICAgewotICAgICAgICB0aGlzLnByb2R1Y3QgPSBwcm9kdWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFtb3VudC4KLSAgICAgKiBAcmV0dXJuIGludAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0QW1vdW50KCkgewotICAgICAgICByZXR1cm4gYW1vdW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByaWNlLgotICAgICAqIEByZXR1cm4gZG91YmxlCi0gICAgICovCi0gICAgcHVibGljIGRvdWJsZSBnZXRQcmljZSgpIHsKLSAgICAgICAgcmV0dXJuIHByaWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFtb3VudC4KLSAgICAgKiBAcGFyYW0gYW1vdW50IFRoZSBhbW91bnQgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QW1vdW50KGludCBhbW91bnQpIHsKLSAgICAgICAgdGhpcy5hbW91bnQgPSBhbW91bnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJpY2UuCi0gICAgICogQHBhcmFtIHByaWNlIFRoZSBwcmljZSB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmljZShkb3VibGUgcHJpY2UpIHsKLSAgICAgICAgdGhpcy5wcmljZSA9IHByaWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb2R1Y3QuCi0gICAgICogQHJldHVybiBQcm9kdWN0Ci0gICAgICovCi0gICAgcHVibGljIFByb2R1Y3QgZ2V0UHJvZHVjdCgpIHsKLSAgICAgICAgcmV0dXJuIHByb2R1Y3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJvZHVjdC4KLSAgICAgKiBAcGFyYW0gcHJvZHVjdCBUaGUgcHJvZHVjdCB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0KFByb2R1Y3QgcHJvZHVjdCkgewotICAgICAgICB0aGlzLnByb2R1Y3QgPSBwcm9kdWN0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZWFuL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW4vUHJvZHVjdC5qYXZhIGIvamVsbHktdGFncy9iZWFuL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW4vUHJvZHVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWMwMGE0Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYmVhbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZWFuL1Byb2R1Y3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYmVhbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIEEgc2FtcGxlIGJlYW4gdGhhdCB3ZSBjYW4gY29uc3RydWN0IHZpYSBKZWxseSB0YWdzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjQgJAotICovCi1wdWJsaWMgY2xhc3MgUHJvZHVjdCB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUHJvZHVjdC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBpZDsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgcHVibGljIFByb2R1Y3QoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJQcm9kdWN0W2lkPSIgKyBpZCArICI7bmFtZT0iICsgbmFtZSArICJdIjsKLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaWQuCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZS4KLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgaWQuCi0gICAgICogQHBhcmFtIGlkIFRoZSBpZCB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUuCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZWFuL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW4vVGVzdEplbGx5LmphdmEgYi9qZWxseS10YWdzL2JlYW4vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbi9UZXN0SmVsbHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVjMGI0Ny4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JlYW4vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbi9UZXN0SmVsbHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYmVhbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qdW5pdC5KZWxseVRlc3RTdWl0ZTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyB0byBydW4gamVsbHkgdGVzdCBjYXNlcyBhcyBwYXJ0IG9mIEFudCdzIEpVbml0IHRlc3RzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjQgJAotICovCi1wdWJsaWMgY2xhc3MgVGVzdEplbGx5IGV4dGVuZHMgSmVsbHlUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oIHN1aXRlKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3JlYXRlVGVzdFN1aXRlKFRlc3RKZWxseS5jbGFzcywgInN1aXRlLmplbGx5Iik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZWFuL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW4vc3VpdGUuamVsbHkgYi9qZWxseS10YWdzL2JlYW4vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbi9zdWl0ZS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVhMjBhNC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JlYW4vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbi9zdWl0ZS5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4NCi0gIA0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIA0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIA0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPHRlc3Q6c3VpdGUgDQotICAgIHhtbG5zOmo9ImplbGx5OmNvcmUiDQotICAgIHhtbG5zOm15dGFncz0iamVsbHk6b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYmVhbi5NeVRhZ0xpYnJhcnkiDQotICAgIHhtbG5zOm15dGFnczI9ImplbGx5Om9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmJlYW4uTXlCZWFuVGFnTGlicmFyeSINCi0gICAgeG1sbnM9ImplbGx5OmJlYW4iDQotICAgIHhtbG5zOnRlc3Q9ImplbGx5Omp1bml0Ig0KLSAgICB4bWxuczpsb2c9ImplbGx5OmxvZyI+DQotDQotICAgIDwhLS0gbmVlZCB0byBkbyB0aGlzIHNvIHRoZSBiZWFuIHRhZ2xpYiByZWNvZ25pemVzIHRoZSBjdXN0b21lciByb290IHRhZy4gRm9yIG5lc3RlZA0KLSAgICAgICAgICAgICB0YWdzLCB0aGUgb2JqZWN0IHR5cGUgaXMgaW5mZXJyZWQgZnJvbSB0aGUgYXZhaWxhYmxlIGFjY2Vzc29yIG1ldGhvZHMuIFRoaXMgZGVmaW5pdGlvbg0KLSAgICAgICAgICAgICBpcyB1c2VkIGJ5IHRoZSB0ZXN0TmVzdGVkQmVhblRhZyBhbmQgdGVzdEJlYW5MaXN0IGNhc2VzLiBUaGUgbmVzdGluZyBsZXZlbCBhdA0KLSAgICAgICAgICAgICB3aGljaCBpdCBhcHBlYXJzIGRvZXMgbm90IHBsYXkgYW55IHJvbGUgLSBpdCBiZWNvbWVzIGdsb2JhbGx5IHZpc2libGUgYWZ0ZXIgaXQgaXMgZXhlY3V0ZWQgLS0+DQotICAgICAgICAgICAgIA0KLSAgICA8YmVhbmRlZiBuYW1lPSJjdXN0b21lciIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5iZWFuLkN1c3RvbWVyIi8+DQotICAgIDxiZWFuZGVmIG5hbWU9Im1hbmFnZXIiIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYmVhbi5NYW5hZ2VyIiBtZXRob2ROYW1lPSJydW4iLz4NCi0gICAgDQotICAgIDx0ZXN0OmNhc2UgbmFtZT0idGVzdE5lc3RlZEJlYW5UYWciPg0KLQ0KLSAgICAgICAgPGN1c3RvbWVyIHZhcj0iYzEiIG5hbWU9IkphbWVzIiBsb2NhdGlvbj0iTG9uZG9uIiA+DQotICAgICAgICAgICAgPG9yZGVyIGFtb3VudD0iMTAwIiBwcmljZT0iMi45OSI+DQotICAgICAgICAgICAgICAgIDxwcm9kdWN0IGlkPSJwMSIgbmFtZT0iQmVlciIvPg0KLSAgICAgICAgICAgIDwvb3JkZXI+DQotICAgICAgICAgICAgPG9yZGVyIGFtb3VudD0iMjAwIiBwcmljZT0iNC45OSI+DQotICAgICAgICAgICAgICAgIDxwcm9kdWN0IGlkPSJwMiIgbmFtZT0iUGl6emEiLz4NCi0gICAgICAgICAgICA8L29yZGVyPg0KLSAgICAgICAgPC9jdXN0b21lcj4NCi0gICAgICAgIA0KLSAgICAgICAgPGxvZzppbmZvPkNyZWF0ZWQgYSBjdXN0b21lciB3aXRoIG5hbWU6ICR7YzEubmFtZX0gYW5kIGxvY2F0aW9uOiAke2MxLmxvY2F0aW9ufTwvbG9nOmluZm8+DQotICAgICAgICA8bG9nOmluZm8+Q3VzdG9tZXIgaGFzIG9yZGVycyAke2MxLm9yZGVyc308L2xvZzppbmZvPg0KLSAgICANCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iSmFtZXMiIGFjdHVhbD0iJHtjMS5uYW1lfSIvPg0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJMb25kb24iIGFjdHVhbD0iJHtjMS5sb2NhdGlvbn0iLz4NCi0gICAgDQotICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtzaXplKGMxLm9yZGVycykgPT0gMn0iLz4NCi0gICAgDQotICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtjMS5vcmRlcnNbMF0uYW1vdW50ID09IDEwMH0iLz4NCi0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2MxLm9yZGVyc1swXS5wcmljZSA9PSAyLjk5fSIvPg0KLSAgICAgICAgDQotICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtjMS5vcmRlcnNbMV0uYW1vdW50ID09IDIwMH0iLz4NCi0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2MxLm9yZGVyc1sxXS5wcmljZSA9PSA0Ljk5fSIvPg0KLSAgICANCi0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2MxLm9yZGVyc1swXS5wcm9kdWN0ICE9IG51bGx9Ii8+DQotICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtjMS5vcmRlcnNbMV0ucHJvZHVjdCAhPSBudWxsfSIvPg0KLSAgICAgICAgDQotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9InAxIiBhY3R1YWw9IiR7YzEub3JkZXJzWzBdLnByb2R1Y3QuaWR9Ii8+DQotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IkJlZXIiIGFjdHVhbD0iJHtjMS5vcmRlcnNbMF0ucHJvZHVjdC5uYW1lfSIvPg0KLSAgICANCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0icDIiIGFjdHVhbD0iJHtjMS5vcmRlcnNbMV0ucHJvZHVjdC5pZH0iLz4NCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iUGl6emEiIGFjdHVhbD0iJHtjMS5vcmRlcnNbMV0ucHJvZHVjdC5uYW1lfSIvPg0KLSAgICANCi0gICAgPC90ZXN0OmNhc2U+DQotICAgIA0KLSAgICA8dGVzdDpjYXNlIG5hbWU9InRlc3ROZXN0ZWRCZWFuUHJvcGVydHlUYWciPg0KLSAgICANCi0gICAgICAgICAgICA8IS0tIA0KLSAgICAgICAgICAgICAgICB8fCBUaGlzIHRlc3QgdXNlcyBhIGN1c3RvbSBsaWJyYXJ5IHdoaWNoIGhhcyB0aGUgY3VzdG9tZXIgdGFnIHJlZ2lzdGVyZWQNCi0gICAgICAgICAgICAgICAgfHwgVGhlcmVmb3JlLCB0aGUgYmVhbmRlZiBpcyBub3QgcmVxdWlyZWQgDQotICAgICAgICAgICAgICAgIC0tPg0KLSAgICAgICAgICAgIDxteXRhZ3M6Y3VzdG9tZXIgdmFyPSJjMSIgbmFtZT0iSmFtZXMiIGxvY2F0aW9uPSJMb25kb24iID4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIGFtb3VudD0iMTAwIiBwcmljZT0iMi45OSI+DQotICAgICAgICAgICAgICAgICAgICA8cHJvZHVjdCBpZD0icDEiIG5hbWU9IkJlZXIiLz4NCi0gICAgICAgICAgICAgICAgPC9vcmRlcj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIGFtb3VudD0iMjAwIiBwcmljZT0iNC45OSI+DQotICAgICAgICAgICAgICAgICAgICA8cHJvZHVjdCBpZD0icDIiIG5hbWU9IlBpenphIi8+DQotICAgICAgICAgICAgICAgIDwvb3JkZXI+DQotICAgICAgICAgICAgPC9teXRhZ3M6Y3VzdG9tZXI+DQotICAgIA0KLSAgICAgICAgICAgIDxsb2c6aW5mbz5DcmVhdGVkIGEgY3VzdG9tZXIgd2l0aCBuYW1lOiAke2MxLm5hbWV9IGFuZCBsb2NhdGlvbjogJHtjMS5sb2NhdGlvbn08L2xvZzppbmZvPg0KLSAgICAgICAgICAgIDxsb2c6aW5mbz5DdXN0b21lciBoYXMgb3JkZXJzICR7YzEub3JkZXJzfTwvbG9nOmluZm8+DQotICAgIA0KLSAgICAgICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iSmFtZXMiIGFjdHVhbD0iJHtjMS5uYW1lfSIvPg0KLSAgICAgICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iTG9uZG9uIiBhY3R1YWw9IiR7YzEubG9jYXRpb259Ii8+DQotICAgIA0KLSAgICAgICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke3NpemUoYzEub3JkZXJzKSA9PSAyfSIvPg0KLSAgICANCi0gICAgICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtjMS5vcmRlcnNbMF0uYW1vdW50ID09IDEwMH0iLz4NCi0gICAgICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtjMS5vcmRlcnNbMF0ucHJpY2UgPT0gMi45OX0iLz4NCi0gICAgDQotICAgICAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7YzEub3JkZXJzWzFdLmFtb3VudCA9PSAyMDB9Ii8+DQotICAgICAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7YzEub3JkZXJzWzFdLnByaWNlID09IDQuOTl9Ii8+DQotICAgIA0KLSAgICAgICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2MxLm9yZGVyc1swXS5wcm9kdWN0ICE9IG51bGx9Ii8+DQotICAgICAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7YzEub3JkZXJzWzFdLnByb2R1Y3QgIT0gbnVsbH0iLz4NCi0gICAgDQotICAgICAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJwMSIgYWN0dWFsPSIke2MxLm9yZGVyc1swXS5wcm9kdWN0LmlkfSIvPg0KLSAgICAgICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iQmVlciIgYWN0dWFsPSIke2MxLm9yZGVyc1swXS5wcm9kdWN0Lm5hbWV9Ii8+DQotICAgIA0KLSAgICAgICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0icDIiIGFjdHVhbD0iJHtjMS5vcmRlcnNbMV0ucHJvZHVjdC5pZH0iLz4NCi0gICAgICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IlBpenphIiBhY3R1YWw9IiR7YzEub3JkZXJzWzFdLnByb2R1Y3QubmFtZX0iLz4NCi0gICAgDQotICAgIDwvdGVzdDpjYXNlPg0KLSAgICANCi0gICAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0TmVzdGVkQmVhblByb3BlcnR5VGFnMiI+DQotICAgIA0KLSAgICAgICAgICAgIDwhLS0gDQotICAgICAgICAgICAgICAgIHx8IGFzIGFib3ZlIGJ1dCB1c2VzIGEgbm9uLUJlYW5UYWdMaWJyYXJ5IGxpYnJhcnkuIA0KLSAgICAgICAgICAgICAgICB8fCBpLmUuIGp1c3QgcmV1c2luZyB0aGUgQmVhblRhZyBhbmQgQmVhblByb3BlcnR5VGFnDQotICAgICAgICAgICAgICAgIC0tPg0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICA8bXl0YWdzMjpjdXN0b21lciB2YXI9ImMxIiBuYW1lPSJKYW1lcyIgbG9jYXRpb249IkxvbmRvbiIgPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgYW1vdW50PSIxMDAiIHByaWNlPSIyLjk5Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxwcm9kdWN0IGlkPSJwMSIgbmFtZT0iQmVlciIvPg0KLSAgICAgICAgICAgICAgICA8L29yZGVyPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgYW1vdW50PSIyMDAiIHByaWNlPSI0Ljk5Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxwcm9kdWN0IGlkPSJwMiIgbmFtZT0iUGl6emEiLz4NCi0gICAgICAgICAgICAgICAgPC9vcmRlcj4NCi0gICAgICAgICAgICA8L215dGFnczI6Y3VzdG9tZXI+DQotICAgIA0KLSAgICAgICAgICAgIDxsb2c6aW5mbz5DcmVhdGVkIGEgY3VzdG9tZXIgd2l0aCBuYW1lOiAke2MxLm5hbWV9IGFuZCBsb2NhdGlvbjogJHtjMS5sb2NhdGlvbn08L2xvZzppbmZvPg0KLSAgICAgICAgICAgIDxsb2c6aW5mbz5DdXN0b21lciBoYXMgb3JkZXJzICR7YzEub3JkZXJzfTwvbG9nOmluZm8+DQotICAgIA0KLSAgICAgICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iSmFtZXMiIGFjdHVhbD0iJHtjMS5uYW1lfSIvPg0KLSAgICAgICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iTG9uZG9uIiBhY3R1YWw9IiR7YzEubG9jYXRpb259Ii8+DQotICAgIA0KLSAgICAgICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke3NpemUoYzEub3JkZXJzKSA9PSAyfSIvPg0KLSAgICANCi0gICAgICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtjMS5vcmRlcnNbMF0uYW1vdW50ID09IDEwMH0iLz4NCi0gICAgICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtjMS5vcmRlcnNbMF0ucHJpY2UgPT0gMi45OX0iLz4NCi0gICAgDQotICAgICAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7YzEub3JkZXJzWzFdLmFtb3VudCA9PSAyMDB9Ii8+DQotICAgICAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7YzEub3JkZXJzWzFdLnByaWNlID09IDQuOTl9Ii8+DQotICAgIA0KLSAgICAgICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2MxLm9yZGVyc1swXS5wcm9kdWN0ICE9IG51bGx9Ii8+DQotICAgICAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7YzEub3JkZXJzWzFdLnByb2R1Y3QgIT0gbnVsbH0iLz4NCi0gICAgDQotICAgICAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJwMSIgYWN0dWFsPSIke2MxLm9yZGVyc1swXS5wcm9kdWN0LmlkfSIvPg0KLSAgICAgICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iQmVlciIgYWN0dWFsPSIke2MxLm9yZGVyc1swXS5wcm9kdWN0Lm5hbWV9Ii8+DQotICAgIA0KLSAgICAgICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0icDIiIGFjdHVhbD0iJHtjMS5vcmRlcnNbMV0ucHJvZHVjdC5pZH0iLz4NCi0gICAgICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IlBpenphIiBhY3R1YWw9IiR7YzEub3JkZXJzWzFdLnByb2R1Y3QubmFtZX0iLz4NCi0gICAgDQotICAgIDwvdGVzdDpjYXNlPg0KLSAgICANCi0gICAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0QmVhbkxpc3QiPg0KLSAgICANCi0gICAgICAgIDxqOnVzZUxpc3QgdmFyPSJsaXN0Ij4NCi0gICAgICAgICAgICA8Y3VzdG9tZXIgbmFtZT0iSmFtZXMiIGxvY2F0aW9uPSJMb25kb24iPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgYW1vdW50PSIxMDAiIHByaWNlPSIyLjk5Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxwcm9kdWN0IGlkPSJwMSIgbmFtZT0iQmVlciIvPg0KLSAgICAgICAgICAgICAgICA8L29yZGVyPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgYW1vdW50PSIyMDAiIHByaWNlPSI0Ljk5Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxwcm9kdWN0IGlkPSJwMiIgbmFtZT0iUGl6emEiLz4NCi0gICAgICAgICAgICAgICAgPC9vcmRlcj4NCi0gICAgICAgICAgICA8L2N1c3RvbWVyPg0KLSAgICAgICAgICAgIDxjdXN0b21lciBuYW1lPSJCb2IiIGxvY2F0aW9uPSJBdGxhbnRhIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIGFtb3VudD0iMjAwIiBwcmljZT0iMi45OSI+DQotICAgICAgICAgICAgICAgICAgICA8cHJvZHVjdCBpZD0icDEiIG5hbWU9IkJlZXIiLz4NCi0gICAgICAgICAgICAgICAgPC9vcmRlcj4NCi0gICAgICAgICAgICA8L2N1c3RvbWVyPg0KLSAgICAgICAgPC9qOnVzZUxpc3Q+DQotICAgICAgICAgICAgDQotICAgICAgICA8bG9nOmluZm8+Q3JlYXRlZCBhIGxpc3Qgb2YgY3VzdG9tZXJzICR7bGlzdH08L2xvZzppbmZvPg0KLSAgICANCi0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke3NpemUobGlzdCkgPT0gMn0iLz4NCi0gICAgDQotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IkphbWVzIiBhY3R1YWw9IiR7bGlzdFswXS5uYW1lfSIvPg0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJMb25kb24iIGFjdHVhbD0iJHtsaXN0WzBdLmxvY2F0aW9ufSIvPg0KLSAgICANCi0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke3NpemUobGlzdFswXS5vcmRlcnMpID09IDJ9Ii8+DQotICAgIA0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7bGlzdFswXS5vcmRlcnNbMF0uYW1vdW50ID09IDEwMH0iLz4NCi0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2xpc3RbMF0ub3JkZXJzWzBdLnByaWNlID09IDIuOTl9Ii8+DQotICAgICAgICANCi0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2xpc3RbMF0ub3JkZXJzWzFdLmFtb3VudCA9PSAyMDB9Ii8+DQotICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtsaXN0WzBdLm9yZGVyc1sxXS5wcmljZSA9PSA0Ljk5fSIvPg0KLSAgICANCi0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2xpc3RbMF0ub3JkZXJzWzBdLnByb2R1Y3QgIT0gbnVsbH0iLz4NCi0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2xpc3RbMF0ub3JkZXJzWzFdLnByb2R1Y3QgIT0gbnVsbH0iLz4NCi0gICAgICAgIA0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJwMSIgYWN0dWFsPSIke2xpc3RbMF0ub3JkZXJzWzBdLnByb2R1Y3QuaWR9Ii8+DQotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IkJlZXIiIGFjdHVhbD0iJHtsaXN0WzBdLm9yZGVyc1swXS5wcm9kdWN0Lm5hbWV9Ii8+DQotICAgIA0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJwMiIgYWN0dWFsPSIke2xpc3RbMF0ub3JkZXJzWzFdLnByb2R1Y3QuaWR9Ii8+DQotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IlBpenphIiBhY3R1YWw9IiR7bGlzdFswXS5vcmRlcnNbMV0ucHJvZHVjdC5uYW1lfSIvPg0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iQm9iIiBhY3R1YWw9IiR7bGlzdFsxXS5uYW1lfSIvPg0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJBdGxhbnRhIiBhY3R1YWw9IiR7bGlzdFsxXS5sb2NhdGlvbn0iLz4NCi0gICAgDQotICAgIDwvdGVzdDpjYXNlPg0KLQ0KLSAgICA8dGVzdDpjYXNlIG5hbWU9InRlc3RJbnZva2VNZXRob2QiPg0KLQ0KLSAgICAgICAgPG1hbmFnZXIgdmFyPSJmb28iPg0KLSAgICAgICAgICAgIDxjdXN0b21lciBuYW1lPSJKYW1lcyIgbG9jYXRpb249IkxvbmRvbiI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBhbW91bnQ9IjEwMCIgcHJpY2U9IjIuOTkiPg0KLSAgICAgICAgICAgICAgICAgICAgPHByb2R1Y3QgaWQ9InAxIiBuYW1lPSJCZWVyIi8+DQotICAgICAgICAgICAgICAgIDwvb3JkZXI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBhbW91bnQ9IjIwMCIgcHJpY2U9IjQuOTkiPg0KLSAgICAgICAgICAgICAgICAgICAgPHByb2R1Y3QgaWQ9InAyIiBuYW1lPSJQaXp6YSIvPg0KLSAgICAgICAgICAgICAgICA8L29yZGVyPg0KLSAgICAgICAgICAgIDwvY3VzdG9tZXI+DQotICAgICAgICAgICAgPGN1c3RvbWVyIG5hbWU9IkJvYiIgbG9jYXRpb249IkF0bGFudGEiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgYW1vdW50PSIyMDAiIHByaWNlPSIyLjk5Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxwcm9kdWN0IGlkPSJwMSIgbmFtZT0iQmVlciIvPg0KLSAgICAgICAgICAgICAgICA8L29yZGVyPg0KLSAgICAgICAgICAgIDwvY3VzdG9tZXI+DQotICAgICAgICA8L21hbmFnZXI+ICAgIA0KLQ0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7Zm9vLmlzSW52b2tlZCgpfSIvPg0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7c2l6ZShmb28uY3VzdG9tZXJzKSA9PSAyfSIvPg0KLSAgICAgICAgDQotICAgIDwvdGVzdDpjYXNlPg0KLQ0KLSAgICA8dGVzdDpjYXNlIG5hbWU9InRlc3RDb2xsZWN0aW9uVGFnIiB4bWxucz0iamVsbHk6b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYmVhbi5NeUJlYW5UYWdMaWJyYXJ5Ij4NCi0NCi0gICAgICAgIDxteUNvbnRhaW5lciB2YXI9Imxpc3QiPg0KLSAgICAgICAgICAgIDxjdXN0b21lciBuYW1lPSJKYW1lcyIgbG9jYXRpb249IkxvbmRvbiI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBhbW91bnQ9IjEwMCIgcHJpY2U9IjIuOTkiPg0KLSAgICAgICAgICAgICAgICAgICAgPHByb2R1Y3QgaWQ9InAxIiBuYW1lPSJCZWVyIi8+DQotICAgICAgICAgICAgICAgIDwvb3JkZXI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBhbW91bnQ9IjIwMCIgcHJpY2U9IjQuOTkiPg0KLSAgICAgICAgICAgICAgICAgICAgPHByb2R1Y3QgaWQ9InAyIiBuYW1lPSJQaXp6YSIvPg0KLSAgICAgICAgICAgICAgICA8L29yZGVyPg0KLSAgICAgICAgICAgIDwvY3VzdG9tZXI+DQotICAgICAgICAgICAgPGN1c3RvbWVyIG5hbWU9IkJvYiIgbG9jYXRpb249IkF0bGFudGEiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgYW1vdW50PSIyMDAiIHByaWNlPSIyLjk5Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxwcm9kdWN0IGlkPSJwMSIgbmFtZT0iQmVlciIvPg0KLSAgICAgICAgICAgICAgICA8L29yZGVyPg0KLSAgICAgICAgICAgIDwvY3VzdG9tZXI+DQotICAgICAgICA8L215Q29udGFpbmVyPiAgICANCi0NCi0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke3NpemUobGlzdCkgPT0gMn0iLz4NCi0gICAgICAgIA0KLSAgICAgICAgQ3JlYXRlZCBsaXN0OiAke2xpc3R9DQotDQotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IkphbWVzIiBhY3R1YWw9IiR7bGlzdFswXS5uYW1lfSIvPg0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJMb25kb24iIGFjdHVhbD0iJHtsaXN0WzBdLmxvY2F0aW9ufSIvPg0KLSAgICAgICAgDQotICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtsaXN0WzBdLm9yZGVyc1swXS5hbW91bnQgPT0gMTAwfSIvPg0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7bGlzdFswXS5vcmRlcnNbMF0ucHJpY2UgPT0gMi45OX0iLz4NCi0gICAgICAgIA0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7bGlzdFswXS5vcmRlcnNbMV0uYW1vdW50ID09IDIwMH0iLz4NCi0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2xpc3RbMF0ub3JkZXJzWzFdLnByaWNlID09IDQuOTl9Ii8+DQotICAgIA0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7bGlzdFswXS5vcmRlcnNbMF0ucHJvZHVjdCAhPSBudWxsfSIvPg0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7bGlzdFswXS5vcmRlcnNbMV0ucHJvZHVjdCAhPSBudWxsfSIvPg0KLSAgICAgICAgDQotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9InAxIiBhY3R1YWw9IiR7bGlzdFswXS5vcmRlcnNbMF0ucHJvZHVjdC5pZH0iLz4NCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iQmVlciIgYWN0dWFsPSIke2xpc3RbMF0ub3JkZXJzWzBdLnByb2R1Y3QubmFtZX0iLz4NCi0gICAgDQotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9InAyIiBhY3R1YWw9IiR7bGlzdFswXS5vcmRlcnNbMV0ucHJvZHVjdC5pZH0iLz4NCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iUGl6emEiIGFjdHVhbD0iJHtsaXN0WzBdLm9yZGVyc1sxXS5wcm9kdWN0Lm5hbWV9Ii8+DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJCb2IiIGFjdHVhbD0iJHtsaXN0WzFdLm5hbWV9Ii8+DQotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IkF0bGFudGEiIGFjdHVhbD0iJHtsaXN0WzFdLmxvY2F0aW9ufSIvPg0KLSAgICA8L3Rlc3Q6Y2FzZT4NCi0gICAgDQotPC90ZXN0OnN1aXRlPg0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYmVhbi94ZG9jcy9jaGFuZ2VzLnhtbCBiL2plbGx5LXRhZ3MvYmVhbi94ZG9jcy9jaGFuZ2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQwM2QzMy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JlYW4veGRvY3MvY2hhbmdlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tIAotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotIC0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5DaGFuZ2VzPC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0gIDxib2R5PgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMC4xIiBkYXRlPSJpbiBDVlMiPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImZpeCI+VGVzdCBjYXNlcyBub3QgZnVuY3Rpb25pbmc8L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4wIiBkYXRlPSIyMDA0LTA5LTEwIj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJhZGQiPkluaXRpYWwgUmVsZWFzZTwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYmVhbi94ZG9jcy9pbmRleC54bWwgYi9qZWxseS10YWdzL2JlYW4veGRvY3MvaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTJhYjQ4Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYmVhbi94ZG9jcy9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5CZWFuIFRhZyBMaWJyYXJ5PC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0KLSAgPGJvZHk+Ci0gICAgPHNlY3Rpb24gbmFtZT0iT3ZlcnZpZXciPgotICAgICAgPHA+Ci0gICAgICAgIEEgdGFnIGxpYnJhcnkgZm9yIG1hcHBpbmcgdGFncyB0byBiZWFucyB1c2luZyBhIHNpbWlsYXIgYXBwcm9hY2ggdG8gQW50LgotICAgICAgICBTZWUgdGhlIDxhIGhyZWY9InRhZ3MuaHRtbCI+dGFnczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICA8L3A+Ci0gICAgPC9zZWN0aW9uPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JlYW4veGRvY3MvbmF2aWdhdGlvbi54bWwgYi9qZWxseS10YWdzL2JlYW4veGRvY3MvbmF2aWdhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYmYxYmEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9iZWFuL3hkb2NzL25hdmlnYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBuYW1lPSJCZWFuIFRhZyBMaWJyYXJ5Ij4KLQotICA8dGl0bGU+QmVhbiBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gIAotICA8Ym9keT4KLSAgICA8bWVudSBuYW1lPSJCZWFuIFRhZyBMaWJyYXJ5Ij4KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICAgICAgICAgICBocmVmPSIvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iVGFncyIgICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWdzLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYmVhbnNoZWxsLy5jdnNpZ25vcmUgYi9qZWxseS10YWdzL2JlYW5zaGVsbC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGQzMWY3Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYmVhbnNoZWxsLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLW1hdmVuLmxvZwotdGFyZ2V0Ci12ZWxvY2l0eS5sb2cKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYmVhbnNoZWxsL2J1aWxkLnhtbCBiL2plbGx5LXRhZ3MvYmVhbnNoZWxsL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJjM2IyYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JlYW5zaGVsbC9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLWJ1aWxkLnhtbCBnZW5lcmF0ZWQgYnkgbWF2ZW4gZnJvbSBwcm9qZWN0LnhtbCB2ZXJzaW9uIDEuMC1TTkFQU0hPVAotICBvbiBkYXRlIE1heSAyNCAyMDA0LCB0aW1lIDIzMDEtLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImphciIgbmFtZT0iY29tbW9ucy1qZWxseS10YWdzLWJlYW5zaGVsbCIgYmFzZWRpcj0iLiI+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkZWZhdWx0dGFyZ2V0ZGlyIiB2YWx1ZT0idGFyZ2V0Ij4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYmRpciIgdmFsdWU9InRhcmdldC9saWIiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC9jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cmVwb3J0ZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtcmVwb3J0cyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0ZGlyIiB2YWx1ZT0iZGlzdCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jZGlyIiB2YWx1ZT0iZGlzdC9kb2NzL2FwaSI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJmaW5hbC5uYW1lIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLWJlYW5zaGVsbC0xLjAtU05BUFNIT1QiPgotICA8L3Byb3BlcnR5PgotICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlc2NyaXB0aW9uPSJvIEluaXRpYWxpemVzIHNvbWUgcHJvcGVydGllcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im5vZ2V0Ij4KLSAgICAgIDxlcXVhbHMgYXJnMj0ib25seSIgYXJnMT0iJHtidWlsZC5zeXNjbGFzc3BhdGh9Ij4KLSAgICAgIDwvZXF1YWxzPgotICAgIDwvY29uZGl0aW9uPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXNjcmlwdGlvbj0ibyBDb21waWxlIHRoZSBjb2RlIiBkZXBlbmRzPSJnZXQtZGVwcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHtjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvamF2YSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICAgIDxjb3B5IHRvZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL2phdmEiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICAgIDxjb3B5IHRvZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qZWxseSI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueHNsIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnJuZyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5kdGQiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5odG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamFyIiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgdGhlIGphciIgZGVwZW5kcz0iY29tcGlsZSx0ZXN0Ij4KLSAgICA8amFyIGphcmZpbGU9InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCIgYmFzZWRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0ibyBDbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIGRpcmVjdG9yaWVzIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGlzdGRpcn0iPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgYSBkaXN0cmlidXRpb24iIGRlcGVuZHM9ImphciwgamF2YWRvYyI+Ci0gICAgPG1rZGlyIGRpcj0iZGlzdCI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29weSB0b2Rpcj0iZGlzdCI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iIGluY2x1ZGVzPSIqLmphciI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iIGluY2x1ZGVzPSJMSUNFTlNFKiwgUkVBRE1FKiI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0ibyBSdW4gdGhlIHRlc3QgY2FzZXMiIGlmPSJ0ZXN0LmZhaWx1cmUiIGRlcGVuZHM9ImludGVybmFsLXRlc3QiPgotICAgIDxmYWlsIG1lc3NhZ2U9IlRoZXJlIHdlcmUgdGVzdCBmYWlsdXJlcy4iPgotICAgIDwvZmFpbD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iaW50ZXJuYWwtdGVzdCIgZGVwZW5kcz0iY29tcGlsZS10ZXN0cyI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8anVuaXQgZGlyPSIuLyIgZmFpbHVyZXByb3BlcnR5PSJ0ZXN0LmZhaWx1cmUiIHByaW50U3VtbWFyeT0ieWVzIiBmb3JrPSJ0cnVlIiBoYWx0b25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJiYXNlZGlyIiB2YWx1ZT0iLiI+Ci0gICAgICA8L3N5c3Byb3BlcnR5PgotICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Zm9ybWF0dGVyIHVzZWZpbGU9ImZhbHNlIiB0eXBlPSJwbGFpbiI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL1Rlc3QqLmphdmEiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgPC9qdW5pdD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZS10ZXN0cyIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy90ZXN0Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamF2YWRvYyIgZGVzY3JpcHRpb249Im8gR2VuZXJhdGUgamF2YWRvYyIgZGVwZW5kcz0iamFyIj4KLSAgICA8bWtkaXIgZGlyPSIke2phdmFkb2NkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDx0c3RhbXA+Ci0gICAgICA8Zm9ybWF0IHBhdHRlcm49IjIwMDIteXl5eSIgcHJvcGVydHk9InllYXIiPgotICAgICAgPC9mb3JtYXQ+Ci0gICAgPC90c3RhbXA+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvcHlyaWdodCIgdmFsdWU9IkNvcHlyaWdodCAmYW1wO2NvcHk7ICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLWJlYW5zaGVsbCAxLjAtU05BUFNIT1QgQVBJIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxqYXZhZG9jIHVzZT0idHJ1ZSIgcHJpdmF0ZT0idHJ1ZSIgZGVzdGRpcj0iJHtqYXZhZG9jZGlyfSIgYXV0aG9yPSJ0cnVlIiB2ZXJzaW9uPSJ0cnVlIiBzb3VyY2VwYXRoPSJzcmMvamF2YSIgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5iZWFuc2hlbGwuKiI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFkb2M+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImdldC1kZXBzIiB1bmxlc3M9Im5vZ2V0IiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2JzaC0xLjItYjMuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2JzaC9qYXJzL2JzaC0xLjItYjMuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LXRhZ3MtanVuaXQtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamVsbHkvamFycy9jb21tb25zLWplbGx5LXRhZ3MtanVuaXQtU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamV4bC9qYXJzL2NvbW1vbnMtamV4bC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3htbC1hcGlzLTEuMC5iMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veG1sLWFwaXMvamFycy94bWwtYXBpcy0xLjAuYjIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWJlYW51dGlscy0xLjYuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtYmVhbnV0aWxzL2phcnMvY29tbW9ucy1iZWFudXRpbHMtMS42LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtY29sbGVjdGlvbnMvamFycy9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1sb2dnaW5nL2phcnMvY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vZG9tNGotMS41LWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vZG9tNGovamFycy9kb200ai0xLjUtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vamF4ZW4tMS4xLWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vamF4ZW4vamFycy9qYXhlbi0xLjEtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veGVyY2VzLTIuMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94ZXJjZXMvamFycy94ZXJjZXMtMi4yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qdW5pdC0zLjguMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vanVuaXQvamFycy9qdW5pdC0zLjguMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FudC0xLjUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC0xLjUuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtb3B0aW9uYWwtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtb3B0aW9uYWwtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtbWF2ZW4iPgotICAgIDxnZXQgZGVzdD0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBzcmM9IiR7cmVwb30vbWF2ZW4vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8dW5qYXIgZGVzdD0iJHttYXZlbi5ob21lfSIgc3JjPSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L3VuamFyPgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JlYW5zaGVsbC9tYXZlbi54bWwgYi9qZWxseS10YWdzL2JlYW5zaGVsbC9tYXZlbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5N2FkYjMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9iZWFuc2hlbGwvbWF2ZW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImphdmE6amFyIj4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZWFuc2hlbGwvcHJvamVjdC5wcm9wZXJ0aWVzIGIvamVsbHktdGFncy9iZWFuc2hlbGwvcHJvamVjdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDE5Y2JjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYmVhbnNoZWxsL3Byb2plY3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jIAotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUCBSIE8gSiBFIEMgVCAgUCBSIE8gUCBFIFIgVCBJIEUgUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JlYW5zaGVsbC9wcm9qZWN0LnhtbCBiL2plbGx5LXRhZ3MvYmVhbnNoZWxsL3Byb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2RkZTRhLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYmVhbnNoZWxsL3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdD4KLSAgPGV4dGVuZD4ke2Jhc2VkaXJ9Ly4uL3RhZy1wcm9qZWN0LnhtbDwvZXh0ZW5kPgotICA8aWQ+Y29tbW9ucy1qZWxseS10YWdzLWJlYW5zaGVsbDwvaWQ+Ci0gIDxuYW1lPmNvbW1vbnMtamVsbHktdGFncy1iZWFuc2hlbGw8L25hbWU+Ci0gIDxjdXJyZW50VmVyc2lvbj4xLjA8L2N1cnJlbnRWZXJzaW9uPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5iZWFuc2hlbGw8L3BhY2thZ2U+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICAgICAgVGhpcyBpcyBhIEplbGx5IGludGVyZmFjZSBmb3IgQmVhblNoZWxsLgotICA8L2Rlc2NyaXB0aW9uPgotICA8c2hvcnREZXNjcmlwdGlvbj5Db21tb25zIEplbGx5IEJlYW5TaGVsbCBUYWcgTGlicmFyeTwvc2hvcnREZXNjcmlwdGlvbj4KLSAgCi0gIDx2ZXJzaW9ucz4KLSAgICA8dmVyc2lvbj4KLSAgICAgIDxpZD4xLjA8L2lkPgotICAgICAgPG5hbWU+MS4wPC9uYW1lPgotICAgICAgPHRhZz5DT01NT05TX0pFTExZX0JFQU5TSEVMTC0xXzA8L3RhZz4KLSAgICA8L3ZlcnNpb24+Ci0gIDwvdmVyc2lvbnM+Ci0gICAgCi0gIDxkZXBlbmRlbmNpZXM+Ci0gIAotICAgIAotICAKLSAgICA8IS0tIFNUQVJUIGZvciBjb21waWxhdGlvbiAtLT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5ic2g8L2lkPgotICAgICAgPHZlcnNpb24+MS4yLWIzPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8IS0tIFNUQVJUIGZvciB0ZXN0aW5nIC0tPgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWplbGx5PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1qZWxseS10YWdzLWp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgPHVybD5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvamVsbHkvbGlicy9qdW5pdC88L3VybD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8IS0tIEVORCBmb3IgdGVzdGluZyAtLT4KLQotICA8L2RlcGVuZGVuY2llcz4KLSAgCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JlYW5zaGVsbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZWFuc2hlbGwvQmVhblNoZWxsRXhwcmVzc2lvbi5qYXZhIGIvamVsbHktdGFncy9iZWFuc2hlbGwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbnNoZWxsL0JlYW5TaGVsbEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2YTAyNC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JlYW5zaGVsbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZWFuc2hlbGwvQmVhblNoZWxsRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5iZWFuc2hlbGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkV4cHJlc3Npb25TdXBwb3J0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLQotLyoqIFJlcHJlc2VudHMgYSA8YSBocmVmPSJodHRwOi8vd3d3LmJlYW5zaGVsbC5vcmciPmJlYW5zaGVsbDwvYT4gZXhwcmVzc2lvbgotICAqCi0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBCZWFuU2hlbGxFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvblN1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKCBCZWFuU2hlbGxFeHByZXNzaW9uLmNsYXNzICk7Ci0KLSAgICAvKiogVGhlIGV4cHJlc3Npb24gKi8KLSAgICBwcml2YXRlIFN0cmluZyB0ZXh0OwotCi0gICAgcHVibGljIEJlYW5TaGVsbEV4cHJlc3Npb24oU3RyaW5nIHRleHQpIHsKLSAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKLSAgICB9Ci0KLSAgICAvLyBFeHByZXNzaW9uIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwcmVzc2lvblRleHQoKSB7Ci0gICAgICAgIHJldHVybiAiJHsiICsgdGV4dCArICJ9IjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKEplbGx5Q29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKZWxseUludGVycHJldGVyIGludGVycHJldGVyID0gbmV3IEplbGx5SW50ZXJwcmV0ZXIoKTsKLSAgICAgICAgICAgIGludGVycHJldGVyLnNldEplbGx5Q29udGV4dChjb250ZXh0KTsKLQotICAgICAgICAgICAgaWYgKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoICJFdmFsdWF0aW5nIGJlYW5zaGVsbDogIiArIHRleHQgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGludGVycHJldGVyLmV2YWwoIHRleHQgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy53YXJuKCAiQ2F1Z2h0IGV4Y2VwdGlvbiBldmFsdWF0aW5nOiAiICsgdGV4dCArICIuIFJlYXNvbjogIiArIGUsIGUgKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZWFuc2hlbGwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbnNoZWxsL0JlYW5TaGVsbEV4cHJlc3Npb25GYWN0b3J5LmphdmEgYi9qZWxseS10YWdzL2JlYW5zaGVsbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZWFuc2hlbGwvQmVhblNoZWxsRXhwcmVzc2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAwMWY5NC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JlYW5zaGVsbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZWFuc2hlbGwvQmVhblNoZWxsRXhwcmVzc2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYmVhbnNoZWxsOwotCi1pbXBvcnQgYnNoLkV2YWxFcnJvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbkZhY3Rvcnk7Ci0KLS8qKiBSZXByZXNlbnRzIGEgZmFjdG9yeSBvZiA8YSBocmVmPSJodHRwOi8vd3d3LmJlYW5zaGVsbC5vcmciPmJlYW5zaGVsbDwvYT4gZXhwcmVzc2lvbnMKLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gICovCi1wdWJsaWMgY2xhc3MgQmVhblNoZWxsRXhwcmVzc2lvbkZhY3RvcnkgaW1wbGVtZW50cyBFeHByZXNzaW9uRmFjdG9yeSB7Ci0KLSAgICAvKioKLSAgICAgKiBBIGhlbHBlciBtZXRob2QgdG8gcmV0dXJuIHRoZSBKZWxseUludGVycHJldGVyIGZvciB0aGUgZ2l2ZW4gSmVsbHlDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBKZWxseUludGVycHJldGVyIGdldEludGVycHJldGVyKEplbGx5Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXZhbEVycm9yIHsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQHRvZG8gd2hlbiB3ZSBjYW4gdW5pZnkgdGhlIEJlYW5TaGVsbCBhbmQgSmVsbHkgdmFyaWFibGUgc2NvcGVzIHdlIGNhbiBzaGFyZSBhIHNpbmdsZQotICAgICAgICAgKiBCZWFuU2hlbGwgY29udGV4dCBmb3IgZWFjaCBKZWxseUNvbnRleHQuCi0gICAgICAgICAqIEZvciBub3cgbGV0cyBjcmVhdGUgYSBuZXcgb25lIGVhY2ggdGltZSwgd2hpY2ggaXMgc2xvd2VyLgotICAgICAgICAgKi8KLSAgICAgICAgSmVsbHlJbnRlcnByZXRlciBpbnRlcnByZXRlciA9IG5ldyBKZWxseUludGVycHJldGVyKCk7Ci0gICAgICAgIGludGVycHJldGVyLnNldEplbGx5Q29udGV4dChjb250ZXh0KTsKLSAgICAgICAgcmV0dXJuIGludGVycHJldGVyOwotLyoKLSAgICAgICAgSmVsbHlJbnRlcnByZXRlciBpbnRlcnByZXRlcgotICAgICAgICAgICAgPSAoSmVsbHlJbnRlcnByZXRlcikgY29udGV4dC5nZXRWYXJpYWJsZSggIm9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5iZWFuc2hlbGwuSmVsbHlJbnRlcnByZXRlciIgKTsKLSAgICAgICAgaWYgKCBpbnRlcnByZXRlciA9PSBudWxsICkgewotICAgICAgICAgICAgaW50ZXJwcmV0ZXIgPSBuZXcgSmVsbHlJbnRlcnByZXRlcigpOwotICAgICAgICAgICAgaW50ZXJwcmV0ZXIuc2V0SmVsbHlDb250ZXh0KGNvbnRleHQpOwotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSggIm9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5iZWFuc2hlbGwuSmVsbHlJbnRlcnByZXRlciIsIGludGVycHJldGVyICk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGludGVycHJldGVyOwotKi8KLSAgICB9Ci0KLQotICAgIC8vIEV4cHJlc3Npb25GYWN0b3J5IGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBFeHByZXNzaW9uIGNyZWF0ZUV4cHJlc3Npb24oU3RyaW5nIHRleHQpIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgQmVhblNoZWxsRXhwcmVzc2lvbih0ZXh0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JlYW5zaGVsbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZWFuc2hlbGwvQmVhblNoZWxsVGFnTGlicmFyeS5qYXZhIGIvamVsbHktdGFncy9iZWFuc2hlbGwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbnNoZWxsL0JlYW5TaGVsbFRhZ0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI4MjZlMi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JlYW5zaGVsbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZWFuc2hlbGwvQmVhblNoZWxsVGFnTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5iZWFuc2hlbGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5FeHByZXNzaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5jb3JlLkNvcmVUYWdMaWJyYXJ5OwotCi0KLS8qKiBEZXNjcmliZXMgdGhlIFRhZ2xpYi4gVGhpcyBjbGFzcyBjb3VsZCBiZSBnZW5lcmF0ZWQgYnkgWERvY2xldAotICAqCi0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBCZWFuU2hlbGxUYWdMaWJyYXJ5IGV4dGVuZHMgQ29yZVRhZ0xpYnJhcnkgewotCi0gICAgcHJpdmF0ZSBFeHByZXNzaW9uRmFjdG9yeSBleHByZXNzaW9uRmFjdG9yeSA9IG5ldyBCZWFuU2hlbGxFeHByZXNzaW9uRmFjdG9yeSgpOwotCi0gICAgcHVibGljIEJlYW5TaGVsbFRhZ0xpYnJhcnkoKSB7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJzY3JpcHQiLCBTY3JpcHRUYWcuY2xhc3MpOwotICAgIH0KLQotICAgIC8qKiBBbGxvd3MgZGVyaXZlZCB0YWcgbGlicmFyaWVzIHRvIHVzZSB0aGVpciBvd24gZmFjdG9yeSAqLwotICAgIHByb3RlY3RlZCBFeHByZXNzaW9uRmFjdG9yeSBnZXRFeHByZXNzaW9uRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIGV4cHJlc3Npb25GYWN0b3J5OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZWFuc2hlbGwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbnNoZWxsL0plbGx5SW50ZXJwcmV0ZXIuamF2YSBiL2plbGx5LXRhZ3MvYmVhbnNoZWxsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW5zaGVsbC9KZWxseUludGVycHJldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlODc5MDMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9iZWFuc2hlbGwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbnNoZWxsL0plbGx5SW50ZXJwcmV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYmVhbnNoZWxsOwotCi1pbXBvcnQgYnNoLkV2YWxFcnJvcjsKLWltcG9ydCBic2guSW50ZXJwcmV0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKiBJbnRlZ3JhdGVzIEJlYW5TaGVsbCdzIGludGVycHJldGVyIHdpdGggSmVsbHkncyBKZWxseUNvbnRleHQKLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNCAkCi0gICovCi1wdWJsaWMgY2xhc3MgSmVsbHlJbnRlcnByZXRlciBleHRlbmRzIEludGVycHJldGVyIHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyggSmVsbHlJbnRlcnByZXRlci5jbGFzcyApOwotCi0gICAgcHJpdmF0ZSBKZWxseUNvbnRleHQgY29udGV4dDsKLQotICAgIHB1YmxpYyBKZWxseUludGVycHJldGVyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBKZWxseUNvbnRleHQgZ2V0SmVsbHlDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gY29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKZWxseUNvbnRleHQoSmVsbHlDb250ZXh0IGNvbnRleHQpIHRocm93cyBFdmFsRXJyb3IgewotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCi0gICAgICAgIC8vIG5vdyBwYXNzIGluIGFsbCB0aGUgdmFyaWFibGVzCi0gICAgICAgIGZvciAoIEl0ZXJhdG9yIGl0ZXIgPSBjb250ZXh0LmdldFZhcmlhYmxlTmFtZXMoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGNvbnRleHQuZ2V0VmFyaWFibGUobmFtZSk7Ci0gICAgICAgICAgICBuYW1lID0gY29udmVydFZhcmlhYmxlTmFtZShuYW1lKTsKLSAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXQoIG5hbWUsIHZhbHVlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBsZXRzIHBhc3MgaW4gdGhlIEplbGx5IGNvbnRleHQKLSAgICAgICAgc2V0KCAiY29udGV4dCIsIGNvbnRleHQgKTsKLSAgICB9Ci0KLS8qCi0KLSAgICAvLyB0aGUgZm9sbG93aW5nIGNvZGUgZG9lc24ndCB3b3JrIC0gaXQgc2VlbXMgdGhhdAotICAgIC8vIGFsbCB2YXJpYWJsZXMgbXVzdCBiZSBwYXNzZWQgaW50byB0aGUgSW50ZXJwcmV0ZXIKLSAgICAvLyB2aWEgc2V0KCkgbWV0aG9kCi0KLSAgICBwdWJsaWMgT2JqZWN0IGdldChTdHJpbmcgbmFtZSkgdGhyb3dzIEV2YWxFcnJvciB7Ci0gICAgICAgIGlmICggY29udGV4dCAhPSBudWxsICkgewotICAgICAgICAgICAgT2JqZWN0IGFuc3dlciA9IGNvbnRleHQuZ2V0VmFyaWFibGUoIG5hbWUgKTsKLSAgICAgICAgICAgIGlmICggYW5zd2VyICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0KCBuYW1lICk7Ci0gICAgfQotKi8KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHZhcmlhYmxlcyB0byBhIGJlYW5zaGVsbCBhbGxvd2FibGUgZm9ybWF0IG9yIGhpZGVzIG5hbWVzIHRoYXQKLSAgICAgKiBjYW4ndCBiZSBjb252ZXJ0ZWQsIGJ5IHJldHVybmluZyBudWxsLgotICAgICAqIEZvciBub3cgbGV0cyBqdXN0IHR1cm4gJy4nIGludG8gJ18nCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VmFyaWFibGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBuYW1lLnJlcGxhY2UoJy4nLCAnXycpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYmVhbnNoZWxsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW5zaGVsbC9TY3JpcHRUYWcuamF2YSBiL2plbGx5LXRhZ3MvYmVhbnNoZWxsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW5zaGVsbC9TY3JpcHRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM5OWQxNS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JlYW5zaGVsbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZWFuc2hlbGwvU2NyaXB0VGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmJlYW5zaGVsbDsKLQotaW1wb3J0IGJzaC5FdmFsRXJyb3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqCi0gKiBBIHRhZyB3aGljaCBpbnZva2VzIGEgQmVhblNoZWxsIHNjcmlwdC4uCi0gKgotICogQGF1dGhvciBKYXNvbiBIb3JtYW4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS42ICQKLSAqLwotcHVibGljIGNsYXNzIFNjcmlwdFRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgcHVibGljIFNjcmlwdFRhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEplbGx5SW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIgPSBCZWFuU2hlbGxFeHByZXNzaW9uRmFjdG9yeS5nZXRJbnRlcnByZXRlcihjb250ZXh0KTsKLQotICAgICAgICAgICAgLy8gQHRvZG8gaXQnZCBiZSByZWFsbHkgbmljZSB0byBjcmVhdGUgYSBKZWxseU5hbWVTcGFjZSB0byBwYXNzIGludG8KLSAgICAgICAgICAgIC8vIHRoaXMgbWV0aG9kIHNvIHRoYXQgYW55IHZhcmlhYmxlcyBkZWNsYXJlZCBieSBiZWFuc2hlbGwgY291bGQgYmUgZXhwb3J0ZWQKLSAgICAgICAgICAgIC8vIGludG8gdGhlIEplbGx5Q29udGV4dAotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBnZXRCb2R5VGV4dChmYWxzZSk7Ci0gICAgICAgICAgICBpbnRlcnByZXRlci5ldmFsKHRleHQpOwotICAgICAgICB9IGNhdGNoIChFdmFsRXJyb3IgZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZWFuc2hlbGwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbnNoZWxsL3BhY2thZ2UuaHRtbCBiL2plbGx5LXRhZ3MvYmVhbnNoZWxsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW5zaGVsbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZTM2Y2QuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9iZWFuc2hlbGwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbnNoZWxsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci0KLSAgPHA+QSB0YWcgbGlicmFyeSBmb3Igd29ya2luZyB3aXRoIEJlYW5TaGVsbCBleHByZXNzaW9ucyBhbmQgc2NyaXB0cyB3aXRoaW4gSmVsbHk8L3A+Ci0gIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZWFuc2hlbGwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbnNoZWxsL1Rlc3RCZWFuU2hlbGxFTC5qYXZhIGIvamVsbHktdGFncy9iZWFuc2hlbGwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbnNoZWxsL1Rlc3RCZWFuU2hlbGxFTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWQ0ZGEzLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYmVhbnNoZWxsL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW5zaGVsbC9UZXN0QmVhblNoZWxsRUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYmVhbnNoZWxsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYmVhbnNoZWxsLkJlYW5TaGVsbEV4cHJlc3Npb25GYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLQotLyoqIFRlc3RzIHRoZSBCZWFuU2hlbGwgRUwKLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNCAkCi0gICovCi1wdWJsaWMgY2xhc3MgVGVzdEJlYW5TaGVsbEVMIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKCBUZXN0QmVhblNoZWxsRUwuY2xhc3MgKTsKLQotICAgIC8qKiBKZWxseSBjb250ZXh0ICovCi0gICAgcHJvdGVjdGVkIEplbGx5Q29udGV4dCBjb250ZXh0OwotCi0gICAgLyoqIFRoZSBmYWN0b3J5IG9mIEV4cHJlc3Npb24gb2JqZWN0cyAqLwotICAgIHByb3RlY3RlZCBFeHByZXNzaW9uRmFjdG9yeSBmYWN0b3J5OwotCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oIHN1aXRlKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3RCZWFuU2hlbGxFTC5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RCZWFuU2hlbGxFTChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBjb250ZXh0ID0gbmV3IEplbGx5Q29udGV4dCgpOwotICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKCAiZm9vIiwgImFiYyIgKTsKLSAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSggImJhciIsIG5ldyBJbnRlZ2VyKCAxMjMgKSApOwotICAgICAgICBmYWN0b3J5ID0gbmV3IEJlYW5TaGVsbEV4cHJlc3Npb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEV4cHJlc3Npb24oICJmb28iLCAiYWJjIiApOwotICAgICAgICBhc3NlcnRFeHByZXNzaW9uKCAiYmFyICogMiIsIG5ldyBJbnRlZ2VyKCAyNDYgKSApOwotICAgICAgICBhc3NlcnRFeHByZXNzaW9uKCAiYmFyID09IDEyMyIsIEJvb2xlYW4uVFJVRSApOwotICAgICAgICBhc3NlcnRFeHByZXNzaW9uKCAiYmFyID09IDEyNCIsIEJvb2xlYW4uRkFMU0UgKTsKLSAgICAgICAgYXNzZXJ0RXhwcmVzc2lvbiggImZvby5lcXVhbHMoIFwiYWJjXCIgKSIsIEJvb2xlYW4uVFJVRSApOwotICAgICAgICBhc3NlcnRFeHByZXNzaW9uKCAiZm9vLmVxdWFscyggXCJ4eXpcIiApIiwgQm9vbGVhbi5GQUxTRSApOwotICAgIH0KLQotICAgIC8qKiBFdmFsdWF0ZXMgdGhlIGdpdmVuIGV4cHJlc3Npb24gdGV4dCBhbmQgdGVzdHMgaXQgYWdhaW5zdCB0aGUgZXhwZWN0ZWQgdmFsdWUgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRFeHByZXNzaW9uKCBTdHJpbmcgZXhwcmVzc2lvblRleHQsIE9iamVjdCBleHBlY3RlZFZhbHVlICkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEV4cHJlc3Npb24gZXhwciA9IGZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbiggZXhwcmVzc2lvblRleHQgKTsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gZXhwci5ldmFsdWF0ZSggY29udGV4dCApOwotICAgICAgICBhc3NlcnRFcXVhbHMoICJWYWx1ZSBvZiBleHByZXNzaW9uOiAiICsgZXhwcmVzc2lvblRleHQsIGV4cGVjdGVkVmFsdWUsIHZhbHVlICk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JlYW5zaGVsbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZWFuc2hlbGwvVGVzdEplbGx5LmphdmEgYi9qZWxseS10YWdzL2JlYW5zaGVsbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZWFuc2hlbGwvVGVzdEplbGx5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYzljM2EuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9iZWFuc2hlbGwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmVhbnNoZWxsL1Rlc3RKZWxseS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5iZWFuc2hlbGw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuanVuaXQuSmVsbHlUZXN0U3VpdGU7Ci0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgdG8gcnVuIGplbGx5IHRlc3QgY2FzZXMgYXMgcGFydCBvZiBBbnQncyBKVW5pdCB0ZXN0cwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAqLwotcHVibGljIGNsYXNzIFRlc3RKZWxseSBleHRlbmRzIEplbGx5VGVzdFN1aXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlc3RSdW5uZXIucnVuKCBzdWl0ZSgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0U3VpdGUgc3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVRlc3RTdWl0ZShUZXN0SmVsbHkuY2xhc3MsICJzdWl0ZS5qZWxseSIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYmVhbnNoZWxsL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW5zaGVsbC9zdWl0ZS5qZWxseSBiL2plbGx5LXRhZ3MvYmVhbnNoZWxsL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JlYW5zaGVsbC9zdWl0ZS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI4YjNjNS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JlYW5zaGVsbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZWFuc2hlbGwvc3VpdGUuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4NCi0gIA0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIA0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIA0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPHRlc3Q6c3VpdGUgDQotICAgIHhtbG5zOmo9ImplbGx5OmNvcmUiDQotICAgIHhtbG5zOmI9ImplbGx5OmJlYW5zaGVsbCIgDQotICAgIHhtbG5zOnRlc3Q9ImplbGx5Omp1bml0Ij4NCi0NCi08dGVzdDpjYXNlIG5hbWU9InRlc3RQcm9wZXJ0eVdpdGhEb3QiPg0KLQ0KLSAgICA8ajpzZXQgdmFyPSJmb28uYmFyIiB2YWx1ZT0iaGVsbG8iLz4NCi0gICAgDQotICAgIDxiOnNjcmlwdD4NCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggImZvby5iYXI6ICIgKyBjb250ZXh0LmdldFZhcmlhYmxlKCJmb28uYmFyIikgKTsNCi0NCi0gICAgICAgIGlmIChjb250ZXh0LmdldFZhcmlhYmxlKCJmb28uYmFyIikgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZDogbm8gZm9vLmJhciBkZWZpbmVkOiAiICsgZm9vX2Jhcik7DQotICAgICAgICB9DQotICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKCJmb28uYmFyIiwgIndvcmtlZCIpOw0KLSAgPC9iOnNjcmlwdD4NCi0NCi0gICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJ3b3JrZWQiIGFjdHVhbD0iJHtmb28uYmFyfSIvPg0KLSAgICAgICAgDQotPC90ZXN0OmNhc2U+DQotDQotPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0RG90Q29udmVyc2lvbiI+DQotDQotICAgIDxqOnNldCB2YXI9ImZvby5iYXIiIHZhbHVlPSJoZWxsbyIvPg0KLSAgICANCi0gICAgPGI6c2NyaXB0Pg0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiZm9vLmJhcjogIiArIGZvb19iYXIgKTsNCi0NCi0gICAgICAgIGlmIChmb29fYmFyID09IG51bGwpIHsNCi0gICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmFpbGVkOiBubyBmb28uYmFyIGRlZmluZWQ6ICIgKyBmb29fYmFyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoImZvby5iYXIiLCAid29ya2VkIik7DQotICA8L2I6c2NyaXB0Pg0KLQ0KLSAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IndvcmtlZCIgYWN0dWFsPSIke2Zvby5iYXJ9Ii8+DQotICAgICAgICANCi08L3Rlc3Q6Y2FzZT4NCi0NCi08L3Rlc3Q6c3VpdGU+DQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZWFuc2hlbGwveGRvY3MvY2hhbmdlcy54bWwgYi9qZWxseS10YWdzL2JlYW5zaGVsbC94ZG9jcy9jaGFuZ2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYzZThlMS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JlYW5zaGVsbC94ZG9jcy9jaGFuZ2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0gLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkNoYW5nZXM8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLSAgPGJvZHk+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4wIiBkYXRlPSIyMDA0LTA5LTEwIj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJhZGQiPkluaXRpYWwgUmVsZWFzZTwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYmVhbnNoZWxsL3hkb2NzL2luZGV4LnhtbCBiL2plbGx5LXRhZ3MvYmVhbnNoZWxsL3hkb2NzL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NhODkzYS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JlYW5zaGVsbC94ZG9jcy9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5CZWFuU2hlbGwgVGFnIExpYnJhcnk8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLQotICA8Ym9keT4KLSAgICA8c2VjdGlvbiBuYW1lPSJPdmVydmlldyI+Ci0gICAgICA8cD4KLSAgICAgICAgQSB0YWcgbGlicmFyeSBmb3Igd29ya2luZyB3aXRoIEJlYW5TaGVsbCBleHByZXNzaW9ucyBhbmQgc2NyaXB0cyB3aXRoaW4gSmVsbHkuCi0gICAgICAgIFNlZSB0aGUgPGEgaHJlZj0idGFncy5odG1sIj50YWdzPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYmVhbnNoZWxsL3hkb2NzL25hdmlnYXRpb24ueG1sIGIvamVsbHktdGFncy9iZWFuc2hlbGwveGRvY3MvbmF2aWdhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMjQxY2EuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9iZWFuc2hlbGwveGRvY3MvbmF2aWdhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IG5hbWU9IkJlYW5TaGVsbCBUYWcgTGlicmFyeSI+Ci0KLSAgPHRpdGxlPkJlYW5TaGVsbCBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gIAotICA8Ym9keT4KLSAgICA8bWVudSBuYW1lPSJCZWFuU2hlbGwgVGFnIExpYnJhcnkiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgICAgICAgICAgIGhyZWY9Ii9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJUYWdzIiAgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZ3MuaHRtbCIvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZXR3aXh0Ly5jdnNpZ25vcmUgYi9qZWxseS10YWdzL2JldHdpeHQvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNhMmNkYS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JldHdpeHQvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotdGFyZ2V0Ci1tYXZlbi5sb2cKLXZlbG9jaXR5LmxvZwpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZXR3aXh0L2J1aWxkLnhtbCBiL2plbGx5LXRhZ3MvYmV0d2l4dC9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MGEwODIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9iZXR3aXh0L2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tYnVpbGQueG1sIGdlbmVyYXRlZCBieSBtYXZlbiBmcm9tIHByb2plY3QueG1sIHZlcnNpb24gMS4wLVNOQVBTSE9UCi0gIG9uIGRhdGUgTWF5IDI0IDIwMDQsIHRpbWUgMjMwMS0tPgotPHByb2plY3QgZGVmYXVsdD0iamFyIiBuYW1lPSJjb21tb25zLWplbGx5LXRhZ3MtYmV0d2l4dCIgYmFzZWRpcj0iLiI+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkZWZhdWx0dGFyZ2V0ZGlyIiB2YWx1ZT0idGFyZ2V0Ij4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYmRpciIgdmFsdWU9InRhcmdldC9saWIiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC9jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cmVwb3J0ZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtcmVwb3J0cyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0ZGlyIiB2YWx1ZT0iZGlzdCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jZGlyIiB2YWx1ZT0iZGlzdC9kb2NzL2FwaSI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJmaW5hbC5uYW1lIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLWJldHdpeHQtMS4wLVNOQVBTSE9UIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0ibyBJbml0aWFsaXplcyBzb21lIHByb3BlcnRpZXMiPgotICAgIDxta2RpciBkaXI9IiR7bGliZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJub2dldCI+Ci0gICAgICA8ZXF1YWxzIGFyZzI9Im9ubHkiIGFyZzE9IiR7YnVpbGQuc3lzY2xhc3NwYXRofSI+Ci0gICAgICA8L2VxdWFscz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249Im8gQ29tcGlsZSB0aGUgY29kZSIgZGVwZW5kcz0iZ2V0LWRlcHMiPgotICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7Y2xhc3Nlc2Rpcn0iIGRlcHJlY2F0aW9uPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSIgb3B0aW1pemU9ImZhbHNlIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIj4KLSAgICAgIDxzcmM+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL2phdmEiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9zcmM+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgICA8Y29weSB0b2Rpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy9qYXZhIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgICA8Y29weSB0b2Rpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamVsbHkiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhzbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5ybmciPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouZHRkIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouaHRtbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphciIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIHRoZSBqYXIiIGRlcGVuZHM9ImNvbXBpbGUsdGVzdCI+Ci0gICAgPGphciBqYXJmaWxlPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiIGJhc2VkaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgIDwvamFyPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249Im8gQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBkaXJlY3RvcmllcyI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iPgotICAgIDwvZGVsZXRlPgotICAgIDxkZWxldGUgZGlyPSIke2Rpc3RkaXJ9Ij4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIGEgZGlzdHJpYnV0aW9uIiBkZXBlbmRzPSJqYXIsIGphdmFkb2MiPgotICAgIDxta2RpciBkaXI9ImRpc3QiPgotICAgIDwvbWtkaXI+Ci0gICAgPGNvcHkgdG9kaXI9ImRpc3QiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2RlZmF1bHR0YXJnZXRkaXJ9IiBpbmNsdWRlcz0iKi5qYXIiPgotICAgICAgPC9maWxlc2V0PgotICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRlcz0iTElDRU5TRSosIFJFQURNRSoiPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249Im8gUnVuIHRoZSB0ZXN0IGNhc2VzIiBpZj0idGVzdC5mYWlsdXJlIiBkZXBlbmRzPSJpbnRlcm5hbC10ZXN0Ij4KLSAgICA8ZmFpbCBtZXNzYWdlPSJUaGVyZSB3ZXJlIHRlc3QgZmFpbHVyZXMuIj4KLSAgICA8L2ZhaWw+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImludGVybmFsLXRlc3QiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdHMiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdHJlcG9ydGRpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGp1bml0IGRpcj0iLi8iIGZhaWx1cmVwcm9wZXJ0eT0idGVzdC5mYWlsdXJlIiBwcmludFN1bW1hcnk9InllcyIgZm9yaz0idHJ1ZSIgaGFsdG9uZXJyb3I9InRydWUiPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYmFzZWRpciIgdmFsdWU9Ii4iPgotICAgICAgPC9zeXNwcm9wZXJ0eT4KLSAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIj4KLSAgICAgIDwvZm9ybWF0dGVyPgotICAgICAgPGZvcm1hdHRlciB1c2VmaWxlPSJmYWxzZSIgdHlwZT0icGxhaW4iPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdHJlcG9ydGRpcn0iPgotICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9UZXN0Ki5qYXZhIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvYmF0Y2h0ZXN0PgotICAgIDwvanVuaXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtdGVzdHMiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqYXZhYyBkZXN0ZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvdGVzdCI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MiIGRlc2NyaXB0aW9uPSJvIEdlbmVyYXRlIGphdmFkb2MiIGRlcGVuZHM9ImphciI+Ci0gICAgPG1rZGlyIGRpcj0iJHtqYXZhZG9jZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8dHN0YW1wPgotICAgICAgPGZvcm1hdCBwYXR0ZXJuPSIyMDAyLXl5eXkiIHByb3BlcnR5PSJ5ZWFyIj4KLSAgICAgIDwvZm9ybWF0PgotICAgIDwvdHN0YW1wPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb3B5cmlnaHQiIHZhbHVlPSJDb3B5cmlnaHQgJmFtcDtjb3B5OyAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSIgdmFsdWU9ImNvbW1vbnMtamVsbHktdGFncy1iZXR3aXh0IDEuMC1TTkFQU0hPVCBBUEkiPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPGphdmFkb2MgdXNlPSJ0cnVlIiBwcml2YXRlPSJ0cnVlIiBkZXN0ZGlyPSIke2phdmFkb2NkaXJ9IiBhdXRob3I9InRydWUiIHZlcnNpb249InRydWUiIHNvdXJjZXBhdGg9InNyYy9qYXZhIiBwYWNrYWdlbmFtZXM9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmJldHdpeHQuKiI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFkb2M+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImdldC1kZXBzIiB1bmxlc3M9Im5vZ2V0IiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtYmV0d2l4dC1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1iZXR3aXh0L2phcnMvY29tbW9ucy1iZXR3aXh0LVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1kaWdlc3Rlci1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1kaWdlc3Rlci9qYXJzL2NvbW1vbnMtZGlnZXN0ZXItU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LXRhZ3MtbG9nLVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS10YWdzLWxvZy1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktdGFncy1qdW5pdC1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktdGFncy1qdW5pdC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamV4bC1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZXhsL2phcnMvY29tbW9ucy1qZXhsLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veG1sLWFwaXMtMS4wLmIyLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94bWwtYXBpcy9qYXJzL3htbC1hcGlzLTEuMC5iMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtYmVhbnV0aWxzLTEuNi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1iZWFudXRpbHMvamFycy9jb21tb25zLWJlYW51dGlscy0xLjYuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1jb2xsZWN0aW9ucy9qYXJzL2NvbW1vbnMtY29sbGVjdGlvbnMtMi4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWxvZ2dpbmcvamFycy9jb21tb25zLWxvZ2dpbmctMS4wLjMuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9kb200ai0xLjUtYmV0YS0yLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9kb200ai9qYXJzL2RvbTRqLTEuNS1iZXRhLTIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qYXhlbi0xLjEtYmV0YS0yLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qYXhlbi9qYXJzL2pheGVuLTEuMS1iZXRhLTIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS94ZXJjZXMtMi4yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3hlcmNlcy9qYXJzL3hlcmNlcy0yLjIuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2p1bml0LTMuOC4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qdW5pdC9qYXJzL2p1bml0LTMuOC4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vYW50LTEuNS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vYW50L2phcnMvYW50LTEuNS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FudC1vcHRpb25hbC0xLjUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC1vcHRpb25hbC0xLjUuamFyIj4KLSAgICA8L2dldD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iaW5zdGFsbC1tYXZlbiI+Ci0gICAgPGdldCBkZXN0PSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIHNyYz0iJHtyZXBvfS9tYXZlbi9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDx1bmphciBkZXN0PSIke21hdmVuLmhvbWV9IiBzcmM9IiR7dXNlci5ob21lfS9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiPgotICAgIDwvdW5qYXI+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYmV0d2l4dC9tYXZlbi54bWwgYi9qZWxseS10YWdzL2JldHdpeHQvbWF2ZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTdhZGIzLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYmV0d2l4dC9tYXZlbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgZGVmYXVsdD0iamF2YTpqYXIiPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JldHdpeHQvcHJvamVjdC5wcm9wZXJ0aWVzIGIvamVsbHktdGFncy9iZXR3aXh0L3Byb2plY3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQxOWNiYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JldHdpeHQvcHJvamVjdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMgCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQIFIgTyBKIEUgQyBUICBQIFIgTyBQIEUgUiBUIEkgRSBTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYmV0d2l4dC9wcm9qZWN0LnhtbCBiL2plbGx5LXRhZ3MvYmV0d2l4dC9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4ZTRlMy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JldHdpeHQvcHJvamVjdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0PgotICA8ZXh0ZW5kPiR7YmFzZWRpcn0vLi4vdGFnLXByb2plY3QueG1sPC9leHRlbmQ+Ci0gIDxpZD5jb21tb25zLWplbGx5LXRhZ3MtYmV0d2l4dDwvaWQ+Ci0gIDxuYW1lPmNvbW1vbnMtamVsbHktdGFncy1iZXR3aXh0PC9uYW1lPgotICA8Y3VycmVudFZlcnNpb24+MS4xLVNOQVBTSE9UPC9jdXJyZW50VmVyc2lvbj4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYmV0d2l4dDwvcGFja2FnZT4KLQotICA8ZGVzY3JpcHRpb24+Ci0gICAgICBUaGlzIGlzIGEgSmVsbHkgaW50ZXJmYWNlIGZvciBCZXR3aXh0LgotICA8L2Rlc2NyaXB0aW9uPgotICA8c2hvcnREZXNjcmlwdGlvbj5Db21tb25zIEplbGx5IEJldHdpeHQgVGFnIExpYnJhcnk8L3Nob3J0RGVzY3JpcHRpb24+Ci0gIAotICA8dmVyc2lvbnM+Ci0gICAgPHZlcnNpb24+Ci0gICAgICA8aWQ+MS4wPC9pZD4KLSAgICAgIDxuYW1lPjEuMDwvbmFtZT4KLSAgICAgIDx0YWc+Q09NTU9OU19KRUxMWV9CRVRXSVhULTFfMDwvdGFnPgotICAgIDwvdmVyc2lvbj4KLSAgPC92ZXJzaW9ucz4KLQotICA8ZGVwZW5kZW5jaWVzPgotCi0gICAgPCEtLSBTVEFSVCBmb3IgY29tcGlsYXRpb24gLS0+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+Y29tbW9ucy1iZXR3aXh0PC9pZD4KLSAgICAgIDx2ZXJzaW9uPjAuNjwvdmVyc2lvbj4KLSAgICAgIDx1cmw+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2JldHdpeHQvPC91cmw+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPmNvbW1vbnMtZGlnZXN0ZXI8L2lkPgotICAgICAgPHZlcnNpb24+MS42PC92ZXJzaW9uPgotICAgICAgPHVybD5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvZGlnZXN0ZXIvPC91cmw+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDwhLS0gRU5EIGZvciBjb21waWxhdGlvbiAtLT4KLQotICAgIDwhLS0gU1RBUlQgZm9yIHRlc3QgLS0+Ci0gIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1qZWxseTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtamVsbHktdGFncy1sb2c8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICA8dXJsPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9qZWxseS90YWdzL2xvZy88L3VybD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtamVsbHk8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWplbGx5LXRhZ3MtanVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICA8dXJsPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9qZWxseS90YWdzL2p1bml0LzwvdXJsPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDwhLS0gRU5EIGZvciB0ZXN0IC0tPgotICAgIAotICA8L2RlcGVuZGVuY2llcz4KLSAgCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JldHdpeHQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmV0d2l4dC9CZXR3aXh0VGFnTGlicmFyeS5qYXZhIGIvamVsbHktdGFncy9iZXR3aXh0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JldHdpeHQvQmV0d2l4dFRhZ0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwM2ZlZi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JldHdpeHQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmV0d2l4dC9CZXR3aXh0VGFnTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5iZXR3aXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ0xpYnJhcnk7Ci0KLS8qKgotICogQSBKZWxseSBjdXN0b20gdGFnIGxpYnJhcnkgdGhhdCB1c2VzIHRoZSBCZXR3aXh0IHByb2plY3QgdG8gcGFyc2UgWE1MIGFuZCB0dXJuIGl0IGludG8gYmVhbnMgb3IKLSAqIHR1cm4gYmVhbnMgaW50byBYTUwKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNiAkCi0gKi8KLXB1YmxpYyBjbGFzcyBCZXR3aXh0VGFnTGlicmFyeSBleHRlbmRzIFRhZ0xpYnJhcnkgewotCi0gICAgcHVibGljIEJldHdpeHRUYWdMaWJyYXJ5KCkgewotICAgICAgICByZWdpc3RlclRhZyggInBhcnNlIiwgUGFyc2VUYWcuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoICJpbnRyb3NwZWN0b3IiLCBJbnRyb3NwZWN0b3JUYWcuY2xhc3MgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JldHdpeHQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmV0d2l4dC9JbnRyb3NwZWN0b3JUYWcuamF2YSBiL2plbGx5LXRhZ3MvYmV0d2l4dC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZXR3aXh0L0ludHJvc3BlY3RvclRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2I3OTI3Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYmV0d2l4dC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9iZXR3aXh0L0ludHJvc3BlY3RvclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYmV0d2l4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuQ29udmVyc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkNvbnZlcnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkNvbnZlcnRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZXR3aXh0LlhNTEludHJvc3BlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmV0d2l4dC5zdHJhdGVneS5DYXBpdGFsaXplTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmV0d2l4dC5zdHJhdGVneS5EZWNhcGl0YWxpemVOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZXR3aXh0LnN0cmF0ZWd5Lkh5cGhlbmF0ZWROYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZXR3aXh0LnN0cmF0ZWd5Lk5hbWVNYXBwZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBDcmVhdGVzIGEgQmV0d2l4dCBYTUxJbnRyb3NwZWN0b3IgaW5zdGFuY2UgdGhhdCBjYW4gYmUgdXNlZCBieSB0aGUgb3RoZXIgQmV0d2l4dCB0YWdzLjwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnRyb3NwZWN0b3JUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhJbnRyb3NwZWN0b3JUYWcuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBYTUxJbnRyb3NwZWN0b3IgaW50cm9zcGVjdG9yOwotICAgIHByaXZhdGUgU3RyaW5nIHZhcjsKLQotICAgIHN0YXRpYyB7Ci0KLSAgICAgICAgLy8gcmVnaXN0ZXIgY29udmVydGVycyB0byBzdGFuZGFyZCBTdHJhdGVnaWVzCi0gICAgICAgIENvbnZlcnRVdGlscy5yZWdpc3RlcigKLSAgICAgICAgICAgIG5ldyBDb252ZXJ0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBjb252ZXJ0KENsYXNzIHR5cGUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZU5hbWVNYXBwZXIoKFN0cmluZykgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCB2YWx1ZSA9PSBudWxsICkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29udmVyc2lvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9uJ3Qga25vdyBob3cgdG8gY29udmVydDogIiArIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG9mIHR5cGU6ICIgKyB2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbnRvIGEgTmFtZU1hcHBlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgTmFtZU1hcHBlci5jbGFzcwotICAgICAgICApOwotICAgIH0KLQotCi0KLSAgICBwdWJsaWMgSW50cm9zcGVjdG9yVGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhmaW5hbCBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiwgSmVsbHlUYWdFeGNlcHRpb24gewotCi0gICAgICAgIGlmICggdmFyID09IG51bGwgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiggInZhciIgKTsKLSAgICAgICAgfQotICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0KLSAgICAgICAgWE1MSW50cm9zcGVjdG9yIGludHJvc3BlY3RvciA9IGdldEludHJvc3BlY3RvcigpOwotCi0gICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoIHZhciwgaW50cm9zcGVjdG9yICk7Ci0KLSAgICAgICAgLy8gbm93IGxldHMgY2xlYXIgdGhpcyBpbnRyb3NwZWN0b3Igc28gdGhhdCBpdHMgcmVjcmVhdGVkIGFnYWluIG5leHQgdGltZQotICAgICAgICB0aGlzLmludHJvc3BlY3RvciA9IG51bGw7Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCBYTUxJbnRyb3NwZWN0b3IsIGxhemlseSBjcmVhdGluZyBvbmUgaWYgcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MSW50cm9zcGVjdG9yIGdldEludHJvc3BlY3RvcigpIHsKLSAgICAgICAgaWYgKCBpbnRyb3NwZWN0b3IgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIGludHJvc3BlY3RvciA9IGNyZWF0ZUludHJvc3BlY3RvcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnRyb3NwZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIGF0dHJpYnV0ZXMgb3IgZWxlbWVudHMgc2hvdWxkIGJlIHVzZWQgZm9yIHByaW1pdGl2ZSB0eXBlcy4KLSAgICAgKiBUaGUgZGVmYXVsdCBpcyBmYWxzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzRm9yUHJpbWl0aXZlcyhib29sZWFuIGF0dHJpYnV0ZXNGb3JQcmltaXRpdmVzKSB7Ci0gICAgICAgIGdldEludHJvc3BlY3RvcigpLnNldEF0dHJpYnV0ZXNGb3JQcmltaXRpdmVzKGF0dHJpYnV0ZXNGb3JQcmltaXRpdmVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG1hcHBlciB1c2VkIGZvciBlbGVtZW50IG5hbWVzLgotICAgICAqIFlvdSBjYW4gYWxzbyB1c2UgdGhlIFN0cmluZ3MgJ2xvd2VyY2FzZScsICd1cHBlcmNhc2UnIG9yICdoeXBoZW5hdGVkJwotICAgICAqIGFzIGFsaWFzZXMgdG8gdGhlIGNvbW1vbiBuYW1lIG1hcHBpbmcgc3RyYXRlZ2llcyBvciBzcGVjaWZ5IGEgY2xhc3MgbmFtZSBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudE5hbWVNYXBwZXIoTmFtZU1hcHBlciBuYW1lTWFwcGVyKSB7Ci0gICAgICAgIGdldEludHJvc3BlY3RvcigpLnNldEVsZW1lbnROYW1lTWFwcGVyKG5hbWVNYXBwZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgbWFwcGVyIHVzZWQgZm9yIGF0dHJpYnV0ZSBuYW1lcy4KLSAgICAgKiBZb3UgY2FuIGFsc28gdXNlIHRoZSBTdHJpbmdzICdsb3dlcmNhc2UnLCAndXBwZXJjYXNlJyBvciAnaHlwaGVuYXRlZCcKLSAgICAgKiBhcyBhbGlhc2VzIHRvIHRoZSBjb21tb24gbmFtZSBtYXBwaW5nIHN0cmF0ZWdpZXMgb3Igc3BlY2lmeSBhIGNsYXNzIG5hbWUgU3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZU5hbWVNYXBwZXIoTmFtZU1hcHBlciBuYW1lTWFwcGVyKSB7Ci0gICAgICAgIGdldEludHJvc3BlY3RvcigpLnNldEF0dHJpYnV0ZU5hbWVNYXBwZXIobmFtZU1hcHBlcik7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YXJpYWJsZSBuYW1lIHRvIG91dHB1dCB0aGUgbmV3IFhNTEludHJvc3BlY3RvciB0by4KLSAgICAgKiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkIHRoZW4gdGhpcyB0YWcgbXVzdCBiZSBuZXN0ZWQKLSAgICAgKiBpbnNpZGUgYW4gJmx0O3BhcnNlJmd0OyBvciAmbHQ7b3V0cHV0Jmd0OyB0YWcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBTdGF0aWMgaGVscGVyIG1ldGhvZCB3aGljaCB3aWxsIGNvbnZlcnQgdGhlIGdpdmVuIHN0cmluZyBpbnRvCi0gICAgICogc3RhbmRhcmQgbmFtZWQgc3RyYXRlZ2llcyBzdWNoIGFzICdsb3dlcmNhc2UnLCAndXBwZXJjYXNlJyBvciAnaHlwaGVuYXRlZCcKLSAgICAgKiBvciB1c2UgdGhlIG5hbWUgYXMgYSBjbGFzcyBuYW1lIGFuZCBjcmVhdGUgYSBuZXcgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBOYW1lTWFwcGVyIGNyZWF0ZU5hbWVNYXBwZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoICJsb3dlcmNhc2UiICkgKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IERlY2FwaXRhbGl6ZU5hbWVNYXBwZXIoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCAidXBwZXJjYXNlIiApICkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBDYXBpdGFsaXplTmFtZU1hcHBlcigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoICJoeXBoZW5hdGVkIiApICkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBIeXBoZW5hdGVkTmFtZU1hcHBlcigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gbGV0cyB0cnkgbG9hZCB0aGUgY2xhc3Mgb2YgdGhpcyBuYW1lCi0gICAgICAgICAgICBDbGFzcyB0aGVDbGFzcyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoZUNsYXNzID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoIG5hbWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb252ZXJzaW9uRXhjZXB0aW9uKCAiQ291bGQgbm90IGxvYWQgY2xhc3MgY2FsbGVkOiAiICsgbmFtZSwgZSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0ID0gdGhlQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb252ZXJzaW9uRXhjZXB0aW9uKCAiQ291bGQgbm90IGluc3RhbnRpYXRlIGFuIGluc3RhbmNlIG9mOiAiICsgbmFtZSwgZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCBvYmplY3QgaW5zdGFuY2VvZiBOYW1lTWFwcGVyICkgewotICAgICAgICAgICAgICAgIHJldHVybiAoTmFtZU1hcHBlcikgb2JqZWN0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCBvYmplY3QgPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29udmVyc2lvbkV4Y2VwdGlvbiggIk5vIE5hbWVNYXBwZXIgY3JlYXRlZCBmb3IgdHlwZTogIiArIG5hbWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb252ZXJzaW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ3JlYXRlZCBvYmplY3Q6ICIgKyBvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vdCBhIE5hbWVNYXBwZXIhIEl0cyB0eXBlIGlzOiAiICsgb2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBYTUxJbnRyb3NwZWN0b3IKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWE1MSW50cm9zcGVjdG9yIGNyZWF0ZUludHJvc3BlY3RvcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYTUxJbnRyb3NwZWN0b3IoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JldHdpeHQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmV0d2l4dC9QYXJzZVRhZy5qYXZhIGIvamVsbHktdGFncy9iZXR3aXh0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JldHdpeHQvUGFyc2VUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZjNDQ1Yy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JldHdpeHQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmV0d2l4dC9QYXJzZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYmV0d2l4dDsKLQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZXR3aXh0LlhNTEludHJvc3BlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmV0d2l4dC5pby5CZWFuUmVhZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnV0aWwuQ2xhc3NMb2FkZXJVdGlsczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIFBhcnNlcyBzb21lIFhNTCBzcGVjaWZpZWQgdmlhIHRoZSBnaXZlbiBVUkkgKHdoaWNoIGNhbiBiZSByZWxhdGl2ZSBvciBhbiBhYnNvbHV0ZSBVUkwpIGFuZCBvdXRwdXRzIHRoZQotICogcGFyc2VkIG9iamVjdC4gVHlwaWNhbGx5IHRoaXMgdGFnIGlzIGN1c3RvbWl6ZWQgYnkgc2V0dGluZyB0aGUgaW50cm9zcGVjdG9yIGF0dHJpYnV0ZSBvciBuZXN0aW5nIGEgY2hpbGQKLSAqIGludHJvc3BlY3RvciB0YWcgaW5zaWRlIGl0LjwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJzZVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBhcnNlVGFnLmNsYXNzKTsKLQotICAgIC8qKiB0aGUgQmVhblJlYWRlciB1c2VkIHRvIHBhcnNlIHRoZSBYTUwgKi8KLSAgICBwcml2YXRlIEJlYW5SZWFkZXIgcmVhZGVyID0gbmV3IEJlYW5SZWFkZXIoKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHVyaTsKLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcm9vdENsYXNzOwotICAgIHByaXZhdGUgU3RyaW5nIHBhdGg7Ci0gICAgcHJpdmF0ZSBYTUxJbnRyb3NwZWN0b3IgaW50cm9zcGVjdG9yOwotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VDb250ZXh0Q2xhc3NMb2FkZXI7Ci0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLQotCi0gICAgcHVibGljIFBhcnNlVGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhmaW5hbCBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiwgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAoIHZhciA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oICJ2YXIiICk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCByb290Q2xhc3MgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCAicm9vdENsYXNzIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVhZGVyLnNldFhNTEludHJvc3BlY3RvcihnZXRJbnRyb3NwZWN0b3IoKSk7Ci0KLSAgICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhlQ2xhc3MgPSBnZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyggcm9vdENsYXNzICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICJDb3VsZCBub3QgbG9hZCBjbGFzcyBjYWxsZWQ6ICIgKyByb290Q2xhc3MsIGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggdGhlQ2xhc3MgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIkNvdWxkIG5vdCBsb2FkIGNsYXNzIGNhbGxlZDogIiArIHJvb3RDbGFzcyApOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICggcGF0aCAhPSBudWxsICkgewotICAgICAgICAgICAgICAgIHJlYWRlci5yZWdpc3RlckJlYW5DbGFzcyggcGF0aCwgdGhlQ2xhc3MgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJlYWRlci5yZWdpc3RlckJlYW5DbGFzcyggdGhlQ2xhc3MgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOwotICAgICAgICBpZiAoIHVyaSAhPSBudWxsICkgewotICAgICAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBjb250ZXh0LmdldFJlc291cmNlKCB1cmkgKTsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlYWRlci5wYXJzZSggdXJsLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLQotICAgICAgICAgICAgLy8gaW52b2tlIHRoZSBib2R5IGFuZCBwYXNzIHRoYXQgaW50byB0aGUgcmVhZGVyCi0gICAgICAgICAgICBYTUxPdXRwdXQgbmV3T3V0cHV0ID0gbmV3IFhNTE91dHB1dCggcmVhZGVyICk7Ci0KLSAgICAgICAgICAgIGludm9rZUJvZHkobmV3T3V0cHV0KTsKLQotICAgICAgICAgICAgdmFsdWUgPSByZWFkZXIuZ2V0Um9vdCgpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoIHZhciwgdmFsdWUgKTsKLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnRyb3NwZWN0b3IgdG8gYmUgdXNlZCwgbGF6aWx5IGNyZWF0aW5nIG9uZSBpZiByZXF1aXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MSW50cm9zcGVjdG9yIGdldEludHJvc3BlY3RvcigpIHsKLSAgICAgICAgaWYgKGludHJvc3BlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRyb3NwZWN0b3IgPSBuZXcgWE1MSW50cm9zcGVjdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGludHJvc3BlY3RvcjsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgQmV0d2l4dCBYTUxJbnRyb3NwZWN0b3IgaW5zdGFuY2UgdXNlZCB0byBkZWZpbmUgdGhlIG1ldGFkYXRhIGZvciBob3cgYQotICAgICAqIGJlYW4gc2hvdWxkIGFwcGVhciBhcyBYTUwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW50cm9zcGVjdG9yKFhNTEludHJvc3BlY3RvciBpbnRyb3NwZWN0b3IpIHsKLSAgICAgICAgdGhpcy5pbnRyb3NwZWN0b3IgPSBpbnRyb3NwZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgVVJJIGZyb20gd2hpY2ggWE1MIGlzIHBhcnNlZC4gVGhpcyBjYW4gYmUgcmVsYXRpdmUgdG8gdGhpcyBKZWxseSBzY3JpcHQsIHVzZQotICAgICAqIGFuIGFic29sdXRlIFVSSSBvciBhIGZ1bGwgVVJMCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXJpKFN0cmluZyB1cmkpIHsKLSAgICAgICAgdGhpcy51cmkgPSB1cmk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFyaWFibGUgbmFtZSB0byBvdXRwdXQgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBYTUwgcGFyc2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgcm9vdCBjbGFzcyB0byB1c2UgZm9yIHBhcnNpbmcgdGhlIFhNTAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvb3RDbGFzcyhTdHJpbmcgcm9vdENsYXNzKSB7Ci0gICAgICAgIHRoaXMucm9vdENsYXNzID0gcm9vdENsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHBhdGggdGhhdCB0aGUgcm9vdCBjbGFzcyBzaG91bGQgYmUgYm91bmQgdG8uCi0gICAgICogVGhpcyBpcyBvcHRpb25hbCBhbmQgb2Z0ZW4gdW5uZWNlc3NhcnkgdGhvdWdoIGNhbiBiZSB1c2VkIHRvIGlnbm9yZSBzb21lIHdyYXBwaW5nCi0gICAgICogZWxlbWVudHMsIHN1Y2ggYXMgdGhlICZsdDtyc3MmZ3Q7IGVsZW1lbnQgaW4gdGhlIFJTUyB1bml0IHRlc3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkgewotICAgICAgICB0aGlzLnBhdGggPSBwYXRoOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIG9yIG5vdCB0aGUgY3VycmVudCB0aHJlYWRzJ3MgY29udGV4dCBjbGFzcyBsb2FkZXIKLSAgICAgKiBzaG91bGQgYmUgdXNlZCB0byBsb2FkIHRoZSBiZWFuIGNsYXNzZXMgb3Igbm90LgotICAgICAqIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiBydW5uaW5nIGluc2lkZSBhIHdlYiBhcHBsaWNhdGlvbiBvciBpbnNpZGUgc29tZQotICAgICAqIGFwcGxpY2F0aW9uIHNlcnZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VDb250ZXh0Q2xhc3NMb2FkZXIoYm9vbGVhbiB1c2VDb250ZXh0Q2xhc3NMb2FkZXIpIHsKLSAgICAgICAgdGhpcy51c2VDb250ZXh0Q2xhc3NMb2FkZXIgPSB1c2VDb250ZXh0Q2xhc3NMb2FkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgQ2xhc3NMb2FkZXIgdG8gYmUgdXNlZCB0byBsb2FkIGJlYW4gY2xhc3NlcyBmcm9tLgotICAgICAqIElmIHRoaXMgaXMgbm90IHNwZWNpZmllZCB0aGVuIGVpdGhlciB0aGUgQ2xhc3NMb2FkZXIgdXNlZCB0byBsb2FkIHRoaXMgdGFnIGxpYnJhcnkKLSAgICAgKiBpcyB1c2VkIG9yLCBpZiB0aGUgJ3VzZUNvbnRleHRDbGFzc0xvYWRlcicgcHJvcGVydHkgaXMgdHJ1ZSwgdGhlbiB0aGUKLSAgICAgKiBjdXJyZW50IHRocmVhZHMgY29udGV4dCBjbGFzcyBsb2FkZXIgaXMgdXNlZCBpbnN0ZWFkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgICB9Ci0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIENsYXNzTG9hZGVyIHRvIGJlIHVzZWQgdG8gbG9hZCBiZWFuIGNsYXNzZXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgewotICAgICAgICByZXR1cm4gQ2xhc3NMb2FkZXJVdGlscy5nZXRDbGFzc0xvYWRlcihjbGFzc0xvYWRlciwgdXNlQ29udGV4dENsYXNzTG9hZGVyLCBnZXRDbGFzcygpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JldHdpeHQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmV0d2l4dC9wYWNrYWdlLmh0bWwgYi9qZWxseS10YWdzL2JldHdpeHQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYmV0d2l4dC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZWU1YzEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9iZXR3aXh0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JldHdpeHQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxodG1sPgotPGhlYWQ+Ci08L2hlYWQ+Ci08Ym9keT4KLQotICA8cD5BIHRhZyBsaWJyYXJ5IGZvciB0dXJuaW5nIFhNTCBpbnRvIGJlYW5zIG9yIGJlYW5zIGludG8gWE1MIHVzaW5nIHRoZQotICA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvamVsbHkvbGlicy9iZXR3aXh0L3RhZ3MuaHRtbCI+QmV0d2l4dDwvYT4gbGlicmFyeQotICA8L3A+Ci0gIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZXR3aXh0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9kaWdlc3Rlci9yc3MvQ2hhbm5lbC5qYXZhIGIvamVsbHktdGFncy9iZXR3aXh0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9kaWdlc3Rlci9yc3MvQ2hhbm5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjk4NGYyLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYmV0d2l4dC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvZGlnZXN0ZXIvcnNzL0NoYW5uZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLnJzczsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLQotLyoqCi0gKiA8cD5JbXBsZW1lbnRhdGlvbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgPHN0cm9uZz5jaGFubmVsPC9zdHJvbmc+IGluIHRoZQotICogPGVtPlJpY2ggU2l0ZSBTdW1tYXJ5PC9lbT4gRFRELCB2ZXJzaW9uIDAuOTEuICBUaGlzIGNsYXNzIG1heSBiZSBzdWJjbGFzc2VkCi0gKiB0byBmdXJ0aGVyIHNwZWNpYWxpemUgaXRzIGJlaGF2aW9yLjwvcD4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQ2hhbm5lbCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcwotCi0KLSAgICAvKioKLSAgICAgKiBUaGUgc2V0IG9mIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIENoYW5uZWwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFycmF5TGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCi0gICAgLyoqCi0gICAgICogVGhlIHNldCBvZiBza2lwIGRheXMgZm9yIHRoaXMgY2hhbm5lbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IHNraXBEYXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0KLSAgICAvKioKLSAgICAgKiBUaGUgc2V0IG9mIHNraXAgaG91cnMgZm9yIHRoaXMgY2hhbm5lbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IHNraXBIb3VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCi0KLQotICAgIC8qKgotICAgICAqIFRoZSBjaGFubmVsIGNvcHlyaWdodCAoMS0xMDAgY2hhcmFjdGVycykuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb3B5cmlnaHQgPSBudWxsOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb3B5cmlnaHQoKSB7Ci0gICAgICAgIHJldHVybiAodGhpcy5jb3B5cmlnaHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvcHlyaWdodChTdHJpbmcgY29weXJpZ2h0KSB7Ci0gICAgICAgIHRoaXMuY29weXJpZ2h0ID0gY29weXJpZ2h0OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhlIGNoYW5uZWwgZGVzY3JpcHRpb24gKDEtNTAwIGNoYXJhY3RlcnMpLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOwotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLmRlc2NyaXB0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhlIGNoYW5uZWwgZGVzY3JpcHRpb24gZmlsZSBVUkwgKDEtNTAwIGNoYXJhY3RlcnMpLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZG9jcyA9IG51bGw7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERvY3MoKSB7Ci0gICAgICAgIHJldHVybiAodGhpcy5kb2NzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREb2NzKFN0cmluZyBkb2NzKSB7Ci0gICAgICAgIHRoaXMuZG9jcyA9IGRvY3M7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGUgaW1hZ2UgZGVzY3JpYmluZyB0aGlzIGNoYW5uZWwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEltYWdlIGltYWdlID0gbnVsbDsKLQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLmltYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSkgewotICAgICAgICB0aGlzLmltYWdlID0gaW1hZ2U7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGUgY2hhbm5lbCBsYW5ndWFnZSAoMi01IGNoYXJhY3RlcnMpLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbGFuZ3VhZ2UgPSBudWxsOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLmxhbmd1YWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhlIGNoYW5uZWwgbGFzdCBidWlsZCBkYXRlICgxLTEwMCBjaGFyYWN0ZXJzKS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGxhc3RCdWlsZERhdGUgPSBudWxsOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0QnVpbGREYXRlKCkgewotICAgICAgICByZXR1cm4gKHRoaXMubGFzdEJ1aWxkRGF0ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdEJ1aWxkRGF0ZShTdHJpbmcgbGFzdEJ1aWxkRGF0ZSkgewotICAgICAgICB0aGlzLmxhc3RCdWlsZERhdGUgPSBsYXN0QnVpbGREYXRlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhlIGNoYW5uZWwgbGluayAoMS01MDAgY2hhcmFjdGVycykuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBsaW5rID0gbnVsbDsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGluaygpIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLmxpbmspOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExpbmsoU3RyaW5nIGxpbmspIHsKLSAgICAgICAgdGhpcy5saW5rID0gbGluazsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoZSBtYW5hZ2luZyBlZGl0b3IgKDEtMTAwIGNoYXJhY3RlcnMpLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbWFuYWdpbmdFZGl0b3IgPSBudWxsOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRNYW5hZ2luZ0VkaXRvcigpIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLm1hbmFnaW5nRWRpdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNYW5hZ2luZ0VkaXRvcihTdHJpbmcgbWFuYWdpbmdFZGl0b3IpIHsKLSAgICAgICAgdGhpcy5tYW5hZ2luZ0VkaXRvciA9IG1hbmFnaW5nRWRpdG9yOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhlIGNoYW5uZWwgcHVibGljYXRpb24gZGF0ZSAoMS0xMDAgY2hhcmFjdGVycykuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBwdWJEYXRlID0gbnVsbDsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHViRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLnB1YkRhdGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFB1YkRhdGUoU3RyaW5nIHB1YkRhdGUpIHsKLSAgICAgICAgdGhpcy5wdWJEYXRlID0gcHViRGF0ZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoZSBjaGFubmVsIHJhdGluZyAoMjAtNTAwIGNoYXJhY3RlcnMpLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgcmF0aW5nID0gbnVsbDsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmF0aW5nKCkgewotICAgICAgICByZXR1cm4gKHRoaXMucmF0aW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSYXRpbmcoU3RyaW5nIHJhdGluZykgewotICAgICAgICB0aGlzLnJhdGluZyA9IHJhdGluZzsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoZSB0ZXh0IGlucHV0IGRlc2NyaXB0aW9uIGZvciB0aGlzIGNoYW5uZWwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRleHRJbnB1dCB0ZXh0SW5wdXQgPSBudWxsOwotCi0gICAgcHVibGljIFRleHRJbnB1dCBnZXRUZXh0SW5wdXQoKSB7Ci0gICAgICAgIHJldHVybiAodGhpcy50ZXh0SW5wdXQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRleHRJbnB1dChUZXh0SW5wdXQgdGV4dElucHV0KSB7Ci0gICAgICAgIHRoaXMudGV4dElucHV0ID0gdGV4dElucHV0OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhlIGNoYW5uZWwgdGl0bGUgKDEtMTAwIGNoYXJhY3RlcnMpLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgdGl0bGUgPSBudWxsOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLnRpdGxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhlIFJTUyBzcGVjaWZpY2F0aW9uIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gY3JlYXRlIHRoaXMgQ2hhbm5lbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZG91YmxlIHZlcnNpb24gPSAwLjkxOwotCi0gICAgcHVibGljIGRvdWJsZSBnZXRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gKHRoaXMudmVyc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihkb3VibGUgdmVyc2lvbikgewotICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhlIHdlYm1hc3RlciBlbWFpbCBhZGRyZXNzICgxLTEwMCBjaGFyYWN0ZXJzKS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHdlYk1hc3RlciA9IG51bGw7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdlYk1hc3RlcigpIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLndlYk1hc3Rlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V2ViTWFzdGVyKFN0cmluZyB3ZWJNYXN0ZXIpIHsKLSAgICAgICAgdGhpcy53ZWJNYXN0ZXIgPSB3ZWJNYXN0ZXI7Ci0gICAgfQotCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKLQotCi0gICAgLyoqCi0gICAgICogQWRkIGFuIGFkZGl0aW9uYWwgaXRlbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRvIGJlIGFkZGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSXRlbShJdGVtIGl0ZW0pIHsKLSAgICAgICAgc3luY2hyb25pemVkIChpdGVtcykgewotICAgICAgICAgICAgaXRlbXMuYWRkKGl0ZW0pOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBBZGQgYW4gYWRkaXRpb25hbCBza2lwIGRheSBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHNraXBEYXkgVGhlIHNraXAgZGF5IHRvIGJlIGFkZGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkU2tpcERheShTdHJpbmcgc2tpcERheSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHNraXBEYXlzKSB7Ci0gICAgICAgICAgICBza2lwRGF5cy5hZGQoc2tpcERheSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEFkZCBhbiBhZGRpdGlvbmFsIHNraXAgaG91ciBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHNraXBIb3VyIFRoZSBza2lwIGhvdXIgdG8gYmUgYWRkZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRTa2lwSG91cihTdHJpbmcgc2tpcEhvdXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChza2lwSG91cnMpIHsKLSAgICAgICAgICAgIHNraXBIb3Vycy5hZGQoc2tpcEhvdXIpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGl0ZW1zIGZvciB0aGlzIGNoYW5uZWwuCi0gICAgICovCi0gICAgcHVibGljIEl0ZW1bXSBmaW5kSXRlbXMoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoaXRlbXMpIHsKLSAgICAgICAgICAgIEl0ZW0gaXRlbXNbXSA9IG5ldyBJdGVtW3RoaXMuaXRlbXMuc2l6ZSgpXTsKLSAgICAgICAgICAgIHJldHVybiAoKEl0ZW1bXSkgdGhpcy5pdGVtcy50b0FycmF5KGl0ZW1zKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgaXRlbXMgZm9yIHRoaXMgY2hhbm5lbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlbVtdIGdldEl0ZW1zKCkgewotICAgICAgICByZXR1cm4gZmluZEl0ZW1zKCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHNraXAgZGF5cyBmb3IgdGhpcyBjaGFubmVsLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kU2tpcERheXMoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoc2tpcERheXMpIHsKLSAgICAgICAgICAgIFN0cmluZyBza2lwRGF5c1tdID0gbmV3IFN0cmluZ1t0aGlzLnNraXBEYXlzLnNpemUoKV07Ci0gICAgICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgdGhpcy5za2lwRGF5cy50b0FycmF5KHNraXBEYXlzKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgc2tpcCBob3VycyBmb3IgdGhpcyBjaGFubmVsLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTa2lwSG91cnMoKSB7Ci0gICAgICAgIHJldHVybiBmaW5kU2tpcEhvdXJzKCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHNraXAgaG91cnMgZm9yIHRoaXMgY2hhbm5lbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZmluZFNraXBIb3VycygpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChza2lwSG91cnMpIHsKLSAgICAgICAgICAgIFN0cmluZyBza2lwSG91cnNbXSA9IG5ldyBTdHJpbmdbdGhpcy5za2lwSG91cnMuc2l6ZSgpXTsKLSAgICAgICAgICAgIHJldHVybiAoKFN0cmluZ1tdKSB0aGlzLnNraXBIb3Vycy50b0FycmF5KHNraXBIb3VycykpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHNraXAgZGF5cyBmb3IgdGhpcyBjaGFubmVsLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTa2lwRGF5cygpIHsKLSAgICAgICAgcmV0dXJuIGZpbmRTa2lwRGF5cygpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGFuIGl0ZW0gZm9yIHRoaXMgY2hhbm5lbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRvIGJlIHJlbW92ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVJdGVtKEl0ZW0gaXRlbSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGl0ZW1zKSB7Ci0gICAgICAgICAgICBpdGVtcy5yZW1vdmUoaXRlbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhIHNraXAgZGF5IGZvciB0aGlzIGNoYW5uZWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2tpcERheSBUaGUgc2tpcCBkYXkgdG8gYmUgcmVtb3ZlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNraXBEYXkoU3RyaW5nIHNraXBEYXkpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChza2lwRGF5cykgewotICAgICAgICAgICAgc2tpcERheXMucmVtb3ZlKHNraXBEYXkpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYSBza2lwIGhvdXIgZm9yIHRoaXMgY2hhbm5lbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBza2lwSG91ciBUaGUgc2tpcCBob3VyIHRvIGJlIHJlbW92ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVTa2lwSG91cihTdHJpbmcgc2tpcEhvdXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChza2lwSG91cnMpIHsKLSAgICAgICAgICAgIHNraXBIb3Vycy5yZW1vdmUoc2tpcEhvdXIpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZW5kZXIgdGhpcyBjaGFubmVsIGFzIFhNTCBjb25mb3JtaW5nIHRvIHRoZSBSU1MgMC45MSBzcGVjaWZpY2F0aW9uLAotICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IHN0cmVhbSwgd2l0aCBubyBpbmRpY2F0aW9uIG9mIGNoYXJhY3RlcgotICAgICAqIGVuY29kaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmVhbSBUaGUgb3V0cHV0IHN0cmVhbSB0byB3cml0ZSB0bwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbmRlcihPdXRwdXRTdHJlYW0gc3RyZWFtKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlbmRlcihzdHJlYW0sIG51bGwpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIDsgLy8gQ2FuIG5vdCBoYXBwZW4KLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZW5kZXIgdGhpcyBjaGFubmVsIGFzIFhNTCBjb25mb3JtaW5nIHRvIHRoZSBSU1MgMC45MSBzcGVjaWZpY2F0aW9uLAotICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IHN0cmVhbSwgd2l0aCB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBlbmNvZGluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJlYW0gVGhlIG91dHB1dCBzdHJlYW0gdG8gd3JpdGUgdG8KLSAgICAgKiBAcGFyYW0gZW5jb2RpbmcgVGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byBkZWNsYXJlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqICBmb3Igbm8gZGVjbGFyYXRpb24KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBpZiB0aGUgbmFtZWQgZW5jb2RpbmcKLSAgICAgKiAgaXMgbm90IHN1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbmRlcihPdXRwdXRTdHJlYW0gc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcpCi0gICAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBudWxsOwotICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3RyZWFtKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHB3ID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc3RyZWFtLCBlbmNvZGluZykpOwotICAgICAgICB9Ci0gICAgICAgIHJlbmRlcihwdywgZW5jb2RpbmcpOwotICAgICAgICBwdy5mbHVzaCgpOwotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZW5kZXIgdGhpcyBjaGFubmVsIGFzIFhNTCBjb25mb3JtaW5nIHRvIHRoZSBSU1MgMC45MSBzcGVjaWZpY2F0aW9uLAotICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgd3JpdGVyLCB3aXRoIG5vIGluZGljYXRpb24gb2YgY2hhcmFjdGVyIGVuY29kaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIHdyaXRlciBUaGUgd3JpdGVyIHRvIHJlbmRlciBvdXRwdXQgdG8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW5kZXIoV3JpdGVyIHdyaXRlcikgewotCi0gICAgICAgIHJlbmRlcih3cml0ZXIsIG51bGwpOwotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZW5kZXIgdGhpcyBjaGFubmVsIGFzIFhNTCBjb25mb3JtaW5nIHRvIHRoZSBSU1MgMC45MSBzcGVjaWZpY2F0aW9uLAotICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgd3JpdGVyLCBpbmRpY2F0aW5nIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGVuY29kaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIHdyaXRlciBUaGUgd3JpdGVyIHRvIHJlbmRlciBvdXRwdXQgdG8KLSAgICAgKiBAcGFyYW0gZW5jb2RpbmcgVGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byBkZWNsYXJlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqICBmb3Igbm8gZGVjbGFyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW5kZXIoV3JpdGVyIHdyaXRlciwgU3RyaW5nIGVuY29kaW5nKSB7Ci0KLSAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKTsKLSAgICAgICAgcmVuZGVyKHB3LCBlbmNvZGluZyk7Ci0gICAgICAgIHB3LmZsdXNoKCk7Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlbmRlciB0aGlzIGNoYW5uZWwgYXMgWE1MIGNvbmZvcm1pbmcgdG8gdGhlIFJTUyAwLjkxIHNwZWNpZmljYXRpb24sCi0gICAgICogdG8gdGhlIHNwZWNpZmllZCB3cml0ZXIsIHdpdGggbm8gaW5kaWNhdGlvbiBvZiBjaGFyYWN0ZXIgZW5jb2RpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd3JpdGVyIFRoZSB3cml0ZXIgdG8gcmVuZGVyIG91dHB1dCB0bwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbmRlcihQcmludFdyaXRlciB3cml0ZXIpIHsKLQotICAgICAgICByZW5kZXIod3JpdGVyLCBudWxsKTsKLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmVuZGVyIHRoaXMgY2hhbm5lbCBhcyBYTUwgY29uZm9ybWluZyB0byB0aGUgUlNTIDAuOTEgc3BlY2lmaWNhdGlvbiwKLSAgICAgKiB0byB0aGUgc3BlY2lmaWVkIHdyaXRlciwgaW5kaWNhdGluZyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBlbmNvZGluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3cml0ZXIgVGhlIHdyaXRlciB0byByZW5kZXIgb3V0cHV0IHRvCi0gICAgICogQHBhcmFtIGVuY29kaW5nIFRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gZGVjbGFyZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiAgZm9yIG5vIGRlY2xhcmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVuZGVyKFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nIGVuY29kaW5nKSB7Ci0KLSAgICAgICAgd3JpdGVyLnByaW50KCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIiKTsKLSAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdyaXRlci5wcmludCgiIGVuY29kaW5nPVwiIik7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnQoZW5jb2RpbmcpOwotICAgICAgICAgICAgd3JpdGVyLnByaW50KCJcIiIpOwotICAgICAgICB9Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCI/PiIpOwotICAgICAgICB3cml0ZXIucHJpbnRsbigpOwotCi0gICAgICAgIHdyaXRlci5wcmludGxuKCI8IURPQ1RZUEUgcnNzIFBVQkxJQyIpOwotICAgICAgICB3cml0ZXIucHJpbnRsbigiICBcIi0vL05ldHNjYXBlIENvbW11bmljYXRpb25zLy9EVEQgUlNTIDAuOTEvL0VOXCIiKTsKLSAgICAgICAgd3JpdGVyLnByaW50bG4oIiAgXCJodHRwOi8vbXkubmV0c2NhcGUuY29tL3B1Ymxpc2gvZm9ybWF0cy9yc3MtMC45MS5kdGRcIj4iKTsKLSAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKLQotICAgICAgICB3cml0ZXIucHJpbnRsbigiPHJzcyB2ZXJzaW9uPVwiMC45MVwiPiIpOwotICAgICAgICB3cml0ZXIucHJpbnRsbigpOwotCi0gICAgICAgIHdyaXRlci5wcmludGxuKCIgIDxjaGFubmVsPiIpOwotICAgICAgICB3cml0ZXIucHJpbnRsbigpOwotCi0gICAgICAgIHdyaXRlci5wcmludCgiICAgIDx0aXRsZT4iKTsKLSAgICAgICAgd3JpdGVyLnByaW50KHRpdGxlKTsKLSAgICAgICAgd3JpdGVyLnByaW50bG4oIjwvdGl0bGU+Iik7Ci0KLSAgICAgICAgd3JpdGVyLnByaW50KCIgICAgPGRlc2NyaXB0aW9uPiIpOwotICAgICAgICB3cml0ZXIucHJpbnQoZGVzY3JpcHRpb24pOwotICAgICAgICB3cml0ZXIucHJpbnRsbigiPC9kZXNjcmlwdGlvbj4iKTsKLQotICAgICAgICB3cml0ZXIucHJpbnQoIiAgICA8bGluaz4iKTsKLSAgICAgICAgd3JpdGVyLnByaW50KGxpbmspOwotICAgICAgICB3cml0ZXIucHJpbnRsbigiPC9saW5rPiIpOwotCi0gICAgICAgIHdyaXRlci5wcmludCgiICAgIDxsYW5ndWFnZT4iKTsKLSAgICAgICAgd3JpdGVyLnByaW50KGxhbmd1YWdlKTsKLSAgICAgICAgd3JpdGVyLnByaW50bG4oIjwvbGFuZ3VhZ2U+Iik7Ci0KLSAgICAgICAgaWYgKHJhdGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnQoIiAgICA8cmF0aW5nPiIpOwotICAgICAgICAgICAgd3JpdGVyLnByaW50KHJhdGluZyk7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiPC9yYXRpbmc+Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29weXJpZ2h0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdyaXRlci5wcmludCgiICAgIDxjb3B5cmlnaHQ+Iik7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnQoY29weXJpZ2h0KTsKLSAgICAgICAgICAgIHdyaXRlci5wcmludCgiPC9jb3B5cmlnaHQ+Iik7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGlmIChwdWJEYXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdyaXRlci5wcmludCgiICAgIDxwdWJEYXRlPiIpOwotICAgICAgICAgICAgd3JpdGVyLnByaW50KHB1YkRhdGUpOwotICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjwvcHViRGF0ZT4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsYXN0QnVpbGREYXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdyaXRlci5wcmludCgiICAgIDxsYXN0QnVpbGREYXRlPiIpOwotICAgICAgICAgICAgd3JpdGVyLnByaW50KGxhc3RCdWlsZERhdGUpOwotICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjwvbGFzdEJ1aWxkRGF0ZT4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkb2NzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdyaXRlci5wcmludCgiICAgIDxkb2NzPiIpOwotICAgICAgICAgICAgd3JpdGVyLnByaW50KGRvY3MpOwotICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjwvZG9jcz4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtYW5hZ2luZ0VkaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnQoIiAgICA8bWFuYWdpbmdFZGl0b3I+Iik7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnQobWFuYWdpbmdFZGl0b3IpOwotICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjwvbWFuYWdpbmdFZGl0b3I+Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAod2ViTWFzdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdyaXRlci5wcmludCgiICAgIDx3ZWJNYXN0ZXI+Iik7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnQod2ViTWFzdGVyKTsKLSAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCI8L3dlYk1hc3Rlcj4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlci5wcmludGxuKCk7Ci0KLSAgICAgICAgaWYgKGltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGltYWdlLnJlbmRlcih3cml0ZXIpOwotICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0ZXh0SW5wdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGV4dElucHV0LnJlbmRlcih3cml0ZXIpOwotICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBza2lwRGF5c1tdID0gZmluZFNraXBEYXlzKCk7Ci0gICAgICAgIGlmIChza2lwRGF5cy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiICAgIDxza2lwRGF5cz4iKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2tpcERheXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiAgICAgIDxza2lwRGF5PiIpOwotICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChza2lwRGF5c1tpXSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjwvc2tpcERheT4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCIgICAgPC9za2lwRGF5cz4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBza2lwSG91cnNbXSA9IGZpbmRTa2lwSG91cnMoKTsKLSAgICAgICAgaWYgKHNraXBIb3Vycy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiICAgIDxza2lwSG91cnM+Iik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNraXBIb3Vycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiICAgICAgPHNraXBIb3VyPiIpOwotICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChza2lwSG91cnNbaV0pOwotICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCI8L3NraXBIb3VyPiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIiAgICA8L3NraXBIb3Vycz4iKTsKLSAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBJdGVtIGl0ZW1zW10gPSBmaW5kSXRlbXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaXRlbXNbaV0ucmVuZGVyKHdyaXRlcik7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnRsbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLnByaW50bG4oIiAgPC9jaGFubmVsPiIpOwotICAgICAgICB3cml0ZXIucHJpbnRsbigpOwotCi0gICAgICAgIHdyaXRlci5wcmludGxuKCI8L3Jzcz4iKTsKLQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JldHdpeHQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2RpZ2VzdGVyL3Jzcy9JbWFnZS5qYXZhIGIvamVsbHktdGFncy9iZXR3aXh0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9kaWdlc3Rlci9yc3MvSW1hZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE3YWJiNy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JldHdpeHQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2RpZ2VzdGVyL3Jzcy9JbWFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIucnNzOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotCi0vKioKLSAqIDxwPkltcGxlbWVudGF0aW9uIG9iamVjdCByZXByZXNlbnRpbmcgYW4gPHN0cm9uZz5pbWFnZTwvc3Ryb25nPiBpbiB0aGUKLSAqIDxlbT5SaWNoIFNpdGUgU3VtbWFyeTwvZW0+IERURCwgdmVyc2lvbiAwLjkxLiAgVGhpcyBjbGFzcyBtYXkgYmUgc3ViY2xhc3NlZAotICogdG8gZnVydGhlciBzcGVjaWFsaXplIGl0cyBiZWhhdmlvci48L3A+Ci0gKi8KLQotcHVibGljIGNsYXNzIEltYWdlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCi0KLQotICAgIC8qKgotICAgICAqIFRoZSBpbWFnZSBkZXNjcmlwdGlvbiAoMS0xMDAgY2hhcmFjdGVycykuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gKHRoaXMuZGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGUgaW1hZ2UgaGVpZ2h0IGluIHBpeGVscyAoMS00MDApLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgaGVpZ2h0ID0gMzE7Ci0KLSAgICBwdWJsaWMgaW50IGdldEhlaWdodCgpIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLmhlaWdodCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCBoZWlnaHQpIHsKLSAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGUgaW1hZ2UgbGluayAoMS01MDAgY2hhcmFjdGVycykuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBsaW5rID0gbnVsbDsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGluaygpIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLmxpbmspOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExpbmsoU3RyaW5nIGxpbmspIHsKLSAgICAgICAgdGhpcy5saW5rID0gbGluazsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoZSBpbWFnZSBhbHRlcm5hdGUgdGV4dCAoMS0xMDAgY2hhcmFjdGVycykuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyB0aXRsZSA9IG51bGw7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotICAgICAgICByZXR1cm4gKHRoaXMudGl0bGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyB0aXRsZSkgewotICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGUgaW1hZ2UgbG9jYXRpb24gVVJMICgxLTUwMCBjaGFyYWN0ZXJzKS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHVybCA9IG51bGw7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVSTCgpIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLnVybCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VVJMKFN0cmluZyB1cmwpIHsKLSAgICAgICAgdGhpcy51cmwgPSB1cmw7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGUgaW1hZ2Ugd2lkdGggaW4gcGl4ZWxzICgxLTQwMCkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCB3aWR0aCA9IDMxOwotCi0gICAgcHVibGljIGludCBnZXRXaWR0aCgpIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLndpZHRoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaWR0aChpbnQgd2lkdGgpIHsKLSAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOwotICAgIH0KLQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFja2FnZSBNZXRob2RzCi0KLQotICAgIC8qKgotICAgICAqIFJlbmRlciB0aGlzIGNoYW5uZWwgYXMgWE1MIGNvbmZvcm1pbmcgdG8gdGhlIFJTUyAwLjkxIHNwZWNpZmljYXRpb24sCi0gICAgICogdG8gdGhlIHNwZWNpZmllZCB3cml0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd3JpdGVyIFRoZSB3cml0ZXIgdG8gcmVuZGVyIG91dHB1dCB0bwotICAgICAqLwotICAgIHZvaWQgcmVuZGVyKFByaW50V3JpdGVyIHdyaXRlcikgewotCi0gICAgICAgIHdyaXRlci5wcmludGxuKCIgICAgPGltYWdlPiIpOwotCi0gICAgICAgIHdyaXRlci5wcmludCgiICAgICAgPHRpdGxlPiIpOwotICAgICAgICB3cml0ZXIucHJpbnQodGl0bGUpOwotICAgICAgICB3cml0ZXIucHJpbnRsbigiPC90aXRsZT4iKTsKLQotICAgICAgICB3cml0ZXIucHJpbnQoIiAgICAgIDx1cmw+Iik7Ci0gICAgICAgIHdyaXRlci5wcmludCh1cmwpOwotICAgICAgICB3cml0ZXIucHJpbnRsbigiPC91cmw+Iik7Ci0KLSAgICAgICAgaWYgKGxpbmsgIT0gbnVsbCkgewotICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgICAgICA8bGluaz4iKTsKLSAgICAgICAgICAgIHdyaXRlci5wcmludChsaW5rKTsKLSAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCI8L2xpbms+Iik7Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIucHJpbnQoIiAgICAgIDx3aWR0aD4iKTsKLSAgICAgICAgd3JpdGVyLnByaW50KHdpZHRoKTsKLSAgICAgICAgd3JpdGVyLnByaW50bG4oIjwvd2lkdGg+Iik7Ci0KLSAgICAgICAgd3JpdGVyLnByaW50KCIgICAgICA8aGVpZ2h0PiIpOwotICAgICAgICB3cml0ZXIucHJpbnQoaGVpZ2h0KTsKLSAgICAgICAgd3JpdGVyLnByaW50bG4oIjwvaGVpZ2h0PiIpOwotCi0gICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnQoIiAgICAgIDxkZXNjcmlwdGlvbj4iKTsKLSAgICAgICAgICAgIHdyaXRlci5wcmludChkZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiPC9kZXNjcmlwdGlvbj4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlci5wcmludGxuKCIgICAgPC9pbWFnZT4iKTsKLQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JldHdpeHQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2RpZ2VzdGVyL3Jzcy9JdGVtLmphdmEgYi9qZWxseS10YWdzL2JldHdpeHQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2RpZ2VzdGVyL3Jzcy9JdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZWYzNmMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9iZXR3aXh0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9kaWdlc3Rlci9yc3MvSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIucnNzOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotCi0vKioKLSAqIDxwPkltcGxlbWVudGF0aW9uIG9iamVjdCByZXByZXNlbnRpbmcgYW4gPHN0cm9uZz5pdGVtPC9zdHJvbmc+IGluIHRoZQotICogPGVtPlJpY2ggU2l0ZSBTdW1tYXJ5PC9lbT4gRFRELCB2ZXJzaW9uIDAuOTEuICBUaGlzIGNsYXNzIG1heSBiZSBzdWJjbGFzc2VkCi0gKiB0byBmdXJ0aGVyIHNwZWNpYWxpemUgaXRzIGJlaGF2aW9yLjwvcD4KLSAqLwotCi1wdWJsaWMgY2xhc3MgSXRlbSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcwotCi0KLSAgICAvKioKLSAgICAgKiBUaGUgaXRlbSBkZXNjcmlwdGlvbiAoMS01MDAgY2hhcmFjdGVycykuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gKHRoaXMuZGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGUgaXRlbSBsaW5rICgxLTUwMCBjaGFyYWN0ZXJzKS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGxpbmsgPSBudWxsOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRMaW5rKCkgewotICAgICAgICByZXR1cm4gKHRoaXMubGluayk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGluayhTdHJpbmcgbGluaykgewotICAgICAgICB0aGlzLmxpbmsgPSBsaW5rOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhlIGl0ZW0gdGl0bGUgKDEtMTAwIGNoYXJhY3RlcnMpLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgdGl0bGUgPSBudWxsOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLnRpdGxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICAgIH0KLQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFja2FnZSBNZXRob2RzCi0KLQotICAgIC8qKgotICAgICAqIFJlbmRlciB0aGlzIGNoYW5uZWwgYXMgWE1MIGNvbmZvcm1pbmcgdG8gdGhlIFJTUyAwLjkxIHNwZWNpZmljYXRpb24sCi0gICAgICogdG8gdGhlIHNwZWNpZmllZCB3cml0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd3JpdGVyIFRoZSB3cml0ZXIgdG8gcmVuZGVyIG91dHB1dCB0bwotICAgICAqLwotICAgIHZvaWQgcmVuZGVyKFByaW50V3JpdGVyIHdyaXRlcikgewotCi0gICAgICAgIHdyaXRlci5wcmludGxuKCIgICAgPGl0ZW0+Iik7Ci0KLSAgICAgICAgd3JpdGVyLnByaW50KCIgICAgICA8dGl0bGU+Iik7Ci0gICAgICAgIHdyaXRlci5wcmludCh0aXRsZSk7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCI8L3RpdGxlPiIpOwotCi0gICAgICAgIHdyaXRlci5wcmludCgiICAgICAgPGxpbms+Iik7Ci0gICAgICAgIHdyaXRlci5wcmludChsaW5rKTsKLSAgICAgICAgd3JpdGVyLnByaW50bG4oIjwvbGluaz4iKTsKLQotICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgICAgICA8ZGVzY3JpcHRpb24+Iik7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnQoZGVzY3JpcHRpb24pOwotICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjwvZGVzY3JpcHRpb24+Iik7Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIucHJpbnRsbigiICAgIDwvaXRlbT4iKTsKLQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JldHdpeHQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2RpZ2VzdGVyL3Jzcy9SU1NEaWdlc3Rlci5qYXZhIGIvamVsbHktdGFncy9iZXR3aXh0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9kaWdlc3Rlci9yc3MvUlNTRGlnZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNlODQwMC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JldHdpeHQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2RpZ2VzdGVyL3Jzcy9SU1NEaWdlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIucnNzOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5EaWdlc3RlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIDxwPkltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+b3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLkRpZ2VzdGVyPC9zdHJvbmc+Ci0gKiBkZXNpZ25lZCB0byBwcm9jZXNzIGlucHV0IHN0cmVhbXMgdGhhdCBjb25mb3JtIHRvIHRoZSA8ZW0+UmljaCBTaXRlCi0gKiBTdW1tYXJ5PC9lbT4gRFRELCB2ZXJzaW9uIDAuOTEuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGZvcm1hdCwKLSAqIHNlZSB0aGUgPGEgaHJlZj0iaHR0cDovL215Lm5ldHNjYXBlLmNvbS9wdWJsaXNoLyI+TXkgTmV0c2NhcGU8L2E+IHNpdGUuPC9wPgotICoKLSAqIDxwPlRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9iamVjdCByZXR1cm5lZCBieSBjYWxsaW5nCi0gKiA8Y29kZT5wYXJzZSgpPC9jb2RlPiAoYW4gaW5zdGFuY2Ugb2YKLSAqIDxjb2RlPm9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5yc3MuQ2hhbm5lbDwvY29kZT4pCi0gKiBrbm93cyBob3cgdG8gcmVuZGVyIGl0c2VsZiBpbiBYTUwgZm9ybWF0IHZpYSB0aGUgPGNvZGU+cmVuZGVyKCk8L2NvZGU+Ci0gKiBtZXRob2QuICBTZWUgdGhlIHRlc3QgPGNvZGU+bWFpbigpPC9jb2RlPiBtZXRob2QgYmVsb3cgZm9yIGFuCi0gKiBleGFtcGxlIG9mIHVzaW5nIHRoZXNlIGNsYXNzZXMuPC9wPgotICovCi0KLXB1YmxpYyBjbGFzcyBSU1NEaWdlc3RlciBleHRlbmRzIERpZ2VzdGVyIHsKLQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCi0KLQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCi0KLQotICAgIC8qKgotICAgICAqIEhhdmUgd2UgYmVlbiBjb25maWd1cmVkIHlldD8KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25maWd1cmVkID0gZmFsc2U7Ci0KLQotICAgIC8qKgotICAgICAqIFRoZSBzZXQgb2YgcHVibGljIGlkZW50aWZpZXJzLCBhbmQgY29ycmVzcG9uZGluZyByZXNvdXJjZSBuYW1lcywKLSAgICAgKiBmb3IgdGhlIHZlcnNpb25zIG9mIHRoZSBEVERzIHRoYXQgd2Uga25vdyBhYm91dC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyByZWdpc3RyYXRpb25zW10gPSB7Ci0gICAgICAgICItLy9OZXRzY2FwZSBDb21tdW5pY2F0aW9ucy8vRFREIFJTUyAwLjkvL0VOIiwKLSAgICAgICAgIi9vcmcvYXBhY2hlL2NvbW1vbnMvZGlnZXN0ZXIvcnNzL3Jzcy0wLjkuZHRkIiwKLSAgICAgICAgIi0vL05ldHNjYXBlIENvbW11bmljYXRpb25zLy9EVEQgUlNTIDAuOTEvL0VOIiwKLSAgICAgICAgIi9vcmcvYXBhY2hlL2NvbW1vbnMvZGlnZXN0ZXIvcnNzL3Jzcy0wLjkxLmR0ZCIsCi0gICAgfTsKLQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCi0KLQotICAgIC8qKgotICAgICAqIFRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgPGNvZGU+Q2hhbm5lbDwvY29kZT4KLSAgICAgKiBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNoYW5uZWxDbGFzcyA9ICJvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIucnNzLkNoYW5uZWwiOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGFubmVsQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiAodGhpcy5jaGFubmVsQ2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENoYW5uZWxDbGFzcyhTdHJpbmcgY2hhbm5lbENsYXNzKSB7Ci0gICAgICAgIHRoaXMuY2hhbm5lbENsYXNzID0gY2hhbm5lbENsYXNzOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSA8Y29kZT5JbWFnZTwvY29kZT4KLSAgICAgKiBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGltYWdlQ2xhc3MgPSAib3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLnJzcy5JbWFnZSI7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEltYWdlQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiAodGhpcy5pbWFnZUNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbWFnZUNsYXNzKFN0cmluZyBpbWFnZUNsYXNzKSB7Ci0gICAgICAgIHRoaXMuaW1hZ2VDbGFzcyA9IGltYWdlQ2xhc3M7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIDxjb2RlPkl0ZW08L2NvZGU+Ci0gICAgICogaW1wbGVtZW50YXRpb24gY2xhc3MuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBpdGVtQ2xhc3MgPSAib3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLnJzcy5JdGVtIjsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXRlbUNsYXNzKCkgewotICAgICAgICByZXR1cm4gKHRoaXMuaXRlbUNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJdGVtQ2xhc3MoU3RyaW5nIGl0ZW1DbGFzcykgewotICAgICAgICB0aGlzLml0ZW1DbGFzcyA9IGl0ZW1DbGFzczsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgPGNvZGU+VGV4dElucHV0PC9jb2RlPgotICAgICAqIGltcGxlbWVudGF0aW9uIGNsYXNzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgdGV4dElucHV0Q2xhc3MgPQotICAgICAgICAgICAgIm9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5yc3MuVGV4dElucHV0IjsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dElucHV0Q2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiAodGhpcy50ZXh0SW5wdXRDbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dElucHV0Q2xhc3MoU3RyaW5nIHRleHRJbnB1dENsYXNzKSB7Ci0gICAgICAgIHRoaXMudGV4dElucHV0Q2xhc3MgPSB0ZXh0SW5wdXRDbGFzczsKLSAgICB9Ci0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcwotCi0KLSAgICAvKioKLSAgICAgKiBQYXJzZSB0aGUgY29udGVudCBvZiB0aGUgc3BlY2lmaWVkIGZpbGUgdXNpbmcgdGhpcyBEaWdlc3Rlci4gIFJldHVybnMKLSAgICAgKiB0aGUgcm9vdCBlbGVtZW50IGZyb20gdGhlIG9iamVjdCBzdGFjayAod2hpY2ggd2lsbCBiZSB0aGUgQ2hhbm5lbCkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZSBGaWxlIGNvbnRhaW5pbmcgdGhlIFhNTCBkYXRhIHRvIGJlIHBhcnNlZAotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCi0gICAgICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24gaWYgYSBwYXJzaW5nIGV4Y2VwdGlvbiBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHBhcnNlKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCi0gICAgICAgIGNvbmZpZ3VyZSgpOwotICAgICAgICByZXR1cm4gKHN1cGVyLnBhcnNlKGZpbGUpKTsKLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgdGhlIGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCBpbnB1dCBzb3VyY2UgdXNpbmcgdGhpcyBEaWdlc3Rlci4KLSAgICAgKiBSZXR1cm5zIHRoZSByb290IGVsZW1lbnQgZnJvbSB0aGUgb2JqZWN0IHN0YWNrICh3aGljaCB3aWxsIGJlIHRoZQotICAgICAqIENoYW5uZWwpLgotICAgICAqCi0gICAgICogQHBhcmFtIGlucHV0IElucHV0IHNvdXJjZSBjb250YWluaW5nIHRoZSBYTUwgZGF0YSB0byBiZSBwYXJzZWQKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycwotICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIGlmIGEgcGFyc2luZyBleGNlcHRpb24gb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBwYXJzZShJbnB1dFNvdXJjZSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCi0gICAgICAgIGNvbmZpZ3VyZSgpOwotICAgICAgICByZXR1cm4gKHN1cGVyLnBhcnNlKGlucHV0KSk7Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtIHVzaW5nIHRoaXMgRGlnZXN0ZXIuCi0gICAgICogUmV0dXJucyB0aGUgcm9vdCBlbGVtZW50IGZyb20gdGhlIG9iamVjdCBzdGFjayAod2hpY2ggd2lsbCBiZQotICAgICAqIHRoZSBDaGFubmVsKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbnB1dCBJbnB1dCBzdHJlYW0gY29udGFpbmluZyB0aGUgWE1MIGRhdGEgdG8gYmUgcGFyc2VkCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKLSAgICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbiBpZiBhIHBhcnNpbmcgZXhjZXB0aW9uIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcGFyc2UoSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQotICAgICAgICBjb25maWd1cmUoKTsKLSAgICAgICAgcmV0dXJuIChzdXBlci5wYXJzZShpbnB1dCkpOwotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBQYXJzZSB0aGUgY29udGVudCBvZiB0aGUgc3BlY2lmaWVkIFVSSSB1c2luZyB0aGlzIERpZ2VzdGVyLgotICAgICAqIFJldHVybnMgdGhlIHJvb3QgZWxlbWVudCBmcm9tIHRoZSBvYmplY3Qgc3RhY2sgKHdoaWNoIHdpbGwgYmUKLSAgICAgKiB0aGUgQ2hhbm5lbCkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJpIFVSSSBjb250YWluaW5nIHRoZSBYTUwgZGF0YSB0byBiZSBwYXJzZWQKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycwotICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIGlmIGEgcGFyc2luZyBleGNlcHRpb24gb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBwYXJzZShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgY29uZmlndXJlKCk7Ci0gICAgICAgIHJldHVybiAoc3VwZXIucGFyc2UodXJpKSk7Ci0KLSAgICB9Ci0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcwotCi0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcwotCi0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmUgdGhlIHBhcnNpbmcgcnVsZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcHJvY2VzcyBSU1MgaW5wdXQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgewotCi0gICAgICAgIGlmIChjb25maWd1cmVkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWdpc3RlciBsb2NhbCBjb3BpZXMgb2YgdGhlIERURHMgd2UgdW5kZXJzdGFuZAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lzdHJhdGlvbnMubGVuZ3RoOyBpICs9IDIpIHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UocmVnaXN0cmF0aW9uc1tpICsgMV0pOwotICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVnaXN0ZXIocmVnaXN0cmF0aW9uc1tpXSwgdXJsLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRklYTUUgLSB2YWxpZGF0ZSB0aGUgInZlcnNpb24iIGF0dHJpYnV0ZSBvZiB0aGUgcnNzIGVsZW1lbnQ/Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBydWxlcyBmb3IgdGhlIENoYW5uZWwgb2JqZWN0Ci0gICAgICAgIGFkZE9iamVjdENyZWF0ZSgicnNzL2NoYW5uZWwiLCBjaGFubmVsQ2xhc3MpOwotICAgICAgICBhZGRDYWxsTWV0aG9kKCJyc3MvY2hhbm5lbC9jb3B5cmlnaHQiLCAic2V0Q29weXJpZ2h0IiwgMCk7Ci0gICAgICAgIGFkZENhbGxNZXRob2QoInJzcy9jaGFubmVsL2Rlc2NyaXB0aW9uIiwgInNldERlc2NyaXB0aW9uIiwgMCk7Ci0gICAgICAgIGFkZENhbGxNZXRob2QoInJzcy9jaGFubmVsL2RvY3MiLCAic2V0RG9jcyIsIDApOwotICAgICAgICBhZGRDYWxsTWV0aG9kKCJyc3MvY2hhbm5lbC9sYW5ndWFnZSIsICJzZXRMYW5ndWFnZSIsIDApOwotICAgICAgICBhZGRDYWxsTWV0aG9kKCJyc3MvY2hhbm5lbC9sYXN0QnVpbGREYXRlIiwgInNldExhc3RCdWlsZERhdGUiLCAwKTsKLSAgICAgICAgYWRkQ2FsbE1ldGhvZCgicnNzL2NoYW5uZWwvbGluayIsICJzZXRMaW5rIiwgMCk7Ci0gICAgICAgIGFkZENhbGxNZXRob2QoInJzcy9jaGFubmVsL21hbmFnaW5nRWRpdG9yIiwgInNldE1hbmFnaW5nRWRpdG9yIiwgMCk7Ci0gICAgICAgIGFkZENhbGxNZXRob2QoInJzcy9jaGFubmVsL3B1YkRhdGUiLCAic2V0UHViRGF0ZSIsIDApOwotICAgICAgICBhZGRDYWxsTWV0aG9kKCJyc3MvY2hhbm5lbC9yYXRpbmciLCAic2V0UmF0aW5nIiwgMCk7Ci0gICAgICAgIGFkZENhbGxNZXRob2QoInJzcy9jaGFubmVsL3NraXBEYXlzL2RheSIsICJhZGRTa2lwRGF5IiwgMCk7Ci0gICAgICAgIGFkZENhbGxNZXRob2QoInJzcy9jaGFubmVsL3NraXBIb3Vycy9ob3VyIiwgImFkZFNraXBIb3VyIiwgMCk7Ci0gICAgICAgIGFkZENhbGxNZXRob2QoInJzcy9jaGFubmVsL3RpdGxlIiwgInNldFRpdGxlIiwgMCk7Ci0gICAgICAgIGFkZENhbGxNZXRob2QoInJzcy9jaGFubmVsL3dlYk1hc3RlciIsICJzZXRXZWJNYXN0ZXIiLCAwKTsKLQotICAgICAgICAvLyBBZGQgdGhlIHJ1bGVzIGZvciB0aGUgSW1hZ2Ugb2JqZWN0Ci0gICAgICAgIGFkZE9iamVjdENyZWF0ZSgicnNzL2NoYW5uZWwvaW1hZ2UiLCBpbWFnZUNsYXNzKTsKLSAgICAgICAgYWRkU2V0TmV4dCgicnNzL2NoYW5uZWwvaW1hZ2UiLCAic2V0SW1hZ2UiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIucnNzLkltYWdlIik7Ci0gICAgICAgIGFkZENhbGxNZXRob2QoInJzcy9jaGFubmVsL2ltYWdlL2Rlc2NyaXB0aW9uIiwgInNldERlc2NyaXB0aW9uIiwgMCk7Ci0gICAgICAgIGFkZENhbGxNZXRob2QoInJzcy9jaGFubmVsL2ltYWdlL2hlaWdodCIsICJzZXRIZWlnaHQiLCAwLAotICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBJbnRlZ2VyLlRZUEUgfSk7Ci0gICAgICAgIGFkZENhbGxNZXRob2QoInJzcy9jaGFubmVsL2ltYWdlL2xpbmsiLCAic2V0TGluayIsIDApOwotICAgICAgICBhZGRDYWxsTWV0aG9kKCJyc3MvY2hhbm5lbC9pbWFnZS90aXRsZSIsICJzZXRUaXRsZSIsIDApOwotICAgICAgICBhZGRDYWxsTWV0aG9kKCJyc3MvY2hhbm5lbC9pbWFnZS91cmwiLCAic2V0VVJMIiwgMCk7Ci0gICAgICAgIGFkZENhbGxNZXRob2QoInJzcy9jaGFubmVsL2ltYWdlL3dpZHRoIiwgInNldFdpZHRoIiwgMCwKLSAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgSW50ZWdlci5UWVBFIH0pOwotCi0gICAgICAgIC8vIEFkZCB0aGUgcnVsZXMgZm9yIHRoZSBJdGVtIG9iamVjdAotICAgICAgICBhZGRPYmplY3RDcmVhdGUoInJzcy9jaGFubmVsL2l0ZW0iLCBpdGVtQ2xhc3MpOwotICAgICAgICBhZGRTZXROZXh0KCJyc3MvY2hhbm5lbC9pdGVtIiwgImFkZEl0ZW0iLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIucnNzLkl0ZW0iKTsKLSAgICAgICAgYWRkQ2FsbE1ldGhvZCgicnNzL2NoYW5uZWwvaXRlbS9kZXNjcmlwdGlvbiIsICJzZXREZXNjcmlwdGlvbiIsIDApOwotICAgICAgICBhZGRDYWxsTWV0aG9kKCJyc3MvY2hhbm5lbC9pdGVtL2xpbmsiLCAic2V0TGluayIsIDApOwotICAgICAgICBhZGRDYWxsTWV0aG9kKCJyc3MvY2hhbm5lbC9pdGVtL3RpdGxlIiwgInNldFRpdGxlIiwgMCk7Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBydWxlcyBmb3IgdGhlIFRleHRJbnB1dCBvYmplY3QKLSAgICAgICAgYWRkT2JqZWN0Q3JlYXRlKCJyc3MvY2hhbm5lbC90ZXh0aW5wdXQiLCB0ZXh0SW5wdXRDbGFzcyk7Ci0gICAgICAgIGFkZFNldE5leHQoInJzcy9jaGFubmVsL3RleHRpbnB1dCIsICJzZXRUZXh0SW5wdXQiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIucnNzLlRleHRJbnB1dCIpOwotICAgICAgICBhZGRDYWxsTWV0aG9kKCJyc3MvY2hhbm5lbC90ZXh0aW5wdXQvZGVzY3JpcHRpb24iLAotICAgICAgICAgICAgICAgICJzZXREZXNjcmlwdGlvbiIsIDApOwotICAgICAgICBhZGRDYWxsTWV0aG9kKCJyc3MvY2hhbm5lbC90ZXh0aW5wdXQvbGluayIsICJzZXRMaW5rIiwgMCk7Ci0gICAgICAgIGFkZENhbGxNZXRob2QoInJzcy9jaGFubmVsL3RleHRpbnB1dC9uYW1lIiwgInNldE5hbWUiLCAwKTsKLSAgICAgICAgYWRkQ2FsbE1ldGhvZCgicnNzL2NoYW5uZWwvdGV4dGlucHV0L3RpdGxlIiwgInNldFRpdGxlIiwgMCk7Ci0KLSAgICAgICAgLy8gTWFyayB0aGlzIGRpZ2VzdGVyIGFzIGhhdmluZyBiZWVuIGNvbmZpZ3VyZWQKLSAgICAgICAgY29uZmlndXJlZCA9IHRydWU7Ci0KLSAgICB9Ci0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUZXN0IE1haW4gUHJvZ3JhbQotCi0KLSAgICAvKioKLSAgICAgKiBUZXN0IG1haW4gcHJvZ3JhbSB0aGF0IHBhcnNlcyB0aGUgY2hhbm5lbCBkZXNjcmlwdGlvbiBpbmNsdWRlZCBpbiB0aGlzCi0gICAgICogcGFja2FnZSBhcyBhIHN0YXRpYyByZXNvdXJjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmdzIFRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIChpZ25vcmVkKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSU1NEaWdlc3RlciBUZXN0IFByb2dyYW0iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT3BlbmluZyBpbnB1dCBzdHJlYW0gLi4uIik7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IFJTU0RpZ2VzdGVyLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgKCIvb3JnL2FwYWNoZS9jb21tb25zL2RpZ2VzdGVyL3Jzcy9yc3MtZXhhbXBsZS54bWwiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRpbmcgbmV3IGRpZ2VzdGVyIC4uLiIpOwotICAgICAgICAgICAgUlNTRGlnZXN0ZXIgZGlnZXN0ZXIgPSBuZXcgUlNTRGlnZXN0ZXIoKTsKLSAgICAgICAgICAgIGlmICgoYXJncy5sZW5ndGggPiAwKSAmJiAoYXJnc1swXS5lcXVhbHMoIi1kZWJ1ZyIpKSkgewotICAgICAgICAgICAgICAgIGRpZ2VzdGVyLnNldExvZ2dlcihMb2dGYWN0b3J5LmdldExvZygiUlNTRGlnZXN0ZXIiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBhcnNpbmcgaW5wdXQgc3RyZWFtIC4uLiIpOwotICAgICAgICAgICAgQ2hhbm5lbCBjaGFubmVsID0gKENoYW5uZWwpIGRpZ2VzdGVyLnBhcnNlKGlzKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xvc2luZyBpbnB1dCBzdHJlYW0gLi4uIik7Ci0gICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEdW1waW5nIGNoYW5uZWwgaW5mbyAuLi4iKTsKLSAgICAgICAgICAgIGNoYW5uZWwucmVuZGVyKFN5c3RlbS5vdXQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLT5FeGNlcHRpb24iKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZXR3aXh0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9kaWdlc3Rlci9yc3MvVGV4dElucHV0LmphdmEgYi9qZWxseS10YWdzL2JldHdpeHQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2RpZ2VzdGVyL3Jzcy9UZXh0SW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVhY2I5ZS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JldHdpeHQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2RpZ2VzdGVyL3Jzcy9UZXh0SW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLnJzczsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLQotLyoqCi0gKiA8cD5JbXBsZW1lbnRhdGlvbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgPHN0cm9uZz50ZXh0aW5wdXQ8L3N0cm9uZz4gaW4gdGhlCi0gKiA8ZW0+UmljaCBTaXRlIFN1bW1hcnk8L2VtPiBEVEQsIHZlcnNpb24gMC45MS4gIFRoaXMgY2xhc3MgbWF5IGJlIHN1YmNsYXNzZWQKLSAqIHRvIGZ1cnRoZXIgc3BlY2lhbGl6ZSBpdHMgYmVoYXZpb3IuPC9wPgotICovCi0KLXB1YmxpYyBjbGFzcyBUZXh0SW5wdXQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKLQotCi0gICAgLyoqCi0gICAgICogVGhlIHRleHQgaW5wdXQgZGVzY3JpcHRpb24gKDEtMTAwIGNoYXJhY3RlcnMpLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOwotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLmRlc2NyaXB0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhlIHRleHQgaW5wdXQgbGluayAoMS01MDAgY2hhcmFjdGVycykuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBsaW5rID0gbnVsbDsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGluaygpIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLmxpbmspOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExpbmsoU3RyaW5nIGxpbmspIHsKLSAgICAgICAgdGhpcy5saW5rID0gbGluazsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoZSB0ZXh0IGlucHV0IGZpZWxkIG5hbWUgKDEtMTAwIGNoYXJhY3RlcnMpLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IG51bGw7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAodGhpcy5uYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGUgdGV4dCBpbnB1dCBzdWJtaXQgYnV0dG9uIGxhYmVsICgxLTEwMCBjaGFyYWN0ZXJzKS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlID0gbnVsbDsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0gICAgICAgIHJldHVybiAodGhpcy50aXRsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKLSAgICB9Ci0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcwotCi0KLSAgICAvKioKLSAgICAgKiBSZW5kZXIgdGhpcyBjaGFubmVsIGFzIFhNTCBjb25mb3JtaW5nIHRvIHRoZSBSU1MgMC45MSBzcGVjaWZpY2F0aW9uLAotICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgd3JpdGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHdyaXRlciBUaGUgd3JpdGVyIHRvIHJlbmRlciBvdXRwdXQgdG8KLSAgICAgKi8KLSAgICB2b2lkIHJlbmRlcihQcmludFdyaXRlciB3cml0ZXIpIHsKLQotICAgICAgICB3cml0ZXIucHJpbnRsbigiICAgIDx0ZXh0aW5wdXQ+Iik7Ci0KLSAgICAgICAgd3JpdGVyLnByaW50KCIgICAgICA8dGl0bGU+Iik7Ci0gICAgICAgIHdyaXRlci5wcmludCh0aXRsZSk7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCI8L3RpdGxlPiIpOwotCi0gICAgICAgIHdyaXRlci5wcmludCgiICAgICAgPGRlc2NyaXB0aW9uPiIpOwotICAgICAgICB3cml0ZXIucHJpbnQoZGVzY3JpcHRpb24pOwotICAgICAgICB3cml0ZXIucHJpbnRsbigiPC9kZXNjcmlwdGlvbj4iKTsKLQotICAgICAgICB3cml0ZXIucHJpbnQoIiAgICAgIDxuYW1lPiIpOwotICAgICAgICB3cml0ZXIucHJpbnQobmFtZSk7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCI8L25hbWU+Iik7Ci0KLSAgICAgICAgd3JpdGVyLnByaW50KCIgICAgICA8bGluaz4iKTsKLSAgICAgICAgd3JpdGVyLnByaW50KGxpbmspOwotICAgICAgICB3cml0ZXIucHJpbnRsbigiPC9saW5rPiIpOwotCi0gICAgICAgIHdyaXRlci5wcmludGxuKCIgICAgPC90ZXh0aW5wdXQ+Iik7Ci0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZXR3aXh0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9kaWdlc3Rlci9yc3MvcGFja2FnZS5odG1sIGIvamVsbHktdGFncy9iZXR3aXh0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9kaWdlc3Rlci9yc3MvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWYxY2M2Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYmV0d2l4dC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvZGlnZXN0ZXIvcnNzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5QYWNrYWdlIERvY3VtZW50YXRpb24gZm9yIG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5yc3MgUGFja2FnZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+Ci08cD5FeGFtcGxlIHVzYWdlIG9mIERpZ2VzdGVyIHRvIHBhcnNlIFhNTCBkb2N1bWVudHMgY29tcGF0aWJsZSB3aXRoIHRoZQotPGVtPlJpY2ggU2l0ZSBTdW1tYXJ5PC9lbT4gZm9ybWF0IHVzZWQgYnkgbWFueSBuZXdzZmVlZHMuPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZXR3aXh0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9kaWdlc3Rlci9yc3MvcnNzLWV4YW1wbGUueG1sIGIvamVsbHktdGFncy9iZXR3aXh0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9kaWdlc3Rlci9yc3MvcnNzLWV4YW1wbGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzgyYzMwLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYmV0d2l4dC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvZGlnZXN0ZXIvcnNzL3Jzcy1leGFtcGxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCFET0NUWVBFIHJzcyBQVUJMSUMKLSAiLS8vTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMvL0RURCBSU1MgMC45MS8vRU4iCi0gImh0dHA6Ly9teS5uZXRzY2FwZS5jb20vcHVibGlzaC9mb3JtYXRzL3Jzcy0wLjkxLmR0ZCI+Ci0KLTxyc3MgdmVyc2lvbj0iMC45MSI+Ci0KLSAgPGNoYW5uZWw+Ci0KLSAgICA8dGl0bGU+QXBhY2hlPC90aXRsZT4KLSAgICA8bGluaz5odHRwOi8vd3d3LmFwYWNoZS5vcmc8L2xpbms+Ci0gICAgPGRlc2NyaXB0aW9uPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgPGxhbmd1YWdlPmVuLVVTPC9sYW5ndWFnZT4KLSAgICA8cmF0aW5nPihQSUNTLTEuMSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiCi0gICAgICAyIGdlbiB0cnVlIGNvbW1lbnQgIlJTQUNpIE5vcnRoIEFtZXJpY2EgU2VydmVyIgotICAgICAgZm9yICJodHRwOi8vd3d3LnJzYWMub3JnIiBvbiAiMTk5Ni4wNC4xNlQwODoxNS0wNTAwIgotICAgICAgciAobiAwIHMgMCB2IDAgbCAwKSk8L3JhdGluZz4KLQotICAgIDxpbWFnZT4KLSAgICAgIDx0aXRsZT5BcGFjaGU8L3RpdGxlPgotICAgICAgPHVybD5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2ltYWdlcy9qYWthcnRhLWxvZ28uZ2lmPC91cmw+Ci0gICAgICA8bGluaz5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnPC9saW5rPgotICAgICAgPHdpZHRoPjUwNTwvd2lkdGg+Ci0gICAgICA8aGVpZ2h0PjQ4MDwvaGVpZ2h0PgotICAgICAgPGRlc2NyaXB0aW9uPlRoZSBKYWthcnRhIHByb2plY3QuIE9wZW4gc291cmNlLCBzZXJ2ZXJzaWRlIGphdmEuPC9kZXNjcmlwdGlvbj4KLSAgICA8L2ltYWdlPgotCi0gICAgPGl0ZW0+Ci0gICAgICA8dGl0bGU+Q29tbW9ucyBBdHRyaWJ1dGVzIDIuMSBSZWxlYXNlZDwvdGl0bGU+Ci0gICAgICA8bGluaz5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3NpdGUvbmV3cy9uZXdzLTIwMDQtMm5kSGFsZi5odG1sIzIwMDQwODE1LjE8L2xpbms+Ci0gICAgICA8ZGVzY3JpcHRpb24+VGhlIEpha2FydGEgQ29tbW9ucyB0ZWFtIGlzIGhhcHB5IHRvIGFubm91bmNlIHRoZSByZWxlYXNlIG9mIENvbW1vbnMgQXR0cmlidXRlcyAyLjEuIAotICAgICAgVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZSBvZiB0aGUgbmV3IENvbW1vbnMtQXR0cmlidXRlcyBjb2RlLjwvZGVzY3JpcHRpb24+Ci0gICAgPC9pdGVtPgotCi0gICAgPGl0ZW0+Ci0gICAgICA8dGl0bGU+Q2xvdWRzY2FwZSBCZWNvbWVzIEFwYWNoZSBEZXJieTwvdGl0bGU+Ci0gICAgICA8bGluaz5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3NpdGUvbmV3cy9lbHNld2hlcmUtMjAwNC0ybmRIYWxmLmh0bWwjMjAwNDA4MDMuMTwvbGluaz4KLSAgICAgIDxkZXNjcmlwdGlvbj5JQk0gaGFzIHN1Ym1pdHRlZCBhIHByb3Bvc2FsIHRvIHRoZSBBcGFjaGUgREIgcHJvamVjdCAKLSAgICAgIGZvciBhIEphdmEtYmFzZWQgcGFja2FnZSB0byBiZSBjYWxsZWQgJ0RlcmJ5Jy48L2Rlc2NyaXB0aW9uPgotICAgIDwvaXRlbT4KLQotICAgIDxpdGVtPgotICAgICAgPHRpdGxlPkNvbW1vbnMgQmVhblV0aWxzIDEuNyBSZWxlYXNlZDwvdGl0bGU+Ci0gICAgICA8bGluaz5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3NpdGUvbmV3cy9uZXdzLTIwMDQtMm5kSGFsZi5odG1sIzIwMDQwODAyLjE8L2xpbms+Ci0gICAgPC9pdGVtPgotCi0gICAgPGl0ZW0+Ci0gICAgICA8dGl0bGU+Q29tbW9ucyBKWFBhdGggMS4yIFJlbGVhc2VkPC90aXRsZT4KLSAgICAgIDxsaW5rPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvc2l0ZS9uZXdzL25ld3MtMjAwNC0ybmRIYWxmLmh0bWwjMjAwNDA4MDEuMjwvbGluaz4KLSAgICA8L2l0ZW0+Ci0KLSAgPC9jaGFubmVsPgotCi08L3Jzcz4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYmV0d2l4dC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYmV0d2l4dC9UZXN0SmVsbHkuamF2YSBiL2plbGx5LXRhZ3MvYmV0d2l4dC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYmV0d2l4dC9UZXN0SmVsbHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM5NWE4Mi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JldHdpeHQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2JldHdpeHQvVGVzdEplbGx5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5iZXR3aXh0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmp1bml0LkplbGx5VGVzdFN1aXRlOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIHRvIHJ1biBqZWxseSB0ZXN0IGNhc2VzIGFzIHBhcnQgb2YgQW50J3MgSlVuaXQgdGVzdHMKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0SmVsbHkgZXh0ZW5kcyBKZWxseVRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUZXN0UnVubmVyLnJ1biggc3VpdGUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVUZXN0U3VpdGUoVGVzdEplbGx5LmNsYXNzLCAic3VpdGUuamVsbHkiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JldHdpeHQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2JldHdpeHQvY29tbW9uLmplbGx5IGIvamVsbHktdGFncy9iZXR3aXh0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9iZXR3aXh0L2NvbW1vbi5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1MDQyYS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JldHdpeHQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2JldHdpeHQvY29tbW9uLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tIGNvbW1vbiB0ZXN0cyB0aGF0IHRoZSBjaGFubmVsIGhhcyBiZWVuIGNyZWF0ZWQgcHJvcGVybHkgLS0+Ci0KLTx0ZXN0OnN1aXRlIHhtbG5zOmo9ImplbGx5OmNvcmUiIHhtbG5zOnRlc3Q9ImplbGx5Omp1bml0IiB4bWxuczpiPSJqZWxseTpiZXR3aXh0IiB4bWxuczpsb2c9ImplbGx5OmxvZyI+Ci0KLSAgICA8bG9nOmluZm8+UGFyc2VkIGNoYW5uZWwgd2l0aCB0aXRsZTogJHtjaGFubmVsLnRpdGxlfTwvbG9nOmluZm8+Ci0gICAgICAKLSAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7Y2hhbm5lbCAhPSBudWxsfSIvPgotICAgICAgCi0gIDx0ZXN0OmFzc2VydEVxdWFscyBhY3R1YWw9IiR7Y2hhbm5lbC50aXRsZX0iIGV4cGVjdGVkPSJNb3ppbGxhWmluZSIvPgotICAgICAgCi08L3Rlc3Q6c3VpdGU+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JldHdpeHQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2JldHdpeHQvcnNzLWV4YW1wbGUueG1sIGIvamVsbHktdGFncy9iZXR3aXh0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9iZXR3aXh0L3Jzcy1leGFtcGxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThjNzZjOS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JldHdpeHQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2JldHdpeHQvcnNzLWV4YW1wbGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tCi08IURPQ1RZUEUgcnNzIFBVQkxJQwotICItLy9OZXRzY2FwZSBDb21tdW5pY2F0aW9ucy8vRFREIFJTUyAwLjkxLy9FTiIKLSAiaHR0cDovL215Lm5ldHNjYXBlLmNvbS9wdWJsaXNoL2Zvcm1hdHMvcnNzLTAuOTEuZHRkIj4KLS0tPgotCi08cnNzIHZlcnNpb249IjAuOTEiPgotCi0gIDxjaGFubmVsPgotCi0gICAgPHRpdGxlPk1vemlsbGFaaW5lPC90aXRsZT4KLSAgICA8bGluaz5odHRwOi8vd3d3Lm1vemlsbGF6aW5lLm9yZzwvbGluaz4KLSAgICA8ZGVzY3JpcHRpb24+WW91ciBzb3VyY2UgZm9yIE1vemlsbGEgbmV3cywgYWR2b2NhY3ksCi0gICAgICBpbnRlcnZpZXdzLCBidWlsZHMsIGFuZCBtb3JlITwvZGVzY3JpcHRpb24+Ci0gICAgPGxhbmd1YWdlPmVuLVVTPC9sYW5ndWFnZT4KLSAgICA8cmF0aW5nPihQSUNTLTEuMSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiCi0gICAgICAyIGdlbiB0cnVlIGNvbW1lbnQgIlJTQUNpIE5vcnRoIEFtZXJpY2EgU2VydmVyIgotICAgICAgZm9yICJodHRwOi8vd3d3LnJzYWMub3JnIiBvbiAiMTk5Ni4wNC4xNlQwODoxNS0wNTAwIgotICAgICAgciAobiAwIHMgMCB2IDAgbCAwKSk8L3JhdGluZz4KLQotICAgIDxpbWFnZT4KLSAgICAgIDx0aXRsZT5Nb3ppbGxhWmluZTwvdGl0bGU+Ci0gICAgICA8dXJsPmh0dHA6Ly93d3cubW96aWxsYXppbmUub3JnL2ltYWdlL215bmV0c2NhcGU4OC5naWY8L3VybD4KLSAgICAgIDxsaW5rPmh0dHA6Ly93d3cubW96aWxsYXppbmUub3JnPC9saW5rPgotICAgICAgPHdpZHRoPjg4PC93aWR0aD4KLSAgICAgIDxoZWlnaHQ+MzE8L2hlaWdodD4KLSAgICAgIDxkZXNjcmlwdGlvbj5BcnRpY2xlcywgZGlzY3Vzc2lvbnMsIGJ1aWxkcywgYW5kIG1vcmUuLi48L2Rlc2NyaXB0aW9uPgotICAgIDwvaW1hZ2U+Ci0KLSAgICA8aXRlbT4KLSAgICAgIDx0aXRsZT5KYXZhMiBpbiBOYXZpZ2F0b3IgNT88L3RpdGxlPgotICAgICAgPGxpbms+aHR0cDovL3d3dy5tb3ppbGxhemluZS5vcmcvdGFsa2JhY2suaHRtbD9hcnRpY2xlPTYwNzwvbGluaz4KLSAgICAgIDxkZXNjcmlwdGlvbj5XaWxsIEphdmEyIGJlIGFuIGludGVncmF0ZWQgcGFydCBvZiBOYXZpZ2F0b3IgNT8KLSAgICAgIFJlYWQgbW9yZSBhYm91dCBpdCBpbiB0aGlzIGRpc2N1c3Npb24uLi48L2Rlc2NyaXB0aW9uPgotICAgIDwvaXRlbT4KLQotICAgIDxpdGVtPgotICAgICAgPHRpdGxlPkNvbW11bmljYXRvciA0LjYxIE91dDwvdGl0bGU+Ci0gICAgICA8bGluaz5odHRwOi8vd3d3Lm1vemlsbGF6aW5lLm9yZy90YWxrYmFjay5odG1sP2FydGljbGU9NjA2PC9saW5rPgotICAgICAgPGRlc2NyaXB0aW9uPlRoZSBsYXRlc3QgdmVyc2lvbiBvZiBDb21tdW5pY2F0b3IgaXMgbm93Ci0gICAgICBhdmFpbGFibGUuICBJdCBpbmNsdWRlcyBzZWN1cml0eSBlbmhhbmNlbWVudHMKLSAgICAgIGFuZCB2YXJpb3VzIGJ1ZyBmaXhlcy48L2Rlc2NyaXB0aW9uPgotICAgIDwvaXRlbT4KLQotICAgIDxpdGVtPgotICAgICAgPHRpdGxlPk1vemlsbGEgRGlzcGVuc2VzIHdpdGggT2xkLAotICAgICAgUHJvcHJpZXRhcnkgRE9NPC90aXRsZT4KLSAgICAgIDxsaW5rPmh0dHA6Ly93d3cubW96aWxsYXppbmUub3JnL3RhbGtiYWNrLmh0bWw/YXJ0aWNsZT02MDQ8L2xpbms+Ci0gICAgPC9pdGVtPgotCi0gICAgPGl0ZW0+Ci0gICAgICA8dGl0bGU+VGhlIEFuaW1hdGlvbiBDb250ZXN0IGlzIE5vdyBDbG9zZWQ8L3RpdGxlPgotICAgICAgPGxpbms+aHR0cDovL3d3dy5tb3ppbGxhemluZS5vcmcvdGFsa2JhY2suaHRtbD9hcnRpY2xlPTYwMzwvbGluaz4KLSAgICA8L2l0ZW0+Ci0KLSAgICA8dGV4dGlucHV0PgotICAgICAgPHRpdGxlPlNlbmQ8L3RpdGxlPgotICAgICAgPGRlc2NyaXB0aW9uPkNvbW1lbnRzIGFib3V0IE1vemlsbGFaaW5lPzwvZGVzY3JpcHRpb24+Ci0gICAgICA8bmFtZT5yZXNwb25zZVRleHQ8L25hbWU+Ci0gICAgICA8bGluaz5odHRwOi8vd3d3Lm1vemlsbGF6aW5lLm9yZy9jZ2ktYmluL3NhbXBsZW9ubHkuY2dpPC9saW5rPgotICAgIDwvdGV4dGlucHV0PgotCi0gICAgPHNraXBEYXlzPgotICAgICAgPGRheT5UdWVzZGF5PC9kYXk+Ci0gICAgPC9za2lwRGF5cz4KLSAgPC9jaGFubmVsPgotCi08L3Jzcz4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYmV0d2l4dC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYmV0d2l4dC9zdWl0ZS5qZWxseSBiL2plbGx5LXRhZ3MvYmV0d2l4dC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYmV0d2l4dC9zdWl0ZS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE3MzIzMS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JldHdpeHQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2JldHdpeHQvc3VpdGUuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHRlc3Q6c3VpdGUgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM6dGVzdD0iamVsbHk6anVuaXQiIHhtbG5zOmI9ImplbGx5OmJldHdpeHQiPgotCi08YjppbnRyb3NwZWN0b3IgdmFyPSJpbnRyb3NwZWN0b3IiIAotICBhdHRyaWJ1dGVzRm9yUHJpbWl0aXZlcz0iZmFsc2UiIGVsZW1lbnROYW1lTWFwcGVyPSJsb3dlcmNhc2UiLz4KLSAgICAKLTx0ZXN0OmNhc2UgbmFtZT0icnNzUGFyc2VWaWFVUkkiPgotCi0gIDxiOnBhcnNlIHZhcj0iY2hhbm5lbCIgCi0gICAgdXJpPSJyc3MtZXhhbXBsZS54bWwiIAotICAgIGludHJvc3BlY3Rvcj0iJHtpbnRyb3NwZWN0b3J9IgotICAgIHJvb3RDbGFzcz0ib3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLnJzcy5DaGFubmVsIgotICAgIHBhdGg9InJzcy9jaGFubmVsIi8+Ci0gIAotICA8ajppbmNsdWRlIHVyaT0iY29tbW9uLmplbGx5Ii8+Ci08L3Rlc3Q6Y2FzZT4KLSAgIAotPHRlc3Q6Y2FzZSBuYW1lPSJyc3NQYXJzZVZpYVRhZ0JvZHkiPgotCi0gIDxiOnBhcnNlIHZhcj0iY2hhbm5lbCIgCi0gICAgaW50cm9zcGVjdG9yPSIke2ludHJvc3BlY3Rvcn0iCi0gICAgcm9vdENsYXNzPSJvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIucnNzLkNoYW5uZWwiCi0gICAgcGF0aD0icnNzL2NoYW5uZWwiPgotICAgICAgCi0gICAgPHJzcyB2ZXJzaW9uPSIwLjkxIj4KLSAgICAKLSAgICAgIDxjaGFubmVsPgotICAgIAotICAgICAgICA8dGl0bGU+TW96aWxsYVppbmU8L3RpdGxlPgotICAgICAgICA8bGluaz5odHRwOi8vd3d3Lm1vemlsbGF6aW5lLm9yZzwvbGluaz4KLSAgICAgICAgPGRlc2NyaXB0aW9uPllvdXIgc291cmNlIGZvciBNb3ppbGxhIG5ld3MsIGFkdm9jYWN5LAotICAgICAgICAgIGludGVydmlld3MsIGJ1aWxkcywgYW5kIG1vcmUhPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxhbmd1YWdlPmVuLVVTPC9sYW5ndWFnZT4KLSAgICAgICAgPHJhdGluZz4oUElDUy0xLjEgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIgotICAgICAgICAgIDIgZ2VuIHRydWUgY29tbWVudCAiUlNBQ2kgTm9ydGggQW1lcmljYSBTZXJ2ZXIiCi0gICAgICAgICAgZm9yICJodHRwOi8vd3d3LnJzYWMub3JnIiBvbiAiMTk5Ni4wNC4xNlQwODoxNS0wNTAwIgotICAgICAgICAgIHIgKG4gMCBzIDAgdiAwIGwgMCkpPC9yYXRpbmc+Ci0gICAgCi0gICAgICAgIDxpbWFnZT4KLSAgICAgICAgICA8dGl0bGU+TW96aWxsYVppbmU8L3RpdGxlPgotICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5tb3ppbGxhemluZS5vcmcvaW1hZ2UvbXluZXRzY2FwZTg4LmdpZjwvdXJsPgotICAgICAgICAgIDxsaW5rPmh0dHA6Ly93d3cubW96aWxsYXppbmUub3JnPC9saW5rPgotICAgICAgICAgIDx3aWR0aD44ODwvd2lkdGg+Ci0gICAgICAgICAgPGhlaWdodD4zMTwvaGVpZ2h0PgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5BcnRpY2xlcywgZGlzY3Vzc2lvbnMsIGJ1aWxkcywgYW5kIG1vcmUuLi48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ltYWdlPgotICAgIAotICAgICAgICA8aXRlbT4KLSAgICAgICAgICA8dGl0bGU+SmF2YTIgaW4gTmF2aWdhdG9yIDU/PC90aXRsZT4KLSAgICAgICAgICA8bGluaz5odHRwOi8vd3d3Lm1vemlsbGF6aW5lLm9yZy90YWxrYmFjay5odG1sP2FydGljbGU9NjA3PC9saW5rPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5XaWxsIEphdmEyIGJlIGFuIGludGVncmF0ZWQgcGFydCBvZiBOYXZpZ2F0b3IgNT8KLSAgICAgICAgICBSZWFkIG1vcmUgYWJvdXQgaXQgaW4gdGhpcyBkaXNjdXNzaW9uLi4uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pdGVtPgotICAgIAotICAgICAgICA8aXRlbT4KLSAgICAgICAgICA8dGl0bGU+Q29tbXVuaWNhdG9yIDQuNjEgT3V0PC90aXRsZT4KLSAgICAgICAgICA8bGluaz5odHRwOi8vd3d3Lm1vemlsbGF6aW5lLm9yZy90YWxrYmFjay5odG1sP2FydGljbGU9NjA2PC9saW5rPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgbGF0ZXN0IHZlcnNpb24gb2YgQ29tbXVuaWNhdG9yIGlzIG5vdwotICAgICAgICAgIGF2YWlsYWJsZS4gIEl0IGluY2x1ZGVzIHNlY3VyaXR5IGVuaGFuY2VtZW50cwotICAgICAgICAgIGFuZCB2YXJpb3VzIGJ1ZyBmaXhlcy48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2l0ZW0+Ci0gICAgCi0gICAgICAgIDxpdGVtPgotICAgICAgICAgIDx0aXRsZT5Nb3ppbGxhIERpc3BlbnNlcyB3aXRoIE9sZCwKLSAgICAgICAgICBQcm9wcmlldGFyeSBET008L3RpdGxlPgotICAgICAgICAgIDxsaW5rPmh0dHA6Ly93d3cubW96aWxsYXppbmUub3JnL3RhbGtiYWNrLmh0bWw/YXJ0aWNsZT02MDQ8L2xpbms+Ci0gICAgICAgIDwvaXRlbT4KLSAgICAKLSAgICAgICAgPGl0ZW0+Ci0gICAgICAgICAgPHRpdGxlPlRoZSBBbmltYXRpb24gQ29udGVzdCBpcyBOb3cgQ2xvc2VkPC90aXRsZT4KLSAgICAgICAgICA8bGluaz5odHRwOi8vd3d3Lm1vemlsbGF6aW5lLm9yZy90YWxrYmFjay5odG1sP2FydGljbGU9NjAzPC9saW5rPgotICAgICAgICA8L2l0ZW0+Ci0gICAgCi0gICAgICAgIDx0ZXh0aW5wdXQ+Ci0gICAgICAgICAgPHRpdGxlPlNlbmQ8L3RpdGxlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5Db21tZW50cyBhYm91dCBNb3ppbGxhWmluZT88L2Rlc2NyaXB0aW9uPgotICAgICAgICAgIDxuYW1lPnJlc3BvbnNlVGV4dDwvbmFtZT4KLSAgICAgICAgICA8bGluaz5odHRwOi8vd3d3Lm1vemlsbGF6aW5lLm9yZy9jZ2ktYmluL3NhbXBsZW9ubHkuY2dpPC9saW5rPgotICAgICAgICA8L3RleHRpbnB1dD4KLSAgICAKLSAgICAgICAgPHNraXBEYXlzPgotICAgICAgICAgIDxkYXk+VHVlc2RheTwvZGF5PgotICAgICAgICA8L3NraXBEYXlzPgotICAgICAgPC9jaGFubmVsPgotICAgIAotICAgIDwvcnNzPgotICAKLSAgPC9iOnBhcnNlPgotICAgIAotICA8ajppbmNsdWRlIHVyaT0iY29tbW9uLmplbGx5Ii8+Ci08L3Rlc3Q6Y2FzZT4KLQotPC90ZXN0OnN1aXRlPgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZXR3aXh0L3hkb2NzL2NoYW5nZXMueG1sIGIvamVsbHktdGFncy9iZXR3aXh0L3hkb2NzL2NoYW5nZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2ZhNDM2Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYmV0d2l4dC94ZG9jcy9jaGFuZ2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0gLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkNoYW5nZXM8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLSAgPGJvZHk+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4xLVNOQVBTSE9UIiBkYXRlPSJpbiBDVlMiPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9InVwZGF0ZSI+TW92ZSB0byBiZXR3aXh0IDAuNjwvYWN0aW9uPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9InVwZGF0ZSI+TW92ZSB0byBiZXR3aXh0IDAuNSBhbmQgZGlnZXN0ZXIgMS42PC9hY3Rpb24+Ci0gICAgPC9yZWxlYXNlPgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMCIgZGF0ZT0iMjAwNC0wOS0xMSI+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0iYWRkIj5Jbml0aWFsIFJlbGVhc2U8L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JldHdpeHQveGRvY3MvaW5kZXgueG1sIGIvamVsbHktdGFncy9iZXR3aXh0L3hkb2NzL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY2MWMyNi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JldHdpeHQveGRvY3MvaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+QmV0d2l4dCBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotICAgIDxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KLSAgICAgIDxwPgotICAgICAgICBBIHRhZyBsaWJyYXJ5IGZvciB0dXJuaW5nIFhNTCBpbnRvIGJlYW5zIG9yIGJlYW5zIGludG8gWE1MIHVzaW5nIHRoZQotICAgICAgICA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvamVsbHkvbGlicy9iZXR3aXh0L3RhZ3MuaHRtbCI+QmV0d2l4dDwvYT4gbGlicmFyeS4KLSAgICAgICAgU2VlIHRoZSA8YSBocmVmPSJ0YWdzLmh0bWwiPnRhZ3M8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgICAgPC9wPgotICAgIDwvc2VjdGlvbj4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9iZXR3aXh0L3hkb2NzL25hdmlnYXRpb24ueG1sIGIvamVsbHktdGFncy9iZXR3aXh0L3hkb2NzL25hdmlnYXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzkwODc1Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYmV0d2l4dC94ZG9jcy9uYXZpZ2F0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgbmFtZT0iQmV0d2l4dCBUYWcgTGlicmFyeSI+Ci0KLSAgPHRpdGxlPkJldHdpeHQgVGFnIExpYnJhcnk8L3RpdGxlPgotICAKLSAgPGJvZHk+Ci0gICAgPG1lbnUgbmFtZT0iQmV0d2l4dCBUYWcgTGlicmFyeSI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgICAgICAgICAgaHJlZj0iL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IlRhZ3MiICAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFncy5odG1sIi8+Ci0gICAgPC9tZW51PgotICA8L2JvZHk+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JzZi8uY3ZzaWdub3JlIGIvamVsbHktdGFncy9ic2YvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRkMzFmNy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JzZi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1tYXZlbi5sb2cKLXRhcmdldAotdmVsb2NpdHkubG9nCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JzZi9idWlsZC54bWwgYi9qZWxseS10YWdzL2JzZi9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MDJlNTguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9ic2YvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS1idWlsZC54bWwgZ2VuZXJhdGVkIGJ5IG1hdmVuIGZyb20gcHJvamVjdC54bWwgdmVyc2lvbiAxLjAtU05BUFNIT1QKLSAgb24gZGF0ZSBNYXkgMjQgMjAwNCwgdGltZSAyMzAxLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXIiIG5hbWU9ImNvbW1vbnMtamVsbHktdGFncy1ic2YiIGJhc2VkaXI9Ii4iPgotICA8cHJvcGVydHkgbmFtZT0iZGVmYXVsdHRhcmdldGRpciIgdmFsdWU9InRhcmdldCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJkaXIiIHZhbHVlPSJ0YXJnZXQvbGliIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXNkaXIiIHZhbHVlPSJ0YXJnZXQvY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Y2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0idGVzdHJlcG9ydGRpciIgdmFsdWU9InRhcmdldC90ZXN0LXJlcG9ydHMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZGlzdGRpciIgdmFsdWU9ImRpc3QiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iamF2YWRvY2RpciIgdmFsdWU9ImRpc3QvZG9jcy9hcGkiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZmluYWwubmFtZSIgdmFsdWU9ImNvbW1vbnMtamVsbHktdGFncy1ic2YtMS4wLVNOQVBTSE9UIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0ibyBJbml0aWFsaXplcyBzb21lIHByb3BlcnRpZXMiPgotICAgIDxta2RpciBkaXI9IiR7bGliZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJub2dldCI+Ci0gICAgICA8ZXF1YWxzIGFyZzI9Im9ubHkiIGFyZzE9IiR7YnVpbGQuc3lzY2xhc3NwYXRofSI+Ci0gICAgICA8L2VxdWFscz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249Im8gQ29tcGlsZSB0aGUgY29kZSIgZGVwZW5kcz0iZ2V0LWRlcHMiPgotICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7Y2xhc3Nlc2Rpcn0iIGRlcHJlY2F0aW9uPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSIgb3B0aW1pemU9ImZhbHNlIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIj4KLSAgICAgIDxzcmM+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL2phdmEiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9zcmM+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgICA8Y29weSB0b2Rpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy9qYXZhIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgICA8Y29weSB0b2Rpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamVsbHkiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhzbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5ybmciPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouZHRkIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouaHRtbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphciIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIHRoZSBqYXIiIGRlcGVuZHM9ImNvbXBpbGUsdGVzdCI+Ci0gICAgPGphciBqYXJmaWxlPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiIGJhc2VkaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgIDwvamFyPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249Im8gQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBkaXJlY3RvcmllcyI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iPgotICAgIDwvZGVsZXRlPgotICAgIDxkZWxldGUgZGlyPSIke2Rpc3RkaXJ9Ij4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIGEgZGlzdHJpYnV0aW9uIiBkZXBlbmRzPSJqYXIsIGphdmFkb2MiPgotICAgIDxta2RpciBkaXI9ImRpc3QiPgotICAgIDwvbWtkaXI+Ci0gICAgPGNvcHkgdG9kaXI9ImRpc3QiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2RlZmF1bHR0YXJnZXRkaXJ9IiBpbmNsdWRlcz0iKi5qYXIiPgotICAgICAgPC9maWxlc2V0PgotICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRlcz0iTElDRU5TRSosIFJFQURNRSoiPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249Im8gUnVuIHRoZSB0ZXN0IGNhc2VzIiBpZj0idGVzdC5mYWlsdXJlIiBkZXBlbmRzPSJpbnRlcm5hbC10ZXN0Ij4KLSAgICA8ZmFpbCBtZXNzYWdlPSJUaGVyZSB3ZXJlIHRlc3QgZmFpbHVyZXMuIj4KLSAgICA8L2ZhaWw+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImludGVybmFsLXRlc3QiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdHMiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdHJlcG9ydGRpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGp1bml0IGRpcj0iLi8iIGZhaWx1cmVwcm9wZXJ0eT0idGVzdC5mYWlsdXJlIiBwcmludFN1bW1hcnk9InllcyIgZm9yaz0idHJ1ZSIgaGFsdG9uZXJyb3I9InRydWUiPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYmFzZWRpciIgdmFsdWU9Ii4iPgotICAgICAgPC9zeXNwcm9wZXJ0eT4KLSAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIj4KLSAgICAgIDwvZm9ybWF0dGVyPgotICAgICAgPGZvcm1hdHRlciB1c2VmaWxlPSJmYWxzZSIgdHlwZT0icGxhaW4iPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdHJlcG9ydGRpcn0iPgotICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9UZXN0Ki5qYXZhIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvYmF0Y2h0ZXN0PgotICAgIDwvanVuaXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtdGVzdHMiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqYXZhYyBkZXN0ZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvdGVzdCI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MiIGRlc2NyaXB0aW9uPSJvIEdlbmVyYXRlIGphdmFkb2MiIGRlcGVuZHM9ImphciI+Ci0gICAgPG1rZGlyIGRpcj0iJHtqYXZhZG9jZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8dHN0YW1wPgotICAgICAgPGZvcm1hdCBwYXR0ZXJuPSIyMDAyLXl5eXkiIHByb3BlcnR5PSJ5ZWFyIj4KLSAgICAgIDwvZm9ybWF0PgotICAgIDwvdHN0YW1wPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb3B5cmlnaHQiIHZhbHVlPSJDb3B5cmlnaHQgJmFtcDtjb3B5OyAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSIgdmFsdWU9ImNvbW1vbnMtamVsbHktdGFncy1ic2YgMS4wLVNOQVBTSE9UIEFQSSI+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgICA8amF2YWRvYyB1c2U9InRydWUiIHByaXZhdGU9InRydWUiIGRlc3RkaXI9IiR7amF2YWRvY2Rpcn0iIGF1dGhvcj0idHJ1ZSIgdmVyc2lvbj0idHJ1ZSIgc291cmNlcGF0aD0ic3JjL2phdmEiIHBhY2thZ2VuYW1lcz0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYnNmLioiPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhZG9jPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJnZXQtZGVwcyIgdW5sZXNzPSJub2dldCIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9ic2YtMi4zLjAtcmMxLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9ic2YvamFycy9ic2YtMi4zLjAtcmMxLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZXhsLVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWpleGwvamFycy9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS94bWwtYXBpcy0xLjAuYjIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3htbC1hcGlzL2phcnMveG1sLWFwaXMtMS4wLmIyLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1iZWFudXRpbHMtMS42LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWJlYW51dGlscy9qYXJzL2NvbW1vbnMtYmVhbnV0aWxzLTEuNi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtY29sbGVjdGlvbnMtMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWNvbGxlY3Rpb25zL2phcnMvY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWxvZ2dpbmctMS4wLjMuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtbG9nZ2luZy9qYXJzL2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2RvbTRqLTEuNS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2RvbTRqL2phcnMvZG9tNGotMS41LWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2pheGVuLTEuMS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2pheGVuL2phcnMvamF4ZW4tMS4xLWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3hlcmNlcy0yLjIuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veGVyY2VzL2phcnMveGVyY2VzLTIuMi4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vanVuaXQtMy44LjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2p1bml0L2phcnMvanVuaXQtMy44LjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vYW50LW9wdGlvbmFsLTEuNS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vYW50L2phcnMvYW50LW9wdGlvbmFsLTEuNS5qYXIiPgotICAgIDwvZ2V0PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJpbnN0YWxsLW1hdmVuIj4KLSAgICA8Z2V0IGRlc3Q9IiR7dXNlci5ob21lfS9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgc3JjPSIke3JlcG99L21hdmVuL21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPHVuamFyIGRlc3Q9IiR7bWF2ZW4uaG9tZX0iIHNyYz0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC91bmphcj4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9ic2YvbWF2ZW4ueG1sIGIvamVsbHktdGFncy9ic2YvbWF2ZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTdhZGIzLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYnNmL21hdmVuLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXZhOmphciI+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYnNmL3Byb2plY3QucHJvcGVydGllcyBiL2plbGx5LXRhZ3MvYnNmL3Byb2plY3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQxOWNiYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JzZi9wcm9qZWN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIyAKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFAgUiBPIEogRSBDIFQgIFAgUiBPIFAgRSBSIFQgSSBFIFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9ic2YvcHJvamVjdC54bWwgYi9qZWxseS10YWdzL2JzZi9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlmNDE4YS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JzZi9wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3Q+Ci0gIDxleHRlbmQ+JHtiYXNlZGlyfS8uLi90YWctcHJvamVjdC54bWw8L2V4dGVuZD4KLSAgPGlkPmNvbW1vbnMtamVsbHktdGFncy1ic2Y8L2lkPgotICA8bmFtZT5jb21tb25zLWplbGx5LXRhZ3MtYnNmPC9uYW1lPgotICA8Y3VycmVudFZlcnNpb24+MS4wPC9jdXJyZW50VmVyc2lvbj4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYnNmPC9wYWNrYWdlPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgICAgIFRoaXMgaXMgYSBKZWxseSBpbnRlcmZhY2UgZm9yIHRoZSBCZWFuIFNjcmlwdGluZyBGcmFtZXdvcmsKLSAgPC9kZXNjcmlwdGlvbj4KLSAgPHNob3J0RGVzY3JpcHRpb24+Q29tbW9ucyBKZWxseSBCU0YgVGFnIExpYnJhcnk8L3Nob3J0RGVzY3JpcHRpb24+Ci0gIAotICA8dmVyc2lvbnM+Ci0gICAgPHZlcnNpb24+Ci0gICAgICA8aWQ+MS4wPC9pZD4KLSAgICAgIDxuYW1lPjEuMDwvbmFtZT4KLSAgICAgIDx0YWc+Q09NTU9OU19KRUxMWV9CU0YtMV8wPC90YWc+Ci0gICAgPC92ZXJzaW9uPgotICA8L3ZlcnNpb25zPgotICAgIAotICA8ZGVwZW5kZW5jaWVzPgotICAKLSAgICAKLSAgCi0gICAgPCEtLSBTVEFSVCBmb3IgY29tcGlsYXRpb24gLS0+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+YnNmPC9pZD4KLSAgICAgIDx2ZXJzaW9uPjIuMy4wLXJjMTwvdmVyc2lvbj4KLSAgICAgIDx1cmw+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9ic2Y8L3VybD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPCEtLSBFTkQgZm9yIGNvbXBpbGF0aW9uIC0tPgotICAgIAotCi0gICAgCi0gIDwvZGVwZW5kZW5jaWVzPgotICAKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYnNmL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JzZi9CU0ZFeHByZXNzaW9uLmphdmEgYi9qZWxseS10YWdzL2JzZi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9ic2YvQlNGRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Zjg5MGJhLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYnNmL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JzZi9CU0ZFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmJzZjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnNmLkJTRkVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLmJzZi5CU0ZNYW5hZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5FeHByZXNzaW9uU3VwcG9ydDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0KLS8qKiBSZXByZXNlbnRzIGEgQlNGIGV4cHJlc3Npb24KLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gICovCi1wdWJsaWMgY2xhc3MgQlNGRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb25TdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyggQlNGRXhwcmVzc2lvbi5jbGFzcyApOwotCi0gICAgLyoqIFRoZSBleHByZXNzaW9uICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQotICAgIC8qKiBUaGUgQlNGIEVuZ2luZSB0byBldmFsdWF0ZSBleHByZXNzaW9ucyAqLwotICAgIHByaXZhdGUgQlNGRW5naW5lIGVuZ2luZTsKLSAgICAvKiogVGhlIEJTRiBNYW5hZ2VyIHRvIGV2YWx1YXRlIGV4cHJlc3Npb25zICovCi0gICAgcHJpdmF0ZSBCU0ZNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICAvKiogVGhlIGFkYXB0ZXIgdG8gQlNGJ3MgT2JqZWN0UmVnaXN0cnkgdGhhdCB1c2VzIHRoZSBKZWxseUNvbnRleHQgKi8KLSAgICBwcml2YXRlIEplbGx5Q29udGV4dFJlZ2lzdHJ5IHJlZ2lzdHJ5OwotCi0gICAgcHVibGljIEJTRkV4cHJlc3Npb24oU3RyaW5nIHRleHQsIEJTRkVuZ2luZSBlbmdpbmUsIEJTRk1hbmFnZXIgbWFuYWdlciwgSmVsbHlDb250ZXh0UmVnaXN0cnkgcmVnaXN0cnkpIHsKLSAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKLSAgICAgICAgdGhpcy5lbmdpbmUgPSBlbmdpbmU7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKLSAgICB9Ci0KLSAgICAvLyBFeHByZXNzaW9uIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwcmVzc2lvblRleHQoKSB7Ci0gICAgICAgIHJldHVybiAiJHsiICsgdGV4dCArICJ9IjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKEplbGx5Q29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIFhYWFg6IHVuZm9ydHVuYXRlbHkgd2UgbXVzdCBzeWNocm9uaXplIGV2YWx1YXRpb25zCi0gICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIHN3aXp6bGUgaW4gdGhlIGNvbnRleHQuCi0gICAgICAgIC8vIG1heWJlIHdlIGNvdWxkIGNyZWF0ZSBhbiBleHByZXNzaW9uIGZyb20gYSBjb250ZXh0Ci0gICAgICAgIC8vIChhbmQgc28gY3JlYXRlIGEgQlNGTWFuYWdlciBmb3IgYSBjb250ZXh0KQotICAgICAgICBzeW5jaHJvbml6ZWQgKHJlZ2lzdHJ5KSB7Ci0gICAgICAgICAgICByZWdpc3RyeS5zZXRKZWxseUNvbnRleHQoY29udGV4dCk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gWFhYWDogaGFjayAtIHRoZXJlIG11c3QgYmUgYSBiZXR0ZXIgd2F5ISEhCi0gICAgICAgICAgICAgICAgZm9yICggSXRlcmF0b3IgaXRlciA9IGNvbnRleHQuZ2V0VmFyaWFibGVOYW1lcygpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGNvbnRleHQuZ2V0VmFyaWFibGUoIG5hbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5kZWNsYXJlQmVhbiggbmFtZSwgdmFsdWUsIHZhbHVlLmdldENsYXNzKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVuZ2luZS5ldmFsKCB0ZXh0LCAtMSwgLTEsIHRleHQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy53YXJuKCAiQ2F1Z2h0IGV4Y2VwdGlvbiBldmFsdWF0aW5nOiAiICsgdGV4dCArICIuIFJlYXNvbjogIiArIGUsIGUgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYnNmL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JzZi9CU0ZFeHByZXNzaW9uRmFjdG9yeS5qYXZhIGIvamVsbHktdGFncy9ic2Yvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYnNmL0JTRkV4cHJlc3Npb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNTUwODIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9ic2Yvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYnNmL0JTRkV4cHJlc3Npb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5ic2Y7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5FeHByZXNzaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnNmLkJTRkVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLmJzZi5CU0ZFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5ic2YuQlNGTWFuYWdlcjsKLQotLyoqIFJlcHJlc2VudHMgYSBmYWN0b3J5IG9mIEJTRiBleHByZXNzaW9ucwotICAqCi0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS42ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBCU0ZFeHByZXNzaW9uRmFjdG9yeSBpbXBsZW1lbnRzIEV4cHJlc3Npb25GYWN0b3J5IHsKLQotICAgIC8qKiBUaGUgbG9nZ2VyIG9mIG1lc3NhZ2VzICovCi0gICAgcHJpdmF0ZSBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coIGdldENsYXNzKCkgKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGxhbmd1YWdlID0gImphdmFzY3JpcHQiOwotICAgIHByaXZhdGUgQlNGTWFuYWdlciBtYW5hZ2VyOwotICAgIHByaXZhdGUgQlNGRW5naW5lIGVuZ2luZTsKLSAgICBwcml2YXRlIEplbGx5Q29udGV4dFJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbmV3IEplbGx5Q29udGV4dFJlZ2lzdHJ5KCk7Ci0KLSAgICBwdWJsaWMgQlNGRXhwcmVzc2lvbkZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqIEByZXR1cm4gdGhlIEJTRiBsYW5ndWFnZSB0byBiZSB1c2VkICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGxhbmd1YWdlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gdGhlIEJTRiBFbmdpbmUgdG8gYmUgdXNlZCBieSB0aGlzIGV4cHJlc3Npb24gZmFjdG9yeSAqLwotICAgIHB1YmxpYyBCU0ZFbmdpbmUgZ2V0QlNGRW5naW5lKCkgdGhyb3dzIEJTRkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICggZW5naW5lID09IG51bGwgKSB7Ci0gICAgICAgICAgICBlbmdpbmUgPSBjcmVhdGVCU0ZFbmdpbmUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW5naW5lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJTRkVuZ2luZShCU0ZFbmdpbmUgZW5naW5lKSB7Ci0gICAgICAgIHRoaXMuZW5naW5lID0gZW5naW5lOwotICAgIH0KLQotICAgIHB1YmxpYyBCU0ZNYW5hZ2VyIGdldEJTRk1hbmFnZXIoKSB7Ci0gICAgICAgIGlmICggbWFuYWdlciA9PSBudWxsICkgewotICAgICAgICAgICAgbWFuYWdlciA9IGNyZWF0ZUJTRk1hbmFnZXIoKTsKLSAgICAgICAgICAgIG1hbmFnZXIuc2V0T2JqZWN0UmVnaXN0cnkoIHJlZ2lzdHJ5ICk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QlNGTWFuYWdlcihCU0ZNYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICAgICAgbWFuYWdlci5zZXRPYmplY3RSZWdpc3RyeSggcmVnaXN0cnkgKTsKLSAgICB9Ci0KLSAgICAvLyBFeHByZXNzaW9uRmFjdG9yeSBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgRXhwcmVzc2lvbiBjcmVhdGVFeHByZXNzaW9uKFN0cmluZyB0ZXh0KSB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBCU0ZFeHByZXNzaW9uKCB0ZXh0LCBnZXRCU0ZFbmdpbmUoKSwgZ2V0QlNGTWFuYWdlcigpLCByZWdpc3RyeSApOwotICAgICAgICB9IGNhdGNoIChCU0ZFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5RXhjZXB0aW9uKCJDb3VsZCBub3Qgb2J0YWluIEJTRiBlbmdpbmUiLGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqIEZhY3RvcnkgbWV0aG9kICovCi0gICAgcHJvdGVjdGVkIEJTRkVuZ2luZSBjcmVhdGVCU0ZFbmdpbmUoKSB0aHJvd3MgQlNGRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldEJTRk1hbmFnZXIoKS5sb2FkU2NyaXB0aW5nRW5naW5lKCBnZXRMYW5ndWFnZSgpICk7Ci0gICAgfQotCi0gICAgLyoqIEZhY3RvcnkgbWV0aG9kICovCi0gICAgcHJvdGVjdGVkIEJTRk1hbmFnZXIgY3JlYXRlQlNGTWFuYWdlcigpIHsKLSAgICAgICAgQlNGTWFuYWdlciBhbnN3ZXIgPSBuZXcgQlNGTWFuYWdlcigpOwotICAgICAgICByZXR1cm4gYW5zd2VyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYnNmL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JzZi9CU0ZUYWdMaWJyYXJ5LmphdmEgYi9qZWxseS10YWdzL2JzZi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9ic2YvQlNGVGFnTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzU2NzU1Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYnNmL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JzZi9CU0ZUYWdMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmJzZjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkV4cHJlc3Npb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLlRhZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZS5Db3JlVGFnTGlicmFyeTsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5ic2YuQlNGRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYnNmLkJTRkV4Y2VwdGlvbjsKLQotCi0vKiogRGVzY3JpYmVzIHRoZSBUYWdsaWIuIFRoaXMgY2xhc3MgY291bGQgYmUgZ2VuZXJhdGVkIGJ5IFhEb2NsZXQKLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNiAkCi0gICovCi1wdWJsaWMgY2xhc3MgQlNGVGFnTGlicmFyeSBleHRlbmRzIENvcmVUYWdMaWJyYXJ5IHsKLQotICAgIHByaXZhdGUgQlNGRXhwcmVzc2lvbkZhY3RvcnkgZXhwcmVzc2lvbkZhY3RvcnkgPSBuZXcgQlNGRXhwcmVzc2lvbkZhY3RvcnkoKTsKLQotICAgIHB1YmxpYyBCU0ZUYWdMaWJyYXJ5KCkgewotICAgICAgICByZWdpc3RlclRhZ0ZhY3RvcnkoCi0gICAgICAgICAgICAic2NyaXB0IiwKLSAgICAgICAgICAgIG5ldyBUYWdGYWN0b3J5KCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBUYWcgY3JlYXRlVGFnKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTY3JpcHRUYWcobmFtZSwgYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQlNGVGFnTGlicmFyeShTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgdGhpcygpOwotICAgICAgICBzZXRMYW5ndWFnZShsYW5ndWFnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGFuZ3VhZ2UoU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIGV4cHJlc3Npb25GYWN0b3J5LnNldExhbmd1YWdlKGxhbmd1YWdlKTsKLSAgICB9Ci0KLSAgICAvKiogQWxsb3dzIGRlcml2ZWQgdGFnIGxpYnJhcmllcyB0byB1c2UgdGhlaXIgb3duIGZhY3RvcnkgKi8KLSAgICBwcm90ZWN0ZWQgRXhwcmVzc2lvbkZhY3RvcnkgZ2V0RXhwcmVzc2lvbkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBleHByZXNzaW9uRmFjdG9yeTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQlNGRW5naW5lIGdldEJTRkVuZ2luZSgpIHRocm93cyBCU0ZFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZXhwcmVzc2lvbkZhY3RvcnkuZ2V0QlNGRW5naW5lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFNjcmlwdFRhZyB3aXRoIGEgQlNGRW5naW5lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgdGFnICh0eXBpY2FsbHkgJ3NjcmlwdCcpCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHRhZwotICAgICAqIEByZXR1cm4gVGFnCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRhZyBjcmVhdGVTY3JpcHRUYWcoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0VGFnKCBleHByZXNzaW9uRmFjdG9yeS5nZXRCU0ZFbmdpbmUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uRmFjdG9yeS5nZXRCU0ZNYW5hZ2VyKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChCU0ZFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5RXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIEJTRkVuZ2luZTogIiArIGUsIGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9ic2Yvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYnNmL0pQeXRob25UYWdMaWJyYXJ5LmphdmEgYi9qZWxseS10YWdzL2JzZi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9ic2YvSlB5dGhvblRhZ0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyYjJlZi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JzZi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9ic2YvSlB5dGhvblRhZ0xpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYnNmOwotCi0vKiogRGVzY3JpYmVzIHRoZSBUYWdsaWIuIFRoaXMgY2xhc3MgY291bGQgYmUgZ2VuZXJhdGVkIGJ5IFhEb2NsZXQKLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNCAkCi0gICovCi1wdWJsaWMgY2xhc3MgSlB5dGhvblRhZ0xpYnJhcnkgZXh0ZW5kcyBCU0ZUYWdMaWJyYXJ5IHsKLQotICAgIHB1YmxpYyBKUHl0aG9uVGFnTGlicmFyeSgpIHsKLSAgICAgICAgc2V0TGFuZ3VhZ2UoICJqcHl0aG9uIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYnNmL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JzZi9KYXZhU2NyaXB0VGFnTGlicmFyeS5qYXZhIGIvamVsbHktdGFncy9ic2Yvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYnNmL0phdmFTY3JpcHRUYWdMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZjMzNTYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9ic2Yvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYnNmL0phdmFTY3JpcHRUYWdMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmJzZjsKLQotLyoqIERlc2NyaWJlcyB0aGUgVGFnbGliLiBUaGlzIGNsYXNzIGNvdWxkIGJlIGdlbmVyYXRlZCBieSBYRG9jbGV0Ci0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjQgJAotICAqLwotcHVibGljIGNsYXNzIEphdmFTY3JpcHRUYWdMaWJyYXJ5IGV4dGVuZHMgQlNGVGFnTGlicmFyeSB7Ci0KLSAgICBwdWJsaWMgSmF2YVNjcmlwdFRhZ0xpYnJhcnkoKSB7Ci0gICAgICAgIHNldExhbmd1YWdlKCAiamF2YXNjcmlwdCIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JzZi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9ic2YvSmVsbHlDb250ZXh0UmVnaXN0cnkuamF2YSBiL2plbGx5LXRhZ3MvYnNmL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JzZi9KZWxseUNvbnRleHRSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjMyY2I2Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYnNmL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JzZi9KZWxseUNvbnRleHRSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5ic2Y7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJzZi51dGlsLk9iamVjdFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqIEEgQlNGIE9iamVjdFJlZ2lzdHJ5IHdoaWNoIHVzZXMgdGhlIENvbnRleHQgdG8gZmluZCBhbmQKLSAgKiByZWdpc3RlciBvYmplY3RzCi0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICAqLwotcHVibGljIGNsYXNzIEplbGx5Q29udGV4dFJlZ2lzdHJ5IGV4dGVuZHMgT2JqZWN0UmVnaXN0cnkgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEplbGx5Q29udGV4dFJlZ2lzdHJ5LmNsYXNzKTsKLQotICAgIC8qKiBUaGUgY29udGV4dCAqLwotICAgIHByaXZhdGUgSmVsbHlDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICBwdWJsaWMgSmVsbHlDb250ZXh0UmVnaXN0cnkoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIEplbGx5Q29udGV4dCBnZXRKZWxseUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBjb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEplbGx5Q29udGV4dChKZWxseUNvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIC8vIE9iamVjdFJlZ2lzdHJ5IGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBPYmplY3QgbG9va3VwKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldFZhcmlhYmxlKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZShuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdW5yZWdpc3RlcihTdHJpbmcgbmFtZSkgewotICAgICAgICBjb250ZXh0LnJlbW92ZVZhcmlhYmxlKG5hbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYnNmL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JzZi9KeXRob25UYWdMaWJyYXJ5LmphdmEgYi9qZWxseS10YWdzL2JzZi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9ic2YvSnl0aG9uVGFnTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDdiYzA1Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYnNmL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JzZi9KeXRob25UYWdMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmJzZjsKLQotLyoqIERlc2NyaWJlcyB0aGUgVGFnbGliLiBUaGlzIGNsYXNzIGNvdWxkIGJlIGdlbmVyYXRlZCBieSBYRG9jbGV0Ci0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjQgJAotICAqLwotcHVibGljIGNsYXNzIEp5dGhvblRhZ0xpYnJhcnkgZXh0ZW5kcyBCU0ZUYWdMaWJyYXJ5IHsKLQotICAgIHB1YmxpYyBKeXRob25UYWdMaWJyYXJ5KCkgewotICAgICAgICBzZXRMYW5ndWFnZSggImp5dGhvbiIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JzZi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9ic2YvUE51dHNUYWdMaWJyYXJ5LmphdmEgYi9qZWxseS10YWdzL2JzZi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9ic2YvUE51dHNUYWdMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliODBmNDQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9ic2Yvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYnNmL1BOdXRzVGFnTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5ic2Y7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJzZi5CU0ZNYW5hZ2VyOwotCi0vKiogRGVzY3JpYmVzIHRoZSBUYWdsaWIuIFRoaXMgY2xhc3MgY291bGQgYmUgZ2VuZXJhdGVkIGJ5IFhEb2NsZXQKLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gICovCi1wdWJsaWMgY2xhc3MgUE51dHNUYWdMaWJyYXJ5IGV4dGVuZHMgQlNGVGFnTGlicmFyeSB7Ci0KLSAgICBwdWJsaWMgUE51dHNUYWdMaWJyYXJ5KCkgewotICAgICAgICBCU0ZNYW5hZ2VyLnJlZ2lzdGVyU2NyaXB0aW5nRW5naW5lKAotICAgICAgICAgICAgInBudXRzIiwKLSAgICAgICAgICAgICJwbnV0cy5leHQuUG51dHNCU0ZFbmdpbmUiLAotICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJwbnV0In0KLSAgICAgICAgKTsKLSAgICAgICAgc2V0TGFuZ3VhZ2UoICJwbnV0cyIgKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYnNmL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JzZi9TY3JpcHRUYWcuamF2YSBiL2plbGx5LXRhZ3MvYnNmL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JzZi9TY3JpcHRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiODMxYi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JzZi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9ic2YvU2NyaXB0VGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5ic2Y7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkxvY2F0aW9uQXdhcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnNmLkJTRkVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLmJzZi5CU0ZNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYnNmLkJTRkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIHRhZyB3aGljaCBldmFsdWF0ZXMgaXRzIGJvZHkgdXNpbmcgdGhlIGN1cnJlbnQgc2NyaXB0aW5nIGxhbmd1YWdlCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICovCi1wdWJsaWMgY2xhc3MgU2NyaXB0VGFnIGV4dGVuZHMgVGFnU3VwcG9ydCBpbXBsZW1lbnRzIExvY2F0aW9uQXdhcmUgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNjcmlwdFRhZy5jbGFzcy5nZXROYW1lKCkgKyAiLmV2YWx1YXRpbmciKTsKLQotICAgIHByaXZhdGUgQlNGRW5naW5lIGVuZ2luZTsKLSAgICBwcml2YXRlIEJTRk1hbmFnZXIgbWFuYWdlcjsKLSAgICBwcml2YXRlIFN0cmluZyBlbGVtZW50TmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBmaWxlTmFtZTsKLSAgICBwcml2YXRlIGludCBjb2x1bW5OdW1iZXI7Ci0gICAgcHJpdmF0ZSBpbnQgbGluZU51bWJlcjsKLQotICAgIHB1YmxpYyBTY3JpcHRUYWcoQlNGRW5naW5lIGVuZ2luZSwgQlNGTWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgIHRoaXMuZW5naW5lID0gZW5naW5lOwotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiwgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdGV4dCA9IGdldEJvZHlUZXh0KCk7Ci0KLSAgICAgICAgbG9nLmRlYnVnKHRleHQpOwotCi0gICAgICAgIC8vIFhYWFg6IHVuZm9ydHVuYXRlbHkgd2UgbXVzdCBzeWNocm9uaXplIGV2YWx1YXRpb25zCi0gICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIHN3aXp6bGUgaW4gdGhlIGNvbnRleHQuCi0gICAgICAgIC8vIG1heWJlIHdlIGNvdWxkIGNyZWF0ZSBhbiBleHByZXNzaW9uIGZyb20gYSBjb250ZXh0Ci0gICAgICAgIC8vIChhbmQgc28gY3JlYXRlIGEgQlNGTWFuYWdlciBmb3IgYSBjb250ZXh0KQotICAgICAgICBzeW5jaHJvbml6ZWQgKGdldFJlZ2lzdHJ5KCkpIHsKLSAgICAgICAgICAgIGdldFJlZ2lzdHJ5KCkuc2V0SmVsbHlDb250ZXh0KGNvbnRleHQpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIFhYWFg6IGhhY2sgLSB0aGVyZSBtdXN0IGJlIGEgYmV0dGVyIHdheSEhIQotICAgICAgICAgICAgICAgIGZvciAoIEl0ZXJhdG9yIGl0ZXIgPSBjb250ZXh0LmdldFZhcmlhYmxlTmFtZXMoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBjb250ZXh0LmdldFZhcmlhYmxlKCBuYW1lICk7Ci0gICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZGVjbGFyZUJlYW4oIG5hbWUsIHZhbHVlLCB2YWx1ZS5nZXRDbGFzcygpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVuZ2luZS5leGVjKGZpbGVOYW1lLCBsaW5lTnVtYmVyLCBjb2x1bW5OdW1iZXIsIHRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEJTRkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJFcnJvciBvY2N1cnJlZCB3aXRoIHNjcmlwdDogIiArIGUsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gaW50Ci0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiBjb2x1bW5OdW1iZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBCU0ZFbmdpbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgQlNGRW5naW5lIGdldEVuZ2luZSgpIHsKLSAgICAgICAgcmV0dXJuIGVuZ2luZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGludAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLSAgICAgICAgcmV0dXJuIGxpbmVOdW1iZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29sdW1uTnVtYmVyLgotICAgICAqIEBwYXJhbSBjb2x1bW5OdW1iZXIgVGhlIGNvbHVtbk51bWJlciB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb2x1bW5OdW1iZXIoaW50IGNvbHVtbk51bWJlcikgewotICAgICAgICB0aGlzLmNvbHVtbk51bWJlciA9IGNvbHVtbk51bWJlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBlbGVtZW50TmFtZS4KLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgVGhlIGVsZW1lbnROYW1lIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnROYW1lKFN0cmluZyBlbGVtZW50TmFtZSkgewotICAgICAgICB0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZW5naW5lLgotICAgICAqIEBwYXJhbSBlbmdpbmUgVGhlIGVuZ2luZSB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmdpbmUoQlNGRW5naW5lIGVuZ2luZSkgewotICAgICAgICB0aGlzLmVuZ2luZSA9IGVuZ2luZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmaWxlTmFtZS4KLSAgICAgKiBAcGFyYW0gZmlsZU5hbWUgVGhlIGZpbGVOYW1lIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgewotICAgICAgICB0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbGluZU51bWJlci4KLSAgICAgKiBAcGFyYW0gbGluZU51bWJlciBUaGUgbGluZU51bWJlciB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMaW5lTnVtYmVyKGludCBsaW5lTnVtYmVyKSB7Ci0gICAgICAgIHRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBKZWxseUNvbnRleHRSZWdpc3RyeSBnZXRSZWdpc3RyeSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEplbGx5Q29udGV4dFJlZ2lzdHJ5KSB0aGlzLm1hbmFnZXIuZ2V0T2JqZWN0UmVnaXN0cnkoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JzZi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9ic2YvcGFja2FnZS5odG1sIGIvamVsbHktdGFncy9ic2Yvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvYnNmL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlODVhYi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JzZi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9ic2YvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxodG1sPgotPGhlYWQ+Ci08L2hlYWQ+Ci08Ym9keT4KLQotICA8cD5BIGNvbGxlY3Rpb24gb2YgdGFnIGxpYnJhcmllcyBmb3Igd29ya2luZyB3aXRoIEJTRiBiYXNlZCBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGxpa2UgSmF2YVNjcmlwdCwgSnl0aG9uIGFuZCBQTnV0czwvcD4KLSAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JzZi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9ic2YvZXhhbXBsZS5qZWxseSBiL2plbGx5LXRhZ3MvYnNmL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JzZi9leGFtcGxlLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWMzNzBmLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYnNmL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2JzZi9leGFtcGxlLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uDQotICANCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICANCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICANCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OnBudXRzIj4NCi0gIDxqOmZvckVhY2ggdmFyPSJhcmciIGl0ZW1zPSJhcmdzIj48ajpleHByIHZhbHVlPSJhcmciLz4gPC9qOmZvckVhY2g+DQotPC9qOmplbGx5PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYnNmL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2phdmFzY3JpcHQvZXhhbXBsZS5qZWxseSBiL2plbGx5LXRhZ3MvYnNmL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2phdmFzY3JpcHQvZXhhbXBsZS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRjZWUxNi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2JzZi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qYXZhc2NyaXB0L2V4YW1wbGUuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4NCi0gIA0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIA0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIA0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6amF2YXNjcmlwdCI+DQotICA8ajpmb3JFYWNoIHZhcj0iYXJnIiBpdGVtcz0iYXJncyI+PGo6ZXhwciB2YWx1ZT0iYXJnIi8+IDwvajpmb3JFYWNoPg0KLTwvajpqZWxseT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2JzZi94ZG9jcy9jaGFuZ2VzLnhtbCBiL2plbGx5LXRhZ3MvYnNmL3hkb2NzL2NoYW5nZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTE0NjQxLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYnNmL3hkb2NzL2NoYW5nZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLSAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSAtLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+Q2hhbmdlczwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotICA8Ym9keT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjAiIGRhdGU9IjIwMDQtMDktMTEiPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImFkZCI+SW5pdGlhbCBSZWxlYXNlPC9hY3Rpb24+Ci0gICAgPC9yZWxlYXNlPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9ic2YveGRvY3MvaW5kZXgueG1sIGIvamVsbHktdGFncy9ic2YveGRvY3MvaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmJlYzc0Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvYnNmL3hkb2NzL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkJTRiBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotICAgIDxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KLSAgICAgIDxwPgotICAgICAgICBBIGNvbGxlY3Rpb24gb2YgdGFnIGxpYnJhcmllcyBmb3Igd29ya2luZyB3aXRoIEJTRiBiYXNlZCBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGxpa2UgCi0gICAgICAgIEphdmFTY3JpcHQsIEp5dGhvbiBhbmQgUE51dHMuCi0gICAgICAgIFNlZSB0aGUgPGEgaHJlZj0idGFncy5odG1sIj50YWdzPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvYnNmL3hkb2NzL25hdmlnYXRpb24ueG1sIGIvamVsbHktdGFncy9ic2YveGRvY3MvbmF2aWdhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NTA1NGYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9ic2YveGRvY3MvbmF2aWdhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IG5hbWU9IkJTRiBUYWcgTGlicmFyeSI+Ci0KLSAgPHRpdGxlPkJTRiBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gIAotICA8Ym9keT4KLSAgICA8bWVudSBuYW1lPSJCU0YgVGFnIExpYnJhcnkiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgICAgICAgICAgIGhyZWY9Ii9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJUYWdzIiAgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZ3MuaHRtbCIvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9kZWZpbmUvLmN2c2lnbm9yZSBiL2plbGx5LXRhZ3MvZGVmaW5lLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYTJjZGEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9kZWZpbmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotdGFyZ2V0Ci1tYXZlbi5sb2cKLXZlbG9jaXR5LmxvZwpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9kZWZpbmUvYnVpbGQueG1sIGIvamVsbHktdGFncy9kZWZpbmUvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGJmMTViLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvZGVmaW5lL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tYnVpbGQueG1sIGdlbmVyYXRlZCBieSBtYXZlbiBmcm9tIHByb2plY3QueG1sIHZlcnNpb24gMS4wLVNOQVBTSE9UCi0gIG9uIGRhdGUgTWF5IDI0IDIwMDQsIHRpbWUgMjMwMS0tPgotPHByb2plY3QgZGVmYXVsdD0iamFyIiBuYW1lPSJjb21tb25zLWplbGx5LXRhZ3MtZGVmaW5lIiBiYXNlZGlyPSIuIj4KLSAgPHByb3BlcnR5IG5hbWU9ImRlZmF1bHR0YXJnZXRkaXIiIHZhbHVlPSJ0YXJnZXQiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0ibGliZGlyIiB2YWx1ZT0idGFyZ2V0L2xpYiI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L2NsYXNzZXMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0idGVzdGNsYXNzZXNkaXIiIHZhbHVlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RyZXBvcnRkaXIiIHZhbHVlPSJ0YXJnZXQvdGVzdC1yZXBvcnRzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImRpc3RkaXIiIHZhbHVlPSJkaXN0Ij4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImphdmFkb2NkaXIiIHZhbHVlPSJkaXN0L2RvY3MvYXBpIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImZpbmFsLm5hbWUiIHZhbHVlPSJjb21tb25zLWplbGx5LXRhZ3MtZGVmaW5lLTEuMC1TTkFQU0hPVCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVzY3JpcHRpb249Im8gSW5pdGlhbGl6ZXMgc29tZSBwcm9wZXJ0aWVzIj4KLSAgICA8bWtkaXIgZGlyPSIke2xpYmRpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibm9nZXQiPgotICAgICAgPGVxdWFscyBhcmcyPSJvbmx5IiBhcmcxPSIke2J1aWxkLnN5c2NsYXNzcGF0aH0iPgotICAgICAgPC9lcXVhbHM+Ci0gICAgPC9jb25kaXRpb24+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJvIENvbXBpbGUgdGhlIGNvZGUiIGRlcGVuZHM9ImdldC1kZXBzIj4KLSAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqYXZhYyBkZXN0ZGlyPSIke2NsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy9qYXZhIj4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0gICAgPGNvcHkgdG9kaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvamF2YSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gICAgPGNvcHkgdG9kaXI9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmplbGx5Ij4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54c2wiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucm5nIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmR0ZCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmh0bWwiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJqYXIiIGRlc2NyaXB0aW9uPSJvIENyZWF0ZSB0aGUgamFyIiBkZXBlbmRzPSJjb21waWxlLHRlc3QiPgotICAgIDxqYXIgamFyZmlsZT0idGFyZ2V0LyR7ZmluYWwubmFtZX0uamFyIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIiBiYXNlZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICA8L2phcj4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJvIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZGlyZWN0b3JpZXMiPgotICAgIDxkZWxldGUgZGlyPSIke2RlZmF1bHR0YXJnZXRkaXJ9Ij4KLSAgICA8L2RlbGV0ZT4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlc2NyaXB0aW9uPSJvIENyZWF0ZSBhIGRpc3RyaWJ1dGlvbiIgZGVwZW5kcz0iamFyLCBqYXZhZG9jIj4KLSAgICA8bWtkaXIgZGlyPSJkaXN0Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb3B5IHRvZGlyPSJkaXN0Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSIgaW5jbHVkZXM9IiouamFyIj4KLSAgICAgIDwvZmlsZXNldD4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZXM9IkxJQ0VOU0UqLCBSRUFETUUqIj4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlc2NyaXB0aW9uPSJvIFJ1biB0aGUgdGVzdCBjYXNlcyIgaWY9InRlc3QuZmFpbHVyZSIgZGVwZW5kcz0iaW50ZXJuYWwtdGVzdCI+Ci0gICAgPGZhaWwgbWVzc2FnZT0iVGhlcmUgd2VyZSB0ZXN0IGZhaWx1cmVzLiI+Ci0gICAgPC9mYWlsPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJpbnRlcm5hbC10ZXN0IiBkZXBlbmRzPSJjb21waWxlLXRlc3RzIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3RyZXBvcnRkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqdW5pdCBkaXI9Ii4vIiBmYWlsdXJlcHJvcGVydHk9InRlc3QuZmFpbHVyZSIgcHJpbnRTdW1tYXJ5PSJ5ZXMiIGZvcms9InRydWUiIGhhbHRvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImJhc2VkaXIiIHZhbHVlPSIuIj4KLSAgICAgIDwvc3lzcHJvcGVydHk+Ci0gICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxmb3JtYXR0ZXIgdXNlZmlsZT0iZmFsc2UiIHR5cGU9InBsYWluIj4KLSAgICAgIDwvZm9ybWF0dGVyPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICA8YmF0Y2h0ZXN0IHRvZGlyPSIke3Rlc3RyZXBvcnRkaXJ9Ij4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovVGVzdCouamF2YSI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2JhdGNodGVzdD4KLSAgICA8L2p1bml0PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlLXRlc3RzIiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iIGRlcHJlY2F0aW9uPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSIgb3B0aW1pemU9ImZhbHNlIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIj4KLSAgICAgIDxzcmM+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL3Rlc3QiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9zcmM+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJqYXZhZG9jIiBkZXNjcmlwdGlvbj0ibyBHZW5lcmF0ZSBqYXZhZG9jIiBkZXBlbmRzPSJqYXIiPgotICAgIDxta2RpciBkaXI9IiR7amF2YWRvY2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPHRzdGFtcD4KLSAgICAgIDxmb3JtYXQgcGF0dGVybj0iMjAwMi15eXl5IiBwcm9wZXJ0eT0ieWVhciI+Ci0gICAgICA8L2Zvcm1hdD4KLSAgICA8L3RzdGFtcD4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29weXJpZ2h0IiB2YWx1ZT0iQ29weXJpZ2h0ICZhbXA7Y29weTsgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLiI+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgICA8cHJvcGVydHkgbmFtZT0idGl0bGUiIHZhbHVlPSJjb21tb25zLWplbGx5LXRhZ3MtZGVmaW5lIDEuMC1TTkFQU0hPVCBBUEkiPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPGphdmFkb2MgdXNlPSJ0cnVlIiBwcml2YXRlPSJ0cnVlIiBkZXN0ZGlyPSIke2phdmFkb2NkaXJ9IiBhdXRob3I9InRydWUiIHZlcnNpb249InRydWUiIHNvdXJjZXBhdGg9InNyYy9qYXZhIiBwYWNrYWdlbmFtZXM9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmRlZmluZS4qIj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0idGFyZ2V0LyR7ZmluYWwubmFtZX0uamFyIj4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWRvYz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iZ2V0LWRlcHMiIHVubGVzcz0ibm9nZXQiIGRlcGVuZHM9ImluaXQiPgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamVsbHkvamFycy9jb21tb25zLWplbGx5LVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS10YWdzLWR5bmFiZWFuLVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS10YWdzLWR5bmFiZWFuLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS10YWdzLWp1bml0LVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS10YWdzLWp1bml0LVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS10YWdzLWxvZy1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktdGFncy1sb2ctU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LXRhZ3MteG1sLVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS10YWdzLXhtbC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtY2xpLVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWNsaS9qYXJzL2NvbW1vbnMtY2xpLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZXhsLVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWpleGwvamFycy9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS94bWwtYXBpcy0xLjAuYjIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3htbC1hcGlzL2phcnMveG1sLWFwaXMtMS4wLmIyLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1iZWFudXRpbHMtMS42LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWJlYW51dGlscy9qYXJzL2NvbW1vbnMtYmVhbnV0aWxzLTEuNi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtY29sbGVjdGlvbnMtMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWNvbGxlY3Rpb25zL2phcnMvY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWxvZ2dpbmctMS4wLjMuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtbG9nZ2luZy9qYXJzL2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2RvbTRqLTEuNS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2RvbTRqL2phcnMvZG9tNGotMS41LWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2pheGVuLTEuMS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2pheGVuL2phcnMvamF4ZW4tMS4xLWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3hlcmNlcy0yLjIuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veGVyY2VzL2phcnMveGVyY2VzLTIuMi4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vanVuaXQtMy44LjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2p1bml0L2phcnMvanVuaXQtMy44LjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vYW50LW9wdGlvbmFsLTEuNS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vYW50L2phcnMvYW50LW9wdGlvbmFsLTEuNS5qYXIiPgotICAgIDwvZ2V0PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJpbnN0YWxsLW1hdmVuIj4KLSAgICA8Z2V0IGRlc3Q9IiR7dXNlci5ob21lfS9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgc3JjPSIke3JlcG99L21hdmVuL21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPHVuamFyIGRlc3Q9IiR7bWF2ZW4uaG9tZX0iIHNyYz0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC91bmphcj4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9kZWZpbmUvbWF2ZW4ueG1sIGIvamVsbHktdGFncy9kZWZpbmUvbWF2ZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGM5NTFiLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvZGVmaW5lL21hdmVuLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXZhOmphciI+Ci0KLSAgPCEtLSBkZWZpbmUgdGhlIGNsYXNzcGF0aCB1c2VkIHRvIHJ1biBleGFtcGxlcyAtLT4KLSAgPGdvYWwgbmFtZT0iY3JlYXRlLWNsYXNzcGF0aCIgcHJlcmVxcz0iamF2YTpjb21waWxlLHRlc3Q6Y29tcGlsZSI+Ci0gICAgICAgIDxwYXRoIGlkPSJ0ZXN0LmNsYXNzcGF0aCI+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHttYXZlbi5idWlsZC5kZXN0fSIvPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9InRhcmdldC9jbGFzc2VzIi8+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0idGFyZ2V0L3Rlc3QtY2xhc3NlcyIvPgotICAgICAgICAgICAgPHBhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0gICAgICAgIDwvcGF0aD4KLSAgPC9nb2FsPgotICAKLSAgPCEtLSBzb21lIGV4YW1wbGVzIC0tPgotICA8Z29hbCBuYW1lPSJkZW1vOmJlYW4iIHByZXJlcXM9ImNyZWF0ZS1jbGFzc3BhdGgiCi0gICAgICAgIGRlc2NyaXB0aW9uPSJSdW5zIHRoZSBleGFtcGxlIG9mIGJpbmRpbmcgYmVhbnMgdG8gdGFncyI+Ci0KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseSIgZm9yaz0ieWVzIj4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgICA8YXJnIHZhbHVlPSJzcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvYmVhblNhbXBsZS5qZWxseSIvPgotICAgIDwvamF2YT4KLSAgPC9nb2FsPgotCi0gIDxnb2FsIG5hbWU9ImRlbW86amVsbHliZWFuIiBwcmVyZXFzPSJjcmVhdGUtY2xhc3NwYXRoIgotICAgICAgICBkZXNjcmlwdGlvbj0iUnVucyB0aGUgZXhhbXBsZSBvZiBiaW5kaW5nIGplbGx5IGJlYW5zIHRvIHRhZ3MiPgotCi0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHkiIGZvcms9InllcyI+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgPGFyZyB2YWx1ZT0ic3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL2plbGx5QmVhblNhbXBsZS5qZWxseSIvPgotICAgIDwvamF2YT4KLSAgPC9nb2FsPgotCi0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZGVmaW5lL3Byb2plY3QucHJvcGVydGllcyBiL2plbGx5LXRhZ3MvZGVmaW5lL3Byb2plY3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQxOWNiYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2RlZmluZS9wcm9qZWN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIyAKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFAgUiBPIEogRSBDIFQgIFAgUiBPIFAgRSBSIFQgSSBFIFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9kZWZpbmUvcHJvamVjdC54bWwgYi9qZWxseS10YWdzL2RlZmluZS9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ4MGRjMS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2RlZmluZS9wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3Q+Ci0gIDxleHRlbmQ+JHtiYXNlZGlyfS8uLi90YWctcHJvamVjdC54bWw8L2V4dGVuZD4KLSAgPGlkPmNvbW1vbnMtamVsbHktdGFncy1kZWZpbmU8L2lkPgotICA8bmFtZT5jb21tb25zLWplbGx5LXRhZ3MtZGVmaW5lPC9uYW1lPgotICA8Y3VycmVudFZlcnNpb24+MS4wPC9jdXJyZW50VmVyc2lvbj4KLQotICA8cGFja2FnZT5vcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5kZWZpbmU8L3BhY2thZ2U+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICAgICAgIFRoZSBKZWxseSBEZWZpbmUgVGFnIExpYnJhcnkKLSAgPC9kZXNjcmlwdGlvbj4KLSAgPHNob3J0RGVzY3JpcHRpb24+Q29tbW9ucyBKZWxseSBEZWZpbmUgVGFnIExpYnJhcnk8L3Nob3J0RGVzY3JpcHRpb24+Ci0gIAotICA8dmVyc2lvbnM+Ci0gICAgPHZlcnNpb24+Ci0gICAgICA8aWQ+MS4wPC9pZD4KLSAgICAgIDxuYW1lPjEuMDwvbmFtZT4KLSAgICAgIDx0YWc+Q09NTU9OU19KRUxMWV9ERUZJTkUtMV8wPC90YWc+Ci0gICAgPC92ZXJzaW9uPgotICA8L3ZlcnNpb25zPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0KLSAgICA8IS0tIFNUQVJUIGZvciB0ZXN0IC0tPgotICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtamVsbHk8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWplbGx5LXRhZ3MtZHluYWJlYW48L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICA8dXJsPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9qZWxseS90YWdzL2R5bmFiZWFuLzwvdXJsPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1qZWxseTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtamVsbHktdGFncy1qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgIDx1cmw+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvPC91cmw+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWplbGx5PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1qZWxseS10YWdzLWxvZzwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgIDx1cmw+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5L3RhZ3MvbG9nLzwvdXJsPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1qZWxseTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtamVsbHktdGFncy14bWw8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICA8dXJsPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9qZWxseS90YWdzL3htbC88L3VybD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAKLSAgICAgIAotICAgIDwhLS0gRU5EIGZvciB0ZXN0IC0tPgotICAgIAotICAgIDwhLS0gU1RBUlQgZm9yIHJ1bm5pbmcgZGVtb3MgLS0+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5jb21tb25zLWNsaTwvaWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDwhLS0gRU5EIGZvciBydW5uaW5nIGRlbW9zIC0tPgotICAgIAotICA8L2RlcGVuZGVuY2llcz4KLSAgCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2RlZmluZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvQXR0cmlidXRlVGFnLmphdmEgYi9qZWxseS10YWdzL2RlZmluZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvQXR0cmlidXRlVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNTMyOTAuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9kZWZpbmUvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL0F0dHJpYnV0ZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5kZWZpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLkF0dHJpYnV0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgdGFnIGlzIGJvdW5kIG9udG8gYSBKYXZhIEJlYW4gY2xhc3MuIFdoZW4gdGhlIHRhZyBpcyBpbnZva2VkIGEgYmVhbiB3aWxsIGJlIGNyZWF0ZWQKLSAqIHVzaW5nIHRoZSB0YWdzIGF0dHJpYnV0ZXMuCi0gKiBUaGUgYmVhbiBtYXkgYWxzbyBoYXZlIGFuIGludm9rZSBtZXRob2QgY2FsbGVkIGludm9rZSgpLCBydW4oKSwgZXhlY3V0ZSgpIG9yIHNvbWUgc3VjaCBtZXRob2QKLSAqIHdoaWNoIHdpbGwgYmUgaW52b2tlZCBhZnRlciB0aGUgYmVhbiBoYXMgYmVlbiBjb25maWd1cmVkLjwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkB6ZW5wbGV4LmNvbSI+SmFzb24gdmFuIFp5bDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIEF0dHJpYnV0ZVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEF0dHJpYnV0ZVRhZy5jbGFzcyk7Ci0KLSAgICAvKiogdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uICovCi0gICAgcHJpdmF0ZSBBdHRyaWJ1dGUgYXR0cmlidXRlOwotCi0gICAgcHVibGljIEF0dHJpYnV0ZVRhZygpIHsKLSAgICAgICAgYXR0cmlidXRlID0gbmV3IEF0dHJpYnV0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBBdHRyaWJ1dGVUYWcoQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotICAgICAgICB0aGlzLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgQmVhblRhZyB0YWcgPSAoQmVhblRhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKCBCZWFuVGFnLmNsYXNzICk7Ci0gICAgICAgIGlmICggdGFnID09IG51bGwgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICJUaGlzIHRhZyBzaG91bGQgYmUgbmVzdGVkIGluc2lkZSBhIDxkZWZpbmU6YmVhbj4gb3IgPGRlZmluZTpqZWxseWJlYW4+IHRhZyIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRhZy5hZGRBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgYXR0cmlidXRlLnNldE5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIHRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeSBvciBub3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZChib29sZWFuIHJlcXVpcmVkKSB7Ci0gICAgICAgIGF0dHJpYnV0ZS5zZXRSZXF1aXJlZChyZXF1aXJlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZShFeHByZXNzaW9uIGRlZmF1bHRWYWx1ZSkgewotICAgICAgICBhdHRyaWJ1dGUuc2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9kZWZpbmUvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL0JlYW5UYWcuamF2YSBiL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9CZWFuVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ODUwYjYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9kZWZpbmUvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL0JlYW5UYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZGVmaW5lOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5EeW5hbWljQmVhblRhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5UYWdGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS51dGlsLkNsYXNzTG9hZGVyVXRpbHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci0KLS8qKgotICogQmluZHMgYSBKYXZhIGJlYW4gdG8gdGhlIGdpdmVuIG5hbWVkIEplbGx5IHRhZyBzbyB0aGF0IHRoZSBhdHRyaWJ1dGVzIG9mCi0gKiB0aGUgdGFnIHNldCB0aGUgYmVhbiBwcm9wZXJ0aWVzLi4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNiAkCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuVGFnIGV4dGVuZHMgRGVmaW5lVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQmVhblRhZy5jbGFzcyk7Ci0KLSAgICAvKiogQW4gZW1wdHkgTWFwIGFzIEkgdGhpbmsgQ29sbGVjdGlvbnMuRU1QVFlfTUFQIGlzIG9ubHkgSkRLIDEuMyBvbndhcmRzICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIEVNUFRZX01BUCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvKiogdGhlIG5hbWUgb2YgdGhlIHRhZyB0byBjcmVhdGUgKi8KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgLyoqIHRoZSBKYXZhIGNsYXNzIG5hbWUgdG8gdXNlIGZvciB0aGUgdGFnICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCi0gICAgLyoqIHRoZSBDbGFzc0xvYWRlciB1c2VkIHRvIGxvYWQgYmVhbnMgKi8KLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOwotCi0gICAgLyoqIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdXNlZCBmb3IgdGhlIHZhcmlhYmxlIG5hbWUgKi8KLSAgICBwcml2YXRlIFN0cmluZyB2YXJBdHRyaWJ1dGUgPSAidmFyIjsKLQotICAgIC8qKiB0aGUgYXR0cmlidXRlIGRlZmluaXRpb25zIGZvciB0aGlzIGR5bmFtaWMgdGFnICovCi0gICAgcHJpdmF0ZSBNYXAgYXR0cmlidXRlczsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBuZXcgYXR0cmlidXRlIGRlZmluaXRpb24gdG8gdGhpcyBkeW5hbWljIHRhZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0gICAgICAgIGlmICggYXR0cmlidXRlcyA9PSBudWxsICkgewotICAgICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXR0cmlidXRlcy5wdXQoIGF0dHJpYnV0ZS5nZXROYW1lKCksIGF0dHJpYnV0ZSApOwotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiwgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0KLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oIm5hbWUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCJjbGFzc05hbWUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzIHRoZUNsYXNzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIHRoZUNsYXNzID0gQ2xhc3NMb2FkZXJVdGlscy5sb2FkQ2xhc3MoY2xhc3NOYW1lLCBnZXRDbGFzc0xvYWRlcigpLCBnZXRDb250ZXh0KCkuZ2V0VXNlQ29udGV4dENsYXNzTG9hZGVyKCksIGdldENsYXNzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvciggIkNvdWxkIG5vdCBsb2FkIGNsYXNzOiAiICsgY2xhc3NOYW1lICsgIiBleGNlcHRpb246ICIgKyBlLCBlICk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBmaW5kIGNsYXNzOiAiCi0gICAgICAgICAgICAgICAgICAgICsgY2xhc3NOYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiB1c2luZyBDbGFzc0xvYWRlcjogIgotICAgICAgICAgICAgICAgICAgICArIGNsYXNzTG9hZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIENsYXNzIGJlYW5DbGFzcyA9IHRoZUNsYXNzOwotICAgICAgICBmaW5hbCBNZXRob2QgaW52b2tlTWV0aG9kID0gZ2V0SW52b2tlTWV0aG9kKCB0aGVDbGFzcyApOwotICAgICAgICBmaW5hbCBNYXAgYmVhbkF0dHJpYnV0ZXMgPSAoYXR0cmlidXRlcyAhPSBudWxsKSA/IGF0dHJpYnV0ZXMgOiBFTVBUWV9NQVA7Ci0KLSAgICAgICAgVGFnRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFRhZ0ZhY3RvcnkoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgVGFnIGNyZWF0ZVRhZyhTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICBuZXcgRHluYW1pY0JlYW5UYWcoYmVhbkNsYXNzLCBiZWFuQXR0cmlidXRlcywgdmFyQXR0cmlidXRlLCBpbnZva2VNZXRob2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGdldFRhZ0xpYnJhcnkoKS5yZWdpc3RlckJlYW5UYWcobmFtZSwgZmFjdG9yeSk7Ci0KLSAgICAgICAgLy8gbm93IGxldHMgY2xlYXIgdGhlIGF0dHJpYnV0ZXMgZm9yIG5leHQgaW52b2NhdGlvbiBhbmQgaGVscCB0aGUgR0MKLSAgICAgICAgYXR0cmlidXRlcyA9IG51bGw7Ci0gICAgfQotCi0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB0YWcgdG8gY3JlYXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEphdmEgY2xhc3MgbmFtZSB0byB1c2UgZm9yIHRoZSB0YWcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBDbGFzc0xvYWRlciB0byB1c2UgdG8gbG9hZCB0aGUgY2xhc3MuCi0gICAgICogSWYgbm8gdmFsdWUgaXMgc2V0IHRoZW4gdGhlIGN1cnJlbnQgdGhyZWFkcyBjb250ZXh0IGNsYXNzCi0gICAgICogbG9hZGVyIGlzIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLSAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIENsYXNzTG9hZGVyIHRvIHVzZSB0byBsb2FkIGNsYXNzZXMgc3BlY2lmaWVkIGJ5IHRoaXMgb2JqZWN0LCAKLSAgICAgKiAgdGhlIHRocmVhZCBjb250ZXh0IGxvYWRlciBpZiB0aGUgY29udGV4dCBmbGFnIGlzIHNldCwgb3IgdGhlIGNsYXNzIHVzZWQgdG8gbG9hZCB0aGlzIGNsYXNzLgotICAgICAqLwotICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgcmV0dXJuIENsYXNzTG9hZGVyVXRpbHMuZ2V0Q2xhc3NMb2FkZXIoY2xhc3NMb2FkZXIsIGdldENvbnRleHQoKS5nZXRVc2VDb250ZXh0Q2xhc3NMb2FkZXIoKSwgZ2V0Q2xhc3MoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHVzZWQgdG8gZGVmaW5lIHRoZSBiZWFuIHZhcmlhYmxlIHRoYXQgdGhpcyBkeW5hbWljCi0gICAgICogdGFnIHdpbGwgb3V0cHV0IGl0cyByZXN1bHRzIGFzLiBUaGlzIGRlZmF1bHRzIHRvICd2YXInIHRob3VnaCB0aGlzIHByb3BlcnR5Ci0gICAgICogY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoaXMgaWYgaXQgY29uZmxpY3RzIHdpdGggYSBiZWFuIHByb3BlcnR5IGNhbGxlZCAndmFyJy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXJBdHRyaWJ1dGUoU3RyaW5nIHZhckF0dHJpYnV0ZSkgewotICAgICAgICB0aGlzLnZhckF0dHJpYnV0ZSA9IHZhckF0dHJpYnV0ZTsKLSAgICB9Ci0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEV4dHJhY3RzIHRoZSBpbnZva2UgbWV0aG9kIGZvciB0aGUgY2xhc3MgaWYgb25lIGlzIHVzZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1ldGhvZCBnZXRJbnZva2VNZXRob2QoIENsYXNzIHRoZUNsYXNzICkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2RlZmluZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvQ2xhc3NMb2FkZXJUYWcuamF2YSBiL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9DbGFzc0xvYWRlclRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWUwNmUzLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9DbGFzc0xvYWRlclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5kZWZpbmU7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnV0aWwuQ2xhc3NMb2FkZXJVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotCi0vKioKLSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VVJMQ2xhc3NMb2FkZXI8L2NvZGU+IHRvIGR5bmFtaWNhbGx5Ci0gKiBsb2FkIHRhZ3MgZnJvbXMuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlcGhlbmhAY2hhc2UzMDAwLmNvbSI+U3RlcGhlbiBIYWJlcm1hbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS42ICQKLSAqLwotcHVibGljIGNsYXNzIENsYXNzTG9hZGVyVGFnIGV4dGVuZHMgQmVhblRhZyB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQ2xhc3NMb2FkZXJUYWcuY2xhc3MpOwotCi0gICAgLyoqIFRoZSBuYW1lIHRvIGV4cG9ydCB0aGUgY2xhc3Nsb2FkZXIgdG8uICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyOwotCi0gICAgLyoqIFRoZSBVUkwgdG8gbG9hZCB0aGUgY2xhc3NlcyBmcm9tLiAqLwotICAgIHByaXZhdGUgU3RyaW5nIHVybDsKLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBjbGFzcyBsb2FkZXIgaW4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudmFyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2YXIgdGhlIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBjbGFzcyBsb2FkZXIgaW4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB1cmwgdG8gbG9hZCB0aGUgY2xhc3NlcyBmcm9tCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRVcmwoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnVybDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdXJsIHRoZSB1cmwgdG8gbG9hZCB0aGUgY2xhc3NlcyBmcm9tCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyB1cmwpIHsKLSAgICAgICAgdGhpcy51cmwgPSB1cmw7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCBnZXRWYXIoKSA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oICJ2YXIiICk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBnZXRVcmwoKSA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oICJ1cmwiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBDbGFzc0xvYWRlciBwYXJlbnQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHBhcmVudCA9IENsYXNzTG9hZGVyVXRpbHMuZ2V0Q2xhc3NMb2FkZXIoZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBVUkxDbGFzc0xvYWRlciBuZXdDbGFzc0xvYWRlciA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ld0NsYXNzTG9hZGVyID0KLSAgICAgICAgICAgICAgbmV3IFVSTENsYXNzTG9hZGVyKCBuZXcgVVJMW10geyBuZXcgVVJMKGdldFVybCgpKSB9LCBwYXJlbnQgKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZy5kZWJ1ZygiU3RvcmluZyB0aGUgbmV3IGNsYXNzbG9hZGVyIGluICIgKyBnZXRWYXIoKSk7Ci0KLSAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZShnZXRWYXIoKSwgbmV3Q2xhc3NMb2FkZXIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9kZWZpbmUvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL0RlZmluZVRhZ0xpYnJhcnkuamF2YSBiL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9EZWZpbmVUYWdMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNDBiMGIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9kZWZpbmUvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL0RlZmluZVRhZ0xpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZGVmaW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ0xpYnJhcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIGEgdGFnIGxpYnJhcnkgdGhhdCBhbGxvd3MgeW91IHRvIGRlZmluZSBuZXcgdGFnIGxpYnJhcmllcyBhdCBydW4gdGltZS4KLSAqIFRodXMgdGFnIGxpYnJhcmllcyBhbmQgdGFncyBjYW4gYmUgZWFzaWx5IGltcGxlbWVudGVkIGluIEplbGx5IHJhdGhlciB0aGFuCi0gKiBpbiBKYXZhIGNvZGUuCi0gKgotICogUGxlYXNlIHNlZSB0aGUgaW5kaXZpZHVhbCB0YWcgY2xhc3NlcyBmb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGFydGljdWxhcmx5Ci0gKiB7QGxpbmsgVGFnbGliVGFnIFRhZ2xpYiB0YWd9IGFuZCB7QGxpbmsgVGFnVGFnIFRhZyB0YWd9LgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIERlZmluZVRhZ0xpYnJhcnkgZXh0ZW5kcyBUYWdMaWJyYXJ5IHsKLQotICAgIHB1YmxpYyBEZWZpbmVUYWdMaWJyYXJ5KCkgewotICAgICAgICByZWdpc3RlclRhZyggInRhZ2xpYiIsIFRhZ2xpYlRhZy5jbGFzcyApOwotICAgICAgICByZWdpc3RlclRhZyggInRhZyIsIFRhZ1RhZy5jbGFzcyApOwotICAgICAgICByZWdpc3RlclRhZyggImJlYW4iLCBCZWFuVGFnLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCAiZHluYUJlYW4iLCBEeW5hQmVhblRhZy5jbGFzcyApOwotICAgICAgICByZWdpc3RlclRhZyggImplbGx5YmVhbiIsIEplbGx5QmVhblRhZy5jbGFzcyApOwotICAgICAgICByZWdpc3RlclRhZyggImF0dHJpYnV0ZSIsIEF0dHJpYnV0ZVRhZy5jbGFzcyApOwotICAgICAgICByZWdpc3RlclRhZyggImludm9rZUJvZHkiLCBJbnZva2VCb2R5VGFnLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCAic2NyaXB0IiwgU2NyaXB0VGFnLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCAiaW52b2tlIiwgSW52b2tlVGFnLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCAiY2xhc3NMb2FkZXIiLCBDbGFzc0xvYWRlclRhZy5jbGFzcyApOwotICAgICAgICByZWdpc3RlclRhZyggImV4dGVuZCIsIEV4dGVuZFRhZy5jbGFzcyApOwotICAgICAgICByZWdpc3RlclRhZyggInN1cGVyIiwgU3VwZXJUYWcuY2xhc3MgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2RlZmluZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvRGVmaW5lVGFnU3VwcG9ydC5qYXZhIGIvamVsbHktdGFncy9kZWZpbmUvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL0RlZmluZVRhZ1N1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBmOTgxNC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2RlZmluZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvRGVmaW5lVGFnU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmRlZmluZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5EeW5hbWljVGFnTGlicmFyeTsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIHVzZWZ1bCBmb3IgaW1wbGVtZW50YXRpb24gaW5oZXJpdGVuY2UuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVmaW5lVGFnU3VwcG9ydCBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCBkeW5hbWljIHRhZyBsaWJyYXJ5IGluc3RhbmNlIG9yIHRocm93cyBhIEplbGx5RXhjZXB0aW9uCi0gICAgICogaWYgb25lIGlzIG5vdCBhdmFpbGFibGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRHluYW1pY1RhZ0xpYnJhcnkgZ2V0VGFnTGlicmFyeSgpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFRhZ2xpYlRhZyB0YWcKLSAgICAgICAgICAgID0gKFRhZ2xpYlRhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKFRhZ2xpYlRhZy5jbGFzcyk7Ci0gICAgICAgIGlmICggdGFnID09IG51bGwgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICI8ZGVmaW5lOnRhZz4gbXVzdCBiZSBpbnNpZGUgPGRlZmluZTp0YWdsaWI+IiApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0YWcuZ2V0VGFnTGlicmFyeSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9kZWZpbmUvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL0R5bmFCZWFuVGFnLmphdmEgYi9qZWxseS10YWdzL2RlZmluZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvRHluYUJlYW5UYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3YjJlYi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2RlZmluZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvRHluYUJlYW5UYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZGVmaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuRHluYUNsYXNzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLkR5bmFtaWNEeW5hQmVhblRhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5UYWdGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci0KLS8qKgotICogQmluZHMgYSBKYXZhIGJlYW4gdG8gdGhlIGdpdmVuIG5hbWVkIEplbGx5IHRhZyBzbyB0aGF0IHRoZSBhdHRyaWJ1dGVzIG9mCi0gKiB0aGUgdGFnIHNldCB0aGUgYmVhbiBwcm9wZXJ0aWVzLi4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBEeW5hQmVhblRhZyBleHRlbmRzIERlZmluZVRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKER5bmFCZWFuVGFnLmNsYXNzKTsKLQotICAgIC8qKiBBbiBlbXB0eSBNYXAgYXMgSSB0aGluayBDb2xsZWN0aW9ucy5FTVBUWV9NQVAgaXMgb25seSBKREsgMS4zIG9ud2FyZHMgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgRU1QVFlfTUFQID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8qKiB0aGUgbmFtZSBvZiB0aGUgdGFnIHRvIGNyZWF0ZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKiogdGhlIER5YW5DbGFzcyB0byBiaW5kIHRvIHRoZSB0YWcgKi8KLSAgICBwcml2YXRlIER5bmFDbGFzcyBkeW5hQ2xhc3M7Ci0KLSAgICAvKiogdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB1c2VkIGZvciB0aGUgdmFyaWFibGUgbmFtZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIHZhckF0dHJpYnV0ZSA9ICJ2YXIiOwotCi0gICAgLyoqIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMgZm9yIHRoaXMgZHluYW1pYyB0YWcgKi8KLSAgICBwcml2YXRlIE1hcCBhdHRyaWJ1dGVzOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5ldyBhdHRyaWJ1dGUgZGVmaW5pdGlvbiB0byB0aGlzIGR5bmFtaWMgdGFnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLSAgICAgICAgaWYgKCBhdHRyaWJ1dGVzID09IG51bGwgKSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgfQotICAgICAgICBhdHRyaWJ1dGVzLnB1dCggYXR0cmlidXRlLmdldE5hbWUoKSwgYXR0cmlidXRlICk7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLQotICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbigibmFtZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkeW5hQ2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oImR5bmFDbGFzcyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgRHluYUNsYXNzIHRoZUR5bmFDbGFzcyA9IGR5bmFDbGFzczsKLSAgICAgICAgZmluYWwgTWFwIGJlYW5BdHRyaWJ1dGVzID0gKGF0dHJpYnV0ZXMgIT0gbnVsbCkgPyBhdHRyaWJ1dGVzIDogRU1QVFlfTUFQOwotCi0gICAgICAgIFRhZ0ZhY3RvcnkgZmFjdG9yeSA9IG5ldyBUYWdGYWN0b3J5KCkgewotICAgICAgICAgICAgcHVibGljIFRhZyBjcmVhdGVUYWcoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotICAgICAgICAgICAgICAgIHJldHVybiAgbmV3IER5bmFtaWNEeW5hQmVhblRhZyh0aGVEeW5hQ2xhc3MsIGJlYW5BdHRyaWJ1dGVzLCB2YXJBdHRyaWJ1dGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBnZXRUYWdMaWJyYXJ5KCkucmVnaXN0ZXJCZWFuVGFnKG5hbWUsIGZhY3RvcnkpOwotCi0gICAgICAgIC8vIG5vdyBsZXRzIGNsZWFyIHRoZSBhdHRyaWJ1dGVzIGZvciBuZXh0IGludm9jYXRpb24gYW5kIGhlbHAgdGhlIEdDCi0gICAgICAgIGF0dHJpYnV0ZXMgPSBudWxsOwotICAgIH0KLQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdGFnIHRvIGNyZWF0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdXNlZCB0byBkZWZpbmUgdGhlIGJlYW4gdmFyaWFibGUgdGhhdCB0aGlzIGR5bmFtaWMKLSAgICAgKiB0YWcgd2lsbCBvdXRwdXQgaXRzIHJlc3VsdHMgYXMuIFRoaXMgZGVmYXVsdHMgdG8gJ3ZhcicgdGhvdWdoIHRoaXMgcHJvcGVydHkKLSAgICAgKiBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhpcyBpZiBpdCBjb25mbGljdHMgd2l0aCBhIGJlYW4gcHJvcGVydHkgY2FsbGVkICd2YXInLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhckF0dHJpYnV0ZShTdHJpbmcgdmFyQXR0cmlidXRlKSB7Ci0gICAgICAgIHRoaXMudmFyQXR0cmlidXRlID0gdmFyQXR0cmlidXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGR5bmFDbGFzcy4KLSAgICAgKiBAcmV0dXJuIER5bmFDbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBEeW5hQ2xhc3MgZ2V0RHluYUNsYXNzKCkgewotICAgICAgICByZXR1cm4gZHluYUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHtAbGluayBEeW5hQ2xhc3N9IHdoaWNoIHdpbGwgYmUgYm91bmQgdG8gdGhpcyBkeW5hbWljIHRhZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREeW5hQ2xhc3MoRHluYUNsYXNzIGR5bmFDbGFzcykgewotICAgICAgICB0aGlzLmR5bmFDbGFzcyA9IGR5bmFDbGFzczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9FeHRlbmRUYWcuamF2YSBiL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9FeHRlbmRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ExNjMxNi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2RlZmluZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvRXh0ZW5kVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDE5OTktMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZGVmaW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5TY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5EeW5hbWljVGFnTGlicmFyeTsKLQotLyoqCi0gKiAmbHQ7ZXh0ZW5kJmd0OyBpcyB1c2VkIHRvIGV4dGVuZCBhIGR5bmFtaWMgdGFnIGRlZmluZWQgaW4gYW4gaW5oZXJpdGVkCi0gKiBkeW5hbWljIHRhZyBsaWJyYXJ5Ci0gKiA8cC8+Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86dGltYUBpbnRhbGlvLmNvbSI+VGltIEFuZGVyc29uPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICogQHNlZSBTdXBlclRhZwotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5kVGFnIGV4dGVuZHMgRGVmaW5lVGFnU3VwcG9ydCB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgcHJpdmF0ZSBTY3JpcHQgc3VwZXJTY3JpcHQ7Ci0KLSAgICBwdWJsaWMgRXh0ZW5kVGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBEeW5hbWljVGFnTGlicmFyeSBsaWJyYXJ5ID0gZ2V0VGFnTGlicmFyeSgpOwotICAgICAgICBEeW5hbWljVGFnTGlicmFyeSBvd25lciA9IGxpYnJhcnkuZmluZChnZXROYW1lKCkpOwotICAgICAgICBpZiAob3duZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJDYW5ub3QgZXh0ZW5kICIgKyBnZXROYW1lKCkgKyAiOiBkeW5hbWljIHRhZyBub3QgZGVmaW5lZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvd25lciA9PSBsaWJyYXJ5KSB7Ci0gICAgICAgICAgICAvLyBkaXNhbGxvdyBleHRlbnNpb24gb2YgdGFncyBkZWZpbmVkIHdpdGhpbiB0aGUgc2FtZSB0YWcKLSAgICAgICAgICAgIC8vIGxpYnJhcnkKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiQ2Fubm90IGV4dGVuZCAiICsgZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiBkeW5hbWljIHRhZyBkZWZpbmVkIGxvY2FsbHkiKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlclNjcmlwdCA9IG93bmVyLmdldER5bmFtaWNUYWcobmFtZSk7Ci0gICAgICAgIGlmIChzdXBlclNjcmlwdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyB0YWcgZG9lc24ndCBkZWZpbmUgYSBzY3JpcHQgLSBkaXNhbGxvdyB0aGlzIGZvciB0aGUgbW9tZW50LgotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJDYW5ub3QgZXh0ZW5kICIgKyBnZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IHRhZyBpcyBub3QgYSBkeW5hbWljIHRhZyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3duZXIucmVnaXN0ZXJEeW5hbWljVGFnKGdldE5hbWUoKSAsIGdldEJvZHkoKSk7Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgdGFnIHRvIGNyZWF0ZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdGFnIHRvIGNyZWF0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyB0YWcKLSAgICAgKi8KLSAgICBwdWJsaWMgU2NyaXB0IGdldFN1cGVyU2NyaXB0KCkgewotICAgICAgICByZXR1cm4gc3VwZXJTY3JpcHQ7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2RlZmluZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvSW52b2tlQm9keVRhZy5qYXZhIGIvamVsbHktdGFncy9kZWZpbmUvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL0ludm9rZUJvZHlUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2NWMyZi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2RlZmluZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvSW52b2tlQm9keVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5kZWZpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlNjcmlwdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuRHluYW1pY1RhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiAmbHQ7aW52b2tlQm9keSZndDsgdGFnIGlzIHVzZWQgaW5zaWRlIGEgJmx0O3RhZyZndDsgdGFnCi0gKiAoaS5lLiB0aGUgZGVmaW5pdGlvbiBvZiBhIGR5bmFtaWMgdGFnKSB0byBpbnZva2UgdGhlIHRhZ3MgYm9keSB3aGVuCi0gKiB0aGUgdGFnIGlzIGludm9rZWQuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICovCi1wdWJsaWMgY2xhc3MgSW52b2tlQm9keVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEludm9rZUJvZHlUYWcuY2xhc3MpOwotCi0gICAgcHVibGljIEludm9rZUJvZHlUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRyeSBmaW5kIGZpbmQgdGhlIGJvZHkgZnJvbSB0aGUgcmVzZXJ2ZWQgJ29yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5ib2R5JyB2YXJpYWJsZQotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gKFNjcmlwdCkgY29udGV4dC5nZXRWYXJpYWJsZSgib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmJvZHkiKTsKLSAgICAgICAgaWYgKHNjcmlwdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzY3JpcHQucnVuKGNvbnRleHQsIG91dHB1dCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBub3RlIHRoaXMgbWVjaGFuaXNtIGRvZXMgbm90IHdvcmsgcHJvcGVybHkgZm9yIGFyYml0cmFyaWx5Ci0gICAgICAgICAgICAvLyBuZXN0ZWQgZHluYW1pYyB0YWdzLiBBIGJldHRlciB3YXkgaXMgcmVxdWlyZWQuCi0gICAgICAgICAgICBUYWcgdGFnID0gZmluZEFuY2VzdG9yV2l0aENsYXNzKHRoaXMsIER5bmFtaWNUYWcuY2xhc3MpOwotICAgICAgICAgICAgaWYgKHRhZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJDYW5ub3QgaW52b2tlIGJvZHksIG5vIGR5bmFtaWMgdGFnIGlzIGRlZmluZWQgaW4gdGhpcyBibG9jayIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGFnLmludm9rZUJvZHkob3V0cHV0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9JbnZva2VUYWcuamF2YSBiL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9JbnZva2VUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY2NTdkNS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2RlZmluZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvSW52b2tlVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmRlZmluZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuU2NyaXB0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogVGhlICZsdDtpbnZva2UmZ3Q7IHRhZyB3aWxsIGludm9rZSBhIGdpdmVuIFNjcmlwdCBpbnN0YW5jZS4KLSAqIEl0IGNhbiBiZSB1c2VkIHdpdGggdGhlICZsdDtzY3JpcHQmZ3Q7IHRhZyB3aGljaCBkZWZpbmVzIHNjcmlwdHMKLSAqIGFzIHZhcmlhYmxlcyB0aGF0IGNhbiBsYXRlciBiZSBpbnZva2VkIGJ5IHRoaXMgJmx0O2ludm9rZSZndDsgdGFnLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIEludm9rZVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEludm9rZVRhZy5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIFNjcmlwdCBzY3JpcHQ7Ci0KLQotICAgIHB1YmxpYyBJbnZva2VUYWcoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgU2NyaXB0IHRvIGJlIGludm9rZWQgYnkgdGhpcyB0YWcsIHdoaWNoIHR5cGljYWxseSBoYXMgYmVlbiBwcmV2aW91c2x5Ci0gICAgICogZGVmaW5lZCBieSB0aGUgdXNlIG9mIHRoZSAmbHQ7c2NyaXB0Jmd0OyB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2NyaXB0KFNjcmlwdCBzY3JpcHQpIHsKLSAgICAgICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQ7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICggc2NyaXB0ID09IG51bGwgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbigic2NyaXB0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgc2NyaXB0LnJ1bihjb250ZXh0LCBvdXRwdXQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9KZWxseUJlYW5UYWcuamF2YSBiL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9KZWxseUJlYW5UYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk4MTc5YS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2RlZmluZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvSmVsbHlCZWFuVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZGVmaW5lOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5NZXRob2RVdGlsczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0KLS8qKgotICogQmluZHMgYSBKYXZhIGJlYW4gdG8gdGhlIGdpdmVuIG5hbWVkIEplbGx5IHRhZyBzbyB0aGF0IHRoZSBhdHRyaWJ1dGVzIG9mCi0gKiB0aGUgdGFnIHNldCB0aGUgYmVhbiBwcm9wZXJ0aWVzLiBBZnRlciB0aGUgYm9keSBvZiB0aGlzIHRhZyBpcyBpbnZva2VkCi0gKiB0aGVuIHRoZSBiZWFucyBpbnZva2UoKSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQsIGlmIHRoZSBiZWFuIGhhcyBvbmUuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICovCi1wdWJsaWMgY2xhc3MgSmVsbHlCZWFuVGFnIGV4dGVuZHMgQmVhblRhZyB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSmVsbHlCZWFuVGFnLmNsYXNzKTsKLQotICAgIC8qKiBFbXB0eSBwYXJhbWV0ZXIgdHlwZXMgZm9yIE1ldGhvZCBsb29rdXAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIGVtcHR5UGFyYW1UeXBlcyA9IHt9OwotCi0gICAgLyoqIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlIG9uIHRoZSBiZWFuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWV0aG9kOwotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbWV0aG9kIG5hbWUgdG8gdXNlLCB3aGljaCBkZWZhdWx0cyB0byAncnVuJyBmb3IgUnVubmFibGUKLSAgICAgKiBvYmplY3RzCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXRob2QoKSB7Ci0gICAgICAgIGlmICggbWV0aG9kID09IG51bGwgKSB7Ci0gICAgICAgICAgICByZXR1cm4gInJ1biI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlIG9uIHRoZSBiZWFuLgotICAgICAqIFRoaXMgZGVmYXVsdHMgdG8gInJ1biIgc28gdGhhdCBSdW5uYWJsZSBvYmplY3RzIGNhbiBiZQotICAgICAqIGludm9rZWQsIGJ1dCB0aGlzIHByb3BlcnR5IGNhbiBiZSBzZXQgdG8gd2hhdGV2ZXIgaXMgcmVxdWlyZWQsCi0gICAgICogc3VjaCBhcyAiZXhlY3V0ZSIgb3IgImludm9rZSIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRob2QoU3RyaW5nIG1ldGhvZCkgewotICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDsKLSAgICB9Ci0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHByb3RlY3RlZCBNZXRob2QgZ2V0SW52b2tlTWV0aG9kKCBDbGFzcyB0aGVDbGFzcyApIHsKLSAgICAgICAgTWV0aG9kIGludm9rZU1ldGhvZCA9Ci0gICAgICAgICAgICBNZXRob2RVdGlscy5nZXRBY2Nlc3NpYmxlTWV0aG9kKAotICAgICAgICAgICAgICAgIHRoZUNsYXNzLAotICAgICAgICAgICAgICAgIGdldE1ldGhvZCgpLAotICAgICAgICAgICAgICAgIGVtcHR5UGFyYW1UeXBlcyk7Ci0KLSAgICAgICAgaWYgKCBpbnZva2VNZXRob2QgPT0gbnVsbCApIHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9TY3JpcHRUYWcuamF2YSBiL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9TY3JpcHRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlmMTNjZi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2RlZmluZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvU2NyaXB0VGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmRlZmluZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKioKLSAqICZsdDtzY3JpcHQmZ3Q7IHRhZyBpcyB1c2VkIHRvIGFzc2lnbiBhIFNjcmlwdCBvYmplY3QKLSAqIHRvIGEgdmFyaWFibGUuIFRoZSBzY3JpcHQgY2FuIHRoZW4gYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSB1c2VyIHdpc2hlcwotICogbWF5YmUgZnJvbSBpbnNpZGUgYW4gZXhwcmVzc2lvbiBvciBtb3JlIHR5cGljYWxseSB2aWEgdGhlICZsdDtpbnZva2UmZ3Q7IHRhZy48L3A+Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICovCi1wdWJsaWMgY2xhc3MgU2NyaXB0VGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0KLSAgICBwdWJsaWMgU2NyaXB0VGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAoIHZhciA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCAiPGRlZmluZTpzY3JpcHQ+IG11c3QgaGF2ZSBhIHZhciBhdHRyaWJ1dGUiICk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSggdmFyLCBnZXRCb2R5KCkgKTsKLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKiogQHJldHVybiB0aGUgdmFyaWFibGUgbmFtZSBvZiB0aGUgc2NyaXB0IHRvIGNyZWF0ZSAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFyKCkgewotICAgICAgICByZXR1cm4gdmFyOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSB2YXJpYWJsZSBuYW1lIG9mIHRoZSB0YWcgdG8gY3JlYXRlICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9kZWZpbmUvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL1N1cGVyVGFnLmphdmEgYi9qZWxseS10YWdzL2RlZmluZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvU3VwZXJUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRiZWJlMS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2RlZmluZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvU3VwZXJUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMTk5OS0yMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5kZWZpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqCi0gKiAmbHQ7c3VwZXImZ3Q7IHRhZyBpcyB1c2VkIHRvIGludm9rZSBhIHBhcmVudCB0YWcgaW1wbGVtZW50YXRpb24sIHdoZW4KLSAqIGEgdGFnIGV4dGVuZHMgYW4gZXhpc3RpbmcgdGFnCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86dGltYUBpbnRhbGlvLmNvbSI+VGltIEFuZGVyc29uPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICogQHNlZSBFeHRlbmRUYWcKLSAqLwotcHVibGljIGNsYXNzIFN1cGVyVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICBwdWJsaWMgU3VwZXJUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIEV4dGVuZFRhZyB0YWcgPSAoRXh0ZW5kVGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoRXh0ZW5kVGFnLmNsYXNzKTsKLSAgICAgICAgaWYgKHRhZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIjxkZWZpbmU6c3VwZXI+IG11c3QgYmUgaW5zaWRlIGEgPGRlZmluZTpleHRlbmQ+Iik7Ci0gICAgICAgIH0KLQotICAgICAgICB0YWcuZ2V0U3VwZXJTY3JpcHQoKS5ydW4oZ2V0Q29udGV4dCgpLCBvdXRwdXQpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9kZWZpbmUvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL1RhZ1RhZy5qYXZhIGIvamVsbHktdGFncy9kZWZpbmUvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL1RhZ1RhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODUwZDNmLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9UYWdUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZGVmaW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLS8qKgotICogJmx0O3RhZyZndDsgaXMgdXNlZCB0byBkZWZpbmUgYSBuZXcgdGFnCi0gKiB1c2luZyBhIEplbGx5IHNjcmlwdCB0byBpbXBsZW1lbnQgdGhlIGJlaGF2aW91ciBvZiB0aGUgdGFnLgotICogUGFyYW1ldGVycyBjYW4gYmUgcGFzc2VkIGludG8gdGhlIG5ldyB0YWcgdXNpbmcgbm9ybWFsIFhNTCBhdHRyaWJ1dGUKLSAqIG5vdGF0aW9ucy4gSW5zaWRlIHRoZSBib2R5IG9mIHRoZSB0YWcgZGVmaW5pdGlvbiwgdGhlIGF0dHJpYnV0ZXMgY2FuCi0gKiBiZSBhY2Nlc3NlZCBhcyBub3JtYWwgSmVsbHkgdmFyaWFibGVzLjwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdUYWcgZXh0ZW5kcyBEZWZpbmVUYWdTdXBwb3J0IHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICBwdWJsaWMgVGFnVGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBnZXRUYWdMaWJyYXJ5KCkucmVnaXN0ZXJEeW5hbWljVGFnKCBnZXROYW1lKCksIGdldEJvZHkoKSApOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB0YWcgdG8gY3JlYXRlICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdGFnIHRvIGNyZWF0ZSAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2RlZmluZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvVGFnbGliVGFnLmphdmEgYi9qZWxseS10YWdzL2RlZmluZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvVGFnbGliVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OWViMTQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9kZWZpbmUvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL1RhZ2xpYlRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZGVmaW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuRHluYW1pY1RhZ0xpYnJhcnk7Ci0KLS8qKgotICogVGhlICZsdDt0YWdsaWImZ3Q7IHRhZyBpcyB1c2VkIHRvIGRlZmluZSBhIG5ldyB0YWcgbGlicmFyeQotICogdXNpbmcgYSBKZWxseSBzY3JpcHQuIFRoZSB0YWcgbGlicmFyeSBpcyBpZGVudGlmaWVkIGJ5IGl0cwotICoge0BsaW5rICNnZXRVUkkoKSBVUkl9LgotICoKLSAqIFRoZSB0YWdzIGZvciBhIHRhZ2xpYiBhcmUgZGVjbGFyZWQgdXNpbmcgdGhlIHtAbGluayBUYWdUYWd9LgotICoKLSAqIFlvdSBjYW4gJ2luaGVyaXQnIHRhZ3MgZnJvbSBhIHByZXZpb3VzbHkgZGVmaW5lZCB0YWdsaWIsIGFzIHdlbGwsCi0gKiBhbGxvd2luZyBydW50aW1lIGV4dGVuc2lvbiBvZiB0YWcgbGlicmFyaWVzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjYgJAotICovCi1wdWJsaWMgY2xhc3MgVGFnbGliVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogVGhlIG5hbWVzcGFjZSBVUkkgKi8KLSAgICBwcml2YXRlIFN0cmluZyB1cmk7Ci0gICAgLyoqIFRoZSBuZXcgdGFncyBiZWluZyBhZGRlZCAqLwotICAgIHByaXZhdGUgRHluYW1pY1RhZ0xpYnJhcnkgdGFnTGlicmFyeTsKLSAgICAvKiogV2hldGhlciBvciBub3QgaW5oZXJpdGVuY2UgaXMgZW5hYmxlZCAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpbmhlcml0ID0gdHJ1ZTsKLQotICAgIHB1YmxpYyBUYWdsaWJUYWcoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFRhZ2xpYlRhZyhTdHJpbmcgdXJpKSB7Ci0gICAgICAgIHRoaXMudXJpID0gdXJpOwotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdXJpID0gZ2V0VXJpKCk7Ci0gICAgICAgIHRhZ0xpYnJhcnkgPSBuZXcgRHluYW1pY1RhZ0xpYnJhcnkoIHVyaSApOwotCi0gICAgICAgIC8vIGluaGVyaXQgdGFncyBmcm9tIGFuIGV4aXN0aW5nIHRhZyBsaWJyYXJ5Ci0gICAgICAgIGlmICggaXNJbmhlcml0KCkgKSB7Ci0gICAgICAgICAgICB0YWdMaWJyYXJ5LnNldFBhcmVudCggY29udGV4dC5nZXRUYWdMaWJyYXJ5KCB1cmkgKSApOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRleHQucmVnaXN0ZXJUYWdMaWJyYXJ5KCB1cmksIHRhZ0xpYnJhcnkgKTsKLQotICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0KLSAgICAgICAgdGFnTGlicmFyeSA9IG51bGw7Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJpKCkgewotICAgICAgICByZXR1cm4gdXJpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWVzcGFjZSBVUkkgdG8gcmVnaXN0ZXIgdGhpcyBuZXcgZHluYW1pYyB0YWcgbGlicmFyeSB3aXRoCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXJpKFN0cmluZyB1cmkpIHsKLSAgICAgICAgdGhpcy51cmkgPSB1cmk7Ci0gICAgfQotCi0gICAgcHVibGljIER5bmFtaWNUYWdMaWJyYXJ5IGdldFRhZ0xpYnJhcnkoKSB7Ci0gICAgICAgIHJldHVybiB0YWdMaWJyYXJ5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGluaGVyaXQuCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbmhlcml0KCkgewotICAgICAgICByZXR1cm4gaW5oZXJpdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdGhpcyBkeW5hbWljIHRhZyBzaG91bGQgaW5oZXJpdCBmcm9tIHRoZSBjdXJyZW50IGV4aXN0aW5nIHRhZyBsaWJyYXJ5Ci0gICAgICogb2YgdGhlIHNhbWUgVVJJLiBUaGlzIGZlYXR1cmUgaXMgZW5hYmxlZCBieSBkZWZhdWx0IHNvIHRoYXQgdGFncyBjYW4gZWFzaWx5IGJlCi0gICAgICogc29tZSB0YWdzIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGV4aXN0aW5nIGxpYnJhcnksIHN1Y2ggYXMgd2hlbiBtYWtpbmcgTW9jayBUYWdzLgotICAgICAqCi0gICAgICogWW91IGNhbiBkaXNhYmxlIHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgYW55IHRhZ3MgaW4gdGhlIGJhc2UgbGlicmFyeSwKLSAgICAgKiB0dXJuaW5nIHRoZW0gaW50byBqdXN0IG5vcm1hbCBzdGF0aWMgWE1MLgotICAgICAqCi0gICAgICogQHBhcmFtIGluaGVyaXQgVGhlIGluaGVyaXQgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5oZXJpdChib29sZWFuIGluaGVyaXQpIHsKLSAgICAgICAgdGhpcy5pbmhlcml0ID0gaW5oZXJpdDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9wYWNrYWdlLmh0bWwgYi9qZWxseS10YWdzL2RlZmluZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWFkM2RmLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGh0bWw+Ci08aGVhZD4KLTwvaGVhZD4KLTxib2R5PgotCi0gIDxwPlRhZyBsaWJyYXJ5IHdoaWNoIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgbmV3IHRhZ3MgdXNpbmcgSmVsbHkgc2NyaXB0IGl0c2VsZi4KLSAgPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9kZWZpbmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL0R5bmFtaWNUYWcuamF2YSBiL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9EeW5hbWljVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMTIxMjAuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9kZWZpbmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL0R5bmFtaWNUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSBwYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmRlZmluZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3Igc3RlcGhlbgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICovCi1wdWJsaWMgY2xhc3MgRHluYW1pY1RhZyBleHRlbmRzIFRhZ1N1cHBvcnQKLXsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZyNkb1RhZyhYTUxPdXRwdXQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3V0cHV0LndyaXRlKCJvdXRwdXQgLSBpZ25vcmVkIGJvZHkiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9kZWZpbmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL015UnVubmFibGUuamF2YSBiL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9NeVJ1bm5hYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YzMzZTQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9kZWZpbmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL015UnVubmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZGVmaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vL2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OwotCi0vKioKLSAqIEFuIGV4YW1wbGUgUnVubmFibGUgYmVhbiB0aGF0IGlzIGZyYW1ld29yayBuZXV0cmFsIGFuZCBqdXN0IHBlcmZvcm1zCi0gKiBzb21lIHVzZWZ1bCBmdW5jdGlvbi4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBNeVJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE15UnVubmFibGUuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBpbnQgeDsKLSAgICBwcml2YXRlIFN0cmluZyB5OwotICAgIHByaXZhdGUgTGlzdCBmaWxlU2V0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHB1YmxpYyBNeVJ1bm5hYmxlKCkgewotICAgIH0KLQotCi0gICAgLy8gQWRkZXIgbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qCi0KLSAgICBDb21tZW50ZWQgb3V0IG1ldGhvZCB0byByZW1vdmUgdGVzdC1vbmx5IGRlcGVuZGVuY3kgb24gYW50Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRGaWxlc2V0KEZpbGVTZXQgZmlsZVNldCkgewotICAgICAgICBmaWxlU2V0cy5hZGQoZmlsZVNldCk7Ci0gICAgfQotICAgICovCi0KLSAgICAvLyBSdW5uYWJsZSBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIGxvZy5pbmZvKCAiQWJvdXQgdG8gZG8gc29tZXRoaW5nIHdoZXJlIHggPSAiICsgZ2V0WCgpICsgIiB5ID0gIiArIGdldFkoKSApOwotICAgICAgICBsb2cuaW5mbyggIkZpbGVTZXRzIGFyZTogIiArIGZpbGVTZXRzICk7Ci0gICAgfQotCi0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIGludCBnZXRYKCkgewotICAgICAgICByZXR1cm4geDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYKGludCB4KSB7Ci0gICAgICAgIHRoaXMueCA9IHg7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRZKCkgewotICAgICAgICByZXR1cm4geTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRZKFN0cmluZyB5KSB7Ci0gICAgICAgIHRoaXMueSA9IHk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9kZWZpbmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL1Rlc3REeW5hbWljVGFncy5qYXZhIGIvamVsbHktdGFncy9kZWZpbmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL1Rlc3REeW5hbWljVGFncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTU4NjExLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9UZXN0RHluYW1pY1RhZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZGVmaW5lOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKiBUZXN0cyBkeW5hbWljIHRhZ3MKLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNCAkCi0gICovCi1wdWJsaWMgY2xhc3MgVGVzdER5bmFtaWNUYWdzIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgSmVsbHlDb250ZXh0IGNvbnRleHQgPSBuZXcgSmVsbHlDb250ZXh0KCk7Ci0gICAgWE1MT3V0cHV0IG91dHB1dDsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUZXN0RHluYW1pY1RhZ3MuY2xhc3MpOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3REeW5hbWljVGFncy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3REeW5hbWljVGFncyhTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdXcml0ZXIgYnVmZmVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBvdXRwdXQgPSBYTUxPdXRwdXQuY3JlYXRlWE1MT3V0cHV0KGJ1ZmZlcik7Ci0KLSAgICAgICAgLy9ydW5TY3JpcHQoInNyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9kZWZpbmUvYmFiZWxmaXNoVGFnbGliLmplbGx5Iik7Ci0gICAgICAgIHJ1blNjcmlwdCgic3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL2V4YW1wbGUuamVsbHkiKTsKLQotICAgICAgICBsb2cuaW5mbygiVGhlIG91dHB1dCB3YXMgYXMgZm9sbG93cyIpOwotICAgICAgICBsb2cuaW5mbyhidWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEplbGx5QmVhbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdXcml0ZXIgYnVmZmVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBvdXRwdXQgPSBYTUxPdXRwdXQuY3JlYXRlWE1MT3V0cHV0KGJ1ZmZlcik7Ci0KLSAgICBsb2cud2FybigiY29tbWVudGVkIG91dCB0ZXN0LCBuZWVkIHRvIHJld3JpdGUgd2l0aG91dCBhbnQiKTsKLSAgICAgICAgLy9ydW5TY3JpcHQoInNyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9kZWZpbmUvamVsbHlCZWFuU2FtcGxlLmplbGx5Iik7Ci0KLSAgICAgICAgbG9nLmluZm8oIlRoZSBvdXRwdXQgd2FzIGFzIGZvbGxvd3MiKTsKLSAgICAgICAgbG9nLmluZm8oYnVmZmVyLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJ1blNjcmlwdChTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNvbnRleHQucnVuU2NyaXB0KG5ldyBGaWxlKG5hbWUpLCBvdXRwdXQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9UZXN0SmVsbHkuamF2YSBiL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9UZXN0SmVsbHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjNjczMi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2RlZmluZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvVGVzdEplbGx5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmRlZmluZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qdW5pdC5KZWxseVRlc3RTdWl0ZTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyB0byBydW4gamVsbHkgdGVzdCBjYXNlcyBhcyBwYXJ0IG9mIEFudCdzIEpVbml0IHRlc3RzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjQgJAotICovCi1wdWJsaWMgY2xhc3MgVGVzdEplbGx5IGV4dGVuZHMgSmVsbHlUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oIHN1aXRlKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3JlYXRlVGVzdFN1aXRlKFRlc3RKZWxseS5jbGFzcywgInN1aXRlLmplbGx5Iik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9kZWZpbmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL2JhYmVsZmlzaFRhZ2xpYi5qZWxseSBiL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9iYWJlbGZpc2hUYWdsaWIuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NTQyZmYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9kZWZpbmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL2JhYmVsZmlzaFRhZ2xpYi5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLg0KLSAgDQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgDQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tIGRlZmluZXMgYSBuZXcgdGFnbGliIG9mIGJhYmVsZmlzaCBzb2FwIHNlcnZpY2VzIC0tPg0KLQ0KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiIHhtbG5zOng9ImplbGx5OnhtbCIgeG1sbnM6ZGVmaW5lPSJqZWxseTpkZWZpbmUiIHhtbG5zOmh0dHA9Im5vdEltcGxlbWVudGVkWWV0Ij4NCi0gIDxkZWZpbmU6dGFnbGliIHVyaT0iYmFiZWxmaXNoIj4gIA0KLQ0KLSAgICA8IS0tIGRlZmluZXMgdGhlIDx0cmFuc2xhdGU+IHRhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQotICAgIDwhLS0gbm90aWNlIGhvdyB0aGUgJ2Zyb20nIGFuZCAndG8nIGF0dHJpYnV0ZXMgYXJlIGF2YWlsYWJsZSBhcyB2YXJpYWJsZXMgICAtLT4NCi0gICAgPCEtLSBhbmQgdGhlIGJvZHkgb2YgdGhlIDx0cmFuc2xhdGU+IHRhZyBpcyBpbnZva2VkIHZpYSA8ZGVmaW5lOmludm9rZUJvZHk+IC0tPg0KLSAgICA8ZGVmaW5lOnRhZyBuYW1lPSJ0cmFuc2xhdGUiPg0KLSAgICAgIDxodHRwOnBvc3QgdXJsPSJodHRwOi8vc2VydmljZXMueG1ldGhvZHMubmV0OjgwL3Blcmwvc29hcGxpdGUuY2dpIj4NCi0gICAgICAgPGh0dHA6aGVhZGVyIG5hbWU9IlNPQVBBY3Rpb24iIHZhbHVlPSJ1cm46eG1ldGhvZHNCYWJlbEZpc2gjQmFiZWxGaXNoIi8+DQotICAgICAgIDxodHRwOmhlYWRlciBuYW1lPSJDb250ZW50LVR5cGUiIHZhbHVlPSJ0ZXh0L3htbCIvPg0KLSAgICAgICA8aHR0cDpib2R5Pg0KLSAgICAgICAgPGVudjpFbnZlbG9wZSANCi0gICAgICAgICAgeG1sbnM6ZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyINCi0gICAgICAgICAgZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4NCi0gICAgICAgICAgPGVudjpCb2R5Pg0KLSAgICAgICAgICAgIDxtOkJhYmVsRmlzaCB4bWxuczptPSJ1cm46eG1ldGhvZHNCYWJlbEZpc2giPg0KLSAgICAgICAgICAgICAgPHRyYW5zbGF0aW9ubW9kZT4ke2Zyb219XyR7dG99PC90cmFuc2xhdGlvbm1vZGU+ICAgICAgDQotICAgICAgICAgICAgICA8c291cmNlZGF0YT4NCi0gICAgICAgICAgICAgICAgPGRlZmluZTppbnZva2VCb2R5Lz4NCi0gICAgICAgICAgICAgIDwvc291cmNlZGF0YT4gICAgDQotICAgICAgICAgICAgPC9tOkJhYmVsRmlzaD4NCi0gICAgICAgICAgPC9lbnY6Qm9keT4NCi0gICAgICAgIDwvZW52OkVudmVsb3BlPg0KLSAgICAgICA8L2h0dHA6Ym9keT4NCi0gICAgICA8L2h0dHA6cG9zdD4NCi0gICAgPC9kZWZpbmU6dGFnPg0KLSAgICANCi0gIDwvZGVmaW5lOnRhZ2xpYj4gICAgDQotPC9qOmplbGx5Pg0KLQ0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9iZWFuU2FtcGxlLmplbGx5IGIvamVsbHktdGFncy9kZWZpbmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL2JlYW5TYW1wbGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NjdiNTQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9kZWZpbmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL2JlYW5TYW1wbGUuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4NCi0gIA0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIA0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIA0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSBjcmVhdGVzIGEgQmVhbiAtLT4NCi08ajpqZWxseSANCi0gICAgeG1sbnM6aj0iamVsbHk6Y29yZSIgDQotICAgIHhtbG5zOmRlZmluZT0iamVsbHk6ZGVmaW5lIiANCi0gICAgeG1sbnM6bG9nPSJqZWxseTpsb2ciIA0KLSAgICB4bWxuczpteT0ibXlEdW1teVRhZ0xpYiI+DQotICAgIA0KLTx0ZXN0Y2FzZT4NCi0NCi0gIDxsb2c6aW5mbz5MZXRzIGRlZmluZSBhIG5ldyB0YWcgbGlicmFyeTwvbG9nOmluZm8+DQotICANCi0gIDxkZWZpbmU6dGFnbGliIHVyaT0ibXlEdW1teVRhZ0xpYiI+ICANCi0gIA0KLSAgICAgIDwhLS0gDQotICAgICAgICB8fCBtYXAgdGhlIGdpdmVuIGJlYW4gdG8gYSBqZWxseSB0YWcgDQotICAgICAgICB8fCB3ZSdsbCBzcGVjaWZ5IHNvbWUgcmVxdWlyZWQgYXR0cmlidXRlcyBhbmQgc29tZSBkZWZhdWx0IHZhbHVlcw0KLSAgICAgICAgLS0+DQotICAgICAgICANCi0gICAgPGRlZmluZTpiZWFuIG5hbWU9ImN1c3RvbWVyIiBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlLkN1c3RvbWVyIj4NCi0gICAgICA8ZGVmaW5lOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiByZXF1aXJlZD0idHJ1ZSIvPg0KLSAgICAgIDxkZWZpbmU6YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIiBkZWZhdWx0VmFsdWU9IlVLIi8+DQotICAgIDwvZGVmaW5lOmJlYW4+ICAgICAgICANCi0gICAgDQotICA8L2RlZmluZTp0YWdsaWI+DQotDQotICA8bG9nOmluZm8+Tm93IGxldHMgaW52b2tlIHRoZSBuZXcgSmVsbHkgYmVhbiB0YWc8L2xvZzppbmZvPg0KLSAgDQotICA8bXk6Y3VzdG9tZXIgdmFyPSJjMSIgbmFtZT0iSmFtZXMiLz4NCi0gIA0KLSAgPGxvZzppbmZvPkNyZWF0ZWQgYSBjdXN0b21lciB3aXRoIG5hbWUgJHtjMS5uYW1lfSBhbmQgbG9jYXRpb24gJHtjMS5sb2NhdGlvbn08L2xvZzppbmZvPg0KLQ0KLSAgPG15OmN1c3RvbWVyIHZhcj0iYzIiIG5hbWU9IkJvYiIgbG9jYXRpb249IlVTIi8+DQotICANCi0gIDxsb2c6aW5mbz5DcmVhdGVkIGEgY3VzdG9tZXIgd2l0aCBuYW1lICR7YzIubmFtZX0gYW5kIGxvY2F0aW9uICR7YzIubG9jYXRpb259PC9sb2c6aW5mbz4NCi0NCi0gICAgICAgIA0KLSAgPGo6Y2F0Y2ggdmFyPSJleGNlcHRpb24iPg0KLSAgICAgIDxteTpjdXN0b21lciBsb2NhdGlvbj0iVUsiLz4NCi0gIDwvajpjYXRjaD4NCi0gIA0KLSAgPGxvZzppbmZvPkNhdWdodCBleGNlcHRpb24gJHtleGNlcHRpb259IHdpdGggcmVhc29uOiAke2V4Y2VwdGlvbi5yZWFzb259PC9sb2c6aW5mbz4NCi0gIA0KLSAgPGo6aWYgdGVzdD0iJHtleGNlcHRpb24gPT0gbnVsbH0iPg0KLSAgICAgIDxsb2c6ZXJyb3I+RmFpbGVkISBJIHNob3VsZCBoYXZlIGFuIGV4Y2VwdGlvbiBzaW5jZSBJIGRpZG4ndCBzcGVjaWZ5IGEgJ25hbWUnIGF0dHJpYnV0ZTwvbG9nOmVycm9yPg0KLSAgPC9qOmlmPg0KLSAgDQotICANCi08L3Rlc3RjYXNlPg0KLSAgICAgICAgICANCi08L2o6amVsbHk+DQotDQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9kZWZpbmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL2V4YW1wbGUuamVsbHkgYi9qZWxseS10YWdzL2RlZmluZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvZXhhbXBsZS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkOWI0ZC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2RlZmluZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvZXhhbXBsZS5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLg0KLSAgDQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgDQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tIHVzZXMgdGhlIGJhYmVsZmlzaCB0YWdsaWIgLS0+DQotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM6YmFiZWxmaXNoPSJiYWJlbGZpc2giPg0KLQ0KLSAgPGo6aW5jbHVkZSB1cmk9ImJhYmVsZmlzaFRhZ2xpYi5qZWxseSIvPg0KLSAgDQotICBUaGlzIGV4YW1wbGUgc2hvdWxkIG91dHB1dCBhIHdlYiBzZXJ2aWNlIGNhbGwuLi4NCi0NCi0gIDxiYWJlbGZpc2g6dHJhbnNsYXRlIGZyb209IkVOIiB0bz0iRlIiPg0KLSAgICBKZWxseSBpcyBjb29sIHN0dWZmIQ0KLSAgPC9iYWJlbGZpc2g6dHJhbnNsYXRlPg0KLQ0KLSAgLi4uIE9LIGRpZCB0aGF0IHdvcms/DQotDQotPC9qOmplbGx5Pg0KLQ0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9qZWxseUJlYW5TYW1wbGUuamVsbHkgYi9qZWxseS10YWdzL2RlZmluZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvamVsbHlCZWFuU2FtcGxlLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjhkMDk1Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2RlZmluZS9qZWxseUJlYW5TYW1wbGUuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4NCi0gIA0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIA0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIA0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSB1c2VzIGEgSmVsbHlCZWFuLCB3aGljaCBpbnZva2VzIHRoZSBydW4oKSBtZXRob2QgLS0+DQotPGo6amVsbHkgDQotICAgIHhtbG5zOmo9ImplbGx5OmNvcmUiIA0KLSAgICB4bWxuczpkZWZpbmU9ImplbGx5OmRlZmluZSIgDQotICAgIHhtbG5zOmxvZz0iamVsbHk6bG9nIiANCi0gICAgeG1sbnM6bXk9Im15RHVtbXlUYWdMaWIiDQotICAgIHhtbG5zPSJqZWxseTphbnQiPg0KLSAgICANCi08dGVzdGNhc2U+DQotDQotICA8bG9nOmluZm8+TGV0cyBkZWZpbmUgYSBuZXcgdGFnIGxpYnJhcnk8L2xvZzppbmZvPg0KLSAgDQotICA8ZGVmaW5lOnRhZ2xpYiB1cmk9Im15RHVtbXlUYWdMaWIiPiAgDQotICANCi0gICAgPGRlZmluZTpqZWxseWJlYW4gbmFtZT0iZm9vIiBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmRlZmluZS5NeVJ1bm5hYmxlIj4NCi0gICAgICA8ZGVmaW5lOmF0dHJpYnV0ZSBuYW1lPSJ5IiBkZWZhdWx0VmFsdWU9IndpbmUiLz4NCi0gICAgPC9kZWZpbmU6amVsbHliZWFuPg0KLSAgICANCi0gICAgPCEtLSANCi0gICAgICBUaGlzIHdhcyBhZGRlZCB0byBkZW1vbnN0cmF0ZSBhIENsYXNzQ2FzdEV4Y2VwdGlvbiB3aGVuIGENCi0gICAgICBkeW5hbWljIHRhZyBpcyBjcmVhdGVkIHRoYXQgdXNlcyBhIGR5bmFtaWNhbGx5IGplbGx5IGJlYW4gYW5kDQotICAgICAgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLiBZb3Ugc2hvdWxkIGJlIGFibGUgdG8gY2FsbCB0aGUgZHluYW1pY2FsbHkNCi0gICAgICBjcmVhdGVkIHRhZyBuIHRpbWVzIHdpdGhvdXQgcHJvYmxlbSBub3cuDQotICAgIC0tPg0KLSAgICANCi0gICAgPGRlZmluZTp0YWcgbmFtZT0iYmFyIj4NCi0gICAgICA8bXk6Zm9vIHg9IjIiIHk9ImNoZWVzZSI+DQotICAgICAgICA8ZmlsZXNldCBkaXI9Ii4iPg0KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLnhtbCIvPg0KLSAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvamF2YSI+DQotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamF2YSIvPg0KLSAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgIDwvbXk6Zm9vPg0KLSAgICA8L2RlZmluZTp0YWc+DQotDQotICA8L2RlZmluZTp0YWdsaWI+DQotDQotICA8bG9nOmluZm8+Tm93IGxldHMgaW52b2tlIHRoZSBuZXcgSmVsbHkgYmVhbiB0YWc8L2xvZzppbmZvPg0KLSAgDQotICA8bXk6Zm9vIHg9IjIiIHk9ImNoZWVzZSI+DQotICAgIDxmaWxlc2V0IGRpcj0iLiI+DQotICAgICAgPGluY2x1ZGUgbmFtZT0iKi54bWwiLz4NCi0gICAgPC9maWxlc2V0Pg0KLSAgICA8ZmlsZXNldCBkaXI9InNyYy9qYXZhIj4NCi0gICAgICA8aW5jbHVkZSBuYW1lPSIqLmphdmEiLz4NCi0gICAgPC9maWxlc2V0Pg0KLSAgPC9teTpmb28+DQotDQotICA8bG9nOmluZm8+RGlkIHRoYXQgd29yaz88L2xvZzppbmZvPg0KLSAgDQotICA8bXk6Zm9vIHg9IjIiPg0KLSAgICA8ZmlsZXNldCBkaXI9Ii4iPg0KLSAgICAgIDxpbmNsdWRlIG5hbWU9IioueG1sIi8+DQotICAgIDwvZmlsZXNldD4NCi0gIDwvbXk6Zm9vPg0KLSAgDQotICA8IS0tIFlvdSBzaG91bGQgYmUgYWJsZSB0byBydW4gZHluYW1pYyB0YWdzIG4gdGltZXMgd2l0aG91dCBDbGFzc0Nhc3RFeGNlcHRpb25zIC0tPg0KLSAgPG15OmJhci8+DQotICA8bXk6YmFyLz4NCi0gIA0KLTwvdGVzdGNhc2U+DQotICAgICAgICAgIA0KLTwvajpqZWxseT4NCi0NCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2RlZmluZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvc3VpdGUuamVsbHkgYi9qZWxseS10YWdzL2RlZmluZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9kZWZpbmUvc3VpdGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNWNmMGYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9kZWZpbmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lL3N1aXRlLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLg0KLSAgDQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgDQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08dGVzdDpzdWl0ZSANCi0gICAgeG1sbnM6aj0iamVsbHk6Y29yZSIgDQotICAgIHhtbG5zOng9ImplbGx5OnhtbCIgDQotICAgIHhtbG5zOnRlc3Q9ImplbGx5Omp1bml0IiANCi0gICAgeG1sbnM6bG9nPSJqZWxseTpsb2ciIA0KLSAgICB4bWxuczpkZWZpbmU9ImplbGx5OmRlZmluZSINCi0gICAgeG1sbnM6ZHluYW1pY1Rlc3Q9ImR5bmFtaWNUZXN0Ij4NCi0NCi08dGVzdDpjYXNlIG5hbWU9Imludm9rZSI+DQotDQotICA8ZGVmaW5lOnNjcmlwdCB2YXI9ImZvb1NjcmlwdCI+DQotICAgICAgPGxvZzppbmZvPkdlbmVyYXRpbmcgc29tZSBYTUw8L2xvZzppbmZvPg0KLSAgICAgIA0KLSAgICA8Zm9vIGlkPSIxIj4NCi0gICAgICA8YmFyPnNvbWUgWE1MPC9iYXI+DQotICAgIDwvZm9vPg0KLSAgPC9kZWZpbmU6c2NyaXB0Pg0KLSAgDQotICANCi0gIDwhLS0gbm93IGxldHMgaW52b2tlIHRoZSBzY3JpcHQgLS0+DQotICANCi0gIA0KLSAgPHg6cGFyc2UgdmFyPSJkb2MiPg0KLSAgICAgIDxsb2c6aW5mbz5BYm91dCB0byBpbnZva2UgdGhlIHNjcmlwdCE8L2xvZzppbmZvPg0KLSAgICAgIA0KLSAgICAgIDxkZWZpbmU6aW52b2tlIHNjcmlwdD0iJHtmb29TY3JpcHR9Ii8+DQotICA8L3g6cGFyc2U+DQotICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICANCi0gIDx4OmZvckVhY2ggc2VsZWN0PSIkZG9jLy9mb28iPg0KLSAgICA8dGVzdDphc3NlcnQgeHBhdGg9ImJhciIvPg0KLSAgPC94OmZvckVhY2g+DQotICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICA8dGVzdDphc3NlcnQgeHBhdGg9IiRkb2MvZm9vL2JhciIvPg0KLSAgDQotPC90ZXN0OmNhc2U+DQotDQotPHRlc3Q6Y2FzZSBuYW1lPSJkeW5hbWljVGFnIj4NCi0NCi0gIDwhLS0gSW5pdCB0aGUgbmV3IHRhZy4gLS0+DQotICA8ZGVmaW5lOnRhZ2xpYiB1cmk9ImR5bmFtaWNUZXN0Ij4NCi0gICAgPGRlZmluZTpqZWxseWJlYW4NCi0gICAgICBuYW1lPSJ0ZXN0Ig0KLSAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZGVmaW5lLkR5bmFtaWNUYWciDQotICAgIC8+DQotICA8L2RlZmluZTp0YWdsaWI+DQotDQotICA8ajpzZXQgdmFyPSJvdXRwdXQiPg0KLSAgICA8ZHluYW1pY1Rlc3Q6dGVzdD4NCi0gICAgICBpZ25vcmVkIG91dHB1dCB0byBtYWtlIHN1cmUgZG9UYWcgaXMgYmVpbmcgY2FsbGVkDQotICAgIDwvZHluYW1pY1Rlc3Q6dGVzdD4NCi0gIDwvajpzZXQ+DQotDQotICA8dGVzdDphc3NlcnRFcXVhbHMNCi0gICAgZXhwZWN0ZWQ9Im91dHB1dCAtIGlnbm9yZWQgYm9keSINCi0gICAgYWN0dWFsPSIke291dHB1dH0iDQotICAvPg0KLQ0KLTwvdGVzdDpjYXNlPg0KLSAgIA0KLQ0KLTx0ZXN0OmNhc2UgbmFtZT0iZHluYUJlYW5zIiANCi0gICAgeG1sbnM6ZHluYWJlYW49ImplbGx5OmR5bmFiZWFuIg0KLSAgICB4bWxuczpteT0iZHluYW1pY0R5bmFCZWFuVGVzdCI+DQotDQotICAgIDwhLS0gY3JlYXRlIGEgRHluYUNsYXNzIC0tPg0KLSAgPGR5bmFiZWFuOmR5bmFjbGFzcyB2YXI9IkN1c3RvbWVyVHlwZSIgbmFtZT0iQ3VzdG9tZXJEeW5hQ2xhc3MiPiANCi0gICAgICAgIDxkeW5hYmVhbjpwcm9wZXJ0eSBuYW1lPSJuYW1lIiB0eXBlPSJTdHJpbmciIC8+DQotICAgICAgICA8ZHluYWJlYW46cHJvcGVydHkgbmFtZT0iYWRkcmVzcyIgdHlwZT0iU3RyaW5nIiAvPg0KLSAgICA8L2R5bmFiZWFuOmR5bmFjbGFzcz4NCi0NCi0gIDwhLS0gQ3JlYXRlIGEgbmV3IHRhZyBsaWJyYXJ5IGJpbmRpbmcgdGhlIGR5bmFiZWFucy4gLS0+DQotICA8ZGVmaW5lOnRhZ2xpYiB1cmk9ImR5bmFtaWNEeW5hQmVhblRlc3QiPg0KLSAgICA8ZGVmaW5lOmR5bmFCZWFuDQotICAgICAgbmFtZT0iY3VzdG9tZXIiDQotICAgICAgZHluYUNsYXNzPSIke0N1c3RvbWVyVHlwZX0iDQotICAgIC8+DQotICA8L2RlZmluZTp0YWdsaWI+DQotDQotICAgIDwhLS0gbm93IGxldHMgY3JlYXRlIGEgY3VzdG9tZXIgLS0+DQotICAgIDxteTpjdXN0b21lciB2YXI9ImN1c3RvbWVyIiBuYW1lPSJDdXN0b21lciAxIiBhZGRyZXNzPSJBZGRyZXNzIG9mIEN1c3RvbWVyIDEiIC8+DQotDQotICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2N1c3RvbWVyICE9IG51bGx9Ij5DcmVhdGVkIGEgY3VzdG9tZXIgRHluYUJlYW48L3Rlc3Q6YXNzZXJ0Pg0KLSAgICANCi0gICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIA0KLSAgICAgICAgZXhwZWN0ZWQ9IkN1c3RvbWVyIDEiIA0KLSAgICAgICAgYWN0dWFsPSIke2N1c3RvbWVyLm5hbWV9Ii8+DQotICAgICAgICANCi0gICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIA0KLSAgICAgICAgZXhwZWN0ZWQ9IkFkZHJlc3Mgb2YgQ3VzdG9tZXIgMSIgDQotICAgICAgICBhY3R1YWw9IiR7Y3VzdG9tZXIuYWRkcmVzc30iLz4NCi0gICAgICAgIA0KLSAgICA8dGVzdDphc3NlcnRFcXVhbHMgDQotICAgICAgICBleHBlY3RlZD0iQ3VzdG9tZXJEeW5hQ2xhc3MiIA0KLSAgICAgICAgYWN0dWFsPSIke2N1c3RvbWVyLmR5bmFDbGFzcy5uYW1lfSIvPg0KLQ0KLTwvdGVzdDpjYXNlPg0KLQ0KLTx0ZXN0OmNhc2UgbmFtZT0idGVzdFRhZ2xpYkluaGVyaXRUZXN0IiB4bWxucz0idGFnbGliSW5oZXJpdCI+DQotDQotICA8ZGVmaW5lOnRhZ2xpYiB1cmk9InRhZ2xpYkluaGVyaXQiIGluaGVyaXQ9ImZhbHNlIj4NCi0gICAgIDxkZWZpbmU6dGFnIG5hbWU9ImZvbyI+DQotICAgICAgICBiYXINCi0gICAgIDwvZGVmaW5lOnRhZz4NCi0gIDwvZGVmaW5lOnRhZ2xpYj4NCi0NCi0gIDxkZWZpbmU6dGFnbGliIHVyaT0idGFnbGliSW5oZXJpdCIgaW5oZXJpdD0idHJ1ZSI+DQotICAgICA8ZGVmaW5lOnRhZyBuYW1lPSJmb28yIj4NCi0gICAgICAgIGJhcjINCi0gICAgIDwvZGVmaW5lOnRhZz4NCi0gIDwvZGVmaW5lOnRhZ2xpYj4NCi0NCi0gIDxqOnNldCB2YXI9Im91dHB1dCI+DQotICAgIDxmb28vPg0KLSAgPC9qOnNldD4NCi0NCi0gIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iYmFyIiBhY3R1YWw9IiR7b3V0cHV0fSIvPg0KLQ0KLTwvdGVzdDpjYXNlPg0KLQ0KLTx0ZXN0OmNhc2UgbmFtZT0idGVzdEV4dGVuZCIgeG1sbnM9InRhZ2xpYkV4dGVuZCI+DQotDQotICA8ZGVmaW5lOnRhZ2xpYiB1cmk9InRhZ2xpYkV4dGVuZCIgaW5oZXJpdD0iZmFsc2UiPg0KLSAgICAgPGRlZmluZTp0YWcgbmFtZT0iZm9vIj4NCi0gICAgICAgIGZvbw0KLSAgICAgPC9kZWZpbmU6dGFnPg0KLSAgPC9kZWZpbmU6dGFnbGliPg0KLQ0KLSAgPGo6c2V0IHZhcj0ib3V0cHV0Ij48Zm9vLz48L2o6c2V0Pg0KLSAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJmb28iIGFjdHVhbD0iJHtvdXRwdXR9Ii8+DQotDQotICA8IS0tIGV4dGVuZCB0aGUgZm9vIHRhZyAtLT4NCi0gIDxkZWZpbmU6dGFnbGliIHVyaT0idGFnbGliRXh0ZW5kIiBpbmhlcml0PSJ0cnVlIj4NCi0gICAgIDxkZWZpbmU6ZXh0ZW5kIG5hbWU9ImZvbyI+DQotICAgICAgICBiYXINCi0gICAgIDwvZGVmaW5lOmV4dGVuZD4NCi0gIDwvZGVmaW5lOnRhZ2xpYj4NCi0NCi0gIDxqOnNldCB2YXI9Im91dHB1dCI+DQotICAgICA8Zm9vLz4NCi0gIDwvajpzZXQ+DQotICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9ImJhciIgYWN0dWFsPSIke291dHB1dH0iLz4NCi0NCi08L3Rlc3Q6Y2FzZT4NCi0NCi08dGVzdDpjYXNlIG5hbWU9InRlc3RTdXBlciIgeG1sbnM9InRhZ2xpYlN1cGVyIj4NCi0NCi0gIDxkZWZpbmU6dGFnbGliIHVyaT0idGFnbGliU3VwZXIiIGluaGVyaXQ9ImZhbHNlIj4NCi0gICAgIDxkZWZpbmU6dGFnIG5hbWU9ImZvbyI+DQotICAgICAgICBmb28NCi0gICAgIDwvZGVmaW5lOnRhZz4NCi0gIDwvZGVmaW5lOnRhZ2xpYj4NCi0NCi0gIDwhLS0gZXh0ZW5kIHRoZSBmb28gdGFnIC0tPg0KLSAgPGRlZmluZTp0YWdsaWIgdXJpPSJ0YWdsaWJTdXBlciIgaW5oZXJpdD0idHJ1ZSI+DQotICAgICA8ZGVmaW5lOmV4dGVuZCBuYW1lPSJmb28iPg0KLSAgICAgICAgPGRlZmluZTpzdXBlci8+DQotICAgICAgICBiYXINCi0gICAgIDwvZGVmaW5lOmV4dGVuZD4NCi0gIDwvZGVmaW5lOnRhZ2xpYj4NCi0NCi0gIDxqOnNldCB2YXI9Im91dHB1dCI+DQotICAgIDxmb28vPg0KLSAgPC9qOnNldD4NCi0gIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iZm9vYmFyIiBhY3R1YWw9IiR7b3V0cHV0fSIvPg0KLQ0KLSAgPCEtLSBleHRlbmQgdGhlIGZvbyB0YWcgLS0+DQotICA8ZGVmaW5lOnRhZ2xpYiB1cmk9InRhZ2xpYlN1cGVyIiBpbmhlcml0PSJ0cnVlIj4NCi0gICAgIDxkZWZpbmU6ZXh0ZW5kIG5hbWU9ImZvbyI+DQotICAgICAgICBiYXINCi0gICAgICAgIDxkZWZpbmU6c3VwZXIvPg0KLSAgICAgPC9kZWZpbmU6ZXh0ZW5kPg0KLSAgPC9kZWZpbmU6dGFnbGliPg0KLQ0KLSAgPGo6c2V0IHZhcj0ib3V0cHV0Ij4NCi0gICAgPGZvby8+DQotICA8L2o6c2V0Pg0KLSAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJiYXJmb29iYXIiIGFjdHVhbD0iJHtvdXRwdXR9Ii8+DQotDQotPC90ZXN0OmNhc2U+DQotDQotDQotPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0T3ZlcnJpZGVWYXJpYWJsZXNXaXRoQXR0cmlidXRlcyI+DQotCTxkZWZpbmU6dGFnbGliIHVyaT0idGVzdE92ZXJyaWRlVmFyaWFibGVzV2l0aEF0dHJpYnV0ZXMiPg0KLQkJPGRlZmluZTp0YWcgbmFtZT0iZ2V0VmFsdWVPZlZhckEiPiR7dmFyQX08L2RlZmluZTp0YWc+DQotCQk8L2RlZmluZTp0YWdsaWI+DQotCTxqOnNldCB2YXI9InZhckEiIHZhbHVlPSJ2YXJBIHZhbHVlRnJvbVNldCIvPg0KLQk8ajpzZXQgdmFyPSJvYnRhaW5lZCI+PGdldFZhbHVlT2ZWYXJBIHZhckE9InZhckEgdmFsdWUgZnJvbSBhdHRyaWJ1dGUiIA0KLQkJeG1sbnM9InRlc3RPdmVycmlkZVZhcmlhYmxlc1dpdGhBdHRyaWJ1dGVzIi8+PC9qOnNldD4NCi0JPGxvZzppbmZvPm9idGFpbmVkIGlzICR7b2J0YWluZWR9PC9sb2c6aW5mbz4NCi0JPHRlc3Q6YXNzZXJ0RXF1YWxzIA0KLQkJZXhwZWN0ZWQ9InZhckEgdmFsdWUgZnJvbSBhdHRyaWJ1dGUiDQotCQlhY3R1YWwgID0iJHtvYnRhaW5lZH0iLz4NCi0JPC90ZXN0OmNhc2U+DQotDQotICAgDQotPC90ZXN0OnN1aXRlPg0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL21vY2svVGVzdEpVbml0LmphdmEgYi9qZWxseS10YWdzL2RlZmluZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9tb2NrL1Rlc3RKVW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjVjZmMyLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL21vY2svVGVzdEpVbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLm1vY2s7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuanVuaXQuSmVsbHlUZXN0U3VpdGU7Ci0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgdG8gcnVuIGplbGx5IHRlc3QgY2FzZXMgYXMgcGFydCBvZiBBbnQncyBKVW5pdCB0ZXN0cwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAqLwotcHVibGljIGNsYXNzIFRlc3RKVW5pdCBleHRlbmRzIEplbGx5VGVzdFN1aXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlc3RSdW5uZXIucnVuKCBzdWl0ZSgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0U3VpdGUgc3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVRlc3RTdWl0ZShUZXN0SlVuaXQuY2xhc3MsICJzdWl0ZS5qZWxseSIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL21vY2svc2VydmljZS5qZWxseSBiL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL21vY2svc2VydmljZS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdlMDdlZi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2RlZmluZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9tb2NrL3NlcnZpY2UuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4NCi0gIA0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIA0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIA0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSB0aGlzIHNjcmlwdCByZXByZXNlbnRzIHNvbWUgc2FtcGxlIHNlcnZpY2UgdGhhdCB3ZSB3aWxsIHRlc3QNCi0gICAgfHwgdmlhIE1vY2sgVGFncw0KLSAgICAtLT4NCi0gICAgDQotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM6bXk9Im15Rm9vZFdlYlNlcnZpY2UiIHhtbG5zOmxvZz0iamVsbHk6bG9nIj4NCi0NCi08IS0tICAgIDxzcWw6cXVlcnkgdmFyPSJyZXN1bHRzIj4gDQotICAgICAgc2VsZWN0ICogZnJvbSBmb29kIHdoZXJlIGtpbmQgPSA/DQotLS0+ICAgICAgDQotICAgICAgPCEtLSBsZXRzIHBhc3MgaW4gc29tZSBwYXJhbWV0cml6ZWQgdmFsdWUgLS0+DQotPCEtLSAgICAgIDxzcWw6cGFyYW0gdmFsdWU9IiR7Zm9vZEtpbmR9Ii8+DQotICAgIDwvc3FsOnF1ZXJ5Pg0KLS0tPiAgICANCi0gICAgPCEtLSBpbnZva2Ugc29tZSBzZXJ2aWNlIA0KLSAgICA8ajpmb3JFYWNoIGl0ZW1zPSIke3Jlc3VsdHMucm93c30iIHZhcj0icm93Ij4NCi0gICAgDQotICAgICAgICA8bG9nOmluZm8+Rm91bmQgcm93IHdpdGggSUQgJHtyb3cuaWR9PC9sb2c6aW5mbz4NCi0tLT4gICAgDQotICAgICAgPCEtLSB0aGlzIHRhZyBjb3VsZCBpbnZva2UgYSB3ZWIgc2VydmljZSBldGMNCi0gICAgICA8bXk6ZWF0IGNoZWVzZT0iJHtyb3cuaWR9Ii8+IC0tPg0KLSAgICAgIDwhLS0gRklYTUU6IENvbW1lbnRlZCBjb2RlIGFib3ZlIGFuZCByZXBlYXRlZCBsaW5lIGFyZSBhIA0KLSAgICAgICAgICAgICAgICAgIHdvcmthcm91bmQgYXMgdGhlIHNxbCB0YWdsaWIgaGFzIGJlZW4gcmVtb3ZlZA0KLSAgICAgICAgLS0+DQotICAgICAgPG15OmVhdCBjaGVlc2U9ImFiYyIvPg0KLSAgICAgIDxteTplYXQgY2hlZXNlPSJkZWYiLz4NCi08IS0tICAgIDwvajpmb3JFYWNoPiAtLT4NCi0gICAgDQotPC9qOmplbGx5Pg0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL21vY2svc3VpdGUuamVsbHkgYi9qZWxseS10YWdzL2RlZmluZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9tb2NrL3N1aXRlLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGJiOTI5Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvZGVmaW5lL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL21vY2svc3VpdGUuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4NCi0gIA0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIA0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIA0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHRlc3Q6c3VpdGUgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM6dGVzdD0iamVsbHk6anVuaXQiIHhtbG5zOm1vY2s9ImplbGx5OmRlZmluZSIgeG1sbnM6bG9nPSJqZWxseTpsb2ciPg0KLQ0KLSAgICA8IS0tIGxldHMgY3JlYXRlIHNvbWUgbW9jayB0YWdzIGFuZCB0ZXN0IGEgc2FtcGxlIHNjcmlwdCB0aGF0IGl0IGV2YWx1YXRlcyB0aGUgDQotICAgICAgICB8fCBtb2NrIHRhZ3MgYXMgd2UnZCBleHBlY3QNCi0gICAgICAgIC0tPg0KLSAgICAgICAgDQotICAgIDx0ZXN0OmNhc2UgbmFtZT0idGVzdE1vY2tUYWdzIj4NCi0NCi0gICAgICAgIDwhLS0gbGV0cyBjcmVhdGUgdGhlIE1vY2sgVGFncyB0byBzaW11bGF0ZSB0aGUgZGF0YWJhc2UgYW5kIHRoZSB3ZWIgc2VydmljZSAtLT4NCi0gICAgICAgIA0KLSAgICA8IS0tIG5vdGUgdGhhdCB0aGUgbW9jayBsaWJyYXJ5IHdpbGwgb25seSBiZSBpbiBlZmZpZWN0IGluIHRoaXMgSmVsbHlDb250ZXh0LiANCi0gICAgICAgIHx8IEVhY2ggdGVzdDpjYXNlIGhhcyBpdHMgb3duIGNvbnRleHQNCi0gICAgICAtLT4NCi0gICAgICAgIDxqOnNldCB2YXI9ImZvb2RLaW5kIiB2YWx1ZT0icGl6emEiLz4NCi0gICAgICAgICAgDQotPCEtLSAgICAgIDxtb2NrOnRhZ2xpYiB1cmk9ImplbGx5OnNxbCI+ICAgICAgDQotICAgICAgICA8bW9jazp0YWcgbmFtZT0icXVlcnkiPg0KLS0tPiAgICAgICAgICAgIA0KLSAgICAgICAgICA8IS0tIGdlbmVyYXRlIGEgbW9jayByZXN1bHQgc2V0ICAgDQotICAgICAgICAgIDxzcWw6cmVzdWx0U2V0IHZhcj0icmVzdWx0cyI+DQotICAgICAgICAgIDxzcWw6cm93IGlkPSJhYmMiLz4NCi0gICAgICAgICAgPHNxbDpyb3cgaWQ9ImRlZiIvPg0KLSAgICAgICAgICA8L3NxbDpyZXN1bHRTZXQ+DQotICAgICAgICAgICAtLT4gDQotICAgICAgICAgIDwhLS0gc2luY2Ugd2UgYXJlIGluc2lkZSBhIFRhZyBDb250ZXh0LCBsZXRzIGV4cG9ydCB0aGUgcmVzdWx0cyB2YXJpYWJsZSB0byB0aGUgcGFyZW50IGNvbnRleHQgDQotICAgICAgICAgIDxqOnNldCB2YXI9IiR7dmFyfSIgc2NvcGU9InBhcmVudCIgdmFsdWU9IiR7cmVzdWx0c30iLz4tLT4NCi08IS0tICAgICAgPC9tb2NrOnRhZz4NCi0gICAgICANCi0gICAgICAgIDxtb2NrOnRhZyBuYW1lPSJwYXJhbSI+DQotICAgICAgICAgICAgPHRlc3Q6ZXF1YWxzIGV4cGVjdHM9InBpenphIiB2YWx1ZT0iJHt2YWx1ZX0iLz4NCi0gICAgICA8L21vY2s6dGFnPg0KLSAgICAgICAgPC9tb2NrOnRhZ2xpYj4NCi0tLT4NCi0gICAgICAgIDxtb2NrOnRhZ2xpYiB1cmk9Im15Rm9vZFdlYlNlcnZpY2UiPg0KLSAgICAgICAgICA8bW9jazp0YWcgbmFtZT0iZWF0Ij4NCi0gICAgICAgICAgICAgIDxsb2c6aW5mbz5JbnZva2luZyB0aGUgZWF0IHdlYiBzZXJ2aWNlIHdpdGggJHtjaGVlc2V9PC9sb2c6aW5mbz4NCi0gICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICA8IS0tIGluY3JlbWVudCB0aGUgY291bnRlciwgaW4gdGhlIHBhcmVudCBzY29wZSBzbyBub3QgdG8gdXNlIGEgbG9jYWwgdmFyaWFibGUgLS0+DQotICAgICAgICAgICAgICA8ajpzZXQgdmFyPSJlYXRTZXJ2aWNlQ291bnQiIHNjb3BlPSJwYXJlbnQiIHZhbHVlPSIkezErZWF0U2VydmljZUNvdW50fSIvPg0KLSAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICA8ajpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICA8ajp3aGVuIHRlc3Q9IiR7ZWF0U2VydmljZUNvdW50ID09IDF9Ij4gICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iYWJjIiBhY3R1YWw9IiR7Y2hlZXNlfSIvPg0KLSAgICAgICAgICAgICAgICAgICAgPC9qOndoZW4+ICAgICAgICAgICAgICANCi0NCi0gICAgICAgICAgICAgICAgICAgIDxqOndoZW4gdGVzdD0iJHtlYXRTZXJ2aWNlQ291bnQgPT0gMn0iPiAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJkZWYiIGFjdHVhbD0iJHtjaGVlc2V9Ii8+DQotICAgICAgICAgICAgICAgICAgICA8L2o6d2hlbj4gICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICA8ajpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Q6ZmFpbD5JbnZva2VkIGVhdCB3ZWIgc2VydmljZSB0b28gbWFueSB0aW1lcyE8L3Rlc3Q6ZmFpbD4NCi0gICAgICAgICAgICAgICAgICAgIDwvajpvdGhlcndpc2U+DQotICAgICAgICAgICAgICA8L2o6Y2hvb3NlPg0KLSAgICAgICAgICAgIDwvbW9jazp0YWc+DQotICAgICAgICA8L21vY2s6dGFnbGliPg0KLQ0KLSAgICAgICAgPCEtLSBub3cgbGV0cyBpbnZva2UgdGhlIHNlcnZpY2UgdXNpbmcgdGhlIE1vY2sgVGFncyAtLT4gICAgICAgIA0KLSAgICAgICAgPGo6aW5jbHVkZSB1cmk9InNlcnZpY2UuamVsbHkiLz4NCi0gICAgICAgIA0KLSAgICANCi0gICAgICAgIDwhLS0gbGV0cyBhc3NlcnQgdGhhdCB0aGUgbW9jayBvYmplY3RzIGhhdmUgYmVlbiBpbnZva2VkIGNvcnJlY3RseSAtLT4NCi0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2VhdFNlcnZpY2VDb3VudCA9PSAyfSI+U2hvdWxkIGhhdmUgaW52b2tlZCB0aGUgZWF0IHdlYiBzZXJ2aWNlIHR3aWNlPC90ZXN0OmFzc2VydD4NCi0gICAgICAgIA0KLSAgICA8L3Rlc3Q6Y2FzZT4NCi0NCi08L3Rlc3Q6c3VpdGU+DQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9kZWZpbmUveGRvY3MvY2hhbmdlcy54bWwgYi9qZWxseS10YWdzL2RlZmluZS94ZG9jcy9jaGFuZ2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExNDY0MS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2RlZmluZS94ZG9jcy9jaGFuZ2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0gLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkNoYW5nZXM8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLSAgPGJvZHk+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4wIiBkYXRlPSIyMDA0LTA5LTExIj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJhZGQiPkluaXRpYWwgUmVsZWFzZTwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZGVmaW5lL3hkb2NzL2luZGV4LnhtbCBiL2plbGx5LXRhZ3MvZGVmaW5lL3hkb2NzL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczYjc0YS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2RlZmluZS94ZG9jcy9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5EZWZpbmUgVGFnIExpYnJhcnk8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLQotICA8Ym9keT4KLSAgICA8c2VjdGlvbiBuYW1lPSJPdmVydmlldyI+Ci0gICAgICA8cD4KLSAgICAgICAgVGFnIGxpYnJhcnkgd2hpY2ggYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBuZXcgdGFncyB1c2luZyBKZWxseSBzY3JpcHQgaXRzZWxmLgotICAgICAgICBTZWUgdGhlIDxhIGhyZWY9InRhZ3MuaHRtbCI+dGFnczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICA8L3A+Ci0gICAgPC9zZWN0aW9uPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2RlZmluZS94ZG9jcy9uYXZpZ2F0aW9uLnhtbCBiL2plbGx5LXRhZ3MvZGVmaW5lL3hkb2NzL25hdmlnYXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWY4NTk2Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvZGVmaW5lL3hkb2NzL25hdmlnYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBuYW1lPSJEZWZpbmUgVGFnIExpYnJhcnkiPgotCi0gIDx0aXRsZT5EZWZpbmUgVGFnIExpYnJhcnk8L3RpdGxlPgotICAKLSAgPGJvZHk+Ci0gICAgPG1lbnUgbmFtZT0iRGVmaW5lIFRhZyBMaWJyYXJ5Ij4KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICAgICAgICAgICBocmVmPSIvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iVGFncyIgICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWdzLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZHluYWJlYW4vLmN2c2lnbm9yZSBiL2plbGx5LXRhZ3MvZHluYWJlYW4vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNhMmNkYS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2R5bmFiZWFuLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXRhcmdldAotbWF2ZW4ubG9nCi12ZWxvY2l0eS5sb2cKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZHluYWJlYW4vYnVpbGQueG1sIGIvamVsbHktdGFncy9keW5hYmVhbi9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYWUyMWMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9keW5hYmVhbi9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLWJ1aWxkLnhtbCBnZW5lcmF0ZWQgYnkgbWF2ZW4gZnJvbSBwcm9qZWN0LnhtbCB2ZXJzaW9uIDEuMC1TTkFQU0hPVAotICBvbiBkYXRlIE1heSAyNCAyMDA0LCB0aW1lIDIzMDEtLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImphciIgbmFtZT0iY29tbW9ucy1qZWxseS10YWdzLWR5bmFiZWFuIiBiYXNlZGlyPSIuIj4KLSAgPHByb3BlcnR5IG5hbWU9ImRlZmF1bHR0YXJnZXRkaXIiIHZhbHVlPSJ0YXJnZXQiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0ibGliZGlyIiB2YWx1ZT0idGFyZ2V0L2xpYiI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L2NsYXNzZXMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0idGVzdGNsYXNzZXNkaXIiIHZhbHVlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RyZXBvcnRkaXIiIHZhbHVlPSJ0YXJnZXQvdGVzdC1yZXBvcnRzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImRpc3RkaXIiIHZhbHVlPSJkaXN0Ij4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImphdmFkb2NkaXIiIHZhbHVlPSJkaXN0L2RvY3MvYXBpIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImZpbmFsLm5hbWUiIHZhbHVlPSJjb21tb25zLWplbGx5LXRhZ3MtZHluYWJlYW4tMS4wLVNOQVBTSE9UIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0ibyBJbml0aWFsaXplcyBzb21lIHByb3BlcnRpZXMiPgotICAgIDxta2RpciBkaXI9IiR7bGliZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJub2dldCI+Ci0gICAgICA8ZXF1YWxzIGFyZzI9Im9ubHkiIGFyZzE9IiR7YnVpbGQuc3lzY2xhc3NwYXRofSI+Ci0gICAgICA8L2VxdWFscz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249Im8gQ29tcGlsZSB0aGUgY29kZSIgZGVwZW5kcz0iZ2V0LWRlcHMiPgotICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7Y2xhc3Nlc2Rpcn0iIGRlcHJlY2F0aW9uPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSIgb3B0aW1pemU9ImZhbHNlIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIj4KLSAgICAgIDxzcmM+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL2phdmEiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9zcmM+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgICA8Y29weSB0b2Rpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy9qYXZhIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgICA8Y29weSB0b2Rpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamVsbHkiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhzbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5ybmciPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouZHRkIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouaHRtbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphciIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIHRoZSBqYXIiIGRlcGVuZHM9ImNvbXBpbGUsdGVzdCI+Ci0gICAgPGphciBqYXJmaWxlPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiIGJhc2VkaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgIDwvamFyPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249Im8gQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBkaXJlY3RvcmllcyI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iPgotICAgIDwvZGVsZXRlPgotICAgIDxkZWxldGUgZGlyPSIke2Rpc3RkaXJ9Ij4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIGEgZGlzdHJpYnV0aW9uIiBkZXBlbmRzPSJqYXIsIGphdmFkb2MiPgotICAgIDxta2RpciBkaXI9ImRpc3QiPgotICAgIDwvbWtkaXI+Ci0gICAgPGNvcHkgdG9kaXI9ImRpc3QiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2RlZmF1bHR0YXJnZXRkaXJ9IiBpbmNsdWRlcz0iKi5qYXIiPgotICAgICAgPC9maWxlc2V0PgotICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRlcz0iTElDRU5TRSosIFJFQURNRSoiPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249Im8gUnVuIHRoZSB0ZXN0IGNhc2VzIiBpZj0idGVzdC5mYWlsdXJlIiBkZXBlbmRzPSJpbnRlcm5hbC10ZXN0Ij4KLSAgICA8ZmFpbCBtZXNzYWdlPSJUaGVyZSB3ZXJlIHRlc3QgZmFpbHVyZXMuIj4KLSAgICA8L2ZhaWw+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImludGVybmFsLXRlc3QiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdHMiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdHJlcG9ydGRpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGp1bml0IGRpcj0iLi8iIGZhaWx1cmVwcm9wZXJ0eT0idGVzdC5mYWlsdXJlIiBwcmludFN1bW1hcnk9InllcyIgZm9yaz0idHJ1ZSIgaGFsdG9uZXJyb3I9InRydWUiPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYmFzZWRpciIgdmFsdWU9Ii4iPgotICAgICAgPC9zeXNwcm9wZXJ0eT4KLSAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIj4KLSAgICAgIDwvZm9ybWF0dGVyPgotICAgICAgPGZvcm1hdHRlciB1c2VmaWxlPSJmYWxzZSIgdHlwZT0icGxhaW4iPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdHJlcG9ydGRpcn0iPgotICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9UZXN0Ki5qYXZhIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvYmF0Y2h0ZXN0PgotICAgIDwvanVuaXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtdGVzdHMiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqYXZhYyBkZXN0ZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvdGVzdCI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MiIGRlc2NyaXB0aW9uPSJvIEdlbmVyYXRlIGphdmFkb2MiIGRlcGVuZHM9ImphciI+Ci0gICAgPG1rZGlyIGRpcj0iJHtqYXZhZG9jZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8dHN0YW1wPgotICAgICAgPGZvcm1hdCBwYXR0ZXJuPSIyMDAyLXl5eXkiIHByb3BlcnR5PSJ5ZWFyIj4KLSAgICAgIDwvZm9ybWF0PgotICAgIDwvdHN0YW1wPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb3B5cmlnaHQiIHZhbHVlPSJDb3B5cmlnaHQgJmFtcDtjb3B5OyAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSIgdmFsdWU9ImNvbW1vbnMtamVsbHktdGFncy1keW5hYmVhbiAxLjAtU05BUFNIT1QgQVBJIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxqYXZhZG9jIHVzZT0idHJ1ZSIgcHJpdmF0ZT0idHJ1ZSIgZGVzdGRpcj0iJHtqYXZhZG9jZGlyfSIgYXV0aG9yPSJ0cnVlIiB2ZXJzaW9uPSJ0cnVlIiBzb3VyY2VwYXRoPSJzcmMvamF2YSIgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5keW5hYmVhbi4qIj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0idGFyZ2V0LyR7ZmluYWwubmFtZX0uamFyIj4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWRvYz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iZ2V0LWRlcHMiIHVubGVzcz0ibm9nZXQiIGRlcGVuZHM9ImluaXQiPgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamVsbHkvamFycy9jb21tb25zLWplbGx5LVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS10YWdzLWp1bml0LVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS10YWdzLWp1bml0LVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZXhsLVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWpleGwvamFycy9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS94bWwtYXBpcy0xLjAuYjIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3htbC1hcGlzL2phcnMveG1sLWFwaXMtMS4wLmIyLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1iZWFudXRpbHMtMS42LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWJlYW51dGlscy9qYXJzL2NvbW1vbnMtYmVhbnV0aWxzLTEuNi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtY29sbGVjdGlvbnMtMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWNvbGxlY3Rpb25zL2phcnMvY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWxvZ2dpbmctMS4wLjMuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtbG9nZ2luZy9qYXJzL2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2RvbTRqLTEuNS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2RvbTRqL2phcnMvZG9tNGotMS41LWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2pheGVuLTEuMS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2pheGVuL2phcnMvamF4ZW4tMS4xLWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3hlcmNlcy0yLjIuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veGVyY2VzL2phcnMveGVyY2VzLTIuMi4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vanVuaXQtMy44LjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2p1bml0L2phcnMvanVuaXQtMy44LjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vYW50LW9wdGlvbmFsLTEuNS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vYW50L2phcnMvYW50LW9wdGlvbmFsLTEuNS5qYXIiPgotICAgIDwvZ2V0PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJpbnN0YWxsLW1hdmVuIj4KLSAgICA8Z2V0IGRlc3Q9IiR7dXNlci5ob21lfS9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgc3JjPSIke3JlcG99L21hdmVuL21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPHVuamFyIGRlc3Q9IiR7bWF2ZW4uaG9tZX0iIHNyYz0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC91bmphcj4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9keW5hYmVhbi9tYXZlbi54bWwgYi9qZWxseS10YWdzL2R5bmFiZWFuL21hdmVuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3YWRiMy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2R5bmFiZWFuL21hdmVuLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXZhOmphciI+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZHluYWJlYW4vcHJvamVjdC5wcm9wZXJ0aWVzIGIvamVsbHktdGFncy9keW5hYmVhbi9wcm9qZWN0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMTljYmMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9keW5hYmVhbi9wcm9qZWN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIyAKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFAgUiBPIEogRSBDIFQgIFAgUiBPIFAgRSBSIFQgSSBFIFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9keW5hYmVhbi9wcm9qZWN0LnhtbCBiL2plbGx5LXRhZ3MvZHluYWJlYW4vcHJvamVjdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NTUzOWUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9keW5hYmVhbi9wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3Q+Ci0gIDxleHRlbmQ+JHtiYXNlZGlyfS8uLi90YWctcHJvamVjdC54bWw8L2V4dGVuZD4KLSAgPGlkPmNvbW1vbnMtamVsbHktdGFncy1keW5hYmVhbjwvaWQ+Ci0gIDxuYW1lPmNvbW1vbnMtamVsbHktdGFncy1keW5hYmVhbjwvbmFtZT4KLSAgPGN1cnJlbnRWZXJzaW9uPjEuMDwvY3VycmVudFZlcnNpb24+Ci0KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZHluYWJlYW48L3BhY2thZ2U+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICAgICAgIFRoZSBKZWxseSBEeW5hQmVhbiBUYWcgTGlicmFyeQotICA8L2Rlc2NyaXB0aW9uPgotICA8c2hvcnREZXNjcmlwdGlvbj5Db21tb25zIEplbGx5IER5bmEgQmVhbiBUYWcgTGlicmFyeTwvc2hvcnREZXNjcmlwdGlvbj4KLSAgCi0gIDx2ZXJzaW9ucz4KLSAgICA8dmVyc2lvbj4KLSAgICAgIDxpZD4xLjA8L2lkPgotICAgICAgPG5hbWU+MS4wPC9uYW1lPgotICAgICAgPHRhZz5DT01NT05TX0pFTExZX0RZTkFCRUFOLTFfMDwvdGFnPgotICAgIDwvdmVyc2lvbj4KLSAgPC92ZXJzaW9ucz4KLQotICA8ZGVwZW5kZW5jaWVzPgotCi0gICAgPCEtLSBTVEFSVCBmb3IgdGVzdCAtLT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1qZWxseTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtamVsbHktdGFncy1qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgIDx1cmw+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvPC91cmw+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPCEtLSBFTkQgZm9yIHRlc3QgLS0+Ci0KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9keW5hYmVhbi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9keW5hYmVhbi9EeW5hYmVhblRhZy5qYXZhIGIvamVsbHktdGFncy9keW5hYmVhbi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9keW5hYmVhbi9EeW5hYmVhblRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWE1NDQ4Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvZHluYWJlYW4vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZHluYWJlYW4vRHluYWJlYW5UYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZHluYWJlYW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkR5bmFCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuRHluYUNsYXNzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0KLS8qKiBBIHRhZyB3aGljaCBjb25kaXRpb25hbGx5IGV2YWx1YXRlcyBpdHMgYm9keSBiYXNlZCBvbiBzb21lIGNvbmRpdGlvbgotICAqCi0gICogQGF1dGhvciBUaGVvIE5pZW1laWplcgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBEeW5hYmVhblRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgcHJpdmF0ZSBEeW5hQ2xhc3MgZHluYUNsYXNzOwotICAgIHByaXZhdGUgU3RyaW5nIHZhcjsKLQotICAgIHB1YmxpYyBEeW5hYmVhblRhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoZHluYUNsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCAiZHluYWNsYXNzIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiggInZhciIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgZHluYWJlYW4gaW5zdGFuY2UgZm9yIHRoaXMgZHluYWNsYXNzCi0gICAgICAgICAgICBEeW5hQmVhbiBkeW5hQmVhbiA9IGR5bmFDbGFzcy5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgICAgICAvLyBQbGFjZSBuZXcgZHluYWJlYW4gaW4gY29udGV4dCBhcyBhIHZhcmlhYmxlCi0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKGdldFZhcigpLCBkeW5hQmVhbik7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIER5bmFDbGFzcyBvZiB0aGUgbmV3IGluc3RhbmNlIHRvIGNyZWF0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldER5bmFjbGFzcyhEeW5hQ2xhc3MgZHluYUNsYXNzKSB7Ci0gICAgICAgIHRoaXMuZHluYUNsYXNzID0gZHluYUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFyKCkgewotICAgICAgICByZXR1cm4gdmFyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGV4cG9ydCB0aGUgbmV3IER5bmFCZWFuIGluc3RhbmNlIHRvCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZHluYWJlYW4vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZHluYWJlYW4vRHluYWJlYW5UYWdMaWJyYXJ5LmphdmEgYi9qZWxseS10YWdzL2R5bmFiZWFuL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2R5bmFiZWFuL0R5bmFiZWFuVGFnTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDY1Y2EwLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvZHluYWJlYW4vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZHluYWJlYW4vRHluYWJlYW5UYWdMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmR5bmFiZWFuOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ0xpYnJhcnk7Ci0KLS8qKiBEZXNjcmliZXMgdGhlIFRhZ2xpYi4gVGhpcyBjbGFzcyBjb3VsZCBiZSBnZW5lcmF0ZWQgYnkgWERvY2xldAotICAqCi0gICogQGF1dGhvciBUaGVvIE5pZW1laWplcgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBEeW5hYmVhblRhZ0xpYnJhcnkgZXh0ZW5kcyBUYWdMaWJyYXJ5IHsKLQotICAgIHB1YmxpYyBEeW5hYmVhblRhZ0xpYnJhcnkoKSB7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJkeW5hY2xhc3MiLCBEeW5hY2xhc3NUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygicHJvcGVydHkiLCBQcm9wZXJ0eVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJkeW5hYmVhbiIsIER5bmFiZWFuVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInNldCIsIFNldFRhZy5jbGFzcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2R5bmFiZWFuL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2R5bmFiZWFuL0R5bmFjbGFzc1RhZy5qYXZhIGIvamVsbHktdGFncy9keW5hYmVhbi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9keW5hYmVhbi9EeW5hY2xhc3NUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVlNmQ2Mi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2R5bmFiZWFuL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2R5bmFiZWFuL0R5bmFjbGFzc1RhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZHluYWJlYW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5CYXNpY0R5bmFDbGFzczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkR5bmFDbGFzczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkR5bmFQcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqCi0gKiBBIHRhZyB3aGljaCBjcmVhdGVzIGFuZCBkZWZpbmVzIGFuZCBjcmVhdGVzIGEgRHluYUNsYXNzCi0gKiBUaGUgRHluYUNsYXNzIG9iamVjdCBpcyBwbGFjZWQgYnkgbmFtZSBpbiB0aGUgY29udGV4dCwKLSAqIHNvIHRoYXQgYSBEeW5hQmVhbiB0YWcgY2FuIHVzZSBpdCBieSBuYW1lIHRvIGluc3RhbnRpYXRlCi0gKiBhIER5bmFCZWFuIG9iamVjdAotICoKLSAqIEBhdXRob3IgVGhlbyBOaWVtZWlqZXIKLSAqIEB2ZXJzaW9uIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRHluYWNsYXNzVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdCBwcm9wTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIER5bmFQcm9wZXJ0eVtdIHByb3BzID0gbnVsbDsKLSAgICBwcml2YXRlIER5bmFDbGFzcyBkeW5hQ2xhc3MgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0KLSAgICBwdWJsaWMgRHluYWNsYXNzVGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiwgSmVsbHlUYWdFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCJuYW1lIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmFyID09IG51bGwpIHsKLSAgICAgICAgICAgIHZhciA9IG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFdmFsdWF0ZSB0aGUgYm9keSBvZiB0aGUgZHluYWNsYXNzIGRlZmluaXRpb24KLSAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotCi0gICAgICAgIC8vIENvbnZlcnQgdGhlIGxpc3Qgb2YgcHJvcGVydGllcyBpbnRvIGFycmF5Ci0gICAgICAgIHByb3BzID0KLSAgICAgICAgICAgIChEeW5hUHJvcGVydHlbXSkgcHJvcExpc3QudG9BcnJheSgKLSAgICAgICAgICAgICAgICBuZXcgRHluYVByb3BlcnR5W3Byb3BMaXN0LnNpemUoKV0pOwotCi0gICAgICAgIGlmIChwcm9wcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIk5vIHByb3BlcnRpZXMgbGlzdCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3BzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIk5vIHByb3BlcnRpZXMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgZHluYWNsYXNzIHdpdGggbmFtZSBhbmQgcHJvcGVydGllcwotICAgICAgICBkeW5hQ2xhc3MgPSAoRHluYUNsYXNzKSBuZXcgQmFzaWNEeW5hQ2xhc3MobmFtZSwgbnVsbCwgcHJvcHMpOwotCi0gICAgICAgIC8vIFBsYWNlIG5ldyBkeW5hY2xhc3MgaW4gY29udGV4dAotICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKGdldFZhcigpLCBkeW5hQ2xhc3MpOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIG5ldyBEeW5hQ2xhc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWYXIoKSB7Ci0gICAgICAgIHJldHVybiB2YXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gZXhwb3J0IHRoZSBEeW5hQ2xhc3MgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGREeW5hUHJvcGVydHkoRHluYVByb3BlcnR5IHByb3ApIHsKLSAgICAgICAgcHJvcExpc3QuYWRkKHByb3ApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZHluYWJlYW4vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZHluYWJlYW4vUHJvcGVydHlUYWcuamF2YSBiL2plbGx5LXRhZ3MvZHluYWJlYW4vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZHluYWJlYW4vUHJvcGVydHlUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIyYjE0Ni4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2R5bmFiZWFuL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2R5bmFiZWFuL1Byb3BlcnR5VGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5keW5hYmVhbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuRHluYVByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKioKLSAqIER5bmFQcm9wZXJ0eSB0YWcgZGVmaW5lcyBhIHByb3BlcnR5IG9mIGEgRHluYUNsYXNzCi0gKiBJdCBjYW4gb25seSBleGlzdCBpbnNpZGUgYSBEeW5hQ2xhc3MgcGFyZW50IGNvbnRleHQKLSAqIFRoZSBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byB0aGUgcHJvcGVydGllcyBhcnJheQotICogb2YgdGhlIHBhcmVudCBjb250ZXh0LCBhbmQgd2lsbCBiZSB1c2VkIHRvCi0gKiBjcmVhdGUgdGhlIER5bmFDbGFzcyBvYmplY3QKLSAqCi0gKiBAYXV0aG9yIFRoZW8gTmllbWVpamVyCi0gKiBAdmVyc2lvbiAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5VGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7Ci0gICAgcHJpdmF0ZSBDbGFzcyBwcm9wZXJ0eUNsYXNzOwotICAgIHByaXZhdGUgRHluYVByb3BlcnR5IHByb3A7Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnIChYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiwgSmVsbHlUYWdFeGNlcHRpb24gewotCi0gICAgICAgIC8vIENoZWNrIHRoYXQgdGhpcyB0YWcgaXMgdXNlZCBpbnNpZGUgdGhlIGJvZHkgb2YKLSAgICAgICAgLy8gYSBEeW5hQ2xhc3MgdGFnLCBzbyB0aGF0IGl0IGNhbiBhY2Nlc3MgdGhlCi0gICAgICAgIC8vIGNvbnRleHQgb2YgdGhhdCB0YWcKLSAgICAgICAgRHluYWNsYXNzVGFnIHBhcmVudFRhZyA9IChEeW5hY2xhc3NUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyggRHluYWNsYXNzVGFnLmNsYXNzICk7Ci0gICAgICAgIGlmICggcGFyZW50VGFnID09IG51bGwgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICJUaGlzIHRhZyBtdXN0IGJlIGVuY2xvc2VkIGluc2lkZSBhIDxkeW5hY2xhc3M+IHRhZyIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIHByb3BlcnR5IG5hbWUKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oICJuYW1lIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTG9va3VwIGFwcHJvcHJpYXRlIHByb3BlcnR5IGNsYXNzCi0gICAgICAgIENsYXNzIHByb3BDbGFzcyA9IHByb3BlcnR5Q2xhc3M7Ci0gICAgICAgIGlmIChwcm9wQ2xhc3MgPT0gbnVsbCkgewotCi0gICAgICAgICAgICAvLyBDaGVjayBwcm9wZXJ0eSB0eXBlCi0gICAgICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oICJ0eXBlIiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodHlwZS5lcXVhbHMoIlN0cmluZyIpKSB7Ci0gICAgICAgICAgICAgICAgcHJvcENsYXNzID0gU3RyaW5nLmNsYXNzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoIkludGVnZXIiKSkgewotICAgICAgICAgICAgICAgIHByb3BDbGFzcyA9IEludGVnZXIuVFlQRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJTaG9ydCIpKSB7Ci0gICAgICAgICAgICAgICAgcHJvcENsYXNzID0gU2hvcnQuVFlQRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJMb25nIikpIHsKLSAgICAgICAgICAgICAgICBwcm9wQ2xhc3MgPSBMb25nLlRZUEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0eXBlLmVxdWFscygiRmxvYXQiKSkgewotICAgICAgICAgICAgICAgIHByb3BDbGFzcyA9IEZsb2F0LlRZUEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0eXBlLmVxdWFscygiRG91YmxlIikpIHsKLSAgICAgICAgICAgICAgICBwcm9wQ2xhc3MgPSBEb3VibGUuVFlQRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJMb25nIikpIHsKLSAgICAgICAgICAgICAgICBwcm9wQ2xhc3MgPSBMb25nLlRZUEU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcm9wQ2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BDbGFzcyA9IENsYXNzLmZvck5hbWUodHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIkNsYXNzICIgKyB0eXBlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG5vdCBmb3VuZCBieSBDbGFzcy5mb3JOYW1lIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGR5bmFwcm9wZXJ0eSBvYmplY3Qgd2l0aCBnaXZlbiBuYW1lIGFuZCB0eXBlCi0gICAgICAgIHByb3AgPSBuZXcgRHluYVByb3BlcnR5IChuYW1lLCBwcm9wQ2xhc3MpOwotCi0gICAgICAgIC8vIEFkZCBuZXcgcHJvcGVydHkgdG8gZHluYWNsYXNzIGNvbnRleHQKLSAgICAgICAgcGFyZW50VGFnLmFkZER5bmFQcm9wZXJ0eShwcm9wKTsKLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgcHJvcGVydHkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdHlwZSBuYW1lIG9mIHRoaXMgcHJvcGVydHkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgQ2xhc3MgZm9yIHRoaXMgcHJvcGVydHkKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0UHJvcGVydHlDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5Q2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgQ2xhc3MgaW5zdGFuY2UgZm9yIHRoaXMgcHJvcGVydHkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eUNsYXNzKENsYXNzIHByb3BlcnR5Q2xhc3MpIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eUNsYXNzID0gcHJvcGVydHlDbGFzczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZHluYWJlYW4vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZHluYWJlYW4vU2V0VGFnLmphdmEgYi9qZWxseS10YWdzL2R5bmFiZWFuL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2R5bmFiZWFuL1NldFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTgwZjc1Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvZHluYWJlYW4vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZHluYWJlYW4vU2V0VGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5keW5hYmVhbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkJlYW5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKiogQSB0YWcgd2hpY2ggc2V0cyBhIHZhcmlhYmxlIGZyb20gdGhlIHJlc3VsdCBvZiBhbiBleHByZXNzaW9uCi0gICoKLSAqIEBhdXRob3IgVGhlbyBOaWVtZWlqZXIKLSAqIEB2ZXJzaW9uIDEuMAotICAqLwotcHVibGljIGNsYXNzIFNldFRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNldFRhZy5jbGFzcyk7Ci0KLSAgICAvKiogVGhlIHZhcmlhYmxlIG5hbWUgdG8gZXhwb3J0LiAqLwotICAgIHByaXZhdGUgU3RyaW5nIHZhcjsKLQotICAgIC8qKiBUaGUgdmFyaWFibGUgc2NvcGUgdG8gZXhwb3J0ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2NvcGU7Ci0KLSAgICAvKiogVGhlIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuICovCi0gICAgcHJpdmF0ZSBFeHByZXNzaW9uIHZhbHVlOwotCi0gICAgLyoqIFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRvIHNldCBhIHByb3BlcnR5LiAqLwotICAgIHByaXZhdGUgT2JqZWN0IHRhcmdldDsKLQotICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0IG9uIHRoZSB0YXJnZXQgb2JqZWN0LiAqLwotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5OwotCi0gICAgcHVibGljIFNldFRhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IGFuc3dlciA9IG51bGw7Ci0gICAgICAgIGlmICggdmFsdWUgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIGFuc3dlciA9IHZhbHVlLmV2YWx1YXRlKGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYW5zd2VyID0gZ2V0Qm9keVRleHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFzc3VtZSB0aGF0IGlmIGEgdmFyIG5hbWUgYW5kIGEgcHJvcGVydHkgaXMgZ2l2ZW4gdGhlbgotICAgICAgICAvLyB2YXIgaXMgdGhlIG5hbWUgb2YgYW4gb2JqZWN0IGluIHRoZSBjb250ZXh0Ci0gICAgICAgIGlmICgoIHZhciAhPSBudWxsICkKLSAgICAgICAgJiYgKCBwcm9wZXJ0eSAhPSBudWxsKQotICAgICAgICAmJiAoIHRhcmdldCA9PSBudWxsICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEdldCBvYmplY3QgZnJvbSBjb250ZXh0Ci0gICAgICAgICAgICBpZiAoIHNjb3BlICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICB0YXJnZXQgPSBjb250ZXh0LmdldFZhcmlhYmxlKHZhciwgc2NvcGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0ID0gY29udGV4dC5nZXRWYXJpYWJsZSh2YXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2YXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCB2YXIgIT0gbnVsbCApIHsKLQotCi0gICAgICAgICAgICBpZiAoIHNjb3BlICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIHNjb3BlLCBhbnN3ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIGFuc3dlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIHRhcmdldCA9PSBudWxsICkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIkVpdGhlciBhICd2YXInIG9yIGEgJ3RhcmdldCcgYXR0cmlidXRlIG11c3QgYmUgZGVmaW5lZCBmb3IgdGhpcyB0YWciICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIHByb3BlcnR5ID09IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCAiWW91IG11c3QgZGVmaW5lIGEgJ3Byb3BlcnR5JyBhdHRyaWJ1dGUgaWYgeW91IHNwZWNpZnkgYSAndGFyZ2V0JyIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFByb3BlcnR5VmFsdWUoIHRhcmdldCwgcHJvcGVydHksIGFuc3dlciApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKiBTZXRzIHRoZSB2YXJpYWJsZSBuYW1lIHRvIGRlZmluZSBmb3IgdGhpcyBleHByZXNzaW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFyaWFibGUgc2NvcGUgZm9yIHRoaXMgdmFyaWFibGUuIEZvciBleGFtcGxlIHNldHRpbmcgdGhpcyB2YWx1ZSB0byAncGFyZW50JyB3aWxsCi0gICAgICogc2V0IHRoaXMgdmFsdWUgaW4gdGhlIHBhcmVudCBzY29wZS4gV2hlbiBKZWxseSBpcyBydW4gZnJvbSBpbnNpZGUgYSBTZXJ2bGV0IGVudmlyb25tZW50Ci0gICAgICogdGhlbiBvdGhlciBzY29wZXMgd2lsbCBiZSBhdmFpbGFibGUgc3VjaCBhcyAncmVxdWVzdCcsICdzZXNzaW9uJyBvciAnYXBwbGljYXRpb24nLgotICAgICAqCi0gICAgICogT3RoZXIgYXBwbGljYXRpb25zIG1heSBpbXBsZW1lbnQgdGhlaXIgb3duIGN1c3RvbSBzY29wZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlKSB7Ci0gICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyB0aGUgZXhwcmVzc2lvbiB0byBldmFsdWF0ZS4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShFeHByZXNzaW9uIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyB0aGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0byBzZXQgYSBwcm9wZXJ0eS4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoT2JqZWN0IHRhcmdldCkgewotICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0IG9uIHRoZSB0YXJnZXQgb2JqZWN0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgewotICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5VmFsdWUoIE9iamVjdCB0YXJnZXQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlICkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCB0YXJnZXQgaW5zdGFuY2VvZiBNYXAgKSB7Ci0gICAgICAgICAgICAgICAgTWFwIG1hcCA9IChNYXApIHRhcmdldDsKLSAgICAgICAgICAgICAgICBtYXAucHV0KCBwcm9wZXJ0eSwgdmFsdWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIEJlYW5VdGlscy5zZXRQcm9wZXJ0eSggdGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvciggIkZhaWxlZCB0byBzZXQgdGhlIHByb3BlcnR5OiAiICsgcHJvcGVydHkgKyAiIG9uIGJlYW46ICIgKyB0YXJnZXQgKyAiIHRvIHZhbHVlOiAiICsgdmFsdWUgKyAiIGR1ZSB0byBleGNlcHRpb246ICIgKyBlLCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZHluYWJlYW4vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZHluYWJlYW4vcGFja2FnZS5odG1sIGIvamVsbHktdGFncy9keW5hYmVhbi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9keW5hYmVhbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYWE5ZDMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9keW5hYmVhbi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9keW5hYmVhbi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGh0bWw+Ci08aGVhZD4KLTwvaGVhZD4KLTxib2R5PgotCi0gIDxwPkEgdGFnIGxpYnJhcnkgZm9yIGNyZWF0aW5nIG5ldyBEeW5hQ2xhc3MgYW5kIER5bmFCZWFuIG9iamVjdHMgZnJvbSB0aGUgCi0gIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9iZWFudXRpbHMuaHRtbCI+YmVhbnV0aWxzPC9hPiBsaWJyYXJ5Ci0gIDwvcD4KLSAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2R5bmFiZWFuL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2R5bmFiZWFuL1Rlc3RKZWxseS5qYXZhIGIvamVsbHktdGFncy9keW5hYmVhbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9keW5hYmVhbi9UZXN0SmVsbHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk5MzZlYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2R5bmFiZWFuL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2R5bmFiZWFuL1Rlc3RKZWxseS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5keW5hYmVhbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qdW5pdC5KZWxseVRlc3RTdWl0ZTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyB0byBydW4gamVsbHkgdGVzdCBjYXNlcyBhcyBwYXJ0IG9mIEFudCdzIEpVbml0IHRlc3RzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjQgJAotICovCi1wdWJsaWMgY2xhc3MgVGVzdEplbGx5IGV4dGVuZHMgSmVsbHlUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oIHN1aXRlKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3JlYXRlVGVzdFN1aXRlKFRlc3RKZWxseS5jbGFzcywgInN1aXRlLmplbGx5Iik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9keW5hYmVhbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9keW5hYmVhbi9zdWl0ZS5qZWxseSBiL2plbGx5LXRhZ3MvZHluYWJlYW4vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZHluYWJlYW4vc3VpdGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODI4MDguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9keW5hYmVhbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9keW5hYmVhbi9zdWl0ZS5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLg0KLSAgDQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgDQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08dGVzdDpzdWl0ZSANCi0gICAgeG1sbnM6aj0iamVsbHk6Y29yZSINCi0gICAgeG1sbnM6ZHluYWJlYW49ImplbGx5OmR5bmFiZWFuIiANCi0gICAgeG1sbnM6dGVzdD0iamVsbHk6anVuaXQiIA0KLSAgICB4bWxuczpsb2c9ImplbGx5OmxvZyI+DQotDQotPHRlc3Q6Y2FzZSBuYW1lPSJzaW1wbGVEeW5hQmVhbiI+DQotDQotICA8ZHluYWJlYW46ZHluYWNsYXNzIHZhcj0iQ3VzdG9tZXJUeXBlIiBuYW1lID0iQ3VzdG9tZXJEeW5hQ2xhc3MiPiANCi0gICAgICAgIDxkeW5hYmVhbjpwcm9wZXJ0eSBuYW1lPSJuYW1lIiB0eXBlPSJTdHJpbmciIC8+DQotICAgICAgICA8ZHluYWJlYW46cHJvcGVydHkgbmFtZT0iYWRkcmVzcyIgdHlwZT0iU3RyaW5nIiAvPg0KLSAgICA8L2R5bmFiZWFuOmR5bmFjbGFzcz4NCi0NCi0gIDxkeW5hYmVhbjpkeW5hYmVhbiB2YXI9ImN1c3RvbWVyIiBkeW5hY2xhc3M9IiR7Q3VzdG9tZXJUeXBlfSIvPg0KLQ0KLSAgPGR5bmFiZWFuOnNldCB2YXI9ImN1c3RvbWVyIiBwcm9wZXJ0eT0ibmFtZSIgdmFsdWU9IkN1c3RvbWVyIDEiIC8+DQotICA8ZHluYWJlYW46c2V0IHZhcj0iY3VzdG9tZXIiIHByb3BlcnR5PSJhZGRyZXNzIiB2YWx1ZT0iQWRkcmVzcyBvZiBDdXN0b21lciAxIiAvPg0KLQ0KLSAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IkN1c3RvbWVyIDEiIGFjdHVhbD0iJHtjdXN0b21lci5uYW1lfSIvPg0KLSAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IkFkZHJlc3Mgb2YgQ3VzdG9tZXIgMSIgYWN0dWFsPSIke2N1c3RvbWVyLmFkZHJlc3N9Ii8+DQotICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iQ3VzdG9tZXJEeW5hQ2xhc3MiIGFjdHVhbD0iJHtjdXN0b21lci5keW5hQ2xhc3MubmFtZX0iLz4NCi0NCi08L3Rlc3Q6Y2FzZT4NCi0NCi0NCi08dGVzdDpjYXNlIG5hbWU9Im5lc3RlZER5bmFCZWFuIj4NCi0NCi0gIDxkeW5hYmVhbjpkeW5hY2xhc3MgdmFyPSJBZGRyZXNzVHlwZSIgbmFtZT0iQWRkcmVzc0R5bmFDbGFzcyI+IA0KLSAgICAgIDxkeW5hYmVhbjpwcm9wZXJ0eSBuYW1lPSJjaXR5IiB0eXBlPSJTdHJpbmciIC8+DQotICAgICAgPGR5bmFiZWFuOnByb3BlcnR5IG5hbWU9InN0cmVldCIgdHlwZT0iU3RyaW5nIiAvPg0KLSAgICAgIDxkeW5hYmVhbjpwcm9wZXJ0eSBuYW1lPSJob3VzZW51bWJlciIgdHlwZT0iSW50ZWdlciIgLz4NCi0gIDwvZHluYWJlYW46ZHluYWNsYXNzPg0KLQ0KLSAgPGR5bmFiZWFuOmR5bmFjbGFzcyB2YXI9IkN1c3RvbWVyVHlwZSIgbmFtZT0iQ3VzdG9tZXJEeW5hQ2xhc3MiPiANCi0gICAgICA8ZHluYWJlYW46cHJvcGVydHkgbmFtZT0ibmFtZSIgdHlwZT0iU3RyaW5nIiAvPg0KLSAgICAgIDxkeW5hYmVhbjpwcm9wZXJ0eSBuYW1lPSJhZGRyZXNzIiB0eXBlPSJvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkR5bmFCZWFuIi8+DQotICA8L2R5bmFiZWFuOmR5bmFjbGFzcz4NCi0NCi0NCi0gIDxkeW5hYmVhbjpkeW5hYmVhbiB2YXI9ImN1c3RvbWVyIiBkeW5hY2xhc3M9IiR7Q3VzdG9tZXJUeXBlfSIgLz4NCi0gIDxkeW5hYmVhbjpkeW5hYmVhbiB2YXI9ImFkZHJlc3MiIGR5bmFjbGFzcz0iJHtBZGRyZXNzVHlwZX0iIC8+DQotDQotICA8ZHluYWJlYW46c2V0IHZhcj0iY3VzdG9tZXIiIHByb3BlcnR5PSJuYW1lIiB2YWx1ZT0iQ3VzdG9tZXIgMSIgLz4NCi0gIDxkeW5hYmVhbjpzZXQgdmFyPSJjdXN0b21lciIgcHJvcGVydHk9ImFkZHJlc3MiIHZhbHVlPSIke2FkZHJlc3N9IiAvPg0KLSAgPGR5bmFiZWFuOnNldCB2YXI9ImN1c3RvbWVyIiBwcm9wZXJ0eT0iYWRkcmVzcy5jaXR5IiB2YWx1ZT0iTG9uZG9uIiAvPg0KLSAgPGR5bmFiZWFuOnNldCB2YXI9ImN1c3RvbWVyIiBwcm9wZXJ0eT0iYWRkcmVzcy5zdHJlZXQiIHZhbHVlPSJEb3duaW5nIFN0cmVldCIgLz4NCi0gIDxkeW5hYmVhbjpzZXQgdmFyPSJjdXN0b21lciIgcHJvcGVydHk9ImFkZHJlc3MuaG91c2VudW1iZXIiIHZhbHVlPSIxMCIgLz4NCi0NCi0gICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJDdXN0b21lciAxIiBhY3R1YWw9IiR7Y3VzdG9tZXIubmFtZX0iLz4NCi0gICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJMb25kb24iIGFjdHVhbD0iJHtjdXN0b21lci5hZGRyZXNzLmNpdHl9Ii8+DQotICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iRG93bmluZyBTdHJlZXQiIGFjdHVhbD0iJHtjdXN0b21lci5hZGRyZXNzLnN0cmVldH0iLz4NCi0gICAgDQotICAgIDwhLS0gIyMjIyBKZWxseVVuaXQgbmVlZHMgdG8gc3VwcG9ydCB0eXBlIGNvb2VyY2lvbiBmb3IgdGhpcyB0byB3b3JrLi4uDQotICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iMTAiIGFjdHVhbD0iJHtjdXN0b21lci5hZGRyZXNzLmhvdXNlbnVtYmVyfSIvPg0KLSAgICAtLT4NCi0gICAgDQotICANCi08L3Rlc3Q6Y2FzZT4NCi0gICANCi08L3Rlc3Q6c3VpdGU+DQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9keW5hYmVhbi94ZG9jcy9jaGFuZ2VzLnhtbCBiL2plbGx5LXRhZ3MvZHluYWJlYW4veGRvY3MvY2hhbmdlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMTQ2NDEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9keW5hYmVhbi94ZG9jcy9jaGFuZ2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0gLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkNoYW5nZXM8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLSAgPGJvZHk+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4wIiBkYXRlPSIyMDA0LTA5LTExIj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJhZGQiPkluaXRpYWwgUmVsZWFzZTwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZHluYWJlYW4veGRvY3MvaW5kZXgueG1sIGIvamVsbHktdGFncy9keW5hYmVhbi94ZG9jcy9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjODAxNDAuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9keW5hYmVhbi94ZG9jcy9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5EeW5hQmVhbiBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotICAgIDxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KLSAgICAgIDxwPgotICAgICAgICBBIHRhZyBsaWJyYXJ5IGZvciBjcmVhdGluZyBuZXcgRHluYUNsYXNzIGFuZCBEeW5hQmVhbiBvYmplY3RzIGZyb20gdGhlIAotICAgICAgICA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvYmVhbnV0aWxzL2luZGV4Lmh0bWwiPmJlYW51dGlsczwvYT4gbGlicmFyeS4KLSAgICAgICAgU2VlIHRoZSA8YSBocmVmPSJ0YWdzLmh0bWwiPnRhZ3M8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgICAgPC9wPgotICAgIDwvc2VjdGlvbj4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9keW5hYmVhbi94ZG9jcy9uYXZpZ2F0aW9uLnhtbCBiL2plbGx5LXRhZ3MvZHluYWJlYW4veGRvY3MvbmF2aWdhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1N2U0OGUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9keW5hYmVhbi94ZG9jcy9uYXZpZ2F0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgbmFtZT0iRHluYUJlYW4gVGFnIExpYnJhcnkiPgotCi0gIDx0aXRsZT5EeW5hQmVhbiBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gIAotICA8Ym9keT4KLSAgICA8bWVudSBuYW1lPSJEeW5hQmVhbiBUYWcgTGlicmFyeSI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgICAgICAgICAgaHJlZj0iL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IlRhZ3MiICAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFncy5odG1sIi8+Ci0gICAgPC9tZW51PgotICA8L2JvZHk+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2VtYWlsLy5jdnNpZ25vcmUgYi9qZWxseS10YWdzL2VtYWlsLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZDMxZjcuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9lbWFpbC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1tYXZlbi5sb2cKLXRhcmdldAotdmVsb2NpdHkubG9nCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2VtYWlsL2J1aWxkLnhtbCBiL2plbGx5LXRhZ3MvZW1haWwvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODQyMjFhLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvZW1haWwvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS1idWlsZC54bWwgZ2VuZXJhdGVkIGJ5IG1hdmVuIGZyb20gcHJvamVjdC54bWwgdmVyc2lvbiAxLjAtU05BUFNIT1QKLSAgb24gZGF0ZSBNYXkgMjQgMjAwNCwgdGltZSAyMzAxLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXIiIG5hbWU9ImNvbW1vbnMtamVsbHktdGFncy1lbWFpbCIgYmFzZWRpcj0iLiI+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkZWZhdWx0dGFyZ2V0ZGlyIiB2YWx1ZT0idGFyZ2V0Ij4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYmRpciIgdmFsdWU9InRhcmdldC9saWIiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC9jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cmVwb3J0ZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtcmVwb3J0cyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0ZGlyIiB2YWx1ZT0iZGlzdCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jZGlyIiB2YWx1ZT0iZGlzdC9kb2NzL2FwaSI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJmaW5hbC5uYW1lIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLWVtYWlsLTEuMC1TTkFQU0hPVCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVzY3JpcHRpb249Im8gSW5pdGlhbGl6ZXMgc29tZSBwcm9wZXJ0aWVzIj4KLSAgICA8bWtkaXIgZGlyPSIke2xpYmRpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibm9nZXQiPgotICAgICAgPGVxdWFscyBhcmcyPSJvbmx5IiBhcmcxPSIke2J1aWxkLnN5c2NsYXNzcGF0aH0iPgotICAgICAgPC9lcXVhbHM+Ci0gICAgPC9jb25kaXRpb24+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJvIENvbXBpbGUgdGhlIGNvZGUiIGRlcGVuZHM9ImdldC1kZXBzIj4KLSAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqYXZhYyBkZXN0ZGlyPSIke2NsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy9qYXZhIj4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0gICAgPGNvcHkgdG9kaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvamF2YSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gICAgPGNvcHkgdG9kaXI9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmplbGx5Ij4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54c2wiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucm5nIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmR0ZCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmh0bWwiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJqYXIiIGRlc2NyaXB0aW9uPSJvIENyZWF0ZSB0aGUgamFyIiBkZXBlbmRzPSJjb21waWxlLHRlc3QiPgotICAgIDxqYXIgamFyZmlsZT0idGFyZ2V0LyR7ZmluYWwubmFtZX0uamFyIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIiBiYXNlZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICA8L2phcj4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJvIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZGlyZWN0b3JpZXMiPgotICAgIDxkZWxldGUgZGlyPSIke2RlZmF1bHR0YXJnZXRkaXJ9Ij4KLSAgICA8L2RlbGV0ZT4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlc2NyaXB0aW9uPSJvIENyZWF0ZSBhIGRpc3RyaWJ1dGlvbiIgZGVwZW5kcz0iamFyLCBqYXZhZG9jIj4KLSAgICA8bWtkaXIgZGlyPSJkaXN0Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb3B5IHRvZGlyPSJkaXN0Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSIgaW5jbHVkZXM9IiouamFyIj4KLSAgICAgIDwvZmlsZXNldD4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZXM9IkxJQ0VOU0UqLCBSRUFETUUqIj4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlc2NyaXB0aW9uPSJvIFJ1biB0aGUgdGVzdCBjYXNlcyIgaWY9InRlc3QuZmFpbHVyZSIgZGVwZW5kcz0iaW50ZXJuYWwtdGVzdCI+Ci0gICAgPGZhaWwgbWVzc2FnZT0iVGhlcmUgd2VyZSB0ZXN0IGZhaWx1cmVzLiI+Ci0gICAgPC9mYWlsPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJpbnRlcm5hbC10ZXN0IiBkZXBlbmRzPSJjb21waWxlLXRlc3RzIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3RyZXBvcnRkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqdW5pdCBkaXI9Ii4vIiBmYWlsdXJlcHJvcGVydHk9InRlc3QuZmFpbHVyZSIgcHJpbnRTdW1tYXJ5PSJ5ZXMiIGZvcms9InRydWUiIGhhbHRvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImJhc2VkaXIiIHZhbHVlPSIuIj4KLSAgICAgIDwvc3lzcHJvcGVydHk+Ci0gICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxmb3JtYXR0ZXIgdXNlZmlsZT0iZmFsc2UiIHR5cGU9InBsYWluIj4KLSAgICAgIDwvZm9ybWF0dGVyPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICA8YmF0Y2h0ZXN0IHRvZGlyPSIke3Rlc3RyZXBvcnRkaXJ9Ij4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovVGVzdCouamF2YSI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2JhdGNodGVzdD4KLSAgICA8L2p1bml0PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlLXRlc3RzIiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iIGRlcHJlY2F0aW9uPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSIgb3B0aW1pemU9ImZhbHNlIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIj4KLSAgICAgIDxzcmM+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL3Rlc3QiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9zcmM+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJqYXZhZG9jIiBkZXNjcmlwdGlvbj0ibyBHZW5lcmF0ZSBqYXZhZG9jIiBkZXBlbmRzPSJqYXIiPgotICAgIDxta2RpciBkaXI9IiR7amF2YWRvY2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPHRzdGFtcD4KLSAgICAgIDxmb3JtYXQgcGF0dGVybj0iMjAwMi15eXl5IiBwcm9wZXJ0eT0ieWVhciI+Ci0gICAgICA8L2Zvcm1hdD4KLSAgICA8L3RzdGFtcD4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29weXJpZ2h0IiB2YWx1ZT0iQ29weXJpZ2h0ICZhbXA7Y29weTsgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLiI+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgICA8cHJvcGVydHkgbmFtZT0idGl0bGUiIHZhbHVlPSJjb21tb25zLWplbGx5LXRhZ3MtZW1haWwgMS4wLVNOQVBTSE9UIEFQSSI+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgICA8amF2YWRvYyB1c2U9InRydWUiIHByaXZhdGU9InRydWUiIGRlc3RkaXI9IiR7amF2YWRvY2Rpcn0iIGF1dGhvcj0idHJ1ZSIgdmVyc2lvbj0idHJ1ZSIgc291cmNlcGF0aD0ic3JjL2phdmEiIHBhY2thZ2VuYW1lcz0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZW1haWwuKiI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFkb2M+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImdldC1kZXBzIiB1bmxlc3M9Im5vZ2V0IiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FjdGl2YXRpb24tMS4wLjIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2phZi9qYXJzL2FjdGl2YXRpb24tMS4wLjIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9tYWlsLTEuMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vamF2YW1haWwvamFycy9tYWlsLTEuMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamV4bC1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZXhsL2phcnMvY29tbW9ucy1qZXhsLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veG1sLWFwaXMtMS4wLmIyLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94bWwtYXBpcy9qYXJzL3htbC1hcGlzLTEuMC5iMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtYmVhbnV0aWxzLTEuNi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1iZWFudXRpbHMvamFycy9jb21tb25zLWJlYW51dGlscy0xLjYuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1jb2xsZWN0aW9ucy9qYXJzL2NvbW1vbnMtY29sbGVjdGlvbnMtMi4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWxvZ2dpbmcvamFycy9jb21tb25zLWxvZ2dpbmctMS4wLjMuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9kb200ai0xLjUtYmV0YS0yLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9kb200ai9qYXJzL2RvbTRqLTEuNS1iZXRhLTIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qYXhlbi0xLjEtYmV0YS0yLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qYXhlbi9qYXJzL2pheGVuLTEuMS1iZXRhLTIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS94ZXJjZXMtMi4yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3hlcmNlcy9qYXJzL3hlcmNlcy0yLjIuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2p1bml0LTMuOC4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qdW5pdC9qYXJzL2p1bml0LTMuOC4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vYW50LTEuNS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vYW50L2phcnMvYW50LTEuNS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FudC1vcHRpb25hbC0xLjUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC1vcHRpb25hbC0xLjUuamFyIj4KLSAgICA8L2dldD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iaW5zdGFsbC1tYXZlbiI+Ci0gICAgPGdldCBkZXN0PSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIHNyYz0iJHtyZXBvfS9tYXZlbi9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDx1bmphciBkZXN0PSIke21hdmVuLmhvbWV9IiBzcmM9IiR7dXNlci5ob21lfS9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiPgotICAgIDwvdW5qYXI+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZW1haWwvbWF2ZW4ueG1sIGIvamVsbHktdGFncy9lbWFpbC9tYXZlbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNjBhOTMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9lbWFpbC9tYXZlbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgZGVmYXVsdD0iamFyOmphciI+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZW1haWwvcHJvamVjdC5wcm9wZXJ0aWVzIGIvamVsbHktdGFncy9lbWFpbC9wcm9qZWN0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMTljYmMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9lbWFpbC9wcm9qZWN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIyAKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFAgUiBPIEogRSBDIFQgIFAgUiBPIFAgRSBSIFQgSSBFIFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9lbWFpbC9wcm9qZWN0LnhtbCBiL2plbGx5LXRhZ3MvZW1haWwvcHJvamVjdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZjFiNjQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9lbWFpbC9wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3Q+Ci0gIDxleHRlbmQ+JHtiYXNlZGlyfS8uLi90YWctcHJvamVjdC54bWw8L2V4dGVuZD4KLSAgPGlkPmNvbW1vbnMtamVsbHktdGFncy1lbWFpbDwvaWQ+Ci0gIDxuYW1lPmNvbW1vbnMtamVsbHktdGFncy1lbWFpbDwvbmFtZT4KLSAgPGN1cnJlbnRWZXJzaW9uPjEuMDwvY3VycmVudFZlcnNpb24+Ci0gIDxwYWNrYWdlPm9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmVtYWlsPC9wYWNrYWdlPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgICAgIFRoaXMgaXMgYSBKZWxseSBpbnRlcmZhY2UgZm9yIEVtYWlsCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDxzaG9ydERlc2NyaXB0aW9uPkNvbW1vbnMgSmVsbHkgZS1tYWlsIFRhZyBMaWJyYXJ5PC9zaG9ydERlc2NyaXB0aW9uPgotICAKLSAgPHZlcnNpb25zPgotICAgIDx2ZXJzaW9uPgotICAgICAgPGlkPjEuMDwvaWQ+Ci0gICAgICA8bmFtZT4xLjA8L25hbWU+Ci0gICAgICA8dGFnPkNPTU1PTlNfSkVMTFlfRU1BSUwtMV8wPC90YWc+Ci0gICAgPC92ZXJzaW9uPgotICA8L3ZlcnNpb25zPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0KLSAgICA8IS0tIFNUQVJUIGZvciBydW4gdGltZSAtLT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmphZjwvZ3JvdXBJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC4yPC92ZXJzaW9uPgotICAgICAgPGFydGlmYWN0SWQ+YWN0aXZhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx1cmw+aHR0cDovL2phdmEuc3VuLmNvbS9iZWFucy9nbGFzZ293L2phZi5odG1sPC91cmw+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGd1bXAucHJvamVjdD5qYWY8L2d1bXAucHJvamVjdD4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qYXZhbWFpbDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1haWw8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+Ci0gICAgICA8dXJsPmh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamF2YW1haWwvamF2YW1haWwtMV8yLmh0bWw8L3VybD4KLSAgICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8Z3VtcC5wcm9qZWN0PmphdmFtYWlsPC9ndW1wLnByb2plY3Q+Ci0gICAgICAgIDxndW1wLmlkPmphdmFtYWlsPC9ndW1wLmlkPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8IS0tIEVORCBmb3IgcnVuIHRpbWUgLS0+Ci0KLSAgICAKLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9lbWFpbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9lbWFpbC9FbWFpbFRhZy5qYXZhIGIvamVsbHktdGFncy9lbWFpbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9lbWFpbC9FbWFpbFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWZjN2JlLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvZW1haWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZW1haWwvRW1haWxUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmVtYWlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLQotaW1wb3J0IGphdmF4Lm1haWwuU2Vzc2lvbjsKLWltcG9ydCBqYXZheC5tYWlsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgubWFpbC5NZXNzYWdpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFpbC5NdWx0aXBhcnQ7Ci1pbXBvcnQgamF2YXgubWFpbC5UcmFuc3BvcnQ7Ci1pbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5BZGRyZXNzRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuTWltZU1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5JbnRlcm5ldEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lQm9keVBhcnQ7Ci1pbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lTXVsdGlwYXJ0OwotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRmlsZURhdGFTb3VyY2U7Ci1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0vKioKLSAqIEJhc2ljIHRhZyBmb3Igc2VuZGluZyBhbiBlbWFpbC4gU3VwcG9ydHMgb25lIGF0dGFjaG1lbnQsIG11bHRpcGxlIHRvIGFkZHJlc3NlcyBkZWxpbWl0ZWQgYnkgIjsiLAotICogbXVsdGlwbGUgY2MgYWRkcmVzc2VzLCBldGMuCi0gKgotICogQGF1dGhvciAgSmFzb24gSG9ybWFuCi0gKiBAYXV0aG9yICA8YSBocmVmPSJtYWlsdG86d2lsbGlldnVAeWFob28uY29tIj5XaWxsaWUgVnU8L2E+Ci0gKiBAdmVyc2lvbiAgJElkOiBFbWFpbFRhZy5qYXZhLHYgMS42IDIwMDQvMDkvMDggMDQ6NDk6MjMgZGlvbiBFeHAgJAotICovCi0KLXB1YmxpYyBjbGFzcyBFbWFpbFRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotICAgIHByaXZhdGUgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEVtYWlsVGFnLmNsYXNzKTsKLQotICAgIC8qKiBzbXRwIHNlcnZlciAqLwotICAgIHByaXZhdGUgRXhwcmVzc2lvbiBzZXJ2ZXIgICAgICAgPSBudWxsOwotCi0gICAgLyoqIHdobyB0byBzZW5kIHRoZSBtZXNzYWdlIGFzICovCi0gICAgcHJpdmF0ZSBFeHByZXNzaW9uIGZyb20gICAgICAgICA9IG51bGw7Ci0KLSAgICAvKiogd2hvIHRvIHNlbmQgdG8gKi8KLSAgICBwcml2YXRlIEV4cHJlc3Npb24gdG8gICAgICAgICAgID0gbnVsbDsKLQotICAgIC8qKiB3aG8gdG8gY2MgKi8KLSAgICBwcml2YXRlIEV4cHJlc3Npb24gY2MgICAgICAgICAgID0gbnVsbDsKLQotICAgIC8qKiBtYWlsIHN1YmplY3QgKi8KLSAgICBwcml2YXRlIEV4cHJlc3Npb24gc3ViamVjdCAgICAgID0gbnVsbDsKLQotICAgIC8qKiBtYWlsIG1lc3NhZ2UgKi8KLSAgICBwcml2YXRlIEV4cHJlc3Npb24gbWVzc2FnZSAgICAgID0gbnVsbDsKLQotICAgIC8qKiBmaWxlIGF0dGFjaG1lbnQgKi8KLSAgICBwcml2YXRlIEZpbGUgYXR0YWNobWVudCAgICAgPSBudWxsOwotCi0gICAgLyoqIHdoZXRoZXIgd2Ugc2hvdWxkIGVuY29kZSB0aGUgWE1MIGJvZHkgYXMgdGV4dCAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVYTUwgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc210cCBzZXJ2ZXIgZm9yIHRoZSBtZXNzYWdlLiBJZiBub3Qgc2V0IHRoZSBzeXN0ZW0KLSAgICAgKiBwcm9wZXJ0eSAibWFpbC5zbXRwLmhvc3QiIHdpbGwgYmUgdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXIoRXhwcmVzc2lvbiBzZXJ2ZXIpIHsKLSAgICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBmcm9tIGFkZHJlc3MgZm9yIHRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RnJvbShFeHByZXNzaW9uIGZyb20pIHsKLSAgICAgICAgdGhpcy5mcm9tID0gZnJvbTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAiOyIgc2VwZXJhdGVkIGxpc3Qgb2YgcGVvcGxlIHRvIHNlbmQgdG8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUbyhFeHByZXNzaW9uIHRvKSB7Ci0gICAgICAgIHRoaXMudG8gPSB0bzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAiOyIgc2VwZXJhdGVkIGxpc3Qgb2YgcGVvcGxlIHRvIGNjCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q0MoRXhwcmVzc2lvbiBjYykgewotICAgICAgICB0aGlzLmNjID0gY2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBlbWFpbCBzdWJqZWN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3ViamVjdChFeHByZXNzaW9uIHN1YmplY3QpIHsKLSAgICAgICAgdGhpcy5zdWJqZWN0ID0gc3ViamVjdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG1lc3NhZ2UgYm9keS4gVGhpcyB3aWxsIG92ZXJyaWRlIHRoZSBKZWxseSB0YWcgYm9keQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoRXhwcmVzc2lvbiBtZXNzYWdlKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBlbWFpbCBhdHRhY2htZW50IGZvciB0aGUgbWVzc2FnZS4gT25seSAxIGF0dGFjaG1lbnQgaXMgc3VwcG9ydGVkIHJpZ2h0IG5vdwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEF0dGFjaChGaWxlIGF0dGFjaG1lbnQpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpZiAoIWF0dGFjaG1lbnQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oImF0dGFjaG1lbnQgbm90IGZvdW5kIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmF0dGFjaG1lbnQgPSBhdHRhY2htZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB3ZSBzaG91bGQgZW5jb2RlIHRoZSBYTUwgYm9keSBhcyB0ZXh0IG9yIG5vdC4gVGhlIGRlZmF1bHQKLSAgICAgKiBpcyBmYWxzZSBzbyB0aGF0IHRoZSBib2R5IHdpbGwgYXNzdW1lZCB0byBiZSB2YWxpZCBYTUwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVYTUwoYm9vbGVhbiBlbmNvZGVYTUwpIHsKLSAgICAgICAgdGhpcy5lbmNvZGVYTUwgPSBlbmNvZGVYTUw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZSB0aGUgdGFnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IHhtbE91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHByb3BzLnB1dEFsbChjb250ZXh0LmdldFZhcmlhYmxlcygpKTsKLQotICAgICAgICAvLyBpZiBhIHNlcnZlciB3YXMgc2V0IHRoZW4gY29uZmlndXJlIHRoZSBzeXN0ZW0gcHJvcGVydHkKLSAgICAgICAgaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPYmplY3Qgc2VydmVySW5wdXQgPSB0aGlzLnNlcnZlci5ldmFsdWF0ZShjb250ZXh0KTsKLSAgICAgICAgICAgIHByb3BzLnB1dCgibWFpbC5zbXRwLmhvc3QiLCBzZXJ2ZXJJbnB1dC50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChwcm9wcy5nZXQoIm1haWwuc210cC5ob3N0IikgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigibm8gc210cCBzZXJ2ZXIgY29uZmlndXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgd2FzIG5vIHRvIGFkZHJlc3MKLSAgICAgICAgaWYgKHRvID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigibm8gdG8gYWRkcmVzcyBzcGVjaWZpZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIHdhcyBubyBmcm9tCi0gICAgICAgIGlmIChmcm9tID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigibm8gZnJvbSBhZGRyZXNzIHNwZWNpZmllZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2VCb2R5ID0gbnVsbDsKLSAgICAgICAgaWYgKHRoaXMubWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXNzYWdlQm9keSA9IHRoaXMubWVzc2FnZS5ldmFsdWF0ZShjb250ZXh0KS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gZ2V0IG1lc3NhZ2UgZnJvbSBib2R5Ci0gICAgICAgICAgICBtZXNzYWdlQm9keSA9IGdldEJvZHlUZXh0KGVuY29kZVhNTCk7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgZnJvbUlucHV0ID0gdGhpcy5mcm9tLmV2YWx1YXRlKGNvbnRleHQpOwotICAgICAgICBPYmplY3QgdG9JbnB1dCA9IHRoaXMudG8uZXZhbHVhdGUoY29udGV4dCk7Ci0KLSAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtYWlsIHNlc3Npb24KLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gU2Vzc2lvbi5nZXREZWZhdWx0SW5zdGFuY2UocHJvcHMsIG51bGwpOwotCi0gICAgICAgIC8vIGNvbnN0cnVjdCB0aGUgbWltZSBtZXNzYWdlCi0gICAgICAgIE1pbWVNZXNzYWdlIG1zZyA9IG5ldyBNaW1lTWVzc2FnZShzZXNzaW9uKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gc2V0IHRoZSBmcm9tIGFkZHJlc3MKLSAgICAgICAgICAgIG1zZy5zZXRGcm9tKG5ldyBJbnRlcm5ldEFkZHJlc3MoZnJvbUlucHV0LnRvU3RyaW5nKCkpKTsKLQotICAgICAgICAgICAgLy8gcGFyc2Ugb3V0IHRoZSB0byBhZGRyZXNzZXMKLSAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodG9JbnB1dC50b1N0cmluZygpLCAiOyIpOwotICAgICAgICAgICAgSW50ZXJuZXRBZGRyZXNzW10gYWRkcmVzc2VzID0gbmV3IEludGVybmV0QWRkcmVzc1tzdC5jb3VudFRva2VucygpXTsKLSAgICAgICAgICAgIGludCBhZGRyZXNzQ291bnQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgIGFkZHJlc3Nlc1thZGRyZXNzQ291bnQrK10gPSBuZXcgSW50ZXJuZXRBZGRyZXNzKHN0Lm5leHRUb2tlbigpLnRyaW0oKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCB0aGUgcmVjaXBpZW50cwotICAgICAgICAgICAgbXNnLnNldFJlY2lwaWVudHMoTWVzc2FnZS5SZWNpcGllbnRUeXBlLlRPLCBhZGRyZXNzZXMpOwotCi0gICAgICAgICAgICAvLyBwYXJzZSBvdXQgdGhlIGNjIGFkZHJlc3NlcwotICAgICAgICAgICAgaWYgKGNjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgY2NJbnB1dCA9IHRoaXMuY2MuZXZhbHVhdGUoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNjSW5wdXQudG9TdHJpbmcoKSwgIjsiKTsKLSAgICAgICAgICAgICAgICBJbnRlcm5ldEFkZHJlc3NbXSBjY0FkZHJlc3NlcyA9IG5ldyBJbnRlcm5ldEFkZHJlc3Nbc3QuY291bnRUb2tlbnMoKV07Ci0gICAgICAgICAgICAgICAgaW50IGNjQWRkcmVzc0NvdW50ID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNjQWRkcmVzc2VzW2NjQWRkcmVzc0NvdW50KytdID0gbmV3IEludGVybmV0QWRkcmVzcyhzdC5uZXh0VG9rZW4oKS50cmltKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgY2MgcmVjaXBpZW50cwotICAgICAgICAgICAgICAgIG1zZy5zZXRSZWNpcGllbnRzKE1lc3NhZ2UuUmVjaXBpZW50VHlwZS5DQywgY2NBZGRyZXNzZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBZGRyZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBzZXQgdGhlIHN1YmplY3QKLSAgICAgICAgICAgIGlmIChzdWJqZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgc3ViamVjdElucHV0ID0gdGhpcy5zdWJqZWN0LmV2YWx1YXRlKGNvbnRleHQpOwotICAgICAgICAgICAgICAgIG1zZy5zZXRTdWJqZWN0KHN1YmplY3RJbnB1dC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2V0IGEgdGltZXN0YW1wCi0gICAgICAgICAgICBtc2cuc2V0U2VudERhdGUobmV3IERhdGUoKSk7Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoZXJlIHdhcyBubyBhdHRhY2htZW50IGp1c3Qgc2V0IHRoZSB0ZXh0L2JvZHkgb2YgdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIGlmIChhdHRhY2htZW50ID09IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIG1zZy5zZXRUZXh0KG1lc3NhZ2VCb2R5KTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBhdHRhY2ggdGhlIG11bHRpcGFydCBtaW1lIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICAvLyBzZXR1cCB0aGUgYm9keQotICAgICAgICAgICAgICAgIE1pbWVCb2R5UGFydCBtYnAxID0gbmV3IE1pbWVCb2R5UGFydCgpOwotICAgICAgICAgICAgICAgIG1icDEuc2V0VGV4dChtZXNzYWdlQm9keSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBzZXR1cCB0aGUgYXR0YWNobWVudAotICAgICAgICAgICAgICAgIE1pbWVCb2R5UGFydCBtYnAyID0gbmV3IE1pbWVCb2R5UGFydCgpOwotICAgICAgICAgICAgICAgIEZpbGVEYXRhU291cmNlIGZkcyA9IG5ldyBGaWxlRGF0YVNvdXJjZShhdHRhY2htZW50KTsKLSAgICAgICAgICAgICAgICBtYnAyLnNldERhdGFIYW5kbGVyKG5ldyBEYXRhSGFuZGxlcihmZHMpKTsKLSAgICAgICAgICAgICAgICBtYnAyLnNldEZpbGVOYW1lKGZkcy5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBtdWx0aXBhcnQgYW5kIGFkZCBpdHMgcGFydHMKLSAgICAgICAgICAgICAgICBNdWx0aXBhcnQgbXAgPSBuZXcgTWltZU11bHRpcGFydCgpOwotICAgICAgICAgICAgICAgIG1wLmFkZEJvZHlQYXJ0KG1icDEpOwotICAgICAgICAgICAgICAgIG1wLmFkZEJvZHlQYXJ0KG1icDIpOwotCi0gICAgICAgICAgICAgICAgbXNnLnNldENvbnRlbnQobXApOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzZW5kaW5nIGVtYWlsIHRvICIgKyB0byArICIgdXNpbmcgIiArIHNlcnZlcik7Ci0KLSAgICAgICAgICAgIC8vIHNlbmQgdGhlIGVtYWlsCi0gICAgICAgICAgICBUcmFuc3BvcnQuc2VuZChtc2cpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2VtYWlsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2VtYWlsL0VtYWlsVGFnTGlicmFyeS5qYXZhIGIvamVsbHktdGFncy9lbWFpbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9lbWFpbC9FbWFpbFRhZ0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg2YWE0OS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2VtYWlsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2VtYWlsL0VtYWlsVGFnTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5lbWFpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdMaWJyYXJ5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKiBEZXNjcmliZXMgdGhlIFRhZ2xpYi4gVGhpcyBjbGFzcyBjb3VsZCBiZSBnZW5lcmF0ZWQgYnkgWERvY2xldAotICAqCi0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBFbWFpbFRhZ0xpYnJhcnkgZXh0ZW5kcyBUYWdMaWJyYXJ5IHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEVtYWlsVGFnTGlicmFyeS5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgRW1haWxUYWdMaWJyYXJ5KCkgewotICAgICAgICByZWdpc3RlclRhZygiZW1haWwiLCBFbWFpbFRhZy5jbGFzcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9lbWFpbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9lbWFpbC9wYWNrYWdlLmh0bWwgYi9qZWxseS10YWdzL2VtYWlsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2VtYWlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFmNDExZC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2VtYWlsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2VtYWlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci0gIDxwPgotICAJVGFncyBmb3Igc2VuZGluZyBlbWFpbCB1c2luZyB0aGUgSmF2YU1haWwgQVBJCi0gIDwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZW1haWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZW1haWwvc2FtcGxlLmplbGx5IGIvamVsbHktdGFncy9lbWFpbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9lbWFpbC9zYW1wbGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNmVhYWQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9lbWFpbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9lbWFpbC9zYW1wbGUuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiIHhtbG5zOmVtYWlsPSJqZWxseTplbWFpbCI+Ci0KLSAgICA8IS0tIHNvbWUgc2FtcGxlIHNjcmlwdHMgd291bGQgYmUgYSBnb29kIGlkZWEgLS0+Ci0KLTwvamVsbHk+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9lbWFpbC94ZG9jcy9jaGFuZ2VzLnhtbCBiL2plbGx5LXRhZ3MvZW1haWwveGRvY3MvY2hhbmdlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMTQ2NDEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9lbWFpbC94ZG9jcy9jaGFuZ2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0gLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkNoYW5nZXM8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLSAgPGJvZHk+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4wIiBkYXRlPSIyMDA0LTA5LTExIj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJhZGQiPkluaXRpYWwgUmVsZWFzZTwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZW1haWwveGRvY3MvaW5kZXgueG1sIGIvamVsbHktdGFncy9lbWFpbC94ZG9jcy9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZWVkNjYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9lbWFpbC94ZG9jcy9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5FbWFpbCBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotICAgIDxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KLSAgICAgIDxwPgotICAgICAgICBUYWdzIGZvciBzZW5kaW5nIGVtYWlsIHVzaW5nIHRoZSBKYXZhTWFpbCBBUEkuCi0gICAgICAgIFNlZSB0aGUgPGEgaHJlZj0idGFncy5odG1sIj50YWdzPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZW1haWwveGRvY3MvbmF2aWdhdGlvbi54bWwgYi9qZWxseS10YWdzL2VtYWlsL3hkb2NzL25hdmlnYXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2MyOWUxLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvZW1haWwveGRvY3MvbmF2aWdhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IG5hbWU9IkVtYWlsIFRhZyBMaWJyYXJ5Ij4KLQotICA8dGl0bGU+RW1haWwgVGFnIExpYnJhcnk8L3RpdGxlPgotICAKLSAgPGJvZHk+Ci0gICAgPG1lbnUgbmFtZT0iRW1haWwgVGFnIExpYnJhcnkiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgICAgICAgICAgIGhyZWY9Ii9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJUYWdzIiAgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZ3MuaHRtbCIvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9mbXQvLmN2c2lnbm9yZSBiL2plbGx5LXRhZ3MvZm10Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZDMxZjcuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9mbXQvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotbWF2ZW4ubG9nCi10YXJnZXQKLXZlbG9jaXR5LmxvZwpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9mbXQvYnVpbGQueG1sIGIvamVsbHktdGFncy9mbXQvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmUzZDA4Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvZm10L2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tYnVpbGQueG1sIGdlbmVyYXRlZCBieSBtYXZlbiBmcm9tIHByb2plY3QueG1sIHZlcnNpb24gMS4wLVNOQVBTSE9UCi0gIG9uIGRhdGUgTWF5IDI0IDIwMDQsIHRpbWUgMjMwMS0tPgotPHByb2plY3QgZGVmYXVsdD0iamFyIiBuYW1lPSJjb21tb25zLWplbGx5LXRhZ3MtZm10IiBiYXNlZGlyPSIuIj4KLSAgPHByb3BlcnR5IG5hbWU9ImRlZmF1bHR0YXJnZXRkaXIiIHZhbHVlPSJ0YXJnZXQiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0ibGliZGlyIiB2YWx1ZT0idGFyZ2V0L2xpYiI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L2NsYXNzZXMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0idGVzdGNsYXNzZXNkaXIiIHZhbHVlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RyZXBvcnRkaXIiIHZhbHVlPSJ0YXJnZXQvdGVzdC1yZXBvcnRzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImRpc3RkaXIiIHZhbHVlPSJkaXN0Ij4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImphdmFkb2NkaXIiIHZhbHVlPSJkaXN0L2RvY3MvYXBpIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImZpbmFsLm5hbWUiIHZhbHVlPSJjb21tb25zLWplbGx5LXRhZ3MtZm10LTEuMC1TTkFQU0hPVCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVzY3JpcHRpb249Im8gSW5pdGlhbGl6ZXMgc29tZSBwcm9wZXJ0aWVzIj4KLSAgICA8bWtkaXIgZGlyPSIke2xpYmRpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibm9nZXQiPgotICAgICAgPGVxdWFscyBhcmcyPSJvbmx5IiBhcmcxPSIke2J1aWxkLnN5c2NsYXNzcGF0aH0iPgotICAgICAgPC9lcXVhbHM+Ci0gICAgPC9jb25kaXRpb24+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJvIENvbXBpbGUgdGhlIGNvZGUiIGRlcGVuZHM9ImdldC1kZXBzIj4KLSAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqYXZhYyBkZXN0ZGlyPSIke2NsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy9qYXZhIj4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0gICAgPGNvcHkgdG9kaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvamF2YSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gICAgPGNvcHkgdG9kaXI9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmplbGx5Ij4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54c2wiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucm5nIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmR0ZCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmh0bWwiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJqYXIiIGRlc2NyaXB0aW9uPSJvIENyZWF0ZSB0aGUgamFyIiBkZXBlbmRzPSJjb21waWxlLHRlc3QiPgotICAgIDxqYXIgamFyZmlsZT0idGFyZ2V0LyR7ZmluYWwubmFtZX0uamFyIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIiBiYXNlZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICA8L2phcj4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJvIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZGlyZWN0b3JpZXMiPgotICAgIDxkZWxldGUgZGlyPSIke2RlZmF1bHR0YXJnZXRkaXJ9Ij4KLSAgICA8L2RlbGV0ZT4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlc2NyaXB0aW9uPSJvIENyZWF0ZSBhIGRpc3RyaWJ1dGlvbiIgZGVwZW5kcz0iamFyLCBqYXZhZG9jIj4KLSAgICA8bWtkaXIgZGlyPSJkaXN0Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb3B5IHRvZGlyPSJkaXN0Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSIgaW5jbHVkZXM9IiouamFyIj4KLSAgICAgIDwvZmlsZXNldD4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZXM9IkxJQ0VOU0UqLCBSRUFETUUqIj4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlc2NyaXB0aW9uPSJvIFJ1biB0aGUgdGVzdCBjYXNlcyIgaWY9InRlc3QuZmFpbHVyZSIgZGVwZW5kcz0iaW50ZXJuYWwtdGVzdCI+Ci0gICAgPGZhaWwgbWVzc2FnZT0iVGhlcmUgd2VyZSB0ZXN0IGZhaWx1cmVzLiI+Ci0gICAgPC9mYWlsPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJpbnRlcm5hbC10ZXN0IiBkZXBlbmRzPSJjb21waWxlLXRlc3RzIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3RyZXBvcnRkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqdW5pdCBkaXI9Ii4vIiBmYWlsdXJlcHJvcGVydHk9InRlc3QuZmFpbHVyZSIgcHJpbnRTdW1tYXJ5PSJ5ZXMiIGZvcms9InRydWUiIGhhbHRvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImJhc2VkaXIiIHZhbHVlPSIuIj4KLSAgICAgIDwvc3lzcHJvcGVydHk+Ci0gICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxmb3JtYXR0ZXIgdXNlZmlsZT0iZmFsc2UiIHR5cGU9InBsYWluIj4KLSAgICAgIDwvZm9ybWF0dGVyPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICA8YmF0Y2h0ZXN0IHRvZGlyPSIke3Rlc3RyZXBvcnRkaXJ9Ij4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovVGVzdCouamF2YSI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2JhdGNodGVzdD4KLSAgICA8L2p1bml0PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlLXRlc3RzIiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iIGRlcHJlY2F0aW9uPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSIgb3B0aW1pemU9ImZhbHNlIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIj4KLSAgICAgIDxzcmM+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL3Rlc3QiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9zcmM+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJqYXZhZG9jIiBkZXNjcmlwdGlvbj0ibyBHZW5lcmF0ZSBqYXZhZG9jIiBkZXBlbmRzPSJqYXIiPgotICAgIDxta2RpciBkaXI9IiR7amF2YWRvY2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPHRzdGFtcD4KLSAgICAgIDxmb3JtYXQgcGF0dGVybj0iMjAwMi15eXl5IiBwcm9wZXJ0eT0ieWVhciI+Ci0gICAgICA8L2Zvcm1hdD4KLSAgICA8L3RzdGFtcD4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29weXJpZ2h0IiB2YWx1ZT0iQ29weXJpZ2h0ICZhbXA7Y29weTsgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLiI+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgICA8cHJvcGVydHkgbmFtZT0idGl0bGUiIHZhbHVlPSJjb21tb25zLWplbGx5LXRhZ3MtZm10IDEuMC1TTkFQU0hPVCBBUEkiPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPGphdmFkb2MgdXNlPSJ0cnVlIiBwcml2YXRlPSJ0cnVlIiBkZXN0ZGlyPSIke2phdmFkb2NkaXJ9IiBhdXRob3I9InRydWUiIHZlcnNpb249InRydWUiIHNvdXJjZXBhdGg9InNyYy9qYXZhIiBwYWNrYWdlbmFtZXM9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmZtdC4qIj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0idGFyZ2V0LyR7ZmluYWwubmFtZX0uamFyIj4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWRvYz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iZ2V0LWRlcHMiIHVubGVzcz0ibm9nZXQiIGRlcGVuZHM9ImluaXQiPgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamVsbHkvamFycy9jb21tb25zLWplbGx5LVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS10YWdzLWFudC1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktdGFncy1hbnQtU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtMS41LjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC0xLjUuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtZ3JhbnQtMS4wLWJldGEtNC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1ncmFudC9qYXJzL2NvbW1vbnMtZ3JhbnQtMS4wLWJldGEtNC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktdGFncy1iZWFuc2hlbGwtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamVsbHkvamFycy9jb21tb25zLWplbGx5LXRhZ3MtYmVhbnNoZWxsLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS10YWdzLWp1bml0LVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS10YWdzLWp1bml0LVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vYnNoLTEuMi1iMy5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vYnNoL2phcnMvYnNoLTEuMi1iMy5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamV4bC1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZXhsL2phcnMvY29tbW9ucy1qZXhsLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veG1sLWFwaXMtMS4wLmIyLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94bWwtYXBpcy9qYXJzL3htbC1hcGlzLTEuMC5iMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtYmVhbnV0aWxzLTEuNi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1iZWFudXRpbHMvamFycy9jb21tb25zLWJlYW51dGlscy0xLjYuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1jb2xsZWN0aW9ucy9qYXJzL2NvbW1vbnMtY29sbGVjdGlvbnMtMi4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWxvZ2dpbmcvamFycy9jb21tb25zLWxvZ2dpbmctMS4wLjMuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9kb200ai0xLjUtYmV0YS0yLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9kb200ai9qYXJzL2RvbTRqLTEuNS1iZXRhLTIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qYXhlbi0xLjEtYmV0YS0yLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qYXhlbi9qYXJzL2pheGVuLTEuMS1iZXRhLTIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS94ZXJjZXMtMi4yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3hlcmNlcy9qYXJzL3hlcmNlcy0yLjIuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2p1bml0LTMuOC4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qdW5pdC9qYXJzL2p1bml0LTMuOC4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vYW50LTEuNS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vYW50L2phcnMvYW50LTEuNS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FudC1vcHRpb25hbC0xLjUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC1vcHRpb25hbC0xLjUuamFyIj4KLSAgICA8L2dldD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iaW5zdGFsbC1tYXZlbiI+Ci0gICAgPGdldCBkZXN0PSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIHNyYz0iJHtyZXBvfS9tYXZlbi9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDx1bmphciBkZXN0PSIke21hdmVuLmhvbWV9IiBzcmM9IiR7dXNlci5ob21lfS9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiPgotICAgIDwvdW5qYXI+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZm10L21hdmVuLnhtbCBiL2plbGx5LXRhZ3MvZm10L21hdmVuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzZGM4MC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ZtdC9tYXZlbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgZGVmYXVsdD0iamFyOmphciI+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2ZtdC9wcm9qZWN0LnByb3BlcnRpZXMgYi9qZWxseS10YWdzL2ZtdC9wcm9qZWN0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMTljYmMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9mbXQvcHJvamVjdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMgCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQIFIgTyBKIEUgQyBUICBQIFIgTyBQIEUgUiBUIEkgRSBTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZm10L3Byb2plY3QueG1sIGIvamVsbHktdGFncy9mbXQvcHJvamVjdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZjI2NDkuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9mbXQvcHJvamVjdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0PgotICA8ZXh0ZW5kPiR7YmFzZWRpcn0vLi4vdGFnLXByb2plY3QueG1sPC9leHRlbmQ+Ci0gIDxpZD5jb21tb25zLWplbGx5LXRhZ3MtZm10PC9pZD4KLSAgPGdyb3VwSWQ+Y29tbW9ucy1qZWxseTwvZ3JvdXBJZD4KLSAgPG5hbWU+Y29tbW9ucy1qZWxseS10YWdzLWZtdDwvbmFtZT4KLSAgPGN1cnJlbnRWZXJzaW9uPjEuMDwvY3VycmVudFZlcnNpb24+Ci0KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZm10PC9wYWNrYWdlPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgICAgIFRoZSBKZWxseSBKU1AgU3RhbmRhcmQgVGFnIExpYnJhcnkgKEpTVEwpIGZvciBJMThOIGFuZCBGb3JtYXR0aW5nCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDxzaG9ydERlc2NyaXB0aW9uPkNvbW1vbnMgSmVsbHkgRk1UIFRhZyBMaWJyYXJ5PC9zaG9ydERlc2NyaXB0aW9uPgotCi0gIDx2ZXJzaW9ucz4KLSAgICA8dmVyc2lvbj4KLSAgICAgIDxpZD4xLjA8L2lkPgotICAgICAgPG5hbWU+MS4wPC9uYW1lPgotICAgICAgPHRhZz5DT01NT05TX0pFTExZX0ZNVC0xXzA8L3RhZz4KLSAgICA8L3ZlcnNpb24+Ci0gIDwvdmVyc2lvbnM+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8IS0tIGJlbG93IGZvciB0ZXN0aW5nLCBwdWxsZWQgaW4gYnkgYW50IHRhZ2xpYiAtLT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1qZWxseTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtamVsbHktdGFncy1hbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPmFudDwvaWQ+Ci0gICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+Y29tbW9ucy1ncmFudDwvaWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtYmV0YS00PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtamVsbHk8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWplbGx5LXRhZ3MtYmVhbnNoZWxsPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1qZWxseTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtamVsbHktdGFncy1qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgIDx1cmw+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvPC91cmw+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+YnNoPC9pZD4KLSAgICAgIDx2ZXJzaW9uPjEuMi1iMzwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gIDwvZGVwZW5kZW5jaWVzPgotICAKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZm10L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ZtdC9CdW5kbGVUYWcuamF2YSBiL2plbGx5LXRhZ3MvZm10L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ZtdC9CdW5kbGVUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ1YmU4My4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ZtdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9mbXQvQnVuZGxlVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5mbXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkV4cHJlc3Npb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci0KLS8qKgotICogU3VwcG9ydCBmb3IgdGFnIGhhbmRsZXJzIGZvciAmbHQ7YnVuZGxlJmd0OywgdGhlIHJlc291cmNlIGJ1bmRsZSBsb2FkaW5nCi0gKiB0YWcgaW4gSlNUTC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzp3aWxsaWV2dUB5YWhvby5jb20iPldpbGxpZSBWdTwvYT4KLSAqIEB2ZXJzaW9uIDEuMQotICoKLSAqIEB0b2RvIGRlY2lkZSBob3cgdG8gaW1wbGVtZW50IHNldFJlc3BvbnNlTG9jYWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBCdW5kbGVUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBQcml2YXRlIGNvbnN0YW50cwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxlIEVNUFRZX0xPQ0FMRSA9IG5ldyBMb2NhbGUoIiIsICIiKTsKLQotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBQcm90ZWN0ZWQgc3RhdGUKLQotICAgIHByaXZhdGUgRXhwcmVzc2lvbiBiYXNlbmFtZTsgICAgICAgICAgICAgICAgICAvLyAnYmFzZW5hbWUnIGF0dHJpYnV0ZQotICAgIHByaXZhdGUgRXhwcmVzc2lvbiBwcmVmaXg7ICAgICAgICAgICAgICAgICAgICAvLyAncHJlZml4JyBhdHRyaWJ1dGUKLSAgICAvKiogZXZhbHVhdGVkIGJhc2VuYW1lICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZWJhc2VuYW1lOwotICAgIC8qKiBldmFsdWF0ZWQgcHJlZml4ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXByZWZpeDsKLQotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBQcml2YXRlIHN0YXRlCi0KLSAgICBwcml2YXRlIExvY2FsaXphdGlvbkNvbnRleHQgbG9jQ3R4dDsKLQotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBDb25zdHJ1Y3RvciBhbmQgaW5pdGlhbGl6YXRpb24KLQotICAgIHB1YmxpYyBCdW5kbGVUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBDb2xsYWJvcmF0aW9uIHdpdGggc3VidGFncwotCi0gICAgcHVibGljIExvY2FsaXphdGlvbkNvbnRleHQgZ2V0TG9jYWxpemF0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGxvY0N0eHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXhBc1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGVwcmVmaXg7Ci0gICAgfQotCi0KLSAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIC8vIFRhZyBsb2dpYwotCi0gICAgLyoqCi0gICAgICogRXZhbHVhdGVzIHRoaXMgdGFnIGFmdGVyIGFsbCB0aGUgdGFncyBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCBiYXNlbmFtZUlucHV0ID0gbnVsbDsKLSAgICAgICAgaWYgKHRoaXMuYmFzZW5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgYmFzZW5hbWVJbnB1dCA9IHRoaXMuYmFzZW5hbWUuZXZhbHVhdGUoY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJhc2VuYW1lSW5wdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgZWJhc2VuYW1lID0gYmFzZW5hbWVJbnB1dC50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IHByZWZpeElucHV0ID0gbnVsbDsKLSAgICAgICAgaWYgKHRoaXMucHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByZWZpeElucHV0ID0gdGhpcy5wcmVmaXguZXZhbHVhdGUoY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByZWZpeElucHV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVwcmVmaXggPSBwcmVmaXhJbnB1dC50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5sb2NDdHh0ID0gdGhpcy5nZXRMb2NhbGl6YXRpb25Db250ZXh0KGNvbnRleHQsIGViYXNlbmFtZSk7Ci0gICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLSAgICB9Ci0KLQotICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgLy8gUHVibGljIHV0aWxpdHkgbWV0aG9kcwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGVmYXVsdCBJMThOIGxvY2FsaXphdGlvbiBjb250ZXh0LgotICAgICAqCi0gICAgICogQHBhcmFtIGpjIFBhZ2UgaW4gd2hpY2ggdG8gbG9vayB1cCB0aGUgZGVmYXVsdCBJMThOIGxvY2FsaXphdGlvbiBjb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YXRpb25Db250ZXh0IGdldExvY2FsaXphdGlvbkNvbnRleHQoSmVsbHlDb250ZXh0IGpjKSB7Ci0gICAgICAgIExvY2FsaXphdGlvbkNvbnRleHQgbG9jQ3R4dCA9IG51bGw7Ci0KLSAgICAgICAgT2JqZWN0IG9iaiA9IGpjLmdldFZhcmlhYmxlKENvbmZpZy5GTVRfTE9DQUxJWkFUSU9OX0NPTlRFWFQpOwotICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIExvY2FsaXphdGlvbkNvbnRleHQpIHsKLSAgICAgICAgICAgIGxvY0N0eHQgPSAoTG9jYWxpemF0aW9uQ29udGV4dCkgb2JqOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbG9jYWxpemF0aW9uIGNvbnRleHQgaXMgYSBidW5kbGUgYmFzZW5hbWUKLSAgICAgICAgICAgIGxvY0N0eHQgPSBnZXRMb2NhbGl6YXRpb25Db250ZXh0KGpjLCAoU3RyaW5nKSBvYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxvY0N0eHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcmVzb3VyY2UgYnVuZGxlIHdpdGggdGhlIGdpdmVuIGJhc2UgbmFtZSwgd2hvc2UgbG9jYWxlIGlzCi0gICAgICogZGV0ZXJtaW5lZCBhcyBmb2xsb3dzOgotICAgICAqCi0gICAgICogQ2hlY2sgaWYgYSBtYXRjaCBleGlzdHMgYmV0d2VlbiB0aGUgb3JkZXJlZCBzZXQgb2YgcHJlZmVycmVkCi0gICAgICogbG9jYWxlcyBhbmQgdGhlIGF2YWlsYWJsZSBsb2NhbGVzLCBmb3IgdGhlIGdpdmVuIGJhc2UgbmFtZS4KLSAgICAgKiBUaGUgc2V0IG9mIHByZWZlcnJlZCBsb2NhbGVzIGNvbnNpc3RzIG9mIGEgc2luZ2xlIGxvY2FsZQotICAgICAqIChpZiB0aGUgPHR0Pm9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmZtdC5sb2NhbGU8L3R0PiBjb25maWd1cmF0aW9uCi0gICAgICogc2V0dGluZyBpcyBwcmVzZW50KS4KLSAgICAgKgotICAgICAqIDxwPiBJZiBubyBtYXRjaCB3YXMgZm91bmQgaW4gdGhlIHByZXZpb3VzIHN0ZXAsIGNoZWNrIGlmIGEgbWF0Y2gKLSAgICAgKiBleGlzdHMgYmV0d2VlbiB0aGUgZmFsbGJhY2sgbG9jYWxlIChnaXZlbiBieSB0aGUKLSAgICAgKiA8dHQ+b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZm10LmZhbGxiYWNrTG9jYWxlPC90dD4gY29uZmlndXJhdGlvbgotICAgICAqIHNldHRpbmcpIGFuZCB0aGUgYXZhaWxhYmxlIGxvY2FsZXMsIGZvciB0aGUgZ2l2ZW4gYmFzZSBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhZ2VDb250ZXh0IFBhZ2UgaW4gd2hpY2ggdGhlIHJlc291cmNlIGJ1bmRsZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIGJhc2UgbmFtZSBpcyByZXF1ZXN0ZWQKLSAgICAgKiBAcGFyYW0gYmFzZW5hbWUgUmVzb3VyY2UgYnVuZGxlIGJhc2UgbmFtZQotICAgICAqCi0gICAgICogQHJldHVybiBMb2NhbGl6YXRpb24gY29udGV4dCBjb250YWluaW5nIHRoZSByZXNvdXJjZSBidW5kbGUgd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBiYXNlIG5hbWUgYW5kIHRoZSBsb2NhbGUgdGhhdCBsZWQgdG8gdGhlIHJlc291cmNlIGJ1bmRsZSBtYXRjaCwKLSAgICAgKiBvciB0aGUgZW1wdHkgbG9jYWxpemF0aW9uIGNvbnRleHQgaWYgbm8gcmVzb3VyY2UgYnVuZGxlIG1hdGNoIHdhcyBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemF0aW9uQ29udGV4dCBnZXRMb2NhbGl6YXRpb25Db250ZXh0KEplbGx5Q29udGV4dCBqYywKLSAgICBTdHJpbmcgYmFzZW5hbWUpIHsKLSAgICAgICAgTG9jYWxpemF0aW9uQ29udGV4dCBsb2NDdHh0ID0gbnVsbDsKLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbnVsbDsKLQotICAgICAgICBpZiAoKGJhc2VuYW1lID09IG51bGwpIHx8IGJhc2VuYW1lLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTG9jYWxpemF0aW9uQ29udGV4dCgpOwotICAgICAgICB9Ci0KLQotICAgICAgICAvLyBUcnkgcHJlZmVycmVkIGxvY2FsZXMKLSAgICAgICAgTG9jYWxlIHByZWYgPSBudWxsOyB7Ci0gICAgICAgICAgICBPYmplY3QgdG1wID0gamMuZ2V0VmFyaWFibGUoQ29uZmlnLkZNVF9MT0NBTEUpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsICYmIHRtcCBpbnN0YW5jZW9mIExvY2FsZSkgewotICAgICAgICAgICAgICAgIHByZWYgPSAoTG9jYWxlKSB0bXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gUHJlZmVycmVkIGxvY2FsZSBpcyBhcHBsaWNhdGlvbi1iYXNlZAotICAgICAgICAgICAgYnVuZGxlID0gZmluZE1hdGNoKGJhc2VuYW1lLCBwcmVmLCBqYy5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvY0N0eHQgPSBuZXcgTG9jYWxpemF0aW9uQ29udGV4dChidW5kbGUsIHByZWYpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvY0N0eHQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gTm8gbWF0Y2ggZm91bmQgd2l0aCBwcmVmZXJyZWQgbG9jYWxlcywgdHJ5IHVzaW5nIGZhbGxiYWNrIGxvY2FsZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9iamVjdCB0bXAgPSBqYy5nZXRWYXJpYWJsZShDb25maWcuRk1UX0ZBTExCQUNLX0xPQ0FMRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsICYmIHRtcCBpbnN0YW5jZW9mIExvY2FsZSkgewotICAgICAgICAgICAgICAgICAgICBwcmVmID0gKExvY2FsZSkgdG1wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwcmVmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidW5kbGUgPSBmaW5kTWF0Y2goYmFzZW5hbWUsIHByZWYsIGpjLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2NDdHh0ID0gbmV3IExvY2FsaXphdGlvbkNvbnRleHQoYnVuZGxlLCBwcmVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9jQ3R4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyB0cnkgdXNpbmcgdGhlIHJvb3QgcmVzb3VyY2UgYnVuZGxlIHdpdGggdGhlIGdpdmVuIGJhc2VuYW1lCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShiYXNlbmFtZSwgRU1QVFlfTE9DQUxFLAotICAgICAgICAgICAgICAgIGpjLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2NDdHh0ID0gbmV3IExvY2FsaXphdGlvbkNvbnRleHQoYnVuZGxlLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbXJlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvY0N0eHQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gc2V0IHJlc3BvbnNlIGxvY2FsZQotICAgICAgICAgICAgaWYgKGxvY0N0eHQuZ2V0TG9jYWxlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8KLSAgICAgICAgICAgICAgICAvLyBTZXRMb2NhbGVTdXBwb3J0LnNldFJlc3BvbnNlTG9jYWxlKGpjLCBsb2NDdHh0LmdldExvY2FsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBlbXB0eSBsb2NhbGl6YXRpb24gY29udGV4dAotICAgICAgICAgICAgbG9jQ3R4dCA9IG5ldyBMb2NhbGl6YXRpb25Db250ZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbG9jQ3R4dDsKLSAgICB9Ci0KLQotCi0gICAgLyoKLSAgICAgKiBHZXRzIHRoZSByZXNvdXJjZSBidW5kbGUgd2l0aCB0aGUgZ2l2ZW4gYmFzZSBuYW1lIGFuZCBwcmVmZXJyZWQgbG9jYWxlLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgY2FsbHMgamF2YS51dGlsLlJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgpLCBidXQgaWdub3JlcwotICAgICAqIGl0cyByZXR1cm4gdmFsdWUgdW5sZXNzIGl0cyBsb2NhbGUgcmVwcmVzZW50cyBhbiBleGFjdCBvciBsYW5ndWFnZSBtYXRjaAotICAgICAqIHdpdGggdGhlIGdpdmVuIHByZWZlcnJlZCBsb2NhbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmFzZW5hbWUgdGhlIHJlc291cmNlIGJ1bmRsZSBiYXNlIG5hbWUKLSAgICAgKiBAcGFyYW0gcHJlZiB0aGUgcHJlZmVycmVkIGxvY2FsZQotICAgICAqIEBwYXJhbSBjbCAgIGNsYXNzbG9hZGVyIHVzZWQgdG8gZmluZCByZXNvdXJjZSBidW5kbGUKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBidW5kbGUsIG9yIDx0dD5udWxsPC90dD4gaWYgbm8gcmVzb3VyY2UKLSAgICAgKiBidW5kbGUgd2l0aCB0aGUgZ2l2ZW4gYmFzZSBuYW1lIGV4aXN0cyBvciBpZiB0aGVyZSBpcyBubyBleGFjdC0gb3IKLSAgICAgKiBsYW5ndWFnZS1tYXRjaCBiZXR3ZWVuIHRoZSBwcmVmZXJyZWQgbG9jYWxlIGFuZCB0aGUgbG9jYWxlIG9mCi0gICAgICogdGhlIGJ1bmRsZSByZXR1cm5lZCBieSBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmluZE1hdGNoKFN0cmluZyBiYXNlbmFtZSwgTG9jYWxlIHByZWYsIENsYXNzTG9hZGVyIGNsKSB7Ci0gICAgICAgIFJlc291cmNlQnVuZGxlIG1hdGNoID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0KLSAgICAgICAgICAgIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShiYXNlbmFtZSwgcHJlZiwgY2wpOwotICAgICAgICAgICAgTG9jYWxlIGF2YWlsID0gYnVuZGxlLmdldExvY2FsZSgpOwotICAgICAgICAgICAgaWYgKHByZWYuZXF1YWxzKGF2YWlsKSkgewotICAgICAgICAgICAgICAgIC8vIEV4YWN0IG1hdGNoCi0gICAgICAgICAgICAgICAgbWF0Y2ggPSBidW5kbGU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChwcmVmLmdldExhbmd1YWdlKCkuZXF1YWxzKGF2YWlsLmdldExhbmd1YWdlKCkpCi0gICAgICAgICAgICAgICAgJiYgKCIiLmVxdWFscyhhdmFpbC5nZXRDb3VudHJ5KCkpKSkgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIExhbmd1YWdlIG1hdGNoLgotICAgICAgICAgICAgICAgICAgICAvLyBCeSBtYWtpbmcgc3VyZSB0aGUgYXZhaWxhYmxlIGxvY2FsZSBkb2VzIG5vdCBoYXZlIGEKLSAgICAgICAgICAgICAgICAgICAgLy8gY291bnRyeSBhbmQgbWF0Y2hlcyB0aGUgcHJlZmVycmVkIGxvY2FsZSdzIGxhbmd1YWdlLCB3ZQotICAgICAgICAgICAgICAgICAgICAvLyBydWxlIG91dCAibWF0Y2hlcyIgYmFzZWQgb24gdGhlIGNvbnRhaW5lcidzIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgLy8gbG9jYWxlLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHByZWZlcnJlZCBsb2NhbGUgaXMKLSAgICAgICAgICAgICAgICAgICAgLy8gImVuLVVTIiwgdGhlIGNvbnRhaW5lcidzIGRlZmF1bHQgbG9jYWxlIGlzICJlbi1VSyIsIGFuZAotICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBhIHJlc291cmNlIGJ1bmRsZSAod2l0aCB0aGUgcmVxdWVzdGVkIGJhc2UKLSAgICAgICAgICAgICAgICAgICAgLy8gbmFtZSkgYXZhaWxhYmxlIGZvciAiZW4tVUsiLCBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoKQotICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHJldHVybiBpdCwgYnV0IGV2ZW4gdGhvdWdoIGl0cyBsYW5ndWFnZSBtYXRjaGVzCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgb2YgdGhlIHByZWZlcnJlZCBsb2NhbGUsIHdlIG11c3QgaWdub3JlIGl0LAotICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIG1hdGNoZXMgYmFzZWQgb24gdGhlIGNvbnRhaW5lcidzIGRlZmF1bHQgbG9jYWxlCi0gICAgICAgICAgICAgICAgICAgIC8vIGFyZSBub3QgcG9ydGFibGUgYWNyb3NzIGRpZmZlcmVudCBjb250YWluZXJzIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgLy8gZGlmZmVyZW50IGRlZmF1bHQgbG9jYWxlcy4KLQotICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGJ1bmRsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtcmUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtYXRjaDsKLSAgICB9Ci0KLSAgICAvKiogU2V0dGVyIGZvciBwcm9wZXJ0eSBiYXNlbmFtZS4KLSAgICAgKiBAcGFyYW0gYmFzZW5hbWUgTmV3IHZhbHVlIG9mIHByb3BlcnR5IGJhc2VuYW1lLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZW5hbWUoRXhwcmVzc2lvbiBiYXNlbmFtZSkgewotICAgICAgICB0aGlzLmJhc2VuYW1lID0gYmFzZW5hbWU7Ci0gICAgfQotCi0gICAgLyoqIFNldHRlciBmb3IgcHJvcGVydHkgcHJlZml4LgotICAgICAqIEBwYXJhbSBwcmVmaXggTmV3IHZhbHVlIG9mIHByb3BlcnR5IHByZWZpeC4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChFeHByZXNzaW9uIHByZWZpeCkgewotICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZm10L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ZtdC9Db25maWcuamF2YSBiL2plbGx5LXRhZ3MvZm10L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ZtdC9Db25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU1ZDgzMi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ZtdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9mbXQvQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmZtdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci0KLQotLyoqCi0gKiBDbGFzcyBzdXBwb3J0aW5nIGFjY2VzcyB0byBjb25maWd1cmF0aW9uIGRhdGEuCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzp3aWxsaWV2dUB5YWhvby5jb20iPldpbGxpZSBWdTwvYT4KLSAqIEB2ZXJzaW9uIDEuMQotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnIHsKLQotICAgIC8qCi0gICAgICogSTE4Ti9Gb3JtYXR0aW5nIGFjdGlvbnMgcmVsYXRlZCBjb25maWd1cmF0aW9uIGRhdGEKLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIE5hbWUgb2YgY29uZmlndXJhdGlvbiBzZXR0aW5nIGZvciBhcHBsaWNhdGlvbi0gKGFzIG9wcG9zZWQgdG8gYnJvd3Nlci0pCi0gICAgICogYmFzZWQgcHJlZmVycmVkIGxvY2FsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZNVF9MT0NBTEUKLSAgICA9ICJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5mbXQubG9jYWxlIjsKLQotICAgIC8qKgotICAgICAqIE5hbWUgb2YgY29uZmlndXJhdGlvbiBzZXR0aW5nIGZvciBmYWxsYmFjayBsb2NhbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTVRfRkFMTEJBQ0tfTE9DQUxFCi0gICAgPSAib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZm10LmZhbGxiYWNrTG9jYWxlIjsKLQotICAgIC8qKgotICAgICAqIE5hbWUgb2YgY29uZmlndXJhdGlvbiBzZXR0aW5nIGZvciBpMThuIGxvY2FsaXphdGlvbiBjb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk1UX0xPQ0FMSVpBVElPTl9DT05URVhUCi0gICAgPSAib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZm10LmxvY2FsaXphdGlvbkNvbnRleHQiOwotCi0gICAgLyoqCi0gICAgICogTmFtZSBvZiBsb2NhbGl6YXRpb24gc2V0dGluZyBmb3IgdGltZSB6b25lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk1UX1RJTUVfWk9ORQotICAgID0gIm9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmZtdC50aW1lWm9uZSI7Ci0KLQotICAgIC8qKgotICAgICAqIExvb2tzIHVwIGEgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBpbiB0aGUgZ2l2ZW4gc2NvcGUuCi0gICAgICoKLSAgICAgKiA8cD4gVGhlIGxvb2t1cCBvZiBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBpcyBwZXJmb3JtZWQgYXMgaWYgZWFjaCBzY29wZQotICAgICAqIGhhZCBpdHMgb3duIG5hbWUgc3BhY2UsIHRoYXQgaXMsIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgbmFtZQotICAgICAqIGluIG9uZSBzY29wZSBkb2VzIG5vdCByZXBsYWNlIG9uZSBzdG9yZWQgaW4gYSBkaWZmZXJlbnQgc2NvcGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gamMgUGFnZSBjb250ZXh0IGluIHdoaWNoIHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGlzIHRvIGJlCi0gICAgICogbG9va2VkIHVwCi0gICAgICogQHBhcmFtIG5hbWUgQ29uZmlndXJhdGlvbiB2YXJpYWJsZSBuYW1lCi0gICAgICogQHBhcmFtIHNjb3BlIFNjb3BlIGluIHdoaWNoIHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGlzIHRvIGJlIGxvb2tlZAotICAgICAqIHVwCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSA8dHQ+amF2YS5sYW5nLk9iamVjdDwvdHQ+IGFzc29jaWF0ZWQgd2l0aCB0aGUgY29uZmlndXJhdGlvbgotICAgICAqIHZhcmlhYmxlLCBvciBudWxsIGlmIGl0IGlzIG5vdCBkZWZpbmVkLgotICAgICAqLwotLy8gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0KEplbGx5Q29udGV4dCBqYywgU3RyaW5nIG5hbWUsIGludCBzY29wZSkgewotLy8gICAgICAgIHN3aXRjaCAoc2NvcGUpIHsKLS8vICAgICAgICAgICAgY2FzZSBKZWxseUNvbnRleHQuUEFHRV9TQ09QRToKLS8vICAgICAgICAgICAgICAgIHJldHVybiBqYy5nZXRBdHRyaWJ1dGUobmFtZSArIFBBR0VfU0NPUEVfU1VGRklYLCBzY29wZSk7Ci0vLyAgICAgICAgICAgIGNhc2UgSmVsbHlDb250ZXh0LlJFUVVFU1RfU0NPUEU6Ci0vLyAgICAgICAgICAgICAgICByZXR1cm4gamMuZ2V0QXR0cmlidXRlKG5hbWUgKyBSRVFVRVNUX1NDT1BFX1NVRkZJWCwgc2NvcGUpOwotLy8gICAgICAgICAgICBjYXNlIEplbGx5Q29udGV4dC5TRVNTSU9OX1NDT1BFOgotLy8gICAgICAgICAgICAgICAgcmV0dXJuIGpjLmdldEF0dHJpYnV0ZShuYW1lICsgU0VTU0lPTl9TQ09QRV9TVUZGSVgsIHNjb3BlKTsKLS8vICAgICAgICAgICAgY2FzZSBKZWxseUNvbnRleHQuQVBQTElDQVRJT05fU0NPUEU6Ci0vLyAgICAgICAgICAgICAgICByZXR1cm4gamMuZ2V0QXR0cmlidXRlKG5hbWUgKyBBUFBMSUNBVElPTl9TQ09QRV9TVUZGSVgsIHNjb3BlKTsKLS8vICAgICAgICAgICAgZGVmYXVsdDoKLS8vICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gc2NvcGUiKTsKLS8vICAgICAgICB9Ci0vLyAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb29rcyB1cCBhIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgaW4gdGhlICJyZXF1ZXN0IiBzY29wZS4KLSAgICAgKgotICAgICAqIDxwPiBUaGUgbG9va3VwIG9mIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGlzIHBlcmZvcm1lZCBhcyBpZiBlYWNoIHNjb3BlCi0gICAgICogaGFkIGl0cyBvd24gbmFtZSBzcGFjZSwgdGhhdCBpcywgdGhlIHNhbWUgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBuYW1lCi0gICAgICogaW4gb25lIHNjb3BlIGRvZXMgbm90IHJlcGxhY2Ugb25lIHN0b3JlZCBpbiBhIGRpZmZlcmVudCBzY29wZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXF1ZXN0IFJlcXVlc3Qgb2JqZWN0IGluIHdoaWNoIHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGlzIHRvCi0gICAgICogYmUgbG9va2VkIHVwCi0gICAgICogQHBhcmFtIG5hbWUgQ29uZmlndXJhdGlvbiB2YXJpYWJsZSBuYW1lCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSA8dHQ+amF2YS5sYW5nLk9iamVjdDwvdHQ+IGFzc29jaWF0ZWQgd2l0aCB0aGUgY29uZmlndXJhdGlvbgotICAgICAqIHZhcmlhYmxlLCBvciBudWxsIGlmIGl0IGlzIG5vdCBkZWZpbmVkLgotICAgICAqLwotLy8gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0KFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyBuYW1lKSB7Ci0vLyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0QXR0cmlidXRlKG5hbWUgKyBSRVFVRVNUX1NDT1BFX1NVRkZJWCk7Ci0vLyAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb29rcyB1cCBhIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgaW4gdGhlICJzZXNzaW9uIiBzY29wZS4KLSAgICAgKgotICAgICAqIDxwPiBUaGUgbG9va3VwIG9mIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGlzIHBlcmZvcm1lZCBhcyBpZiBlYWNoIHNjb3BlCi0gICAgICogaGFkIGl0cyBvd24gbmFtZSBzcGFjZSwgdGhhdCBpcywgdGhlIHNhbWUgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBuYW1lCi0gICAgICogaW4gb25lIHNjb3BlIGRvZXMgbm90IHJlcGxhY2Ugb25lIHN0b3JlZCBpbiBhIGRpZmZlcmVudCBzY29wZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXNzaW9uIFNlc3Npb24gb2JqZWN0IGluIHdoaWNoIHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGlzIHRvCi0gICAgICogYmUgbG9va2VkIHVwCi0gICAgICogQHBhcmFtIG5hbWUgQ29uZmlndXJhdGlvbiB2YXJpYWJsZSBuYW1lCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSA8dHQ+amF2YS5sYW5nLk9iamVjdDwvdHQ+IGFzc29jaWF0ZWQgd2l0aCB0aGUgY29uZmlndXJhdGlvbgotICAgICAqIHZhcmlhYmxlLCBvciBudWxsIGlmIGl0IGlzIG5vdCBkZWZpbmVkLgotICAgICAqLwotLy8gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0KEh0dHBTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBuYW1lKSB7Ci0vLyAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0QXR0cmlidXRlKG5hbWUgKyBTRVNTSU9OX1NDT1BFX1NVRkZJWCk7Ci0vLyAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb29rcyB1cCBhIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgaW4gdGhlICJhcHBsaWNhdGlvbiIgc2NvcGUuCi0gICAgICoKLSAgICAgKiA8cD4gVGhlIGxvb2t1cCBvZiBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBpcyBwZXJmb3JtZWQgYXMgaWYgZWFjaCBzY29wZQotICAgICAqIGhhZCBpdHMgb3duIG5hbWUgc3BhY2UsIHRoYXQgaXMsIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgbmFtZQotICAgICAqIGluIG9uZSBzY29wZSBkb2VzIG5vdCByZXBsYWNlIG9uZSBzdG9yZWQgaW4gYSBkaWZmZXJlbnQgc2NvcGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCBTZXJ2bGV0IGNvbnRleHQgaW4gd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgaXMKLSAgICAgKiB0byBiZSBsb29rZWQgdXAKLSAgICAgKiBAcGFyYW0gbmFtZSBDb25maWd1cmF0aW9uIHZhcmlhYmxlIG5hbWUKLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIDx0dD5qYXZhLmxhbmcuT2JqZWN0PC90dD4gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICogdmFyaWFibGUsIG9yIG51bGwgaWYgaXQgaXMgbm90IGRlZmluZWQuCi0gICAgICovCi0vLyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXQoU2VydmxldENvbnRleHQgY29udGV4dCwgU3RyaW5nIG5hbWUpIHsKLS8vICAgICAgICByZXR1cm4gY29udGV4dC5nZXRBdHRyaWJ1dGUobmFtZSArIEFQUExJQ0FUSU9OX1NDT1BFX1NVRkZJWCk7Ci0vLyAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgaW4gdGhlIGdpdmVuIHNjb3BlLgotICAgICAqCi0gICAgICogPHA+IFNldHRpbmcgdGhlIHZhbHVlIG9mIGEgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBpcyBwZXJmb3JtZWQgYXMgaWYKLSAgICAgKiBlYWNoIHNjb3BlIGhhZCBpdHMgb3duIG5hbWVzcGFjZSwgdGhhdCBpcywgdGhlIHNhbWUgY29uZmlndXJhdGlvbgotICAgICAqIHZhcmlhYmxlIG5hbWUgaW4gb25lIHNjb3BlIGRvZXMgbm90IHJlcGxhY2Ugb25lIHN0b3JlZCBpbiBhIGRpZmZlcmVudAotICAgICAqIHNjb3BlLgotICAgICAqCi0gICAgICogQHBhcmFtIGpjIFBhZ2UgY29udGV4dCBpbiB3aGljaCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBpcyB0byBiZSBzZXQKLSAgICAgKiBAcGFyYW0gbmFtZSBDb25maWd1cmF0aW9uIHZhcmlhYmxlIG5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUgQ29uZmlndXJhdGlvbiB2YXJpYWJsZSB2YWx1ZQotICAgICAqIEBwYXJhbSBzY29wZSBTY29wZSBpbiB3aGljaCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBpcyB0byBiZSBzZXQKLSAgICAgKi8KLS8vICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXQoSmVsbHlDb250ZXh0IGpjLCBTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlLAotLy8gICAgaW50IHNjb3BlKSB7Ci0vLyAgICAgICAgc3dpdGNoIChzY29wZSkgewotLy8gICAgICAgICAgICBjYXNlIEplbGx5Q29udGV4dC5QQUdFX1NDT1BFOgotLy8gICAgICAgICAgICAgICAgamMuc2V0QXR0cmlidXRlKG5hbWUgKyBQQUdFX1NDT1BFX1NVRkZJWCwgdmFsdWUsIHNjb3BlKTsKLS8vICAgICAgICAgICAgICAgIGJyZWFrOwotLy8gICAgICAgICAgICBjYXNlIEplbGx5Q29udGV4dC5SRVFVRVNUX1NDT1BFOgotLy8gICAgICAgICAgICAgICAgamMuc2V0QXR0cmlidXRlKG5hbWUgKyBSRVFVRVNUX1NDT1BFX1NVRkZJWCwgdmFsdWUsIHNjb3BlKTsKLS8vICAgICAgICAgICAgICAgIGJyZWFrOwotLy8gICAgICAgICAgICBjYXNlIEplbGx5Q29udGV4dC5TRVNTSU9OX1NDT1BFOgotLy8gICAgICAgICAgICAgICAgamMuc2V0QXR0cmlidXRlKG5hbWUgKyBTRVNTSU9OX1NDT1BFX1NVRkZJWCwgdmFsdWUsIHNjb3BlKTsKLS8vICAgICAgICAgICAgICAgIGJyZWFrOwotLy8gICAgICAgICAgICBjYXNlIEplbGx5Q29udGV4dC5BUFBMSUNBVElPTl9TQ09QRToKLS8vICAgICAgICAgICAgICAgIGpjLnNldEF0dHJpYnV0ZShuYW1lICsgQVBQTElDQVRJT05fU0NPUEVfU1VGRklYLCB2YWx1ZSwgc2NvcGUpOwotLy8gICAgICAgICAgICAgICAgYnJlYWs7Ci0vLyAgICAgICAgICAgIGRlZmF1bHQ6Ci0vLyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIHNjb3BlIik7Ci0vLyAgICAgICAgfQotLy8gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGluIHRoZSAicmVxdWVzdCIgc2NvcGUuCi0gICAgICoKLSAgICAgKiA8cD4gU2V0dGluZyB0aGUgdmFsdWUgb2YgYSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGlzIHBlcmZvcm1lZCBhcyBpZgotICAgICAqIGVhY2ggc2NvcGUgaGFkIGl0cyBvd24gbmFtZXNwYWNlLCB0aGF0IGlzLCB0aGUgc2FtZSBjb25maWd1cmF0aW9uCi0gICAgICogdmFyaWFibGUgbmFtZSBpbiBvbmUgc2NvcGUgZG9lcyBub3QgcmVwbGFjZSBvbmUgc3RvcmVkIGluIGEgZGlmZmVyZW50Ci0gICAgICogc2NvcGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IG9iamVjdCBpbiB3aGljaCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBpcyB0bwotICAgICAqIGJlIHNldAotICAgICAqIEBwYXJhbSBuYW1lIENvbmZpZ3VyYXRpb24gdmFyaWFibGUgbmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZSBDb25maWd1cmF0aW9uIHZhcmlhYmxlIHZhbHVlCi0gICAgICovCi0vLyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0KFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLS8vICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZShuYW1lICsgUkVRVUVTVF9TQ09QRV9TVUZGSVgsIHZhbHVlKTsKLS8vICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBpbiB0aGUgInNlc3Npb24iIHNjb3BlLgotICAgICAqCi0gICAgICogPHA+IFNldHRpbmcgdGhlIHZhbHVlIG9mIGEgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBpcyBwZXJmb3JtZWQgYXMgaWYKLSAgICAgKiBlYWNoIHNjb3BlIGhhZCBpdHMgb3duIG5hbWVzcGFjZSwgdGhhdCBpcywgdGhlIHNhbWUgY29uZmlndXJhdGlvbgotICAgICAqIHZhcmlhYmxlIG5hbWUgaW4gb25lIHNjb3BlIGRvZXMgbm90IHJlcGxhY2Ugb25lIHN0b3JlZCBpbiBhIGRpZmZlcmVudAotICAgICAqIHNjb3BlLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlc3Npb24gU2Vzc2lvbiBvYmplY3QgaW4gd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgaXMgdG8KLSAgICAgKiBiZSBzZXQKLSAgICAgKiBAcGFyYW0gbmFtZSBDb25maWd1cmF0aW9uIHZhcmlhYmxlIG5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUgQ29uZmlndXJhdGlvbiB2YXJpYWJsZSB2YWx1ZQotICAgICAqLwotLy8gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldChIdHRwU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0vLyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUobmFtZSArIFNFU1NJT05fU0NPUEVfU1VGRklYLCB2YWx1ZSk7Ci0vLyAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgaW4gdGhlICJhcHBsaWNhdGlvbiIgc2NvcGUuCi0gICAgICoKLSAgICAgKiA8cD4gU2V0dGluZyB0aGUgdmFsdWUgb2YgYSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGlzIHBlcmZvcm1lZCBhcyBpZgotICAgICAqIGVhY2ggc2NvcGUgaGFkIGl0cyBvd24gbmFtZXNwYWNlLCB0aGF0IGlzLCB0aGUgc2FtZSBjb25maWd1cmF0aW9uCi0gICAgICogdmFyaWFibGUgbmFtZSBpbiBvbmUgc2NvcGUgZG9lcyBub3QgcmVwbGFjZSBvbmUgc3RvcmVkIGluIGEgZGlmZmVyZW50Ci0gICAgICogc2NvcGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCBTZXJ2bGV0IGNvbnRleHQgaW4gd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgaXMgdG8KLSAgICAgKiBiZSBzZXQKLSAgICAgKiBAcGFyYW0gbmFtZSBDb25maWd1cmF0aW9uIHZhcmlhYmxlIG5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUgQ29uZmlndXJhdGlvbiB2YXJpYWJsZSB2YWx1ZQotICAgICAqLwotLy8gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldChTZXJ2bGV0Q29udGV4dCBjb250ZXh0LCBTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0vLyAgICAgICAgY29udGV4dC5zZXRBdHRyaWJ1dGUobmFtZSArIEFQUExJQ0FUSU9OX1NDT1BFX1NVRkZJWCwgdmFsdWUpOwotLy8gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgZnJvbSB0aGUgZ2l2ZW4gc2NvcGUuCi0gICAgICoKLSAgICAgKiA8cD4gUmVtb3ZpbmcgYSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGlzIHBlcmZvcm1lZCBhcyBpZiBlYWNoIHNjb3BlIGhhZAotICAgICAqIGl0cyBvd24gbmFtZXNwYWNlLCB0aGF0IGlzLCB0aGUgc2FtZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIG5hbWUgaW4gb25lCi0gICAgICogc2NvcGUgZG9lcyBub3QgaW1wYWN0IG9uZSBzdG9yZWQgaW4gYSBkaWZmZXJlbnQgc2NvcGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gamMgUGFnZSBjb250ZXh0IGZyb20gd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgaXMgdG8gYmUKLSAgICAgKiByZW1vdmVkCi0gICAgICogQHBhcmFtIG5hbWUgQ29uZmlndXJhdGlvbiB2YXJpYWJsZSBuYW1lCi0gICAgICogQHBhcmFtIHNjb3BlIFNjb3BlIGZyb20gd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgaXMgdG8gYmUKLSAgICAgKiByZW1vdmVkCi0gICAgICovCi0vLyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlKEplbGx5Q29udGV4dCBqYywgU3RyaW5nIG5hbWUsIGludCBzY29wZSkgewotLy8gICAgICAgIHN3aXRjaCAoc2NvcGUpIHsKLS8vICAgICAgICAgICAgY2FzZSBKZWxseUNvbnRleHQuUEFHRV9TQ09QRToKLS8vICAgICAgICAgICAgICAgIGpjLnJlbW92ZUF0dHJpYnV0ZShuYW1lICsgUEFHRV9TQ09QRV9TVUZGSVgsIHNjb3BlKTsKLS8vICAgICAgICAgICAgICAgIGJyZWFrOwotLy8gICAgICAgICAgICBjYXNlIEplbGx5Q29udGV4dC5SRVFVRVNUX1NDT1BFOgotLy8gICAgICAgICAgICAgICAgamMucmVtb3ZlQXR0cmlidXRlKG5hbWUgKyBSRVFVRVNUX1NDT1BFX1NVRkZJWCwgc2NvcGUpOwotLy8gICAgICAgICAgICAgICAgYnJlYWs7Ci0vLyAgICAgICAgICAgIGNhc2UgSmVsbHlDb250ZXh0LlNFU1NJT05fU0NPUEU6Ci0vLyAgICAgICAgICAgICAgICBqYy5yZW1vdmVBdHRyaWJ1dGUobmFtZSArIFNFU1NJT05fU0NPUEVfU1VGRklYLCBzY29wZSk7Ci0vLyAgICAgICAgICAgICAgICBicmVhazsKLS8vICAgICAgICAgICAgY2FzZSBKZWxseUNvbnRleHQuQVBQTElDQVRJT05fU0NPUEU6Ci0vLyAgICAgICAgICAgICAgICBqYy5yZW1vdmVBdHRyaWJ1dGUobmFtZSArIEFQUExJQ0FUSU9OX1NDT1BFX1NVRkZJWCwgc2NvcGUpOwotLy8gICAgICAgICAgICAgICAgYnJlYWs7Ci0vLyAgICAgICAgICAgIGRlZmF1bHQ6Ci0vLyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIHNjb3BlIik7Ci0vLyAgICAgICAgfQotLy8gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgZnJvbSB0aGUgInJlcXVlc3QiIHNjb3BlLgotICAgICAqCi0gICAgICogPHA+IFJlbW92aW5nIGEgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBpcyBwZXJmb3JtZWQgYXMgaWYgZWFjaCBzY29wZSBoYWQKLSAgICAgKiBpdHMgb3duIG5hbWVzcGFjZSwgdGhhdCBpcywgdGhlIHNhbWUgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBuYW1lIGluIG9uZQotICAgICAqIHNjb3BlIGRvZXMgbm90IGltcGFjdCBvbmUgc3RvcmVkIGluIGEgZGlmZmVyZW50IHNjb3BlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCBvYmplY3QgZnJvbSB3aGljaCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBpcwotICAgICAqIHRvIGJlIHJlbW92ZWQKLSAgICAgKiBAcGFyYW0gbmFtZSBDb25maWd1cmF0aW9uIHZhcmlhYmxlIG5hbWUKLSAgICAgKi8KLS8vICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmUoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIG5hbWUpIHsKLS8vICAgICAgICByZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZShuYW1lICsgUkVRVUVTVF9TQ09QRV9TVUZGSVgpOwotLy8gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgZnJvbSB0aGUgInNlc3Npb24iIHNjb3BlLgotICAgICAqCi0gICAgICogPHA+IFJlbW92aW5nIGEgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBpcyBwZXJmb3JtZWQgYXMgaWYgZWFjaCBzY29wZSBoYWQKLSAgICAgKiBpdHMgb3duIG5hbWVzcGFjZSwgdGhhdCBpcywgdGhlIHNhbWUgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBuYW1lIGluIG9uZQotICAgICAqIHNjb3BlIGRvZXMgbm90IGltcGFjdCBvbmUgc3RvcmVkIGluIGEgZGlmZmVyZW50IHNjb3BlLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlc3Npb24gU2Vzc2lvbiBvYmplY3QgZnJvbSB3aGljaCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBpcwotICAgICAqIHRvIGJlIHJlbW92ZWQKLSAgICAgKiBAcGFyYW0gbmFtZSBDb25maWd1cmF0aW9uIHZhcmlhYmxlIG5hbWUKLSAgICAgKi8KLS8vICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmUoSHR0cFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIG5hbWUpIHsKLS8vICAgICAgICBzZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZShuYW1lICsgU0VTU0lPTl9TQ09QRV9TVUZGSVgpOwotLy8gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgZnJvbSB0aGUgImFwcGxpY2F0aW9uIiBzY29wZS4KLSAgICAgKgotICAgICAqIDxwPiBSZW1vdmluZyBhIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgaXMgcGVyZm9ybWVkIGFzIGlmIGVhY2ggc2NvcGUgaGFkCi0gICAgICogaXRzIG93biBuYW1lc3BhY2UsIHRoYXQgaXMsIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgbmFtZSBpbiBvbmUKLSAgICAgKiBzY29wZSBkb2VzIG5vdCBpbXBhY3Qgb25lIHN0b3JlZCBpbiBhIGRpZmZlcmVudCBzY29wZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IFNlcnZsZXQgY29udGV4dCBmcm9tIHdoaWNoIHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGlzCi0gICAgICogdG8gYmUgcmVtb3ZlZAotICAgICAqIEBwYXJhbSBuYW1lIENvbmZpZ3VyYXRpb24gdmFyaWFibGUgbmFtZQotICAgICAqLwotLy8gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZShTZXJ2bGV0Q29udGV4dCBjb250ZXh0LCBTdHJpbmcgbmFtZSkgewotLy8gICAgICAgIGNvbnRleHQucmVtb3ZlQXR0cmlidXRlKG5hbWUgKyBBUFBMSUNBVElPTl9TQ09QRV9TVUZGSVgpOwotLy8gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gc2V0dGluZwotICAgICAqIGlkZW50aWZpZWQgYnkgaXRzIGNvbnRleHQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIG5hbWUuCi0gICAgICoKLSAgICAgKiA8cD4gRm9yIGVhY2ggb2YgdGhlIEpTUCBzY29wZXMgKHBhZ2UsIHJlcXVlc3QsIHNlc3Npb24sIGFwcGxpY2F0aW9uKSwKLSAgICAgKiBnZXQgdGhlIHZhbHVlIG9mIHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGlkZW50aWZpZWQgYnkgPHR0Pm5hbWU8L3R0PgotICAgICAqIHVzaW5nIG1ldGhvZCA8dHQ+Z2V0KCk8L3R0Pi4gUmV0dXJuIGFzIHNvb24gYXMgYSBub24tbnVsbCB2YWx1ZSBpcwotICAgICAqIGZvdW5kLiBJZiBubyB2YWx1ZSBpcyBmb3VuZCwgZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgY29udGV4dCBpbml0aWFsaXphdGlvbgotICAgICAqIHBhcmFtZXRlciBpZGVudGlmaWVkIGJ5IDx0dD5uYW1lPC90dD4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gamMgUGFnZSBjb250ZXh0IGluIHdoaWNoIHRoZSBjb25maWd1cmF0aW9uIHNldHRpbmcgaXMgdG8gYmUKLSAgICAgKiBzZWFyY2hlZAotICAgICAqIEBwYXJhbSBuYW1lIENvbnRleHQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgKiBzZXR0aW5nCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSA8dHQ+amF2YS5sYW5nLk9iamVjdDwvdHQ+IGFzc29jaWF0ZWQgd2l0aCB0aGUgY29uZmlndXJhdGlvbgotICAgICAqIHNldHRpbmcgaWRlbnRpZmllZCBieSA8dHQ+bmFtZTwvdHQ+LCBvciBudWxsIGlmIGl0IGlzIG5vdCBkZWZpbmVkLgotICAgICAqLwotLy8gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZmluZChKZWxseUNvbnRleHQgamMsIFN0cmluZyBuYW1lKSB7Ci0vLyAgICAgICAgT2JqZWN0IHJldCA9IGpjLmdldFZhcmlhYmxlKG5hbWUsIEplbGx5Q29udGV4dC5QQUdFX1NDT1BFKTsKLS8vICAgICAgICBpZiAocmV0ID09IG51bGwpIHsKLS8vICAgICAgICAgICAgcmV0ID0gZ2V0KGpjLCBuYW1lLCBKZWxseUNvbnRleHQuUkVRVUVTVF9TQ09QRSk7Ci0vLyAgICAgICAgICAgIGlmIChyZXQgPT0gbnVsbCkgewotLy8gICAgICAgICAgICAgICAgaWYgKGpjLmdldFNlc3Npb24oKSAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgc2Vzc2lvbiBvbmx5IGlmIGEgc2Vzc2lvbiBpcyBwcmVzZW50Ci0vLyAgICAgICAgICAgICAgICAgICAgcmV0ID0gZ2V0KGpjLCBuYW1lLCBKZWxseUNvbnRleHQuU0VTU0lPTl9TQ09QRSk7Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICBpZiAocmV0ID09IG51bGwpIHsKLS8vICAgICAgICAgICAgICAgICAgICByZXQgPSBnZXQoamMsIG5hbWUsIEplbGx5Q29udGV4dC5BUFBMSUNBVElPTl9TQ09QRSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGpjLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcihuYW1lKTsKLS8vICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLwotLy8gICAgICAgIHJldHVybiByZXQ7Ci0vLyAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2ZtdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9mbXQvRm10VGFnTGlicmFyeS5qYXZhIGIvamVsbHktdGFncy9mbXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZm10L0ZtdFRhZ0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgwZjYwNi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ZtdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9mbXQvRm10VGFnTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5mbXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnTGlicmFyeTsKLQotLyoqIERlc2NyaWJlcyB0aGUgdGFnIGxpYnJhcnkgZm9yIHRhZ3MgaW4gSlNUTC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzp3aWxsaWV2dUB5YWhvby5jb20iPldpbGxpZSBWdTwvYT4KLSAqIEB2ZXJzaW9uIDEuMgotICoKLSAqIEB0YXNrIGltcGxlbWVudCAmbHQ7Zm10OmZvcm1hdE51bWJlciZndDsKLSAqIEB0YXNrIGltcGxlbWVudCAmbHQ7Zm10OnBhcnNlTnVtYmVyJmd0OwotICogQHRhc2sgaW1wbGVtZW50ICZsdDtmbXQ6cGFyc2VEYXRlJmd0OwotICogQHRhc2sgZGVjaWRlIGhvdyB0byBzdXBwb3J0ICZsdDtmbXQ6cmVxdWVzdEVuY29kaW5nJmd0OwotICovCi1wdWJsaWMgY2xhc3MgRm10VGFnTGlicmFyeSBleHRlbmRzIFRhZ0xpYnJhcnkgewotCi0gICAgLyoqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgRm10VGFnTGlicmFyeSAqLwotICAgIHB1YmxpYyBGbXRUYWdMaWJyYXJ5KCkgewotICAgICAgICByZWdpc3RlclRhZygiYnVuZGxlIiwgQnVuZGxlVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImZvcm1hdERhdGUiLCBGb3JtYXREYXRlVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoIm1lc3NhZ2UiLCBNZXNzYWdlVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInBhcmFtIiwgUGFyYW1UYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygic2V0QnVuZGxlIiwgU2V0QnVuZGxlVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInNldExvY2FsZSIsIFNldExvY2FsZVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJzZXRUaW1lWm9uZSIsIFNldFRpbWVab25lVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInRpbWVab25lIiwgVGltZVpvbmVUYWcuY2xhc3MpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9mbXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZm10L0Zvcm1hdERhdGVUYWcuamF2YSBiL2plbGx5LXRhZ3MvZm10L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ZtdC9Gb3JtYXREYXRlVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMWRlNmYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9mbXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZm10L0Zvcm1hdERhdGVUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmZtdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbjsKLQotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotCi0KLS8qKgotICogU3VwcG9ydCBmb3IgdGFnIGhhbmRsZXJzIGZvciAmbHQ7Zm9ybWF0RGF0ZSZndDssIHRoZSBkYXRlIGFuZCB0aW1lIGZvcm1hdHRpbmcKLSAqIHRhZyBpbiBKU1RMLgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86d2lsbGlldnVAeWFob28uY29tIj5XaWxsaWUgVnU8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gKiBAdGFzayBpMThuIGV4Y2VwdGlvbiBtZXNzYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JtYXREYXRlVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVCA9ICJkZWZhdWx0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPUlQgPSAic2hvcnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJVU0gPSAibWVkaXVtIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9ORyA9ICJsb25nIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTCA9ICJmdWxsIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFID0gImRhdGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FID0gInRpbWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFVElNRSA9ICJib3RoIjsKLQotICAgIC8qKiBIb2xkcyB2YWx1ZSBvZiBwcm9wZXJ0eSB2YWx1ZS4gKi8KLSAgICBwcml2YXRlIEV4cHJlc3Npb24gdmFsdWU7Ci0KLSAgICAvKiogSG9sZHMgdmFsdWUgb2YgcHJvcGVydHkgdHlwZS4gKi8KLSAgICBwcml2YXRlIEV4cHJlc3Npb24gdHlwZTsKLQotICAgIC8qKiBIb2xkcyB2YWx1ZSBvZiBwcm9wZXJ0eSBkYXRhU3R5bGUuICovCi0gICAgcHJpdmF0ZSBFeHByZXNzaW9uIGRhdGVTdHlsZTsKLQotICAgIC8qKiBIb2xkcyB2YWx1ZSBvZiBwcm9wZXJ0eSB0aW1lU3R5bGUuICovCi0gICAgcHJpdmF0ZSBFeHByZXNzaW9uIHRpbWVTdHlsZTsKLQotICAgIC8qKiBIb2xkcyB2YWx1ZSBvZiBwcm9wZXJ0eSBwYXR0ZXJuLiAqLwotICAgIHByaXZhdGUgRXhwcmVzc2lvbiBwYXR0ZXJuOwotCi0gICAgLyoqIEhvbGRzIHZhbHVlIG9mIHByb3BlcnR5IHRpbWVab25lLiAqLwotICAgIHByaXZhdGUgRXhwcmVzc2lvbiB0aW1lWm9uZTsKLQotICAgIC8qKiBIb2xkcyB2YWx1ZSBvZiBwcm9wZXJ0eSB2YXIuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyOwotCi0gICAgLyoqIEhvbGRzIHZhbHVlIG9mIHByb3BlcnR5IHNjb3BlLiAqLwotICAgIHByaXZhdGUgU3RyaW5nIHNjb3BlOwotCi0gICAgLyoqIEV2YWx1YXRlZCB0eXBlICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXR5cGU7Ci0gICAgLyoqIEV2YWx1YXRlZCBkYXRlU3R5bGUgKi8KLSAgICBwcml2YXRlIFN0cmluZyBlZGF0ZVN0eWxlOwotICAgIC8qKiBFdmFsdWF0ZWQgdGltZVN0eWxlICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXRpbWVTdHlsZTsKLQotICAgIC8qKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEZvcm1hdERhdGVUYWcgKi8KLSAgICBwdWJsaWMgRm9ybWF0RGF0ZVRhZygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFdmFsdWF0ZXMgdGhpcyB0YWcgYWZ0ZXIgYWxsIHRoZSB0YWdzIHByb3BlcnRpZXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoc2NvcGUgIT0gbnVsbCAmJiB2YXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKAotICAgICAgICAgICAgIklmICdzY29wZScgaXMgc3BlY2lmaWVkLCAndmFyJyBtdXN0IGJlIGRlZmluZWQgZm9yIHRoaXMgdGFnIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IHZhbHVlSW5wdXQgPSBudWxsOwotICAgICAgICBpZiAodGhpcy52YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB2YWx1ZUlucHV0ID0gdGhpcy52YWx1ZS5ldmFsdWF0ZShjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIERhdGUgZGF0ZSA9IG51bGw7Ci0gICAgICAgIGlmICh2YWx1ZUlucHV0ICE9IG51bGwgJiYgdmFsdWVJbnB1dCBpbnN0YW5jZW9mIERhdGUpIHsKLSAgICAgICAgICAgIGRhdGUgPSAoRGF0ZSkgdmFsdWVJbnB1dDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkYXRlID09IG51bGwgJiYgdmFyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChzY29wZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5yZW1vdmVWYXJpYWJsZSh2YXIsIHNjb3BlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGNvbnRleHQucmVtb3ZlVmFyaWFibGUodmFyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGV0eXBlID0gREFURTsKLSAgICAgICAgaWYgKHRoaXMudHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBldHlwZSA9IChTdHJpbmcpIHRoaXMudHlwZS5ldmFsdWF0ZShjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGVkYXRlU3R5bGUgPSBERUZBVUxUOwotICAgICAgICBpZiAodGhpcy5kYXRlU3R5bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZWRhdGVTdHlsZSA9IChTdHJpbmcpIHRoaXMuZGF0ZVN0eWxlLmV2YWx1YXRlKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXRpbWVTdHlsZSA9IERFRkFVTFQ7Ci0gICAgICAgIGlmICh0aGlzLnRpbWVTdHlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBldGltZVN0eWxlID0gKFN0cmluZykgdGhpcy50aW1lU3R5bGUuZXZhbHVhdGUoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZXBhdHRlcm4gPSBudWxsOwotICAgICAgICBpZiAodGhpcy5wYXR0ZXJuICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVwYXR0ZXJuID0gKFN0cmluZykgdGhpcy5wYXR0ZXJuLmV2YWx1YXRlKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IGV0aW1lWm9uZSA9IG51bGw7Ci0gICAgICAgIGlmICh0aGlzLnRpbWVab25lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGV0aW1lWm9uZSA9IHRoaXMudGltZVpvbmUuZXZhbHVhdGUoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDcmVhdGUgZm9ybWF0dGVyCi0gICAgICAgIExvY2FsZSBsb2NhbGUgPSBTZXRMb2NhbGVUYWcuZ2V0Rm9ybWF0dGluZ0xvY2FsZSgKLSAgICAgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgIERhdGVGb3JtYXQuZ2V0QXZhaWxhYmxlTG9jYWxlcygpKTsKLQotICAgICAgICBTdHJpbmcgZm9ybWF0dGVkID0gbnVsbDsKLSAgICAgICAgaWYgKGxvY2FsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBEYXRlRm9ybWF0IGZvcm1hdHRlciA9IGNyZWF0ZUZvcm1hdHRlcihsb2NhbGUpOwotCi0gICAgICAgICAgICAvLyBBcHBseSBwYXR0ZXJuLCBpZiBwcmVzZW50Ci0gICAgICAgICAgICBpZiAocGF0dGVybiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgKChTaW1wbGVEYXRlRm9ybWF0KSBmb3JtYXR0ZXIpLmFwcGx5UGF0dGVybihlcGF0dGVybik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChlcGF0dGVybiwgbG9jYWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFNldCB0aW1lIHpvbmUKLSAgICAgICAgICAgIFRpbWVab25lIHR6ID0gbnVsbDsKLSAgICAgICAgICAgIGlmICgoZXRpbWVab25lIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgJiYgKChTdHJpbmcpIGV0aW1lWm9uZSkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIGV0aW1lWm9uZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXRpbWVab25lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXRpbWVab25lIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR6ID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoKFN0cmluZykgZXRpbWVab25lKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV0aW1lWm9uZSBpbnN0YW5jZW9mIFRpbWVab25lKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR6ID0gKFRpbWVab25lKSBldGltZVpvbmU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJCYWQgdGltZSB6b25lIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0eiA9IFRpbWVab25lVGFnLmdldFRpbWVab25lKGNvbnRleHQsIHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHR6ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3JtYXR0ZXIuc2V0VGltZVpvbmUodHopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9ybWF0dGVkID0gZm9ybWF0dGVyLmZvcm1hdChkYXRlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG5vIGZvcm1hdHRpbmcgbG9jYWxlIGF2YWlsYWJsZSwgdXNlIERhdGUudG9TdHJpbmcoKQotICAgICAgICAgICAgZm9ybWF0dGVkID0gZGF0ZS50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoc2NvcGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUodmFyLCBzY29wZSwgZm9ybWF0dGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUodmFyLCBmb3JtYXR0ZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgZm9ybWF0dGVkCi0gICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKGZvcm1hdHRlZCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiY291bGQgbm90IHdyaXRlIGZvcm1hdHRlZCB0ZXh0IixlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBTZXR0ZXIgZm9yIHByb3BlcnR5IHZhbHVlLgotICAgICAqIEBwYXJhbSB2YWx1ZSBOZXcgdmFsdWUgb2YgcHJvcGVydHkgdmFsdWUuCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShFeHByZXNzaW9uIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKiogU2V0dGVyIGZvciBwcm9wZXJ0eSB0eXBlLgotICAgICAqIEBwYXJhbSB0eXBlIE5ldyB2YWx1ZSBvZiBwcm9wZXJ0eSB0eXBlLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShFeHByZXNzaW9uIHR5cGUpIHsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICAvKiogU2V0dGVyIGZvciBwcm9wZXJ0eSBkYXRhU3R5bGUuCi0gICAgICogQHBhcmFtIGRhdGFTdHlsZSBOZXcgdmFsdWUgb2YgcHJvcGVydHkgZGF0YVN0eWxlLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZVN0eWxlKEV4cHJlc3Npb24gZGF0ZVN0eWxlKSB7Ci0gICAgICAgIHRoaXMuZGF0ZVN0eWxlID0gZGF0ZVN0eWxlOwotICAgIH0KLQotICAgIC8qKiBTZXR0ZXIgZm9yIHByb3BlcnR5IHRpbWVTdHlsZS4KLSAgICAgKiBAcGFyYW0gdGltZVN0eWxlIE5ldyB2YWx1ZSBvZiBwcm9wZXJ0eSB0aW1lU3R5bGUuCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaW1lU3R5bGUoRXhwcmVzc2lvbiB0aW1lU3R5bGUpIHsKLSAgICAgICAgdGhpcy50aW1lU3R5bGUgPSB0aW1lU3R5bGU7Ci0gICAgfQotCi0gICAgLyoqIFNldHRlciBmb3IgcHJvcGVydHkgcGF0dGVybi4KLSAgICAgKiBAcGFyYW0gcGF0dGVybiBOZXcgdmFsdWUgb2YgcHJvcGVydHkgcGF0dGVybi4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm4oRXhwcmVzc2lvbiBwYXR0ZXJuKSB7Ci0gICAgICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm47Ci0gICAgfQotCi0gICAgLyoqIFNldHRlciBmb3IgcHJvcGVydHkgdGltZVpvbmUuCi0gICAgICogQHBhcmFtIHRpbWVab25lIE5ldyB2YWx1ZSBvZiBwcm9wZXJ0eSB0aW1lWm9uZS4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRpbWVab25lKEV4cHJlc3Npb24gdGltZVpvbmUpIHsKLSAgICAgICAgdGhpcy50aW1lWm9uZSA9IHRpbWVab25lOwotICAgIH0KLQotICAgIC8qKiBTZXR0ZXIgZm9yIHByb3BlcnR5IHZhci4KLSAgICAgKiBAcGFyYW0gdmFyIE5ldyB2YWx1ZSBvZiBwcm9wZXJ0eSB2YXIuCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0KLSAgICAvKiogU2V0dGVyIGZvciBwcm9wZXJ0eSBzY29wZS4KLSAgICAgKiBAcGFyYW0gc2NvcGUgTmV3IHZhbHVlIG9mIHByb3BlcnR5IHNjb3BlLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlKSB7Ci0gICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKLSAgICB9Ci0KLSAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIC8vIFByaXZhdGUgdXRpbGl0eSBtZXRob2RzCi0KLSAgICBwcml2YXRlIERhdGVGb3JtYXQgY3JlYXRlRm9ybWF0dGVyKExvY2FsZSBsb2MpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIERhdGVGb3JtYXQgZm9ybWF0dGVyID0gbnVsbDsKLQotICAgICAgICBpZiAoKGV0eXBlID09IG51bGwpIHx8IERBVEUuZXF1YWxzSWdub3JlQ2FzZShldHlwZSkpIHsKLSAgICAgICAgICAgIGZvcm1hdHRlciA9IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKAotICAgICAgICAgICAgZ2V0U3R5bGUoZWRhdGVTdHlsZSwgIkZPUk1BVF9EQVRFX0lOVkFMSURfREFURV9TVFlMRSIpLAotICAgICAgICAgICAgbG9jKTsKLSAgICAgICAgfSBlbHNlIGlmIChUSU1FLmVxdWFsc0lnbm9yZUNhc2UoZXR5cGUpKSB7Ci0gICAgICAgICAgICBmb3JtYXR0ZXIgPSBEYXRlRm9ybWF0LmdldFRpbWVJbnN0YW5jZSgKLSAgICAgICAgICAgIGdldFN0eWxlKGV0aW1lU3R5bGUsICJGT1JNQVRfREFURV9JTlZBTElEX1RJTUVfU1RZTEUiKSwKLSAgICAgICAgICAgIGxvYyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREFURVRJTUUuZXF1YWxzSWdub3JlQ2FzZShldHlwZSkpIHsKLSAgICAgICAgICAgIGZvcm1hdHRlciA9IERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZSgKLSAgICAgICAgICAgIGdldFN0eWxlKGVkYXRlU3R5bGUsICJGT1JNQVRfREFURV9JTlZBTElEX0RBVEVfU1RZTEUiKSwKLSAgICAgICAgICAgIGdldFN0eWxlKGV0aW1lU3R5bGUsICJGT1JNQVRfREFURV9JTlZBTElEX1RJTUVfU1RZTEUiKSwKLSAgICAgICAgICAgIGxvYyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIkRhdGUgZm9ybWF0IGludmFsdWUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmb3JtYXR0ZXI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gc3RyaW5nIGRlc2NyaXB0aW9uIG9mIGEgZm9ybWF0dGluZyBzdHlsZSBmb3IKLSAgICAgKiBkYXRlcyBhbmQgdGltZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgamF2YS51dGlsLkRhdGVGb3JtYXQgY29uc3RhbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3R5bGUgU3RyaW5nIGRlc2NyaXB0aW9uIG9mIGZvcm1hdHRpbmcgc3R5bGUgZm9yIGRhdGVzIGFuZCB0aW1lcwotICAgICAqIEBwYXJhbSBlcnJDb2RlIEVycm9yIGNvZGUgdG8gdGhyb3cgaWYgZ2l2ZW4gc3R5bGUgaXMgaW52YWxpZAotICAgICAqCi0gICAgICogQHJldHVybiBqYXZhLnV0aWwuRGF0ZUZvcm1hdCBjb25zdGFudCBjb3JyZXNwb25kaW5nIHRvIGdpdmVuIHN0eWxlCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEplbGx5RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBzdHlsZSBpcyBpbnZhbGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0U3R5bGUoU3RyaW5nIHN0eWxlLCBTdHJpbmcgZXJyQ29kZSkKLSAgICB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpbnQgcmV0ID0gRGF0ZUZvcm1hdC5ERUZBVUxUOwotCi0gICAgICAgIGlmIChzdHlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoREVGQVVMVC5lcXVhbHNJZ25vcmVDYXNlKHN0eWxlKSkgewotICAgICAgICAgICAgICAgIHJldCA9IERhdGVGb3JtYXQuREVGQVVMVDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoU0hPUlQuZXF1YWxzSWdub3JlQ2FzZShzdHlsZSkpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBEYXRlRm9ybWF0LlNIT1JUOwotICAgICAgICAgICAgfSBlbHNlIGlmIChNRURJVU0uZXF1YWxzSWdub3JlQ2FzZShzdHlsZSkpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBEYXRlRm9ybWF0Lk1FRElVTTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoTE9ORy5lcXVhbHNJZ25vcmVDYXNlKHN0eWxlKSkgewotICAgICAgICAgICAgICAgIHJldCA9IERhdGVGb3JtYXQuTE9ORzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRlVMTC5lcXVhbHNJZ25vcmVDYXNlKHN0eWxlKSkgewotICAgICAgICAgICAgICAgIHJldCA9IERhdGVGb3JtYXQuRlVMTDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJJbnZhbGlkIHN0eWxlICIgKyBlcnJDb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2ZtdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9mbXQvTG9jYWxpemF0aW9uQ29udGV4dC5qYXZhIGIvamVsbHktdGFncy9mbXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZm10L0xvY2FsaXphdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZhMGI5My4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ZtdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9mbXQvTG9jYWxpemF0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZm10OwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLQotLyoqCi0gKiBDbGFzcyByZXByZXNlbnRpbmcgYW4gSTE4TiBsb2NhbGl6YXRpb24gY29udGV4dC4KLSAqCi0gKiA8cD4gQW4gSTE4TiBsb2NhbGl6YXRpb24gY29udGV4dCBoYXMgdHdvIGNvbXBvbmVudHM6IGEgcmVzb3VyY2UgYnVuZGxlIGFuZAotICogdGhlIGxvY2FsZSB0aGF0IGxlZCB0byB0aGUgcmVzb3VyY2UgYnVuZGxlIG1hdGNoLgotICoKLSAqIDxwPiBUaGUgcmVzb3VyY2UgYnVuZGxlIGNvbXBvbmVudCBpcyB1c2VkIGJ5ICZsdDtmbXQ6bWVzc2FnZSZndDsgZm9yIG1hcHBpbmcKLSAqIG1lc3NhZ2Uga2V5cyB0byBsb2NhbGl6ZWQgbWVzc2FnZXMsIGFuZCB0aGUgbG9jYWxlIGNvbXBvbmVudCBpcyB1c2VkIGJ5IHRoZQotICogJmx0O2ZtdDptZXNzYWdlJmd0OywgJmx0O2ZtdDpmb3JtYXROdW1iZXImZ3Q7LCAmbHQ7Zm10OnBhcnNlTnVtYmVyJmd0OywgJmx0O2ZtdDpmb3JtYXREYXRlJmd0OywKLSAqIGFuZCAmbHQ7Zm10OnBhcnNlRGF0ZSZndDsgYWN0aW9ucyBhcyB0aGVpciBmb3JtYXR0aW5nIGxvY2FsZS4KLSAqCi0gKiBAc2VlIGphdmF4LnNlcnZsZXQuanNwLmpzdGwuZm10LkxvY2FsaXphdGlvbkNvbnRleHQKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzp3aWxsaWV2dUB5YWhvby5jb20iPldpbGxpZSBWdTwvYT4KLSAqIEB2ZXJzaW9uIDEuMQotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxpemF0aW9uQ29udGV4dCB7Ci0KLSAgICAvLyB0aGUgbG9jYWxpemF0aW9uIGNvbnRleHQncyByZXNvdXJjZSBidW5kbGUKLSAgICBmaW5hbCBwcml2YXRlIFJlc291cmNlQnVuZGxlIGJ1bmRsZTsKLQotICAgIC8vIHRoZSBsb2NhbGl6YXRpb24gY29udGV4dCdzIGxvY2FsZQotICAgIGZpbmFsIHByaXZhdGUgTG9jYWxlIGxvY2FsZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgSTE4TiBsb2NhbGl6YXRpb24gY29udGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTG9jYWxpemF0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgYnVuZGxlID0gbnVsbDsKLSAgICAgICAgbG9jYWxlID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIEkxOE4gbG9jYWxpemF0aW9uIGNvbnRleHQgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UgYnVuZGxlCi0gICAgICogYW5kIGxvY2FsZS4KLSAgICAgKgotICAgICAqIDxwPiBUaGUgc3BlY2lmaWVkIGxvY2FsZSBpcyB0aGUgYXBwbGljYXRpb24tIG9yIGJyb3dzZXItYmFzZWQgcHJlZmVycmVkCi0gICAgICogbG9jYWxlIHRoYXQgbGVkIHRvIHRoZSByZXNvdXJjZSBidW5kbGUgbWF0Y2guCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBsb2NhbGl6YXRpb24gY29udGV4dCdzIHJlc291cmNlIGJ1bmRsZQotICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsaXphdGlvbiBjb250ZXh0J3MgbG9jYWxlCi0gICAgICovCi0gICAgcHVibGljIExvY2FsaXphdGlvbkNvbnRleHQoUmVzb3VyY2VCdW5kbGUgYnVuZGxlLCBMb2NhbGUgbG9jYWxlKSB7Ci0gICAgICAgIHRoaXMuYnVuZGxlID0gYnVuZGxlOwotICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIEkxOE4gbG9jYWxpemF0aW9uIGNvbnRleHQgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UgYnVuZGxlLgotICAgICAqCi0gICAgICogPHA+IFRoZSBsb2NhbGl6YXRpb24gY29udGV4dCdzIGxvY2FsZSBpcyB0YWtlbiBmcm9tIHRoZSBnaXZlbgotICAgICAqIHJlc291cmNlIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIHJlc291cmNlIGJ1bmRsZQotICAgICAqLwotICAgIHB1YmxpYyBMb2NhbGl6YXRpb25Db250ZXh0KFJlc291cmNlQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICB0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLSAgICAgICAgdGhpcy5sb2NhbGUgPSBidW5kbGUuZ2V0TG9jYWxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcmVzb3VyY2UgYnVuZGxlIG9mIHRoaXMgSTE4TiBsb2NhbGl6YXRpb24gY29udGV4dC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHJlc291cmNlIGJ1bmRsZSBvZiB0aGlzIEkxOE4gbG9jYWxpemF0aW9uIGNvbnRleHQsIG9yIG51bGwKLSAgICAgKiBpZiB0aGlzIEkxOE4gbG9jYWxpemF0aW9uIGNvbnRleHQgaXMgZW1wdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbG9jYWxlIG9mIHRoaXMgSTE4TiBsb2NhbGl6YXRpb24gY29udGV4dC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGxvY2FsZSBvZiB0aGlzIEkxOE4gbG9jYWxpemF0aW9uIGNvbnRleHQsIG9yIG51bGwgaWYgdGhpcwotICAgICAqIEkxOE4gbG9jYWxpemF0aW9uIGNvbnRleHQgaXMgZW1wdHksIG9yIGl0cyByZXNvdXJjZSBidW5kbGUgaXMgYQotICAgICAqIChsb2NhbGUtbGVzcykgcm9vdCByZXNvdXJjZSBidW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKSB7Ci0gICAgICAgIHJldHVybiBsb2NhbGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9mbXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZm10L01lc3NhZ2VUYWcuamF2YSBiL2plbGx5LXRhZ3MvZm10L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ZtdC9NZXNzYWdlVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4Yjg3NmYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9mbXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZm10L01lc3NhZ2VUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmZtdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbjsKLQotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci0KLS8qKgotICogU3VwcG9ydCBmb3IgdGFnIGhhbmRsZXJzIGZvciAmbHQ7bWVzc2FnZSZndDssIHRoZSBsb29rdXAgdXAKLSAqIGxvY2FsaXplZCBtZXNzYWdlIHRhZyBpbiBKU1RMLgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86d2lsbGlldnVAeWFob28uY29tIj5XaWxsaWUgVnU8L2E+Ci0gKiBAdmVyc2lvbiAxLjEKLSAqCi0gKiBAdGFzayBkZWNpZGUgaG93IHRvIGltcGxlbWVudCBzZXRSZXNwb25zZUxvY2FsZQotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVOREVGSU5FRF9LRVkgPSAiPz8/IjsKLQotICAgIHByaXZhdGUgRXhwcmVzc2lvbiBrZXk7Ci0gICAgcHJpdmF0ZSBFeHByZXNzaW9uIGJ1bmRsZTsKLQotICAgIHByaXZhdGUgTG9jYWxpemF0aW9uQ29udGV4dCBsb2NDdHh0OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2NvcGU7Ci0KLSAgICBwcml2YXRlIExpc3QgcGFyYW1zOwotCi0gICAgLyoqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgTWVzc2FnZVRhZyAqLwotICAgIHB1YmxpYyBNZXNzYWdlVGFnKCkgewotICAgICAgICBwYXJhbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBhcmd1bWVudCAoZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQpIHRvIHRoaXMgdGFnJ3MgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbShPYmplY3QgYXJnKSB7Ci0gICAgICAgIHBhcmFtcy5hZGQoYXJnKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotCi0gICAgICAgIE9iamVjdCBrZXlJbnB1dCA9IG51bGw7Ci0gICAgICAgIGlmICh0aGlzLmtleSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBrZXlJbnB1dCA9IHRoaXMua2V5LmV2YWx1YXRlKGNvbnRleHQpOwotICAgICAgICAgICAgLy8gcHJvY2VzcyA8cGFyYW0+IHN1YiB0YWdzCi0gICAgICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBnZXQga2V5IGZyb20gYm9keQotICAgICAgICAgICAga2V5SW5wdXQgPSBnZXRCb2R5VGV4dCgpOwotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoKGtleUlucHV0ID09IG51bGwpIHx8IGtleUlucHV0LmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKCI/Pz8/Pz8iKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IGJ1bmRsZUlucHV0ID0gbnVsbDsKLSAgICAgICAgaWYgKHRoaXMuYnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1bmRsZUlucHV0ID0gdGhpcy5idW5kbGUuZXZhbHVhdGUoY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ1bmRsZUlucHV0ICE9IG51bGwgJiYgYnVuZGxlSW5wdXQgaW5zdGFuY2VvZiBMb2NhbGl6YXRpb25Db250ZXh0KSB7Ci0gICAgICAgICAgICBsb2NDdHh0ID0gKExvY2FsaXphdGlvbkNvbnRleHQpIGJ1bmRsZUlucHV0OwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgIGlmIChsb2NDdHh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIFRhZyB0ID0gZmluZEFuY2VzdG9yV2l0aENsYXNzKHRoaXMsIEJ1bmRsZVRhZy5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAodCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gdXNlIHJlc291cmNlIGJ1bmRsZSBmcm9tIHBhcmVudCA8YnVuZGxlPiB0YWcKLSAgICAgICAgICAgICAgICBCdW5kbGVUYWcgcGFyZW50ID0gKEJ1bmRsZVRhZykgdDsKLSAgICAgICAgICAgICAgICBsb2NDdHh0ID0gcGFyZW50LmdldExvY2FsaXphdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnQuZ2V0UHJlZml4QXNTdHJpbmcoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9jQ3R4dCA9IEJ1bmRsZVRhZy5nZXRMb2NhbGl6YXRpb25Db250ZXh0KGNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbG9jYWxpemF0aW9uIGNvbnRleHQgdGFrZW4gZnJvbSAnYnVuZGxlJyBhdHRyaWJ1dGUKLSAgICAgICAgICAgIGlmIChsb2NDdHh0LmdldExvY2FsZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPCi0gICAgICAgICAgICAgICAgLy8gU2V0TG9jYWxlU3VwcG9ydC5zZXRSZXNwb25zZUxvY2FsZShwYWdlQ29udGV4dCwKLSAgICAgICAgICAgICAgICAvLyBsb2NDdHh0LmdldExvY2FsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gVU5ERUZJTkVEX0tFWSArIGtleUlucHV0ICsgVU5ERUZJTkVEX0tFWTsKLSAgICAgICAgaWYgKGxvY0N0eHQgIT0gbnVsbCkgewotICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbG9jQ3R4dC5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotICAgICAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcHJlcGVuZCAncHJlZml4JyBhdHRyaWJ1dGUgZnJvbSBwYXJlbnQgYnVuZGxlCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAga2V5SW5wdXQgPSBwcmVmaXggKyBrZXlJbnB1dDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYnVuZGxlLmdldFN0cmluZyhrZXlJbnB1dC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gUGVyZm9ybSBwYXJhbWV0cmljIHJlcGxhY2VtZW50IGlmIHJlcXVpcmVkCi0gICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1zLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gbWVzc2FnZUFyZ3MgPSBwYXJhbXMudG9BcnJheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZvcm1hdCBmb3JtYXR0ZXIgPSBuZXcgTWVzc2FnZUZvcm1hdCgiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jQ3R4dC5nZXRMb2NhbGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyLnNldExvY2FsZShsb2NDdHh0LmdldExvY2FsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlci5hcHBseVBhdHRlcm4obWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gZm9ybWF0dGVyLmZvcm1hdChtZXNzYWdlQXJncyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBVTkRFRklORURfS0VZICsga2V5SW5wdXQgKyBVTkRFRklORURfS0VZOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKHNjb3BlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh2YXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUodmFyLCBzY29wZSwgbWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICJJZiAnc2NvcGUnIGlzIHNwZWNpZmllZCwgJ3ZhcicgbXVzdCBiZSBkZWZpbmVkIGZvciB0aGlzIHRhZyIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmICh2YXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUodmFyLCBtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogU2V0dGVyIGZvciBwcm9wZXJ0eSBrZXkuCi0gICAgICogQHBhcmFtIGtleSBOZXcgdmFsdWUgb2YgcHJvcGVydHkga2V5LgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0S2V5KEV4cHJlc3Npb24ga2V5KSB7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgIH0KLQotICAgIC8qKiBTZXR0ZXIgZm9yIHByb3BlcnR5IGJ1bmRsZS4KLSAgICAgKiBAcGFyYW0gYnVuZGxlIE5ldyB2YWx1ZSBvZiBwcm9wZXJ0eSBidW5kbGUuCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCdW5kbGUoRXhwcmVzc2lvbiBidW5kbGUpIHsKLSAgICAgICAgdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0gICAgfQotCi0gICAgLyoqIFNldHRlciBmb3IgcHJvcGVydHkgdmFyLgotICAgICAqIEBwYXJhbSB2YXIgTmV3IHZhbHVlIG9mIHByb3BlcnR5IHZhci4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0gICAgICAgIHRoaXMudmFyID0gdmFyOwotICAgIH0KLQotICAgIC8qKiBTZXR0ZXIgZm9yIHByb3BlcnR5IHNjb3BlLgotICAgICAqIEBwYXJhbSBzY29wZSBOZXcgdmFsdWUgb2YgcHJvcGVydHkgc2NvcGUuCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTY29wZShTdHJpbmcgc2NvcGUpIHsKLSAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9mbXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZm10L1BhcmFtVGFnLmphdmEgYi9qZWxseS10YWdzL2ZtdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9mbXQvUGFyYW1UYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEyYmE0MC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ZtdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9mbXQvUGFyYW1UYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZm10OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5FeHByZXNzaW9uOwotCi0vKioKLSAqIFN1cHBvcnQgZm9yIHRhZyBoYW5kbGVycyBmb3IgJmx0O3BhcmFtJmd0OywgdGhlIHBhcmFtZXRlciBzZXR0aW5nCi0gKiB0YWcgaW4gSlNUTC4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOndpbGxpZXZ1QHlhaG9vLmNvbSI+V2lsbGllIFZ1PC9hPgotICogQHZlcnNpb24gMS4xCi0gKgotICogQHRhc2sgaGFuZGxlIGJvZHkgY29udGVudCB0cmltbWluZwotICovCi1wdWJsaWMgY2xhc3MgUGFyYW1UYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBIb2xkcyB2YWx1ZSBvZiBwcm9wZXJ0eSB2YWx1ZS4gKi8KLSAgICBwcml2YXRlIEV4cHJlc3Npb24gdmFsdWU7Ci0KLSAgICAvKiogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBQYXJhbVRhZyAqLwotICAgIHB1YmxpYyBQYXJhbVRhZygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFdmFsdWF0ZXMgdGhpcyB0YWcgYWZ0ZXIgYWxsIHRoZSB0YWdzIHByb3BlcnRpZXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZVRhZyBwYXJlbnQgPSBudWxsOwotICAgICAgICBUYWcgdCA9IGZpbmRBbmNlc3RvcldpdGhDbGFzcyh0aGlzLCBNZXNzYWdlVGFnLmNsYXNzKTsKLSAgICAgICAgaWYgKHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFyZW50ID0gKE1lc3NhZ2VUYWcpIHQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBtdXN0IGJlIG5lc3RlZCBpbnNpZGUgYSA8Zm10Om1lc3NhZ2U+IGFjdGlvbi4KLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigibXVzdCBiZSBuZXN0ZWQgaW5zaWRlIGEgPGZtdDptZXNzYWdlPiBhY3Rpb24uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgdmFsdWVJbnB1dCA9IG51bGw7Ci0gICAgICAgIGlmICh0aGlzLnZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHZhbHVlSW5wdXQgPSB0aGlzLnZhbHVlLmV2YWx1YXRlKGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gZ2V0IHZhbHVlIGZyb20gYm9keQotICAgICAgICAgICAgdmFsdWVJbnB1dCA9IGdldEJvZHlUZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwYXJlbnQuYWRkUGFyYW0odmFsdWVJbnB1dCk7Ci0gICAgfQotCi0gICAgLyoqIFNldHRlciBmb3IgcHJvcGVydHkgdmFsdWUuCi0gICAgICogQHBhcmFtIHZhbHVlIE5ldyB2YWx1ZSBvZiBwcm9wZXJ0eSB2YWx1ZS4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKEV4cHJlc3Npb24gdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9mbXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZm10L1NldEJ1bmRsZVRhZy5qYXZhIGIvamVsbHktdGFncy9mbXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZm10L1NldEJ1bmRsZVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjUzOTVjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvZm10L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ZtdC9TZXRCdW5kbGVUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZm10OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi0vKioKLSAqIFN1cHBvcnQgZm9yIHRhZyBoYW5kbGVycyBmb3IgJmx0O3NldExvY2FsZSZndDssIHRoZSBidW5kbGUgc2V0dGluZwotICogdGFnIGluIEpTVEwuCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzp3aWxsaWV2dUB5YWhvby5jb20iPldpbGxpZSBWdTwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRCdW5kbGVUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHZhcjsKLQotICAgIHByaXZhdGUgRXhwcmVzc2lvbiBiYXNlbmFtZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHNjb3BlOwotCi0gICAgLyoqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgU2V0QnVuZGxlVGFnICovCi0gICAgcHVibGljIFNldEJ1bmRsZVRhZygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFdmFsdWF0ZXMgdGhpcyB0YWcgYWZ0ZXIgYWxsIHRoZSB0YWdzIHByb3BlcnRpZXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IGJhc2VuYW1lSW5wdXQgPSBudWxsOwotICAgICAgICBpZiAodGhpcy5iYXNlbmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBiYXNlbmFtZUlucHV0ID0gdGhpcy5iYXNlbmFtZS5ldmFsdWF0ZShjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIExvY2FsaXphdGlvbkNvbnRleHQgbG9jQ3R4dCA9IEJ1bmRsZVRhZy5nZXRMb2NhbGl6YXRpb25Db250ZXh0KAotICAgICAgICAgICAgY29udGV4dCwgKFN0cmluZykgYmFzZW5hbWVJbnB1dCk7Ci0KLSAgICAgICAgU3RyaW5nIHZhcm5hbWUgPSAodmFyICE9IG51bGwpID8gdmFyIDogQ29uZmlnLkZNVF9MT0NBTElaQVRJT05fQ09OVEVYVDsKLQotICAgICAgICBpZiAoc2NvcGUgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXJuYW1lLCBzY29wZSwgbG9jQ3R4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhcm5hbWUsIGxvY0N0eHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZW5hbWUoRXhwcmVzc2lvbiBiYXNlbmFtZSkgewotICAgICAgICB0aGlzLmJhc2VuYW1lID0gYmFzZW5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlKSB7Ci0gICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2ZtdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9mbXQvU2V0TG9jYWxlVGFnLmphdmEgYi9qZWxseS10YWdzL2ZtdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9mbXQvU2V0TG9jYWxlVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZTE1NmEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9mbXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZm10L1NldExvY2FsZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZm10OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkV4cHJlc3Npb247Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoqCi0gKiBTdXBwb3J0IGZvciB0YWcgaGFuZGxlcnMgZm9yICZsdDtzZXRMb2NhbGUmZ3Q7LCB0aGUgbG9jYWxlIHNldHRpbmcKLSAqIHRhZyBpbiBKU1RMLgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86d2lsbGlldnVAeWFob28uY29tIj5XaWxsaWUgVnU8L2E+Ci0gKiBAdmVyc2lvbiAxLjIKLSAqCi0gKiBAdGFzayBkZWNpZGUgaG93IHRvIGltcGxlbWVudCBzZXRSZXNwb25zZUxvY2FsZQotICovCi1wdWJsaWMgY2xhc3MgU2V0TG9jYWxlVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEhZUEhFTiA9ICctJzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFVOREVSU0NPUkUgPSAnXyc7Ci0KLSAgICBwcml2YXRlIEV4cHJlc3Npb24gdmFsdWU7Ci0KLSAgICBwcml2YXRlIEV4cHJlc3Npb24gdmFyaWFudDsKLQotICAgIHByaXZhdGUgU3RyaW5nIHNjb3BlOwotCi0gICAgLyoqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgU2V0TG9jYWxlVGFnICovCi0gICAgcHVibGljIFNldExvY2FsZVRhZygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFdmFsdWF0ZXMgdGhpcyB0YWcgYWZ0ZXIgYWxsIHRoZSB0YWdzIHByb3BlcnRpZXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgTG9jYWxlIGxvY2FsZSA9IG51bGw7Ci0KLSAgICAgICAgT2JqZWN0IHZhbHVlSW5wdXQgPSBudWxsOwotICAgICAgICBpZiAodGhpcy52YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB2YWx1ZUlucHV0ID0gdGhpcy52YWx1ZS5ldmFsdWF0ZShjb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBPYmplY3QgdmFyaWFudElucHV0ID0gbnVsbDsKLSAgICAgICAgaWYgKHRoaXMudmFyaWFudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB2YXJpYW50SW5wdXQgPSB0aGlzLnZhcmlhbnQuZXZhbHVhdGUoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmFsdWVJbnB1dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlSW5wdXQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIGlmICgoKFN0cmluZykgdmFsdWVJbnB1dCkudHJpbSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2NhbGUgPSBwYXJzZUxvY2FsZSgoU3RyaW5nKSB2YWx1ZUlucHV0LCAoU3RyaW5nKSB2YXJpYW50SW5wdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbG9jYWxlID0gKExvY2FsZSkgdmFsdWVJbnB1dDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzY29wZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKENvbmZpZy5GTVRfTE9DQUxFLCBzY29wZSwgbG9jYWxlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoQ29uZmlnLkZNVF9MT0NBTEUsIGxvY2FsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9zZXRSZXNwb25zZUxvY2FsZShqYywgbG9jYWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShFeHByZXNzaW9uIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXJpYW50KEV4cHJlc3Npb24gdmFyaWFudCkgewotICAgICAgICB0aGlzLnZhcmlhbnQgPSB2YXJpYW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNjb3BlKFN0cmluZyBzY29wZSkgewotICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7Ci0gICAgfQotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBQdWJsaWMgdXRpbGl0eSBtZXRob2RzCi0KLSAgICAvKioKLSAgICAgKiBTZWUgcGFyc2VMb2NhbGUoU3RyaW5nLCBTdHJpbmcpIGZvciBkZXRhaWxzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxlIHBhcnNlTG9jYWxlKFN0cmluZyBsb2NhbGUpIHsKLSAgICAgICAgcmV0dXJuIHBhcnNlTG9jYWxlKGxvY2FsZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBnaXZlbiBsb2NhbGUgc3RyaW5nIGludG8gaXRzIGxhbmd1YWdlIGFuZCAob3B0aW9uYWxseSkKLSAgICAgKiBjb3VudHJ5IGNvbXBvbmVudHMsIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgICogPHR0PmphdmEudXRpbC5Mb2NhbGU8L3R0PiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBJZiB0aGUgZ2l2ZW4gbG9jYWxlIHN0cmluZyBpcyBudWxsIG9yIGVtcHR5LCB0aGUgcnVudGltZSdzIGRlZmF1bHQKLSAgICAgKiBsb2NhbGUgaXMgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbG9jYWxlIHRoZSBsb2NhbGUgc3RyaW5nIHRvIHBhcnNlCi0gICAgICogQHBhcmFtIHZhcmlhbnQgdGhlIHZhcmlhbnQKLSAgICAgKgotICAgICAqIEByZXR1cm4gPHR0PmphdmEudXRpbC5Mb2NhbGU8L3R0PiBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KLSAgICAgKiBsb2NhbGUgc3RyaW5nLCBvciB0aGUgcnVudGltZSdzIGRlZmF1bHQgbG9jYWxlIGlmIHRoZSBsb2NhbGUgc3RyaW5nIGlzCi0gICAgICogbnVsbCBvciBlbXB0eQotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIGxvY2FsZSBkb2VzIG5vdCBoYXZlIGEKLSAgICAgKiBsYW5ndWFnZSBjb21wb25lbnQgb3IgaGFzIGFuIGVtcHR5IGNvdW50cnkgY29tcG9uZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMb2NhbGUgcGFyc2VMb2NhbGUoU3RyaW5nIGxvY2FsZSwgU3RyaW5nIHZhcmlhbnQpIHsKLQotICAgICAgICBMb2NhbGUgcmV0ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gbG9jYWxlOwotICAgICAgICBTdHJpbmcgY291bnRyeSA9IG51bGw7Ci0gICAgICAgIGludCBpbmRleCA9IC0xOwotCi0gICAgICAgIGlmICgoKGluZGV4ID0gbG9jYWxlLmluZGV4T2YoSFlQSEVOKSkgPiAtMSkKLSAgICAgICAgfHwgKChpbmRleCA9IGxvY2FsZS5pbmRleE9mKFVOREVSU0NPUkUpKSA+IC0xKSkgewotICAgICAgICAgICAgbGFuZ3VhZ2UgPSBsb2NhbGUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgICAgICAgIGNvdW50cnkgPSBsb2NhbGUuc3Vic3RyaW5nKGluZGV4KzEpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChsYW5ndWFnZSA9PSBudWxsKSB8fCAobGFuZ3VhZ2UubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1pc3NpbmcgbGFuZ3VhZ2UiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb3VudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh2YXJpYW50ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0ID0gbmV3IExvY2FsZShsYW5ndWFnZSwgIiIsIHZhcmlhbnQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldCA9IG5ldyBMb2NhbGUobGFuZ3VhZ2UsICIiKTsKLSAgICAgICAgfSBlbHNlIGlmIChjb3VudHJ5Lmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgaWYgKHZhcmlhbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXQgPSBuZXcgTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5LCB2YXJpYW50KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXQgPSBuZXcgTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1pc3NpbmcgY291bnRyeSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsb2NhbGUgc3BlY2lmaWVkIGJ5IHRoZSBuYW1lZCBzY29wZWQgYXR0cmlidXRlIG9yIGNvbnRleHQKLSAgICAgKiBjb25maWd1cmF0aW9uIHBhcmFtZXRlci4KLSAgICAgKgotICAgICAqIDxwPiBUaGUgbmFtZWQgc2NvcGVkIGF0dHJpYnV0ZSBpcyBzZWFyY2hlZCBpbiB0aGUgcGFnZSwgcmVxdWVzdCwKLSAgICAgKiBzZXNzaW9uIChpZiB2YWxpZCksIGFuZCBhcHBsaWNhdGlvbiBzY29wZShzKSAoaW4gdGhpcyBvcmRlcikuIElmIG5vIHN1Y2gKLSAgICAgKiBhdHRyaWJ1dGUgZXhpc3RzIGluIGFueSBvZiB0aGUgc2NvcGVzLCB0aGUgbG9jYWxlIGlzIHRha2VuIGZyb20gdGhlCi0gICAgICogbmFtZWQgY29udGV4dCBjb25maWd1cmF0aW9uIHBhcmFtZXRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBqYyB0aGUgcGFnZSBpbiB3aGljaCB0byBzZWFyY2ggZm9yIHRoZSBuYW1lZCBzY29wZWQKLSAgICAgKiBhdHRyaWJ1dGUgb3IgY29udGV4dCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBzY29wZWQgYXR0cmlidXRlIG9yIGNvbnRleHQgY29uZmlndXJhdGlvbgotICAgICAqIHBhcmFtZXRlcgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbG9jYWxlIHNwZWNpZmllZCBieSB0aGUgbmFtZWQgc2NvcGVkIGF0dHJpYnV0ZSBvciBjb250ZXh0Ci0gICAgICogY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIsIG9yIDx0dD5udWxsPC90dD4gaWYgbm8gc2NvcGVkIGF0dHJpYnV0ZSBvcgotICAgICAqIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHdpdGggdGhlIGdpdmVuIG5hbWUgZXhpc3RzCi0gICAgICovCi0gICAgc3RhdGljIExvY2FsZSBnZXRMb2NhbGUoSmVsbHlDb250ZXh0IGpjLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBMb2NhbGUgbG9jID0gbnVsbDsKLQotICAgICAgICBPYmplY3Qgb2JqID0gamMuZ2V0VmFyaWFibGUobmFtZSk7Ci0gICAgICAgIGlmIChvYmogIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIExvY2FsZSkgewotICAgICAgICAgICAgICAgIGxvYyA9IChMb2NhbGUpIG9iajsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9jID0gcGFyc2VMb2NhbGUoKFN0cmluZykgb2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsb2M7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIHRoZSBmb3JtYXR0aW5nIGxvY2FsZSB0byB1c2Ugd2l0aCB0aGUgZ2l2ZW4gZm9ybWF0dGluZyBhY3Rpb24KLSAgICAgKiBpbiB0aGUgZ2l2ZW4gcGFnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBqYyBUaGUgY29udGV4dCBjb250YWluaW5nIHRoZSBmb3JtYXR0aW5nIGFjdGlvbgotICAgICAqIEBwYXJhbSBmcm9tVGFnIFRoZSBmb3JtYXR0aW5nIGFjdGlvbgotICAgICAqIEBwYXJhbSBmb3JtYXQgPHR0PnRydWU8L3R0PiBpZiB0aGUgZm9ybWF0dGluZyBhY3Rpb24gaXMgb2YgdHlwZQotICAgICAqIDxmb3JtYXRYWFg+IChhcyBvcHBvc2VkIHRvIDxwYXJzZVhYWD4pLCBhbmQgPHR0PmZhbHNlPC90dD4gb3RoZXJ3aXNlCi0gICAgICogKGlmIHNldCB0byA8dHQ+dHJ1ZTwvdHQ+LCB0aGUgZm9ybWF0dGluZyBsb2NhbGUgdGhhdCBpcyByZXR1cm5lZCBieQotICAgICAqIHRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHRoZSByZXNwb25zZSBsb2NhbGUpLgotICAgICAqCi0gICAgICogQHBhcmFtIGF2YWlsIHRoZSBhcnJheSBvZiBhdmFpbGFibGUgbG9jYWxlcwotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZm9ybWF0dGluZyBsb2NhbGUgdG8gdXNlCi0gICAgICovCi0gICAgc3RhdGljIExvY2FsZSBnZXRGb3JtYXR0aW5nTG9jYWxlKEplbGx5Q29udGV4dCBqYywKLSAgICBUYWcgZnJvbVRhZywKLSAgICBib29sZWFuIGZvcm1hdCwKLSAgICBMb2NhbGVbXSBhdmFpbCkgewotCi0gICAgICAgIExvY2FsaXphdGlvbkNvbnRleHQgbG9jQ3R4dCA9IG51bGw7Ci0KLSAgICAgICAgLy8gR2V0IGZvcm1hdHRpbmcgbG9jYWxlIGZyb20gZW5jbG9zaW5nIDxmbXQ6YnVuZGxlPgotICAgICAgICBUYWcgcGFyZW50ID0gZmluZEFuY2VzdG9yV2l0aENsYXNzKGZyb21UYWcsIEJ1bmRsZVRhZy5jbGFzcyk7Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAvKgotICAgICAgICAgKiB1c2UgbG9jYWxlIGZyb20gbG9jYWxpemF0aW9uIGNvbnRleHQgZXN0YWJsaXNoZWQgYnkgcGFyZW50Ci0gICAgICAgICAqIDxmbXQ6YnVuZGxlPiBhY3Rpb24sIHVubGVzcyB0aGF0IGxvY2FsZSBpcyBudWxsCi0gICAgICAgICAqLwotICAgICAgICAgICAgbG9jQ3R4dCA9ICgoQnVuZGxlVGFnKSBwYXJlbnQpLmdldExvY2FsaXphdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgIGlmIChsb2NDdHh0LmdldExvY2FsZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vc2V0UmVzcG9uc2VMb2NhbGUoamMsIGxvY0N0eHQuZ2V0TG9jYWxlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbG9jQ3R4dC5nZXRMb2NhbGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFVzZSBsb2NhbGUgZnJvbSBkZWZhdWx0IEkxOE4gbG9jYWxpemF0aW9uIGNvbnRleHQsIHVubGVzcyBpdCBpcyBudWxsCi0gICAgICAgIGlmICgobG9jQ3R4dCA9IEJ1bmRsZVRhZy5nZXRMb2NhbGl6YXRpb25Db250ZXh0KGpjKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvY0N0eHQuZ2V0TG9jYWxlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChmb3JtYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9zZXRSZXNwb25zZUxvY2FsZShqYywgbG9jQ3R4dC5nZXRMb2NhbGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBsb2NDdHh0LmdldExvY2FsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAvKgotICAgICAqIEVzdGFibGlzaCBmb3JtYXR0aW5nIGxvY2FsZSBieSBjb21wYXJpbmcgdGhlIHByZWZlcnJlZCBsb2NhbGVzCi0gICAgICogKGluIG9yZGVyIG9mIHByZWZlcmVuY2UpIGFnYWluc3QgdGhlIGF2YWlsYWJsZSBmb3JtYXR0aW5nCi0gICAgICogbG9jYWxlcywgYW5kIGRldGVybWluaW5nIHRoZSBiZXN0IG1hdGNoaW5nIGxvY2FsZS4KLSAgICAgKi8KLSAgICAgICAgTG9jYWxlIG1hdGNoID0gbnVsbDsKLSAgICAgICAgTG9jYWxlIHByZWYgPSBnZXRMb2NhbGUoamMsIENvbmZpZy5GTVRfTE9DQUxFKTsKLSAgICAgICAgaWYgKHByZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gUHJlZmVycmVkIGxvY2FsZSBpcyBhcHBsaWNhdGlvbi1iYXNlZAotICAgICAgICAgICAgbWF0Y2ggPSBmaW5kRm9ybWF0dGluZ01hdGNoKHByZWYsIGF2YWlsKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWF0Y2ggPT0gbnVsbCkgewotICAgICAgICAgICAgLy9Vc2UgZmFsbGJhY2sgbG9jYWxlLgotICAgICAgICAgICAgcHJlZiA9IGdldExvY2FsZShqYywgQ29uZmlnLkZNVF9GQUxMQkFDS19MT0NBTEUpOwotICAgICAgICAgICAgaWYgKHByZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1hdGNoID0gZmluZEZvcm1hdHRpbmdNYXRjaChwcmVmLCBhdmFpbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZvcm1hdCAmJiAobWF0Y2ggIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIC8vc2V0UmVzcG9uc2VMb2NhbGUoamMsIG1hdGNoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtYXRjaDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybnMgdGhlIGJlc3QgbWF0Y2ggYmV0d2VlbiB0aGUgZ2l2ZW4gcHJlZmVycmVkIGxvY2FsZSBhbmQgdGhlCi0gICAgICogZ2l2ZW4gYXZhaWxhYmxlIGxvY2FsZXMuCi0gICAgICoKLSAgICAgKiBUaGUgYmVzdCBtYXRjaCBpcyBnaXZlbiBhcyB0aGUgZmlyc3QgYXZhaWxhYmxlIGxvY2FsZSB0aGF0IGV4YWN0bHkKLSAgICAgKiBtYXRjaGVzIHRoZSBnaXZlbiBwcmVmZXJyZWQgbG9jYWxlICgiZXhhY3QgbWF0Y2giKS4gSWYgbm8gZXhhY3QgbWF0Y2gKLSAgICAgKiBleGlzdHMsIHRoZSBiZXN0IG1hdGNoIGlzIGdpdmVuIGFzIHRoZSBmaXJzdCBhdmFpbGFibGUgbG9jYWxlIHRoYXQKLSAgICAgKiBtYXRjaGVzIHRoZSBwcmVmZXJyZWQgbG9jYWxlJ3MgbGFuZ3VhZ2UgY29tcG9uZW50IGFuZCBkb2VzIG5vdCBoYXZlIGFueQotICAgICAqIGNvdW50cnkgY29tcG9uZW50ICgibGFuZ3VhZ2UgbWF0Y2giKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmVmIHRoZSBwcmVmZXJyZWQgbG9jYWxlCi0gICAgICogQHBhcmFtIGF2YWlsIHRoZSBhdmFpbGFibGUgZm9ybWF0dGluZyBsb2NhbGVzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEF2YWlsYWJsZSBsb2NhbGUgdGhhdCBiZXN0IG1hdGNoZXMgdGhlIGdpdmVuIHByZWZlcnJlZCBsb2NhbGUsCi0gICAgICogb3IgPHR0Pm51bGw8L3R0PiBpZiBubyBtYXRjaCBleGlzdHMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBMb2NhbGUgZmluZEZvcm1hdHRpbmdNYXRjaChMb2NhbGUgcHJlZiwgTG9jYWxlW10gYXZhaWwpIHsKLSAgICAgICAgTG9jYWxlIG1hdGNoID0gbnVsbDsKLQotICAgICAgICBmb3IgKGludCBpPTA7IGk8YXZhaWwubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwcmVmLmVxdWFscyhhdmFpbFtpXSkpIHsKLSAgICAgICAgICAgICAgICAvLyBFeGFjdCBtYXRjaAotICAgICAgICAgICAgICAgIG1hdGNoID0gYXZhaWxbaV07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChwcmVmLmdldExhbmd1YWdlKCkuZXF1YWxzKGF2YWlsW2ldLmdldExhbmd1YWdlKCkpCi0gICAgICAgICAgICAgICAgJiYgKCIiLmVxdWFscyhhdmFpbFtpXS5nZXRDb3VudHJ5KCkpKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBMYW5ndWFnZSBtYXRjaAotICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBhdmFpbFtpXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtYXRjaDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2ZtdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9mbXQvU2V0VGltZVpvbmVUYWcuamF2YSBiL2plbGx5LXRhZ3MvZm10L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ZtdC9TZXRUaW1lWm9uZVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQ3MzYzLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvZm10L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ZtdC9TZXRUaW1lWm9uZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5mbXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkV4cHJlc3Npb247Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotCi0vKioKLSAqIFN1cHBvcnQgZm9yIHRhZyBoYW5kbGVycyBmb3IgJmx0O3NldFRpbWVab25lJmd0OywgdGhlIHRpbWUgem9uZSBzZXR0aW5nCi0gKiB0YWcgaW4gSlNUTC4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOndpbGxpZXZ1QHlhaG9vLmNvbSI+V2lsbGllIFZ1PC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICoKLSAqLwotcHVibGljIGNsYXNzIFNldFRpbWVab25lVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICBwcml2YXRlIEV4cHJlc3Npb24gdmFsdWU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzY29wZTsKLQotICAgIC8qKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFNldExvY2FsZVRhZyAqLwotICAgIHB1YmxpYyBTZXRUaW1lWm9uZVRhZygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFdmFsdWF0ZXMgdGhpcyB0YWcgYWZ0ZXIgYWxsIHRoZSB0YWdzIHByb3BlcnRpZXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgVGltZVpvbmUgdGltZVpvbmUgPSBudWxsOwotCi0gICAgICAgIE9iamVjdCB2YWx1ZUlucHV0ID0gbnVsbDsKLSAgICAgICAgaWYgKHRoaXMudmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdmFsdWVJbnB1dCA9IHRoaXMudmFsdWUuZXZhbHVhdGUoY29udGV4dCk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICh2YWx1ZUlucHV0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRpbWVab25lID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHZhbHVlSW5wdXQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIGlmICgoKFN0cmluZykgdmFsdWVJbnB1dCkudHJpbSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICB0aW1lWm9uZSA9IFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGltZVpvbmUgPSBUaW1lWm9uZS5nZXRUaW1lWm9uZSgoU3RyaW5nKSB2YWx1ZUlucHV0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRpbWVab25lID0gKFRpbWVab25lKSB2YWx1ZUlucHV0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNjb3BlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoQ29uZmlnLkZNVF9USU1FX1pPTkUsIHNjb3BlLCB0aW1lWm9uZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKENvbmZpZy5GTVRfVElNRV9aT05FLCB0aW1lWm9uZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShFeHByZXNzaW9uIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTY29wZShTdHJpbmcgc2NvcGUpIHsKLSAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZm10L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ZtdC9UaW1lWm9uZVRhZy5qYXZhIGIvamVsbHktdGFncy9mbXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZm10L1RpbWVab25lVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NzUzNjYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9mbXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZm10L1RpbWVab25lVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5mbXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7Ci0KLS8qKgotICogU3VwcG9ydCBmb3IgdGFnIGhhbmRsZXJzIGZvciAmbHQ7dGltZVpvbmUmZ3Q7LCB0aGUgdGltZSB6b25lIGxvYWRpbmcKLSAqIHRhZyBpbiBKU1RMLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOndpbGxpZXZ1QHlhaG9vLmNvbSI+V2lsbGllIFZ1PC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICoKLSAqIEB0YXNrIGRlY2lkZSBob3cgdG8gaW1wbGVtZW50IHNldFJlc3BvbnNlTG9jYWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBUaW1lWm9uZVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgcHJpdmF0ZSBUaW1lWm9uZSB0aW1lWm9uZTsKLSAgICBwcml2YXRlIEV4cHJlc3Npb24gdmFsdWU7ICAgICAgICAgICAgICAgICAgICAvLyAndmFsdWUnIGF0dHJpYnV0ZQotCi0KLSAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIC8vIENvbnN0cnVjdG9yIGFuZCBpbml0aWFsaXphdGlvbgotCi0gICAgcHVibGljIFRpbWVab25lVGFnKCkgewotICAgIH0KLQotICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgLy8gQ29sbGFib3JhdGlvbiB3aXRoIHN1YnRhZ3MKLQotICAgIHB1YmxpYyBUaW1lWm9uZSBnZXRUaW1lWm9uZSgpIHsKLSAgICAgICAgcmV0dXJuIHRpbWVab25lOwotICAgIH0KLQotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBUYWcgbG9naWMKLQotICAgIC8qKgotICAgICAqIEV2YWx1YXRlcyB0aGlzIHRhZyBhZnRlciBhbGwgdGhlIHRhZ3MgcHJvcGVydGllcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBPYmplY3QgdmFsdWVJbnB1dCA9IG51bGw7Ci0gICAgICAgIGlmICh0aGlzLnZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHZhbHVlSW5wdXQgPSB0aGlzLnZhbHVlLmV2YWx1YXRlKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbHVlSW5wdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGltZVpvbmUgPSBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodmFsdWVJbnB1dCBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgaWYgKCgoU3RyaW5nKSB2YWx1ZUlucHV0KS50cmltKCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIHRpbWVab25lID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aW1lWm9uZSA9IFRpbWVab25lLmdldFRpbWVab25lKChTdHJpbmcpIHZhbHVlSW5wdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGltZVpvbmUgPSAoVGltZVpvbmUpIHZhbHVlSW5wdXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0gICAgfQotCi0KLSAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIC8vIFBhY2thZ2Utc2NvcGVkIHV0aWxpdHkgbWV0aG9kcwotCi0gICAgLyoKLSAgICAgKiBEZXRlcm1pbmVzIGFuZCByZXR1cm5zIHRoZSB0aW1lIHpvbmUgdG8gYmUgdXNlZCBieSB0aGUgZ2l2ZW4gYWN0aW9uLgotICAgICAqCi0gICAgICogPHA+IElmIHRoZSBnaXZlbiBhY3Rpb24gaXMgbmVzdGVkIGluc2lkZSBhICZsdDt0aW1lWm9uZSZndDsgYWN0aW9uLAotICAgICAqIHRoZSB0aW1lIHpvbmUgaXMgdGFrZW4gZnJvbSB0aGUgZW5jbG9zaW5nICZsdDt0aW1lWm9uZSZndDsgYWN0aW9uLgotICAgICAqCi0gICAgICogPHA+IE90aGVyd2lzZSwgdGhlIHRpbWUgem9uZSBjb25maWd1cmF0aW9uIHNldHRpbmcKLSAgICAgKiA8dHQ+amF2YXguc2VydmxldC5qc3AuanN0bC5jb3JlLkNvbmZpZy5GTVRfVElNRV9aT05FPC90dD4KLSAgICAgKiBpcyB1c2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIGpjIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIGFjdGlvbiBmb3Igd2hpY2ggdGhlCi0gICAgICogdGltZSB6b25lIG5lZWRzIHRvIGJlIGRldGVybWluZWQKLSAgICAgKiBAcGFyYW0gZnJvbVRhZyB0aGUgYWN0aW9uIGZvciB3aGljaCB0aGUgdGltZSB6b25lIG5lZWRzIHRvIGJlCi0gICAgICogZGV0ZXJtaW5lZAotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdGltZSB6b25lLCBvciA8dHQ+bnVsbDwvdHQ+IGlmIHRoZSBnaXZlbiBhY3Rpb24gaXMgbm90Ci0gICAgICogbmVzdGVkIGluc2lkZSBhICZsdDt0aW1lWm9uZSZndDsgYWN0aW9uIGFuZCBubyB0aW1lIHpvbmUgY29uZmlndXJhdGlvbgotICAgICAqIHNldHRpbmcgZXhpc3RzCi0gICAgICovCi0gICAgc3RhdGljIFRpbWVab25lIGdldFRpbWVab25lKEplbGx5Q29udGV4dCBqYywgVGFnIGZyb21UYWcpIHsKLSAgICAgICAgVGltZVpvbmUgdHogPSBudWxsOwotCi0gICAgICAgIFRhZyB0ID0gZmluZEFuY2VzdG9yV2l0aENsYXNzKGZyb21UYWcsIFRpbWVab25lVGFnLmNsYXNzKTsKLSAgICAgICAgaWYgKHQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gdXNlIHRpbWUgem9uZSBmcm9tIHBhcmVudCA8dGltZVpvbmU+IHRhZwotICAgICAgICAgICAgVGltZVpvbmVUYWcgcGFyZW50ID0gKFRpbWVab25lVGFnKSB0OwotICAgICAgICAgICAgdHogPSBwYXJlbnQuZ2V0VGltZVpvbmUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGdldCB0aW1lIHpvbmUgZnJvbSBjb25maWd1cmF0aW9uIHNldHRpbmcKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBqYy5nZXRWYXJpYWJsZShDb25maWcuRk1UX1RJTUVfWk9ORSk7Ci0gICAgICAgICAgICBpZiAob2JqICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgVGltZVpvbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgdHogPSAoVGltZVpvbmUpIG9iajsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0eiA9IFRpbWVab25lLmdldFRpbWVab25lKChTdHJpbmcpIG9iaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHR6OwotICAgIH0KLQotICAgIC8qKiBTZXR0ZXIgZm9yIHByb3BlcnR5IHZhbHVlLgotICAgICAqIEBwYXJhbSB2YWx1ZSBOZXcgdmFsdWUgb2YgcHJvcGVydHkgdmFsdWUuCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShFeHByZXNzaW9uIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2ZtdC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9mbXQvVGVzdEZNVFN1aXRlLmphdmEgYi9qZWxseS10YWdzL2ZtdC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9mbXQvVGVzdEZNVFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZDA5NTMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9mbXQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZm10L1Rlc3RGTVRTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5mbXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuanVuaXQuSmVsbHlUZXN0U3VpdGU7Ci0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgdG8gcnVuIGplbGx5IHRlc3QgY2FzZXMgYXMgcGFydCBvZiBBbnQncyBKVW5pdCB0ZXN0cwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOndpbGxpZXZ1QHlhaG9vLmNvbSI+V2lsbGllIFZ1PC9hPgotICogQHZlcnNpb24gMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0Rk1UU3VpdGUgZXh0ZW5kcyBKZWxseVRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0U3VpdGUgc3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVRlc3RTdWl0ZShUZXN0Rk1UU3VpdGUuY2xhc3MsICJzdWl0ZS5qZWxseSIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZm10L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ZtdC9hYmMucHJvcGVydGllcyBiL2plbGx5LXRhZ3MvZm10L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ZtdC9hYmMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEwYWRkNC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ZtdC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9mbXQvYWJjLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIyAKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBTYW1wbGUgUmVzb3VyY2VCdW5kbGUgcHJvcGVydGllcyBmaWxlCi1rZXkxPXZhbHVlMQotCi1rZXkyPXZhbHVlMgotCi1rZXkzPXZhbHVlMyB7MH0gezF9Ci0KLWtleTQ9dmFsdWU0IHswfSB7MX0gezIsbnVtYmVyLGludGVnZXJ9CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2ZtdC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9mbXQvc3VpdGUuamVsbHkgYi9qZWxseS10YWdzL2ZtdC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9mbXQvc3VpdGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMjYwODUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9mbXQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZm10L3N1aXRlLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx0ZXN0OnN1aXRlIHhtbG5zOmo9ImplbGx5OmNvcmUiIAotICAgICAgICAgICAgeG1sbnM6Zm10PSJqZWxseTpmbXQiCi0gICAgICAgICAgICB4bWxuczptPSJqZWxseTphbnQiCi0gICAgICAgICAgICB4bWxuczpiPSJqZWxseTpiZWFuc2hlbGwiIAotICAgICAgICAgICAgeG1sbnM6dGVzdD0iamVsbHk6anVuaXQiIAotICAgICAgICAgICAgeG1sbnM6bG9nPSJqZWxseTpsb2ciPgotCi0gICAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0U2ltcGxlIiB4bWxucz0iZHVtbXkiPgotICAgICAgICA8ajpzZXQgdmFyPSJrZXl2YXIiIHZhbHVlPSJrZXkyIi8+Ci0gICAgICAgIDxmbXQ6YnVuZGxlIGJhc2VuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5mbXQuYWJjIj4KLSAgICAgICAgICAgIDxmbXQ6bWVzc2FnZSBrZXk9ImtleTEiIHZhcj0iZHVtbXlLZXkxIi8+Ci0gICAgICAgICAgICA8Zm10Om1lc3NhZ2UgdmFyPSJkdW1teUtleTIiPiR7a2V5dmFyfTwvZm10Om1lc3NhZ2U+Ci0gICAgICAgICAgICA8Zm10Om1lc3NhZ2UgdmFyPSJkdW1teUtleUludmFsaWQiPmludmFsaWQua2V5PC9mbXQ6bWVzc2FnZT4KLSAgICAgICAgPC9mbXQ6YnVuZGxlPgotCi0gICAgICAgIDxtOmVjaG8+aTEwbiBjb250ZW50IGlzIDwvbTplY2hvPgotICAgICAgICA8bTplY2hvPmtleTE6ICcke2R1bW15S2V5MX0nPC9tOmVjaG8+Ci0gICAgICAgIDxtOmVjaG8+a2V5MjogJyR7ZHVtbXlLZXkyfSc8L206ZWNobz4KLSAgICAgICAgPG06ZWNobz5rZXlJbnZhbGlkOiAnJHtkdW1teUtleUludmFsaWR9JzwvbTplY2hvPgotICAgIAotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9InZhbHVlMSIgYWN0dWFsPSIke2R1bW15S2V5MX0iIC8+Ci0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0idmFsdWUyIiBhY3R1YWw9IiR7ZHVtbXlLZXkyfSIgLz4KLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSI/Pz9pbnZhbGlkLmtleT8/PyIgYWN0dWFsPSIke2R1bW15S2V5SW52YWxpZH0iIC8+Ci0gICAgPC90ZXN0OmNhc2U+Ci0gICAgCi0gICAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0UGFyYW0iIHhtbG5zPSJkdW1teSI+Ci0gICAgICAgIDxqOnNldCB2YXI9ImtleXZhciIgdmFsdWU9ImtleTMiLz4KLSAgICAgICAgPGo6c2V0IHZhcj0idmFsdWV2YXIiIHZhbHVlPSJwYXJhbTEiLz4KLQotICAgICAgICA8Zm10OmJ1bmRsZSBiYXNlbmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZm10LmFiYyI+Ci0gICAgICAgICAgICA8Zm10Om1lc3NhZ2UgdmFyPSJkdW1teUtleTMiPiR7a2V5dmFyfTxmbXQ6cGFyYW0gdmFsdWU9IiR7dmFsdWV2YXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPGZtdDpwYXJhbSB2YWx1ZT0icGFyYW0yIi8+Ci0gICAgICAgICAgICA8L2ZtdDptZXNzYWdlPgotICAgICAgICA8L2ZtdDpidW5kbGU+Ci0KLSAgICAgICAgPG06ZWNobz5pMTBuIGNvbnRlbnQgaXMgPC9tOmVjaG8+Ci0gICAgICAgIDxtOmVjaG8+a2V5MzogJyR7ZHVtbXlLZXkzfSc8L206ZWNobz4KLSAgICAKLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJ2YWx1ZTMgcGFyYW0xIHBhcmFtMiIgYWN0dWFsPSIke2R1bW15S2V5M30iIC8+Ci0KLSAgICAgICAgPGZtdDpidW5kbGUgYmFzZW5hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmZtdC5hYmMiPgotICAgICAgICAgICAgPGZtdDptZXNzYWdlIHZhcj0iZHVtbXlLZXkzIiBrZXk9IiR7a2V5dmFyfSI+PGZtdDpwYXJhbSB2YWx1ZT0iJHt2YWx1ZXZhcn0iLz4KLSAgICAgICAgICAgICAgICA8Zm10OnBhcmFtIHZhbHVlPSJwYXJhbTIiLz4KLSAgICAgICAgICAgIDwvZm10Om1lc3NhZ2U+Ci0gICAgICAgIDwvZm10OmJ1bmRsZT4KLQotICAgICAgICA8bTplY2hvPmkxMG4gY29udGVudCBpcyA8L206ZWNobz4KLSAgICAgICAgPG06ZWNobz5rZXkzOiAnJHtkdW1teUtleTN9JzwvbTplY2hvPgotICAgIAotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9InZhbHVlMyBwYXJhbTEgcGFyYW0yIiBhY3R1YWw9IiR7ZHVtbXlLZXkzfSIgLz4KLSAgICA8L3Rlc3Q6Y2FzZT4KLQotICAgIDx0ZXN0OmNhc2UgbmFtZT0idGVzdFBhcmFtMiIgeG1sbnM9ImR1bW15Ij4KLSAgICAgICAgPGo6c2V0IHZhcj0ia2V5dmFyIiB2YWx1ZT0ia2V5NCIvPgotICAgICAgICA8ajpzZXQgdmFyPSJ2YWx1ZXZhciIgdmFsdWU9InBhcmFtMSIvPgotICAgICAgICA8ajpzZXQgdmFyPSJpbnR2YWx1ZSIgdmFsdWU9IjEyMyIvPgotICAgICAgICA8ajpuZXcgY2xhc3NOYW1lPSJqYXZhLmxhbmcuSW50ZWdlciIgdmFyPSJpbnRWYWx1ZSI+Ci0gICAgICAgICAgICA8ajphcmcgdmFsdWU9IjEyMyIvPgotICAgICAgICA8L2o6bmV3PgotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9ImphdmEubGFuZy5JbnRlZ2VyIiBhY3R1YWw9IiR7aW50VmFsdWUuY2xhc3MubmFtZX0iIC8+Ci0gICAgICAgIDxmbXQ6YnVuZGxlIGJhc2VuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5mbXQuYWJjIj4KLSAgICAgICAgICAgIDxmbXQ6bWVzc2FnZSB2YXI9ImR1bW15S2V5NCI+JHtrZXl2YXJ9PGZtdDpwYXJhbSB2YWx1ZT0iJHt2YWx1ZXZhcn0iLz4KLSAgICAgICAgICAgICAgICA8Zm10OnBhcmFtIHZhbHVlPSJwYXJhbTIiLz4KLSAgICAgICAgICAgICAgICA8Zm10OnBhcmFtIHZhbHVlPScke2ludFZhbHVlfScvPgotICAgICAgICAgICAgPC9mbXQ6bWVzc2FnZT4KLSAgICAgICAgPC9mbXQ6YnVuZGxlPgotCi0gICAgICAgIDxtOmVjaG8+aTEwbiBjb250ZW50IGlzIDwvbTplY2hvPgotICAgICAgICA8bTplY2hvPmtleTQ6ICcke2R1bW15S2V5NH0nPC9tOmVjaG8+Ci0gICAgCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0idmFsdWU0IHBhcmFtMSBwYXJhbTIgMTIzIiBhY3R1YWw9IiR7ZHVtbXlLZXk0fSIgLz4KLSAgICA8L3Rlc3Q6Y2FzZT4KLQotCi0gICAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0UHJlZml4IiB4bWxucz0iZHVtbXkiPgotICAgICAgICA8Zm10OmJ1bmRsZSBiYXNlbmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZm10Lnh5eiIgcHJlZml4PSIxMjMuIj4KLSAgICAgICAgICAgIDxmbXQ6bWVzc2FnZSBrZXk9ImtleTEiIHZhcj0iZHVtbXlLZXkxIi8+Ci0gICAgICAgICAgICA8Zm10Om1lc3NhZ2UgdmFyPSJkdW1teUtleTIiPmtleTI8L2ZtdDptZXNzYWdlPgotICAgICAgICAgICAgPGZtdDptZXNzYWdlIHZhcj0iZHVtbXlLZXlJbnZhbGlkIj5pbnZhbGlkLmtleTwvZm10Om1lc3NhZ2U+Ci0gICAgICAgIDwvZm10OmJ1bmRsZT4KLQotICAgICAgICA8bTplY2hvPmkxMG4gY29udGVudCBpcyA8L206ZWNobz4KLSAgICAgICAgPG06ZWNobz5rZXkxOiAnJHtkdW1teUtleTF9JzwvbTplY2hvPgotICAgICAgICA8bTplY2hvPmtleTI6ICcke2R1bW15S2V5Mn0nPC9tOmVjaG8+Ci0gICAgICAgIDxtOmVjaG8+a2V5SW52YWxpZDogJyR7ZHVtbXlLZXlJbnZhbGlkfSc8L206ZWNobz4KLSAgICAKLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJ2YWx1ZTEiIGFjdHVhbD0iJHtkdW1teUtleTF9IiAvPgotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9InZhbHVlMiIgYWN0dWFsPSIke2R1bW15S2V5Mn0iIC8+Ci0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iPz8/MTIzLmludmFsaWQua2V5Pz8/IiBhY3R1YWw9IiR7ZHVtbXlLZXlJbnZhbGlkfSIgLz4KLSAgICA8L3Rlc3Q6Y2FzZT4KLSAgICAKLSAgICA8dGVzdDpjYXNlIG5hbWU9InRlc3RTZXRMb2NhbGUiIHhtbG5zPSJkdW1teSI+Ci0gICAgICAgIDxmbXQ6c2V0TG9jYWxlIHZhbHVlPSJ6aCIvPgotICAgICAgICA8Zm10OmJ1bmRsZSBiYXNlbmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZm10Lnh5eiIgcHJlZml4PSIxMjMuIj4KLSAgICAgICAgICAgIDxmbXQ6bWVzc2FnZSBrZXk9ImtleTEiIHZhcj0iZHVtbXlLZXkxIi8+Ci0gICAgICAgICAgICA8Zm10Om1lc3NhZ2UgdmFyPSJkdW1teUtleTIiPmtleTI8L2ZtdDptZXNzYWdlPgotICAgICAgICAgICAgPGZtdDptZXNzYWdlIHZhcj0iZHVtbXlLZXlJbnZhbGlkIj5pbnZhbGlkLmtleTwvZm10Om1lc3NhZ2U+Ci0gICAgICAgIDwvZm10OmJ1bmRsZT4KLQotICAgICAgICA8bTplY2hvPmkxMG4gY29udGVudCBpcyA8L206ZWNobz4KLSAgICAgICAgPG06ZWNobz5rZXkxOiAnJHtkdW1teUtleTF9JzwvbTplY2hvPgotICAgICAgICA8bTplY2hvPmtleTI6ICcke2R1bW15S2V5Mn0nPC9tOmVjaG8+Ci0gICAgICAgIDxtOmVjaG8+a2V5SW52YWxpZDogJyR7ZHVtbXlLZXlJbnZhbGlkfSc8L206ZWNobz4KLSAgICAKLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJ2YWx1ZTEtemgiIGFjdHVhbD0iJHtkdW1teUtleTF9IiAvPgotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9InZhbHVlMi16aCIgYWN0dWFsPSIke2R1bW15S2V5Mn0iIC8+Ci0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iPz8/MTIzLmludmFsaWQua2V5Pz8/IiBhY3R1YWw9IiR7ZHVtbXlLZXlJbnZhbGlkfSIgLz4KLSAgICA8L3Rlc3Q6Y2FzZT4KLTwvdGVzdDpzdWl0ZT4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZm10L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ZtdC94eXoucHJvcGVydGllcyBiL2plbGx5LXRhZ3MvZm10L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ZtdC94eXoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY1ZDU3YS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ZtdC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9mbXQveHl6LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIyAKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBTYW1wbGUgUmVzb3VyY2VCdW5kbGUgcHJvcGVydGllcyBmaWxlCi0xMjMua2V5MT12YWx1ZTEKLQotMTIzLmtleTI9dmFsdWUyCi0KLTEyMy5rZXkzPXZhbHVlMyB7MH0gezF9CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2ZtdC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9mbXQveHl6X3poLnByb3BlcnRpZXMgYi9qZWxseS10YWdzL2ZtdC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9mbXQveHl6X3poLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNTZjOGMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9mbXQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvZm10L3h5el96aC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMgCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgU2FtcGxlIFJlc291cmNlQnVuZGxlIHByb3BlcnRpZXMgZmlsZQotMTIzLmtleTE9dmFsdWUxLXpoCi0KLTEyMy5rZXkyPXZhbHVlMi16aAotCi0xMjMua2V5Mz17MH0gdmFsdWUzLXpoIHsxfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9mbXQveGRvY3MvY2hhbmdlcy54bWwgYi9qZWxseS10YWdzL2ZtdC94ZG9jcy9jaGFuZ2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExNDY0MS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ZtdC94ZG9jcy9jaGFuZ2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0gLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkNoYW5nZXM8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLSAgPGJvZHk+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4wIiBkYXRlPSIyMDA0LTA5LTExIj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJhZGQiPkluaXRpYWwgUmVsZWFzZTwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZm10L3hkb2NzL2luZGV4LnhtbCBiL2plbGx5LXRhZ3MvZm10L3hkb2NzL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgxMGE4ZC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ZtdC94ZG9jcy9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5FbWFpbCBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotICAgIDxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KLSAgICAgIDxwPgotICAgICAgICBUYWdzIHRoYXQgc3VwcG9ydCBJbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgbG9jYWxpemVkIGZvcm1hdHRpbmcgYW5kIHBhcnNpbmcuCi0gICAgICAgIFNlZSB0aGUgPGEgaHJlZj0idGFncy5odG1sIj50YWdzPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvZm10L3hkb2NzL25hdmlnYXRpb24ueG1sIGIvamVsbHktdGFncy9mbXQveGRvY3MvbmF2aWdhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMWI3OGEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9mbXQveGRvY3MvbmF2aWdhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IG5hbWU9IkZvcm1hdHRpbmcgVGFnIExpYnJhcnkiPgotCi0gIDx0aXRsZT5Gb3JtYXR0aW5nIFRhZyBMaWJyYXJ5PC90aXRsZT4KLSAgCi0gIDxib2R5PgotICAgIDxtZW51IG5hbWU9IkZvcm1hdHRpbmcgVGFnIExpYnJhcnkiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgICAgICAgICAgIGhyZWY9Ii9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJUYWdzIiAgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZ3MuaHRtbCIvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9odG1sLy5jdnNpZ25vcmUgYi9qZWxseS10YWdzL2h0bWwvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhiNDhiMy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2h0bWwvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotdGFyZ2V0Ci1tYXZlbi5sb2cKLWxpYgotdmVsb2NpdHkubG9nCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2h0bWwvYnVpbGQueG1sIGIvamVsbHktdGFncy9odG1sL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjZmM2NS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2h0bWwvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS1idWlsZC54bWwgZ2VuZXJhdGVkIGJ5IG1hdmVuIGZyb20gcHJvamVjdC54bWwgdmVyc2lvbiAxLjAtU05BUFNIT1QKLSAgb24gZGF0ZSBNYXkgMjQgMjAwNCwgdGltZSAyMzAxLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXIiIG5hbWU9ImNvbW1vbnMtamVsbHktdGFncy1odG1sIiBiYXNlZGlyPSIuIj4KLSAgPHByb3BlcnR5IG5hbWU9ImRlZmF1bHR0YXJnZXRkaXIiIHZhbHVlPSJ0YXJnZXQiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0ibGliZGlyIiB2YWx1ZT0idGFyZ2V0L2xpYiI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L2NsYXNzZXMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0idGVzdGNsYXNzZXNkaXIiIHZhbHVlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RyZXBvcnRkaXIiIHZhbHVlPSJ0YXJnZXQvdGVzdC1yZXBvcnRzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImRpc3RkaXIiIHZhbHVlPSJkaXN0Ij4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImphdmFkb2NkaXIiIHZhbHVlPSJkaXN0L2RvY3MvYXBpIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImZpbmFsLm5hbWUiIHZhbHVlPSJjb21tb25zLWplbGx5LXRhZ3MtaHRtbC0xLjAtU05BUFNIT1QiPgotICA8L3Byb3BlcnR5PgotICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlc2NyaXB0aW9uPSJvIEluaXRpYWxpemVzIHNvbWUgcHJvcGVydGllcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im5vZ2V0Ij4KLSAgICAgIDxlcXVhbHMgYXJnMj0ib25seSIgYXJnMT0iJHtidWlsZC5zeXNjbGFzc3BhdGh9Ij4KLSAgICAgIDwvZXF1YWxzPgotICAgIDwvY29uZGl0aW9uPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXNjcmlwdGlvbj0ibyBDb21waWxlIHRoZSBjb2RlIiBkZXBlbmRzPSJnZXQtZGVwcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHtjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvamF2YSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICAgIDxjb3B5IHRvZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL2phdmEiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICAgIDxjb3B5IHRvZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qZWxseSI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueHNsIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnJuZyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5kdGQiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5odG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamFyIiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgdGhlIGphciIgZGVwZW5kcz0iY29tcGlsZSx0ZXN0Ij4KLSAgICA8amFyIGphcmZpbGU9InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCIgYmFzZWRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0ibyBDbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIGRpcmVjdG9yaWVzIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGlzdGRpcn0iPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgYSBkaXN0cmlidXRpb24iIGRlcGVuZHM9ImphciwgamF2YWRvYyI+Ci0gICAgPG1rZGlyIGRpcj0iZGlzdCI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29weSB0b2Rpcj0iZGlzdCI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iIGluY2x1ZGVzPSIqLmphciI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iIGluY2x1ZGVzPSJMSUNFTlNFKiwgUkVBRE1FKiI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0ibyBSdW4gdGhlIHRlc3QgY2FzZXMiIGlmPSJ0ZXN0LmZhaWx1cmUiIGRlcGVuZHM9ImludGVybmFsLXRlc3QiPgotICAgIDxmYWlsIG1lc3NhZ2U9IlRoZXJlIHdlcmUgdGVzdCBmYWlsdXJlcy4iPgotICAgIDwvZmFpbD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iaW50ZXJuYWwtdGVzdCIgZGVwZW5kcz0iY29tcGlsZS10ZXN0cyI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8anVuaXQgZGlyPSIuLyIgZmFpbHVyZXByb3BlcnR5PSJ0ZXN0LmZhaWx1cmUiIHByaW50U3VtbWFyeT0ieWVzIiBmb3JrPSJ0cnVlIiBoYWx0b25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJiYXNlZGlyIiB2YWx1ZT0iLiI+Ci0gICAgICA8L3N5c3Byb3BlcnR5PgotICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Zm9ybWF0dGVyIHVzZWZpbGU9ImZhbHNlIiB0eXBlPSJwbGFpbiI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL1Rlc3QqLmphdmEiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgPC9qdW5pdD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZS10ZXN0cyIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy90ZXN0Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamF2YWRvYyIgZGVzY3JpcHRpb249Im8gR2VuZXJhdGUgamF2YWRvYyIgZGVwZW5kcz0iamFyIj4KLSAgICA8bWtkaXIgZGlyPSIke2phdmFkb2NkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDx0c3RhbXA+Ci0gICAgICA8Zm9ybWF0IHBhdHRlcm49IjIwMDIteXl5eSIgcHJvcGVydHk9InllYXIiPgotICAgICAgPC9mb3JtYXQ+Ci0gICAgPC90c3RhbXA+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvcHlyaWdodCIgdmFsdWU9IkNvcHlyaWdodCAmYW1wO2NvcHk7ICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLWh0bWwgMS4wLVNOQVBTSE9UIEFQSSI+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgICA8amF2YWRvYyB1c2U9InRydWUiIHByaXZhdGU9InRydWUiIGRlc3RkaXI9IiR7amF2YWRvY2Rpcn0iIGF1dGhvcj0idHJ1ZSIgdmVyc2lvbj0idHJ1ZSIgc291cmNlcGF0aD0ic3JjL2phdmEiIHBhY2thZ2VuYW1lcz0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuaHRtbC4qIj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0idGFyZ2V0LyR7ZmluYWwubmFtZX0uamFyIj4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWRvYz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iZ2V0LWRlcHMiIHVubGVzcz0ibm9nZXQiIGRlcGVuZHM9ImluaXQiPgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamVsbHkvamFycy9jb21tb25zLWplbGx5LVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vbmVrb2h0bWwtMC43LjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL25la29odG1sL2phcnMvbmVrb2h0bWwtMC43LjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWNsaS1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1jbGkvamFycy9jb21tb25zLWNsaS1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktdGFncy1sb2ctU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamVsbHkvamFycy9jb21tb25zLWplbGx5LXRhZ3MtbG9nLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS10YWdzLWpzbC1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktdGFncy1qc2wtU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LXRhZ3MteG1sLVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS10YWdzLXhtbC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktdGFncy1qdW5pdC1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktdGFncy1qdW5pdC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamV4bC1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZXhsL2phcnMvY29tbW9ucy1qZXhsLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veG1sLWFwaXMtMS4wLmIyLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94bWwtYXBpcy9qYXJzL3htbC1hcGlzLTEuMC5iMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtYmVhbnV0aWxzLTEuNi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1iZWFudXRpbHMvamFycy9jb21tb25zLWJlYW51dGlscy0xLjYuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1jb2xsZWN0aW9ucy9qYXJzL2NvbW1vbnMtY29sbGVjdGlvbnMtMi4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWxvZ2dpbmcvamFycy9jb21tb25zLWxvZ2dpbmctMS4wLjMuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9kb200ai0xLjUtYmV0YS0yLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9kb200ai9qYXJzL2RvbTRqLTEuNS1iZXRhLTIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qYXhlbi0xLjEtYmV0YS0yLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qYXhlbi9qYXJzL2pheGVuLTEuMS1iZXRhLTIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS94ZXJjZXMtMi4yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3hlcmNlcy9qYXJzL3hlcmNlcy0yLjIuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2p1bml0LTMuOC4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qdW5pdC9qYXJzL2p1bml0LTMuOC4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vYW50LTEuNS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vYW50L2phcnMvYW50LTEuNS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FudC1vcHRpb25hbC0xLjUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC1vcHRpb25hbC0xLjUuamFyIj4KLSAgICA8L2dldD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iaW5zdGFsbC1tYXZlbiI+Ci0gICAgPGdldCBkZXN0PSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIHNyYz0iJHtyZXBvfS9tYXZlbi9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDx1bmphciBkZXN0PSIke21hdmVuLmhvbWV9IiBzcmM9IiR7dXNlci5ob21lfS9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiPgotICAgIDwvdW5qYXI+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaHRtbC9tYXZlbi54bWwgYi9qZWxseS10YWdzL2h0bWwvbWF2ZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTU2MzRlLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvaHRtbC9tYXZlbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgZGVmYXVsdD0iamF2YTpqYXIiPgotCi0gICAgPCEtLSBkZWZpbmUgdGhlIGNsYXNzcGF0aCAtLT4gCi0gICAgPGdvYWwgbmFtZT0iY3JlYXRlLWNsYXNzcGF0aCIgcHJlcmVxcz0iamF2YTpjb21waWxlLHRlc3Q6Y29tcGlsZSI+IAotICAgICAgICA8cGF0aCBpZD0idGVzdC5jbGFzc3BhdGgiPiAKLSAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke21hdmVuLmJ1aWxkLmRlc3R9Ii8+IAotICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9InRhcmdldC9jbGFzc2VzIi8+IAotICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9InRhcmdldC90ZXN0LWNsYXNzZXMiLz4gCi0gICAgICAgICAgICA8cGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiLz4gCi0gICAgICAgIDwvcGF0aD4gCi0gICAgPC9nb2FsPiAKLQotICAgIDwhLS0gZGVtb3MtLT4KLSAgICAKLSAgPGdvYWwgbmFtZT0iZGVtbzpodG1sIiBwcmVyZXFzPSJjcmVhdGUtY2xhc3NwYXRoIgotICAgICAgICBkZXNjcmlwdGlvbj0iUnVucyB0aGUgZXhhbXBsZSBvZiBwYXJzaW5nIEhUTUwgd2l0aCBqZWxseSI+Ci0KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseSIgZm9yaz0ieWVzIj4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgICA8YXJnIHZhbHVlPSJzcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaHRtbC9leGFtcGxlLmplbGx5Ii8+Ci0gICAgPC9qYXZhPgotICA8L2dvYWw+Ci0KLSAgPGdvYWwgbmFtZT0iZGVtbzp0ZXh0IiBwcmVyZXFzPSJjcmVhdGUtY2xhc3NwYXRoIgotICAgICAgICBkZXNjcmlwdGlvbj0iUnVucyB0aGUgZXhhbXBsZSBvZiBwYXJzaW5nIHRleHQgd2l0aCB0YWdzIHZpYSBqZWxseSI+Ci0KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseSIgZm9yaz0ieWVzIj4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgICA8YXJnIHZhbHVlPSJzcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaHRtbC9leGFtcGxlMi5qZWxseSIvPgotICAgIDwvamF2YT4KLSAgPC9nb2FsPgotCi0KLSAgPGdvYWwgbmFtZT0iZGVtbzpyYWRpbzJwZGEiIHByZXJlcXM9ImNyZWF0ZS1jbGFzc3BhdGgiIAotICAgICAgZGVzY3JpcHRpb249IkNvbnZlcnRzIHRoZSBIVE1MIG5ld3Mgb3V0cHV0IG9mIFJhZGlvIFVzZXJsYW5kIHRvIHNpbXBsZSBIVE1MIHZpZXdhYmxlIG9uIGEgUERBIj4gCi0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHkiIGZvcms9InllcyI+IAotICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4gCi0gICAgICA8YXJnIHZhbHVlPSJzcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaHRtbC9yYWRpb1RvUERBLmplbGx5Ii8+IAotICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJvdXRwdXRGaWxlIiB2YWx1ZT0iJHtwZGFPdXRwdXRGaWxlfSIvPiAKLSAgICAgPC9qYXZhPiAKLSAgPC9nb2FsPiAKLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9odG1sL3Byb2plY3QucHJvcGVydGllcyBiL2plbGx5LXRhZ3MvaHRtbC9wcm9qZWN0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMTljYmMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9odG1sL3Byb2plY3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jIAotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUCBSIE8gSiBFIEMgVCAgUCBSIE8gUCBFIFIgVCBJIEUgUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2h0bWwvcHJvamVjdC54bWwgYi9qZWxseS10YWdzL2h0bWwvcHJvamVjdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZTM4NWEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9odG1sL3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3Q+Ci0gIDxleHRlbmQ+JHtiYXNlZGlyfS8uLi90YWctcHJvamVjdC54bWw8L2V4dGVuZD4KLSAgPGlkPmNvbW1vbnMtamVsbHktdGFncy1odG1sPC9pZD4KLSAgPG5hbWU+Y29tbW9ucy1qZWxseS10YWdzLWh0bWw8L25hbWU+Ci0gIDxjdXJyZW50VmVyc2lvbj4xLjA8L2N1cnJlbnRWZXJzaW9uPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5odG1sPC9wYWNrYWdlPgotICA8ZGVzY3JpcHRpb24+VGhlc2UgSmVsbHkgdGFncyBjYW4gc2NydWIgY29tbW9ucyBlcnJvcnMgaW4gSFRNTCBzeW50YXguPC9kZXNjcmlwdGlvbj4KLSAgPHNob3J0RGVzY3JpcHRpb24+Q29tbW9ucyBKZWxseSBIVE1MIFRhZyBMaWJyYXJ5PC9zaG9ydERlc2NyaXB0aW9uPgotICA8dmVyc2lvbnM+Ci0gICAgPHZlcnNpb24+Ci0gICAgICA8aWQ+MS4wPC9pZD4KLSAgICAgIDxuYW1lPjEuMDwvbmFtZT4KLSAgICAgIDx0YWc+Q09NTU9OUy1KRUxMWS1IVE1MLTFfMDwvdGFnPgotICAgIDwvdmVyc2lvbj4KLSAgPC92ZXJzaW9ucz4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8IS0tIGh0bWwgdGFnbGliIC0tPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPm5la29odG1sPC9pZD4KLSAgICAgIDx2ZXJzaW9uPjAuNy4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDwhLS0gU1RBUlQgZm9yIHJ1bm5pbmcgZGVtb3MgLS0+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5jb21tb25zLWNsaTwvaWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1qZWxseTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtamVsbHktdGFncy1sb2c8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1qZWxseTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtamVsbHktdGFncy1qc2w8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1qZWxseTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtamVsbHktdGFncy14bWw8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDwhLS0gRU5EIGZvciBydW5uaW5nIGRlbW9zIC0tPgotICAgIDwhLS0gU1RBUlQgZm9yIHRlc3RpbmcgLS0+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtamVsbHk8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWplbGx5LXRhZ3MtanVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICA8dXJsPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9qZWxseS90YWdzL2p1bml0LzwvdXJsPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8IS0tIEVORCBmb3IgdGVzdGluZyAtLT4KLQotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaHRtbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9odG1sL0hUTUxUYWdMaWJyYXJ5LmphdmEgYi9qZWxseS10YWdzL2h0bWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHRtbC9IVE1MVGFnTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjYwYTI0Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvaHRtbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9odG1sL0hUTUxUYWdMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmh0bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnTGlicmFyeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKiogRGVzY3JpYmVzIHRoZSBUYWdsaWIuIFRoaXMgY2xhc3MgY291bGQgYmUgZ2VuZXJhdGVkIGJ5IFhEb2NsZXQKLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOSAkCi0gICovCi1wdWJsaWMgY2xhc3MgSFRNTFRhZ0xpYnJhcnkgZXh0ZW5kcyBUYWdMaWJyYXJ5IHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEhUTUxUYWdMaWJyYXJ5LmNsYXNzKTsKLQotICAgIHB1YmxpYyBIVE1MVGFnTGlicmFyeSgpIHsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInBhcnNlIiwgUGFyc2VUYWcuY2xhc3MpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaHRtbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9odG1sL1BhcnNlVGFnLmphdmEgYi9qZWxseS10YWdzL2h0bWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHRtbC9QYXJzZVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjAyN2E5Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvaHRtbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9odG1sL1BhcnNlVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5odG1sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MueG1sLlBhcnNlVGFnU3VwcG9ydDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmN5YmVybmVrby5odG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotCi1pbXBvcnQgb3JnLmRvbTRqLkRvY3VtZW50OwotaW1wb3J0IG9yZy5kb200ai5pby5TQVhSZWFkZXI7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLQotLyoqIEEgdGFnIHdoaWNoIHBhcnNlcyBzb21lIEhUTUwgYW5kIGRlZmluZXMgYSB2YXJpYWJsZSB3aXRoIHRoZSBwYXJzZWQgRG9jdW1lbnQuCi0gICogVGhlIEhUTUwgY2FuIGVpdGhlciBiZSBzcGVjaWZpZWQgYXMgaXRzIGJvZHkgb3IgY2FuIGJlIHBhc3NlZCBpbiB2aWEgdGhlCi0gICogaHRtbCBwcm9wZXJ0eSB3aGljaCBjYW4gYmUgYSBSZWFkZXIsIElucHV0U3RyZWFtLCBVUkwgb3IgU3RyaW5nIFVSSS4KLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOSAkCi0gICovCi1wdWJsaWMgY2xhc3MgUGFyc2VUYWcgZXh0ZW5kcyBQYXJzZVRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBhcnNlVGFnLmNsYXNzKTsKLQotICAgIC8qKiBUaGUgSFRNTCB0byBwYXJzZSwgZWl0aGVyIGEgU3RyaW5nIFVSSSwgYSBSZWFkZXIgb3IgSW5wdXRTdHJlYW0gKi8KLSAgICBwcml2YXRlIE9iamVjdCBodG1sOwotICAgIHByaXZhdGUgU3RyaW5nIGVsZW1lbnQgPSAibWF0Y2giOwotICAgIHByaXZhdGUgU3RyaW5nIGF0dHJpYnV0ZSA9ICJuby1jaGFuZ2UiOwotCi0gICAgcHVibGljIFBhcnNlVGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAoZ2V0VmFyKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhciBhdHRyaWJ1dGUgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIGlmIChodG1sID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gZ2V0VGV4dCgpOwotICAgICAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRvY3VtZW50ID0gcGFyc2VUZXh0KHRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZG9jdW1lbnQgPSBwYXJzZUJvZHkob3V0cHV0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gcGFyc2UoaHRtbCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZShnZXRWYXIoKSwgZG9jdW1lbnQpOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKiogU2V0cyB0aGUgc291cmNlIG9mIHRoZSBIVE1MIHdoaWNoIGlzIGVpdGhlciBhIFN0cmluZyBVUkksIFJlYWRlciBvciBJbnB1dFN0cmVhbSAqLwotICAgIHB1YmxpYyB2b2lkIHNldEh0bWwoT2JqZWN0IGh0bWwpIHsKLSAgICAgICAgdGhpcy5odG1sID0gaHRtbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgYXR0cmlidXRlcyBzaG91bGQgYmUgY29udmVydGVkIHRvIGEgZGlmZmVyZW50IGNhc2UuCi0gICAgICogUG9zc2libGUgdmFsdWVzIGFyZSAidXBwZXIiLCAibG93ZXIiIG9yICJuby1jaGFuZ2UiCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXR0cmlidXRlIFRoZSBwcm9jZXNzaW5nIG1vZGUgb2YgYXR0cmlidXRlcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlKSB7Ci0gICAgICAgIHRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciBlbGVtZW50cyBzaG91bGQgYmUgY29udmVydGVkIHRvIGEgZGlmZmVyZW50IGNhc2UKLSAgICAgKiBQb3NzaWJsZSB2YWx1ZXMgYXJlICJ1cHBlciIsICJsb3dlciIgb3IgIm1hdGNoIgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIHByb2Nlc3NpbmcgbW9kZSBvZiBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnQoU3RyaW5nIGVsZW1lbnQpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICB9Ci0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBTQVhSZWFkZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU0FYUmVhZGVyIGNyZWF0ZVNBWFJlYWRlcigpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAvLyBpbnN0YWxscyB0aGUgTmVja0hUTUwgcGFyc2VyCi0gICAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBuZXcgU0FYUGFyc2VyKCk7Ci0gICAgICAgIHBhcnNlci5zZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICJodHRwOi8vY3liZXJuZWtvLm9yZy9odG1sL3Byb3BlcnRpZXMvbmFtZXMvZWxlbXMiLAotICAgICAgICAgICAgZWxlbWVudAotICAgICAgICApOwotICAgICAgICBwYXJzZXIuc2V0UHJvcGVydHkoCi0gICAgICAgICAgICAiaHR0cDovL2N5YmVybmVrby5vcmcvaHRtbC9wcm9wZXJ0aWVzL25hbWVzL2F0dHJzIiwKLSAgICAgICAgICAgIGF0dHJpYnV0ZQotICAgICAgICApOwotICAgICAgICByZXR1cm4gbmV3IFNBWFJlYWRlciggcGFyc2VyICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9odG1sL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2h0bWwvcGFja2FnZS5odG1sIGIvamVsbHktdGFncy9odG1sL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2h0bWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTg0OWRhLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvaHRtbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9odG1sL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci0KLSAgPHA+VGFncyBmb3IgcGFyc2luZyBIVE1MIHNvIHRoYXQgaXQgY2FuIGJlIHByb2Nlc3NlZCBieSBKZWxseSB1c2luZyBBbmR5IENsYXJrJ3MgCi0gIAk8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvfmFuZHljL25la28vZG9jL2luZGV4Lmh0bWwiPk5la29IVE1MPC9hPgotICA8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2h0bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2h0bWwvVGVzdEplbGx5LmphdmEgYi9qZWxseS10YWdzL2h0bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2h0bWwvVGVzdEplbGx5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZThlYjkuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9odG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9odG1sL1Rlc3RKZWxseS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaHRtbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qdW5pdC5KZWxseVRlc3RTdWl0ZTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyB0byBydW4gamVsbHkgdGVzdCBjYXNlcyBhcyBwYXJ0IG9mIEFudCdzIEpVbml0IHRlc3RzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0SmVsbHkgZXh0ZW5kcyBKZWxseVRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUZXN0UnVubmVyLnJ1biggc3VpdGUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVUZXN0U3VpdGUoVGVzdEplbGx5LmNsYXNzLCAic3VpdGUuamVsbHkiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2h0bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2h0bWwvZXhhbXBsZS5qZWxseSBiL2plbGx5LXRhZ3MvaHRtbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaHRtbC9leGFtcGxlLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzg0M2NlLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvaHRtbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaHRtbC9leGFtcGxlLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM6eD0iamVsbHk6eG1sIiB4bWxuczpodG1sPSJqZWxseTpodG1sIj4KLQotICA8aHRtbDpwYXJzZSB2YXI9ImRvYyIgaHRtbD0iaW5kZXguaHRtbCIvPgotCi0gIFRoZSB0aXRsZSBpczogCi0gIAotICA8eDpleHByIHNlbGVjdD0iJGRvYy9odG1sL2hlYWQvdGl0bGUiLz4KLQotICA8ajp3aGl0ZXNwYWNlPgotICAgICAgCi0gIFRoZSBYTUwgb2YgdGhlIGRvY3VtZW50IGlzCi0gIAotICA8eDpjb3B5T2Ygc2VsZWN0PSIkZG9jIi8+Ci0gIAotICA8L2o6d2hpdGVzcGFjZT4KLSAgCi08L2o6amVsbHk+Ci0KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9odG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9odG1sL2V4YW1wbGUyLmplbGx5IGIvamVsbHktdGFncy9odG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9odG1sL2V4YW1wbGUyLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTc3MmFiLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvaHRtbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaHRtbC9leGFtcGxlMi5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiIHhtbG5zOng9ImplbGx5OnhtbCIgeG1sbnM6aHRtbD0iamVsbHk6aHRtbCI+Ci0KLSAgPGh0bWw6cGFyc2UgdmFyPSJkb2MiIGh0bWw9InRleHRTY3JpcHQudHh0Ii8+Ci0KLSAgPGo6d2hpdGVzcGFjZT4KLSAgICAgIAotICBUaGUgWE1MIG9mIHRoZSBkb2N1bWVudCBpcwotICAKLSAgPHg6Y29weU9mIHNlbGVjdD0iJGRvYyIvPgotICAKLSAgPC9qOndoaXRlc3BhY2U+Ci0gIAotPC9qOmplbGx5PgotCi0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaHRtbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaHRtbC9pbmRleC5odG1sIGIvamVsbHktdGFncy9odG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9odG1sL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMGY1MmIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9odG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9odG1sL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0gIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vQ29sbGFiTmV0Ly9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAiaHR0cDovL3d3dy5jb2xsYWJuZXQuY29tL2R0ZHMvY29sbGFibmV0X3RyYW5zaXRpb25hbF8xMC5kdGQiPgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgIDx0aXRsZT5KZWxseSAtIEplbGx5IDogSmF2YSBhbmQgWE1MIGJhc2VkIHByb2Nlc3NpbmcgZW5naW5lPC90aXRsZT4KLQotCQk8bWV0YSBuYW1lPSJhdXRob3IiIHZhbHVlPSJKYW1lcyBTdHJhY2hhbiIvPgotICAgICAgICA8bWV0YSBuYW1lPSJlbWFpbCIgdmFsdWU9ImpzdHJhY2hhbkBhcGFjaGUub3JnIiAvPgotICAgICAgCi0gICAgPC9oZWFkPgotCi0gICAgPGJvZHkgY2xhc3M9ImNvbXBvc2l0ZSIgbWFyZ2lud2lkdGg9IjAiIG1hcmdpbmhlaWdodD0iMCI+Ci0KLQkJCTxwPlNvbWUgdGV4dDwvcD4KLQkJCQotICAgIAk8SU1HIFVSST0iZm9vIj4KLSAgICAKLQkJc29tZSB1bm1hdGNoZWQgdGFncyBoZXJlLi4uCQkgICAgCQotICAgIAk8cD4KLSAgICAJCi0gICAgCWFuZCBoZXJlLi4uCi0gICAgCTxwPgotICAgIAkKLSAgICAJCi0gICAgCTxicj4KLQotCQk8Zm9vOmJhciBuYW1lPSJhIGN1c3RvbSB0YWciLz4KLQkJICAgIAkKLSAgICA8L2JvZHk+Ci0gIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaHRtbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaHRtbC9yYWRpb1RvUERBLmplbGx5IGIvamVsbHktdGFncy9odG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9odG1sL3JhZGlvVG9QREEuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZTkwZTUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9odG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9odG1sL3JhZGlvVG9QREEuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseSAKLSAgICB4bWxuczpqPSJqZWxseTpjb3JlIiAKLSAgICB4bWxuczp4PSJqZWxseTp4bWwiIAotICAgIHhtbG5zOmh0bWw9ImplbGx5Omh0bWwiIAotICAgIHhtbG5zOmxvZz0iamVsbHk6bG9nIiAKLSAgICB4bWxuczpqc2w9ImplbGx5OmpzbCI+Ci0KLSAgICA8IS0tIAotICAgICAgICB8fCBUaGlzIHNjcmlwdCBwYXJzZXJzIHRoZSBjdXJyZW50IG5ld3MgdXNpbmcgUmFkaW8gVXNlcmxhbmQncyBuZXdzIGFnZ3JlZ2F0b3IKLSAgICAgICAgfHwgYW5kIHRoZW4gb3V0cHV0cyBpdCBpbiBhIHNpbXBsZSBIVE1MIGZvcm1hdCB0aGF0IGNhbiBiZSByZWFkIGVhc2lseSBvbiBhIFBEQQotICAgICAgICAtLT4KLQotICA8aHRtbDpwYXJzZSB2YXI9ImRvYyIgaHRtbD0iaHR0cDovLzEyNy4wLjAuMTo1MzM1L3N5c3RlbS9wYWdlcy9uZXdzIi8+Ci0KLSAgICA8ajppZiB0ZXN0PSIke2VtcHR5KG91dHB1dEZpbGUpfSI+Ci0gICAgICAgIDxqOnNldCB2YXI9Im91dHB1dEZpbGUiIHZhbHVlPSJ0YXJnZXQvcmFkaW8uaHRtbCIvPiAgICAgICAgICAgIAotICAgIDwvajppZj4KLSAgICAKLSAgICA8bG9nOmluZm8+QWJvdXQgdG8gZ2VuZXJhdGUgZmlsZSAke291dHB1dEZpbGV9PC9sb2c6aW5mbz4KLSAgICAKLSAgICA8ajpmaWxlIG5hbWU9IiR7b3V0cHV0RmlsZX0iIG91dHB1dE1vZGU9Imh0bWwiIGVuY29kaW5nPSJJU08tODg1OS0xIj4KLSAgICAgICAgPGpzbDpzdHlsZXNoZWV0IHNlbGVjdD0iJGRvYyI+Ci0gICAgICAgICAgICA8anNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICAgICAgICAgICAgICA8anNsOmFwcGx5VGVtcGxhdGVzLz4KLSAgICAgICAgICAgIDwvanNsOnRlbXBsYXRlPgotICAgICAgICAKLSAgICAgICAgICAgIDwhLS0gc3RyaXAgb3V0IHRoZXNlIGVsZW1lbnRzLS0+Ci0gICAgICAgICAgICA8anNsOnRlbXBsYXRlIG1hdGNoPSJmb3JtfHRhYmxlfHRkfGNlbnRlciI+Ci0gICAgICAgICAgICAgICAgPGpzbDphcHBseVRlbXBsYXRlcyBzZWxlY3Q9ImNoaWxkOjpub2RlKCkiLz4KLSAgICAgICAgICAgIDwvanNsOnRlbXBsYXRlPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPGpzbDp0ZW1wbGF0ZSBtYXRjaD0idHIiPgotICAgICAgICAgICAgICAgIDxiciAvPgotICAgICAgICAgICAgICAgIDxkaXY+Ci0gICAgICAgICAgICAgICAgICAgIDxqc2w6YXBwbHlUZW1wbGF0ZXMgc2VsZWN0PSJjaGlsZDo6bm9kZSgpIi8+Ci0gICAgICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgICA8L2pzbDp0ZW1wbGF0ZT4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDxqc2w6dGVtcGxhdGUgbWF0Y2g9InNjcmlwdHxpbWd8aW5wdXQiLz4KLSAgICAgICAgCi0gICAgICAgICAgICA8IS0tIHBhc3MgdGhyb3VnaCBhbGwgb3RoZXIgZWxlbWVudHMgLS0+Ci0gICAgICAgICAgICA8anNsOnRlbXBsYXRlIG1hdGNoPSIqIiB0cmltPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgPGpzbDpjb3B5PgotICAgICAgICAgICAgICAgICAgICA8anNsOmFwcGx5VGVtcGxhdGVzLz4KLSAgICAgICAgICAgICAgICA8L2pzbDpjb3B5PgotICAgICAgICAgICAgPC9qc2w6dGVtcGxhdGU+Ci0KLSAgICAgICAgICAgIDxqc2w6dGVtcGxhdGUgbWF0Y2g9IkAqIi8+Ci0gICAgICAgIDwvanNsOnN0eWxlc2hlZXQ+Ci0gICAgPC9qOmZpbGU+IAotICAgIAotPC9qOmplbGx5PgotCi0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaHRtbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaHRtbC9zdWl0ZS5qZWxseSBiL2plbGx5LXRhZ3MvaHRtbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaHRtbC9zdWl0ZS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNkMzRjMC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2h0bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2h0bWwvc3VpdGUuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4NCi0gIA0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIA0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIA0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHRlc3Q6c3VpdGUgDQotICB4bWxuczpodG1sPSJqZWxseTpodG1sIiANCi0gIHhtbG5zOmo9ImplbGx5OmNvcmUiDQotICB4bWxuczp4PSJqZWxseTp4bWwiDQotICB4bWxuczp0ZXN0PSJqZWxseTpqdW5pdCI+DQotDQotICA8dGVzdDpjYXNlIG5hbWU9InRlc3RTaW1wbGVQYXJzZSI+DQotICAgIDxodG1sOnBhcnNlIHZhcj0iZG9jIiBodG1sPSJpbmRleC5odG1sIi8+DQotICANCi0gICAgPHRlc3Q6YXNzZXJ0IHhwYXRoPSIkZG9jL2h0bWwvaGVhZC90aXRsZSIvPg0KLSAgICA8dGVzdDphc3NlcnQgeHBhdGg9IiRkb2MvaHRtbC9ib2R5L0lNR1tAVVJJPSdmb28nXSIvPg0KLSAgPC90ZXN0OmNhc2U+DQotDQotICA8dGVzdDpjYXNlIG5hbWU9InRlc3RVcHBlckNhc2UiPg0KLSAgICA8aHRtbDpwYXJzZSB2YXI9ImRvYyIgaHRtbD0iaW5kZXguaHRtbCIgZWxlbWVudD0idXBwZXIiIGF0dHJpYnV0ZT0idXBwZXIiLz4NCi0gIA0KLSAgICA8dGVzdDphc3NlcnQgeHBhdGg9IiRkb2MvSFRNTC9IRUFEL1RJVExFIi8+ICAgIA0KLSAgICA8dGVzdDphc3NlcnQgeHBhdGg9IiRkb2MvSFRNTC9CT0RZL0lNR1tAVVJJPSdmb28nXSIvPg0KLSAgPC90ZXN0OmNhc2U+DQotICANCi0gIDx0ZXN0OmNhc2UgbmFtZT0idGVzdExvd2VyQ2FzZSI+DQotICAgIDxodG1sOnBhcnNlIHZhcj0iZG9jIiBodG1sPSJpbmRleC5odG1sIiBlbGVtZW50PSJsb3dlciIgYXR0cmlidXRlPSJsb3dlciIvPg0KLSAgDQotICAgIDx0ZXN0OmFzc2VydCB4cGF0aD0iJGRvYy9odG1sL2hlYWQvdGl0bGUiLz4NCi0gICAgPHRlc3Q6YXNzZXJ0IHhwYXRoPSIkZG9jL2h0bWwvYm9keS9pbWdbQHVyaT0nZm9vJ10iLz4NCi0gIDwvdGVzdDpjYXNlPg0KLSAgDQotICA8dGVzdDpjYXNlIG5hbWU9InRlc3RNaXhlZENhc2UiPg0KLSAgICA8aHRtbDpwYXJzZSB2YXI9ImRvYyIgaHRtbD0iaW5kZXguaHRtbCIgZWxlbWVudD0idXBwZXIiIGF0dHJpYnV0ZT0ibG93ZXIiLz4NCi0gIA0KLSAgICA8dGVzdDphc3NlcnQgeHBhdGg9IiRkb2MvSFRNTC9IRUFEL1RJVExFIi8+DQotICAgIDx0ZXN0OmFzc2VydCB4cGF0aD0iJGRvYy9IVE1ML0JPRFkvSU1HW0B1cmk9J2ZvbyddIi8+DQotICA8L3Rlc3Q6Y2FzZT4NCi0NCi0gIDx0ZXN0OmNhc2UgbmFtZT0idGVzdElubGluZUh0bWwiPg0KLSAgICA8aHRtbDpwYXJzZSB2YXI9ImRvYyI+DQotICAgICAgPGh0bWw+DQotICAgICAgICA8aGVhZD4NCi0gICAgICAgICAgPHRpdGxlPkplbGx5IC0gSmVsbHkgOiBKYXZhIGFuZCBYTUwgYmFzZWQgcHJvY2Vzc2luZyBlbmdpbmU8L3RpdGxlPg0KLSAgICAgICAgICA8bWV0YSBuYW1lPSJhdXRob3IiIHZhbHVlPSJKYW1lcyBTdHJhY2hhbiIvPg0KLSAgICAgICAgICA8bWV0YSBuYW1lPSJlbWFpbCIgdmFsdWU9ImpzdHJhY2hhbkBhcGFjaGUub3JnIiAvPg0KLSAgICAgICAgPC9oZWFkPg0KLSAgICAgICAgPGJvZHk+DQotICAgICAgICA8L2JvZHk+DQotICAgICAgPC9odG1sPg0KLSAgICA8L2h0bWw6cGFyc2U+DQotICAgIA0KLSAgICA8dGVzdDphc3NlcnQgeHBhdGg9IiRkb2MvaHRtbC9oZWFkL3RpdGxlIi8+DQotICAgIA0KLSAgICA8ajpzZXQgdmFyPSJ0aXRsZSI+PHg6ZXhwciBzZWxlY3Q9IiRkb2MvaHRtbC9oZWFkL3RpdGxlIiAvPjwvajpzZXQ+DQotICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iSmVsbHkgLSBKZWxseSA6IEphdmEgYW5kIFhNTCBiYXNlZCBwcm9jZXNzaW5nIGVuZ2luZSINCi0gICAgICBhY3R1YWw9IiR7dGl0bGV9IiAvPg0KLSAgPC90ZXN0OmNhc2U+DQotDQotICA8dGVzdDpjYXNlIG5hbWU9InRlc3RJbmxpbmVGcm9tVmFyIj4NCi0gICAgICANCi0gICAgICA8IS0tIHRoaXMgd2lsbCB0dXJuIHRoZSBIVE1MIG1hcmt1cCBmcm9tIFhNTCBldmVudHMgaW50byB0ZXh0IC0tPg0KLSAgICA8ajpzZXQgdmFyPSJodG1sIiBlbmNvZGU9ImZhbHNlIj4NCi0gICAgICA8aHRtbD4NCi0gICAgICAgIDxoZWFkPg0KLSAgICAgICAgICA8dGl0bGU+SmVsbHkgLSBKZWxseSA6IEphdmEgYW5kIFhNTCBiYXNlZCBwcm9jZXNzaW5nIGVuZ2luZTwvdGl0bGU+DQotICAgICAgICAgICAgICAgICAgPG1ldGEgbmFtZT0iYXV0aG9yIiB2YWx1ZT0iSmFtZXMgU3RyYWNoYW4iLz4NCi0gICAgICAgICAgPG1ldGEgbmFtZT0iZW1haWwiIHZhbHVlPSJqc3RyYWNoYW5AYXBhY2hlLm9yZyIgLz4NCi0gICAgICAgIDwvaGVhZD4NCi0gICAgICAgIDxib2R5Pg0KLSAgICAgICAgPC9ib2R5Pg0KLSAgICAgIDwvaHRtbD4NCi0gICAgPC9qOnNldD4NCi0NCi0gICAgICAgIDwhLS0gcGFyc2UgdGhlIHRleHQgYXMgbWFya3VwIC0tPg0KLSAgICA8aHRtbDpwYXJzZSB2YXI9ImRvYyIgdGV4dD0iJHtodG1sfSIvPg0KLQ0KLSAgICA8dGVzdDphc3NlcnQgeHBhdGg9IiRkb2MvaHRtbC9oZWFkL3RpdGxlIi8+DQotICAgIA0KLSAgICA8ajpzZXQgdmFyPSJ0aXRsZSI+PHg6ZXhwciBzZWxlY3Q9IiRkb2MvaHRtbC9oZWFkL3RpdGxlIiAvPjwvajpzZXQ+DQotICAgIA0KLSAgICA8dGVzdDphc3NlcnRFcXVhbHMgDQotICAgICAgICBleHBlY3RlZD0iSmVsbHkgLSBKZWxseSA6IEphdmEgYW5kIFhNTCBiYXNlZCBwcm9jZXNzaW5nIGVuZ2luZSINCi0gICAgICBhY3R1YWw9IiR7dGl0bGV9IiAvPg0KLSAgPC90ZXN0OmNhc2U+DQotDQotPC90ZXN0OnN1aXRlPg0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaHRtbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaHRtbC90ZXh0U2NyaXB0LnR4dCBiL2plbGx5LXRhZ3MvaHRtbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaHRtbC90ZXh0U2NyaXB0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJkZTUyZC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2h0bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2h0bWwvdGV4dFNjcmlwdC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi10aGlzIGlzIHNvbWUgdGV4dAotCi08Zm9vOmJhciBuYW1lPSJhIGN1c3RvbSB0YWchIj4KLQotdGhpcyBpcyBzb21lIG1vcmUgdGV4dAotCi08ajpmb3JFYWNoIHNlbGVjdD0iJHtmb28uYmFyfSI+Ci0gIGRvIHNvbWV0aGluZwotICAkezEyICsgMTJ9Ci08L2o6Zm9yRWFjaD4KLQotZW5kIG9mIHRoZSBwYWdlLi4uICAJCSAgCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaHRtbC94ZG9jcy9jaGFuZ2VzLnhtbCBiL2plbGx5LXRhZ3MvaHRtbC94ZG9jcy9jaGFuZ2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExNDY0MS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2h0bWwveGRvY3MvY2hhbmdlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tIAotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotIC0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5DaGFuZ2VzPC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0gIDxib2R5PgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMCIgZGF0ZT0iMjAwNC0wOS0xMSI+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0iYWRkIj5Jbml0aWFsIFJlbGVhc2U8L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2h0bWwveGRvY3MvaW5kZXgueG1sIGIvamVsbHktdGFncy9odG1sL3hkb2NzL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVjODYxNy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2h0bWwveGRvY3MvaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+SFRNTCBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotICAgIDxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KLSAgICAgIDxwPgotICAgICAgICBUYWdzIGZvciBwYXJzaW5nIEhUTUwgc28gdGhhdCBpdCBjYW4gYmUgcHJvY2Vzc2VkIGJ5IEplbGx5IHVzaW5nIEFuZHkgQ2xhcmsncyAKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvfmFuZHljL25la28vZG9jL2luZGV4Lmh0bWwiPk5la29IVE1MPC9hPi4KLSAgICAgICAgICBTZWUgdGhlIDxhIGhyZWY9InRhZ3MuaHRtbCI+dGFnczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICA8L3A+Ci0gICAgPC9zZWN0aW9uPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2h0bWwveGRvY3MvbmF2aWdhdGlvbi54bWwgYi9qZWxseS10YWdzL2h0bWwveGRvY3MvbmF2aWdhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMGE3ZmEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9odG1sL3hkb2NzL25hdmlnYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBuYW1lPSJIVE1MIFRhZyBMaWJyYXJ5Ij4KLQotICA8dGl0bGU+SFRNTCBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gIAotICA8Ym9keT4KLSAgICA8bWVudSBuYW1lPSJIVE1MIFRhZyBMaWJyYXJ5Ij4KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICAgICAgICAgICBocmVmPSIvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iVGFncyIgICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWdzLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaHR0cC8uY3ZzaWdub3JlIGIvamVsbHktdGFncy9odHRwLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZDMxZjcuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9odHRwLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLW1hdmVuLmxvZwotdGFyZ2V0Ci12ZWxvY2l0eS5sb2cKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaHR0cC9idWlsZC54bWwgYi9qZWxseS10YWdzL2h0dHAvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzRmODg5Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvaHR0cC9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLWJ1aWxkLnhtbCBnZW5lcmF0ZWQgYnkgbWF2ZW4gZnJvbSBwcm9qZWN0LnhtbCB2ZXJzaW9uIDEuMC1TTkFQU0hPVAotICBvbiBkYXRlIE1heSAyNCAyMDA0LCB0aW1lIDIzMDEtLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImphciIgbmFtZT0iY29tbW9ucy1qZWxseS10YWdzLWh0dHAiIGJhc2VkaXI9Ii4iPgotICA8cHJvcGVydHkgbmFtZT0iZGVmYXVsdHRhcmdldGRpciIgdmFsdWU9InRhcmdldCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJkaXIiIHZhbHVlPSJ0YXJnZXQvbGliIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXNkaXIiIHZhbHVlPSJ0YXJnZXQvY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Y2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0idGVzdHJlcG9ydGRpciIgdmFsdWU9InRhcmdldC90ZXN0LXJlcG9ydHMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZGlzdGRpciIgdmFsdWU9ImRpc3QiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iamF2YWRvY2RpciIgdmFsdWU9ImRpc3QvZG9jcy9hcGkiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZmluYWwubmFtZSIgdmFsdWU9ImNvbW1vbnMtamVsbHktdGFncy1odHRwLTEuMC1TTkFQU0hPVCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVzY3JpcHRpb249Im8gSW5pdGlhbGl6ZXMgc29tZSBwcm9wZXJ0aWVzIj4KLSAgICA8bWtkaXIgZGlyPSIke2xpYmRpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibm9nZXQiPgotICAgICAgPGVxdWFscyBhcmcyPSJvbmx5IiBhcmcxPSIke2J1aWxkLnN5c2NsYXNzcGF0aH0iPgotICAgICAgPC9lcXVhbHM+Ci0gICAgPC9jb25kaXRpb24+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJvIENvbXBpbGUgdGhlIGNvZGUiIGRlcGVuZHM9ImdldC1kZXBzIj4KLSAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqYXZhYyBkZXN0ZGlyPSIke2NsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy9qYXZhIj4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0gICAgPGNvcHkgdG9kaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvamF2YSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gICAgPGNvcHkgdG9kaXI9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmplbGx5Ij4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54c2wiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucm5nIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmR0ZCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmh0bWwiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJqYXIiIGRlc2NyaXB0aW9uPSJvIENyZWF0ZSB0aGUgamFyIiBkZXBlbmRzPSJjb21waWxlLHRlc3QiPgotICAgIDxqYXIgamFyZmlsZT0idGFyZ2V0LyR7ZmluYWwubmFtZX0uamFyIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIiBiYXNlZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICA8L2phcj4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJvIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZGlyZWN0b3JpZXMiPgotICAgIDxkZWxldGUgZGlyPSIke2RlZmF1bHR0YXJnZXRkaXJ9Ij4KLSAgICA8L2RlbGV0ZT4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlc2NyaXB0aW9uPSJvIENyZWF0ZSBhIGRpc3RyaWJ1dGlvbiIgZGVwZW5kcz0iamFyLCBqYXZhZG9jIj4KLSAgICA8bWtkaXIgZGlyPSJkaXN0Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb3B5IHRvZGlyPSJkaXN0Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSIgaW5jbHVkZXM9IiouamFyIj4KLSAgICAgIDwvZmlsZXNldD4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZXM9IkxJQ0VOU0UqLCBSRUFETUUqIj4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlc2NyaXB0aW9uPSJvIFJ1biB0aGUgdGVzdCBjYXNlcyIgaWY9InRlc3QuZmFpbHVyZSIgZGVwZW5kcz0iaW50ZXJuYWwtdGVzdCI+Ci0gICAgPGZhaWwgbWVzc2FnZT0iVGhlcmUgd2VyZSB0ZXN0IGZhaWx1cmVzLiI+Ci0gICAgPC9mYWlsPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJpbnRlcm5hbC10ZXN0IiBkZXBlbmRzPSJjb21waWxlLXRlc3RzIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3RyZXBvcnRkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqdW5pdCBkaXI9Ii4vIiBmYWlsdXJlcHJvcGVydHk9InRlc3QuZmFpbHVyZSIgcHJpbnRTdW1tYXJ5PSJ5ZXMiIGZvcms9InRydWUiIGhhbHRvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImJhc2VkaXIiIHZhbHVlPSIuIj4KLSAgICAgIDwvc3lzcHJvcGVydHk+Ci0gICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxmb3JtYXR0ZXIgdXNlZmlsZT0iZmFsc2UiIHR5cGU9InBsYWluIj4KLSAgICAgIDwvZm9ybWF0dGVyPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICA8YmF0Y2h0ZXN0IHRvZGlyPSIke3Rlc3RyZXBvcnRkaXJ9Ij4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovVGVzdCouamF2YSI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2JhdGNodGVzdD4KLSAgICA8L2p1bml0PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlLXRlc3RzIiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iIGRlcHJlY2F0aW9uPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSIgb3B0aW1pemU9ImZhbHNlIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIj4KLSAgICAgIDxzcmM+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL3Rlc3QiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9zcmM+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJqYXZhZG9jIiBkZXNjcmlwdGlvbj0ibyBHZW5lcmF0ZSBqYXZhZG9jIiBkZXBlbmRzPSJqYXIiPgotICAgIDxta2RpciBkaXI9IiR7amF2YWRvY2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPHRzdGFtcD4KLSAgICAgIDxmb3JtYXQgcGF0dGVybj0iMjAwMi15eXl5IiBwcm9wZXJ0eT0ieWVhciI+Ci0gICAgICA8L2Zvcm1hdD4KLSAgICA8L3RzdGFtcD4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29weXJpZ2h0IiB2YWx1ZT0iQ29weXJpZ2h0ICZhbXA7Y29weTsgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLiI+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgICA8cHJvcGVydHkgbmFtZT0idGl0bGUiIHZhbHVlPSJjb21tb25zLWplbGx5LXRhZ3MtaHR0cCAxLjAtU05BUFNIT1QgQVBJIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxqYXZhZG9jIHVzZT0idHJ1ZSIgcHJpdmF0ZT0idHJ1ZSIgZGVzdGRpcj0iJHtqYXZhZG9jZGlyfSIgYXV0aG9yPSJ0cnVlIiB2ZXJzaW9uPSJ0cnVlIiBzb3VyY2VwYXRoPSJzcmMvamF2YSIgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5odHRwLioiPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhZG9jPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJnZXQtZGVwcyIgdW5sZXNzPSJub2dldCIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWh0dHBjbGllbnQtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtaHR0cGNsaWVudC9qYXJzL2NvbW1vbnMtaHR0cGNsaWVudC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktdGFncy1kZWZpbmUtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamVsbHkvamFycy9jb21tb25zLWplbGx5LXRhZ3MtZGVmaW5lLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZXhsLVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWpleGwvamFycy9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS94bWwtYXBpcy0xLjAuYjIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3htbC1hcGlzL2phcnMveG1sLWFwaXMtMS4wLmIyLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1iZWFudXRpbHMtMS42LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWJlYW51dGlscy9qYXJzL2NvbW1vbnMtYmVhbnV0aWxzLTEuNi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtY29sbGVjdGlvbnMtMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWNvbGxlY3Rpb25zL2phcnMvY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWxvZ2dpbmctMS4wLjMuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtbG9nZ2luZy9qYXJzL2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2RvbTRqLTEuNS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2RvbTRqL2phcnMvZG9tNGotMS41LWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2pheGVuLTEuMS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2pheGVuL2phcnMvamF4ZW4tMS4xLWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3hlcmNlcy0yLjIuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veGVyY2VzL2phcnMveGVyY2VzLTIuMi4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vanVuaXQtMy44LjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2p1bml0L2phcnMvanVuaXQtMy44LjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vYW50LW9wdGlvbmFsLTEuNS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vYW50L2phcnMvYW50LW9wdGlvbmFsLTEuNS5qYXIiPgotICAgIDwvZ2V0PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJpbnN0YWxsLW1hdmVuIj4KLSAgICA8Z2V0IGRlc3Q9IiR7dXNlci5ob21lfS9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgc3JjPSIke3JlcG99L21hdmVuL21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPHVuamFyIGRlc3Q9IiR7bWF2ZW4uaG9tZX0iIHNyYz0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC91bmphcj4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9odHRwL21hdmVuLnhtbCBiL2plbGx5LXRhZ3MvaHR0cC9tYXZlbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5N2FkYjMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9odHRwL21hdmVuLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXZhOmphciI+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaHR0cC9wcm9qZWN0LnByb3BlcnRpZXMgYi9qZWxseS10YWdzL2h0dHAvcHJvamVjdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDE5Y2JjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvaHR0cC9wcm9qZWN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIyAKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFAgUiBPIEogRSBDIFQgIFAgUiBPIFAgRSBSIFQgSSBFIFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9odHRwL3Byb2plY3QueG1sIGIvamVsbHktdGFncy9odHRwL3Byb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmRlOTBlLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvaHR0cC9wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0PgotICA8ZXh0ZW5kPiR7YmFzZWRpcn0vLi4vdGFnLXByb2plY3QueG1sPC9leHRlbmQ+Ci0gIDxpZD5jb21tb25zLWplbGx5LXRhZ3MtaHR0cDwvaWQ+Ci0gIDxjdXJyZW50VmVyc2lvbj4xLjEtU05BUFNIT1Q8L2N1cnJlbnRWZXJzaW9uPgotICA8bmFtZT5jb21tb25zLWplbGx5LXRhZ3MtaHR0cDwvbmFtZT4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuaHR0cDwvcGFja2FnZT4KLSAgPGRlc2NyaXB0aW9uPlRoZXNlIGFyZSBzaW1wbGUgSmVsbHkgdGFncyB0aGF0IGNhbiBwZXJmb3JtIEhUVFAgcmVxdWVzdHMuPC9kZXNjcmlwdGlvbj4KLSAgPHNob3J0RGVzY3JpcHRpb24+Q29tbW9ucyBKZWxseSBIVFRQIFRhZyBMaWJyYXJ5PC9zaG9ydERlc2NyaXB0aW9uPgotICA8dmVyc2lvbnM+Ci0gICAgPHZlcnNpb24+Ci0gICAgICA8aWQ+MS4wPC9pZD4KLSAgICAgIDxuYW1lPjEuMDwvbmFtZT4KLSAgICAgIDx0YWc+Q09NTU9OUy1KRUxMWS1IVFRQLTFfMDwvdGFnPgotICAgIDwvdmVyc2lvbj4KLSAgPC92ZXJzaW9ucz4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5jb21tb25zLWh0dHBjbGllbnQ8L2lkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8IS0tICB0ZXN0aW5nIC0tPgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWplbGx5PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1qZWxseS10YWdzLWRlZmluZTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgIDx1cmw+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lLzwvdXJsPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2h0dHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHR0cC9Cb2R5VGFnLmphdmEgYi9qZWxseS10YWdzL2h0dHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHR0cC9Cb2R5VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZWQwYjMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9odHRwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2h0dHAvQm9keVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmh0dHA7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwTWV0aG9kOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMuUG9zdE1ldGhvZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLlB1dE1ldGhvZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqCi0gKiBBIHRhZyB0byBzZXQgdGhlIGJvZHkgZm9yIHBvc3RzIGFuZCBwdXRzIGV0YwotICoKLSAqIEBhdXRob3IgIGRpb24KLSAqIEB2ZXJzaW9uICRJZDogQm9keVRhZy5qYXZhLHYgMS4zIDIwMDIvMDcvMTQgMTY6NDQ6MTAgZGlvbiBFeHAgJAotICovCi1wdWJsaWMgY2xhc3MgQm9keVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgQm9keVRhZyAqLwotICAgIHB1YmxpYyBCb2R5VGFnKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm0gdGhlIHRhZyBmdW5jdGlvbmFsaXR5LiBJbiB0aGlzIGNhc2UsIGdldCB0aGUgcGFyZW50IGh0dHAgdGFnLAotICAgICAqIGFuZCBpZiBpdCdzIGEgcG9zdCBvciBwdXQsIHNldCB0aGUgcmVxdWVzdCBib2R5IGZyb20gdGhlIGJvZHkgb2YgdGhpcwotICAgICAqIHRhZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB4bWxPdXRwdXQgZm9yIHdyaXRpbmcgb3V0cHV0IHRvCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gd2hlbiBhbnkgZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IHhtbE91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgSHR0cFRhZ1N1cHBvcnQgaHR0cFRhZyA9IChIdHRwVGFnU3VwcG9ydCkgZmluZEFuY2VzdG9yV2l0aENsYXNzKAotICAgICAgICAgICAgSHR0cFRhZ1N1cHBvcnQuY2xhc3MpOwotCi0gICAgICAgIEh0dHBNZXRob2QgaHR0cE1ldGhvZCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBodHRwTWV0aG9kID0gaHR0cFRhZy5nZXRIdHRwTWV0aG9kKCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgYm9keVRleHQgPSBnZXRCb2R5VGV4dCgpOwotICAgICAgICBpZiAoaHR0cE1ldGhvZCBpbnN0YW5jZW9mIFBvc3RNZXRob2QpIHsKLSAgICAgICAgICAgIFBvc3RNZXRob2QgcG9zdE1ldGhvZCA9IChQb3N0TWV0aG9kKSBodHRwTWV0aG9kOwotICAgICAgICAgICAgcG9zdE1ldGhvZC5zZXRSZXF1ZXN0Qm9keShib2R5VGV4dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaHR0cE1ldGhvZCBpbnN0YW5jZW9mIFB1dE1ldGhvZCkgewotICAgICAgICAgICAgUHV0TWV0aG9kIHB1dE1ldGhvZCA9IChQdXRNZXRob2QpIGh0dHBNZXRob2Q7Ci0gICAgICAgICAgICBwdXRNZXRob2Quc2V0UmVxdWVzdEJvZHkoYm9keVRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSHR0cCBtZXRob2QgZnJvbSBwYXJlbnQgd2FzICIKLSAgICAgICAgICAgICAgICArICJub3QgcG9zdCBvciBwdXQiKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9odHRwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2h0dHAvRGVsZXRlVGFnLmphdmEgYi9qZWxseS10YWdzL2h0dHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHR0cC9EZWxldGVUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0N2U2Yi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2h0dHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHR0cC9EZWxldGVUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5odHRwOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cE1ldGhvZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLkRlbGV0ZU1ldGhvZDsKLQotLyoqCi0gKiBBIGh0dHAgZGVsZXRlIHRhZwotICoKLSAqIEBhdXRob3IgIGRpb24KLSAqIEB2ZXJzaW9uICRJZDogRGVsZXRlVGFnLmphdmEsdiAxLjIgMjAwMi8wNy8xNCAxMjozODoyMiBkaW9uIEV4cCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVUYWcgZXh0ZW5kcyBIdHRwVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogdGhlIGRlbGV0ZSBtZXRob2QgKi8KLSAgICBwcml2YXRlIERlbGV0ZU1ldGhvZCBfZGVsZXRlTWV0aG9kOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBEZWxldGVUYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgRGVsZXRlVGFnKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYSB1cmwgbWV0aG9kIGZvciBhIGdldCByZXF1ZXN0Ci0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gd2hlbiB0aGUgdXJsIGlzIGJhZAotICAgICAqLwotICAgIHByb3RlY3RlZCBIdHRwTWV0aG9kIGdldEh0dHBNZXRob2QoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKF9kZWxldGVNZXRob2QgPT0gbnVsbCkgewotICAgICAgICAgICAgX2RlbGV0ZU1ldGhvZCA9IG5ldyBEZWxldGVNZXRob2QoZ2V0UmVzb2x2ZWRVcmwoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIF9kZWxldGVNZXRob2Q7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2h0dHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHR0cC9HZXRUYWcuamF2YSBiL2plbGx5LXRhZ3MvaHR0cC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9odHRwL0dldFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzk3ZTRjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvaHR0cC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9odHRwL0dldFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmh0dHA7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwTWV0aG9kOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMuR2V0TWV0aG9kOwotCi0vKioKLSAqIEEgaHR0cCBnZXQgdGFnCi0gKgotICogQGF1dGhvciAgZGlvbgotICogQHZlcnNpb24gJElkOiBHZXRUYWcuamF2YSx2IDEuMyAyMDAyLzA3LzE0IDEyOjM4OjIyIGRpb24gRXhwICQKLSAqLwotcHVibGljIGNsYXNzIEdldFRhZyBleHRlbmRzIEh0dHBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiB0aGUgZ2V0IG1ldGhvZCAqLwotICAgIHByaXZhdGUgR2V0TWV0aG9kIF9nZXRNZXRob2Q7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEdldFRhZwotICAgICAqLwotICAgIHB1YmxpYyBHZXRUYWcoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhIHVybCBtZXRob2QgZm9yIGEgZ2V0IHJlcXVlc3QKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB3aGVuIHRoZSB1cmwgaXMgYmFkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEh0dHBNZXRob2QgZ2V0SHR0cE1ldGhvZCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICBpZiAoX2dldE1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBfZ2V0TWV0aG9kID0gbmV3IEdldE1ldGhvZChnZXRSZXNvbHZlZFVybCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gX2dldE1ldGhvZDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaHR0cC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9odHRwL0hlYWRUYWcuamF2YSBiL2plbGx5LXRhZ3MvaHR0cC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9odHRwL0hlYWRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUxYjJmYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2h0dHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHR0cC9IZWFkVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuaHR0cDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBNZXRob2Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5IZWFkTWV0aG9kOwotCi0vKioKLSAqIEEgaHR0cCBnZXQgdGFnCi0gKgotICogQGF1dGhvciAgZGlvbgotICogQHZlcnNpb24gJElkOiBIZWFkVGFnLmphdmEsdiAxLjIgMjAwMi8wNy8xNCAxMjozODoyMiBkaW9uIEV4cCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWFkVGFnIGV4dGVuZHMgSHR0cFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIHRoZSBoZWFkIG1ldGhvZCAqLwotICAgIHByaXZhdGUgSGVhZE1ldGhvZCBfaGVhZE1ldGhvZDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgSGVhZFRhZwotICAgICAqLwotICAgIHB1YmxpYyBIZWFkVGFnKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYSB1cmwgbWV0aG9kIGZvciBhIEhlYWQgcmVxdWVzdAotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHdoZW4gdGhlIHVybCBpcyBiYWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSHR0cE1ldGhvZCBnZXRIdHRwTWV0aG9kKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChfaGVhZE1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBfaGVhZE1ldGhvZCA9IG5ldyBIZWFkTWV0aG9kKGdldFJlc29sdmVkVXJsKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBfaGVhZE1ldGhvZDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaHR0cC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9odHRwL0hlYWRlclRhZy5qYXZhIGIvamVsbHktdGFncy9odHRwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2h0dHAvSGVhZGVyVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMGRkNTEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9odHRwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2h0dHAvSGVhZGVyVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuaHR0cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKioKLSAqIEEgdGFnIHRvIGhvbGQgcmVxdWVzdCBoZWFkZXJzCi0gKgotICogQGF1dGhvciAgZGlvbgotICogQHZlcnNpb24gJElkOiBIZWFkZXJUYWcuamF2YSx2IDEuMyAyMDAyLzA3LzE0IDEyOjM4OjIyIGRpb24gRXhwICQKLSAqLwotcHVibGljIGNsYXNzIEhlYWRlclRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotICAgIC8qKiBwYXJhbWV0ZXIgbmFtZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIF9uYW1lOwotICAgIC8qKiBwYXJhbWV0ZXIgdmFsdWUgKi8KLSAgICBwcml2YXRlIFN0cmluZyBfdmFsdWU7Ci0KLSAgICAvKiogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBIZWFkZXJUYWcgKi8KLSAgICBwdWJsaWMgSGVhZGVyVGFnKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm0gdGhlIHRhZyBmdW5jdGlvbmFsaXR5LiBJbiB0aGlzIGNhc2UsIHNpbXBseSBldmFsdWF0ZSB0aGUgYm9keS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB4bWxPdXRwdXQgd2hlcmUgdG8gc2VuZCBvdXRwdXQKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiB3aGVuIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCB4bWxPdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIEh0dHBUYWdTdXBwb3J0IGh0dHAgPSAoSHR0cFRhZ1N1cHBvcnQpIGZpbmRBbmNlc3RvcldpdGhDbGFzcygKLSAgICAgICAgICAgIEh0dHBUYWdTdXBwb3J0LmNsYXNzKTsKLSAgICAgICAgaHR0cC5hZGRSZXF1ZXN0SGVhZGVyKGdldE5hbWUoKSwgZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGludm9rZUJvZHkoeG1sT3V0cHV0KTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUHJvcGVydHkgYWNjZXNzb3JzL211dGF0b3JzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEdldHRlciBmb3IgcHJvcGVydHkgbmFtZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVmFsdWUgb2YgcHJvcGVydHkgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBfbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgZm9yIHByb3BlcnR5IG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBOZXcgdmFsdWUgb2YgcHJvcGVydHkgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIF9uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIHByb3BlcnR5IHZhbHVlLgotICAgICAqCi0gICAgICogQHJldHVybiBWYWx1ZSBvZiBwcm9wZXJ0eSB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gX3ZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHRlciBmb3IgcHJvcGVydHkgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgTmV3IHZhbHVlIG9mIHByb3BlcnR5IHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBfdmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaHR0cC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9odHRwL0h0dHBUYWdMaWJyYXJ5LmphdmEgYi9qZWxseS10YWdzL2h0dHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHR0cC9IdHRwVGFnTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWMwNzg1Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvaHR0cC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9odHRwL0h0dHBUYWdMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuaHR0cDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnTGlicmFyeTsKLQotLyoqCi0gKiBUaGUgc2V0IG9mIGplbGx5IHRhZ3MgcHJvdmlkZWQgYnkgTGF0a2EKLSAqCi0gKiBAYXV0aG9yIGRpb24KLSAqIEB2ZXJzaW9uICRJZDogSHR0cFRhZ0xpYnJhcnkuamF2YSx2IDEuMSAyMDAyLzA3LzE0IDEzOjA1OjE0IGRpb24gRXhwICQKLSAqLwotcHVibGljIGNsYXNzIEh0dHBUYWdMaWJyYXJ5IGV4dGVuZHMgVGFnTGlicmFyeSB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIExhdGthVGFnTGlicmFyeQotICAgICAqLwotICAgIHB1YmxpYyBIdHRwVGFnTGlicmFyeSgpIHsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImJvZHkiLCBCb2R5VGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImRlbGV0ZSIsIERlbGV0ZVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJnZXQiLCBHZXRUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygiaGVhZCIsIEhlYWRUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygiaGVhZGVyIiwgSGVhZGVyVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoIm1wcG9zdCIsIE11bHRpcGFydFBvc3RUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygib3B0aW9ucyIsIE9wdGlvbnNUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygicGFyYW1ldGVyIiwgUGFyYW1ldGVyVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInBhcnQiLCBQYXJ0VGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInBvc3QiLCBQb3N0VGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInB1dCIsIFB1dFRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJzZXNzaW9uIiwgU2Vzc2lvblRhZy5jbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBUYWdMaWJhcmFyeSNnZXRUYWdDbGFzc2VzKCkKLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBNYXAgb2YgdGFnIG5hbWUgdG8gdGFnIGNsYXNzCi0gICAgICovCi0gICAgcHVibGljIE1hcCBnZXRUYWdDbGFzc2VzKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VGFnQ2xhc3NlcygpOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2h0dHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHR0cC9IdHRwVGFnU3VwcG9ydC5qYXZhIGIvamVsbHktdGFncy9odHRwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2h0dHAvSHR0cFRhZ1N1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMxNGM3OS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2h0dHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHR0cC9IdHRwVGFnU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5odHRwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cE1ldGhvZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5OYW1lVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKioKLSAqIFRoZSBiYXNlIHRhZyBmb3IgYWxsIGh0dHAgcmVxdWVzdHMKLSAqCi0gKiBAYXV0aG9yICBkaW9uCi0gKiBAdmVyc2lvbiAkSWQ6IEh0dHBUYWdTdXBwb3J0LmphdmEsdiAxLjMgMjAwMi8wNy8xNCAxNjo1MTozMyBkaW9uIEV4cCAkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBIdHRwVGFnU3VwcG9ydCBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0YWcvIHZhcmlhYmxlIHRvIHN0b3JlIHJlc3VsdCBpbiAqLwotICAgIHByaXZhdGUgU3RyaW5nIF92YXI7Ci0KLSAgICAvKioKLSAgICAgKiB0aGUgcGF0aCB0byBiZSB0ZXN0ZWQgcmVsYXRpdmUgdG8gdGhlIGhvc3QvcG9ydCBzcGVjaWZlZCBvbiB0aGUgcGFyZW50Ci0gICAgICoge0BsaW5rIFN1aXRlVGFnIHN1aXRlIHRhZ30uCi0gICAgICogRWl0aGVyIHRoaXMgcHJvcGVydHkgYW5kIHRoZSBzdWl0ZSdzIGhvc3QKLSAgICAgKiBtdXN0IGJlIHByb3ZpZGVkLCBvciB0aGUge0BsaW5rICNnZXRVcmwoKSB1cmx9IHByb3BlcnR5IG11c3QgYmUgc3BlY2lmZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBfcGF0aDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb21wbGV0ZSB1cmkgdG8gYmUgcHJvY2Vzc2VkCi0gICAgICogRWl0aGVyIHRoaXMgcHJvcGVydHkgb3IgdGhlIHtAbGluayAjZ2V0UGF0aCgpIHBhdGh9IGFuZCB0aGUgc3VpdGUncyBob3N0Ci0gICAgICogbXVzdCBiZSBwcm92aWRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBfdXJpOwotCi0gICAgLyoqIHdoZXRoZXIgb3Igbm90IHRvIGZvbGxvdyByZWRpcmVjdHMgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gX2ZvbGxvd1JlZGlyZWN0cyA9IGZhbHNlOwotICAgIC8qKiBsaXN0IG9mIHBhcmFtZXRlcnMgYXMgbmFtZSB2YWx1ZSBwYWlycyAqLwotICAgIHByaXZhdGUgTGlzdCBfcGFyYW1ldGVyczsKLSAgICAvKiogbGlzdCBvZiBoZWFkZXJzIGFzIG5hbWUgdmFsdWUgcGFpcnMgKi8KLSAgICBwcml2YXRlIExpc3QgX3JlcXVlc3RIZWFkZXJzOwotICAgIC8qKiB0aGUgaGVhZGVyIG5hbWUgZm9yIHRoZSB1c2VyIGFnZW50ICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9OQU1FX1VTRVJfQUdFTlQgPSAiVXNlci1BZ2VudCI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEh0dHBUYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgSHR0cFRhZ1N1cHBvcnQoKSB7Ci0gICAgICAgIHNldFBhcmFtZXRlcnMobmV3IEFycmF5TGlzdCgpKTsKLSAgICAgICAgc2V0UmVxdWVzdEhlYWRlcnMobmV3IEFycmF5TGlzdCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB1cmwgc3BlY2lmaWVkIGJ5IHRoZSB0YWcsIGVpdGhlciB0aGUgdXJsIGlmIG5vdCBudWxsLCBvcgotICAgICAqIGEgY29tYmluYXRpb24gb2YgdGhlIGhvc3QsIHBvcnQgYW5kIHBhdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc29sdmVkVXJsKCkgewotICAgICAgICBpZiAoZ2V0VXJpKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGdldFVyaSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gYnVpbGQgaXQgZnJvbSBwYXRoLCBob3N0IGFuZCBvcHRpb25hbGx5IHBvcnQKLSAgICAgICAgICAgIFNlc3Npb25UYWcgc2Vzc2lvbiA9IChTZXNzaW9uVGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoCi0gICAgICAgICAgICAgICAgU2Vzc2lvblRhZy5jbGFzcyk7Ci0gICAgICAgICAgICBTdHJpbmcgaG9zdCA9IHNlc3Npb24uZ2V0SG9zdCgpOwotICAgICAgICAgICAgU3RyaW5nIHBvcnQgPSBzZXNzaW9uLmdldFBvcnQoKTsKLSAgICAgICAgICAgIC8vIHNob3J0IHRlcm0gaGFjaywgbmVlZCB0byBhZGQgcG9ydCBhbmQgc2VjdXJpdHkgaW4KLSAgICAgICAgICAgIHJldHVybiAiaHR0cDovLyIgKyBob3N0ICsgZ2V0UGF0aCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgdG8gcHJvdmlkZSB0aGUKLSAgICAgKiB7QGxpbmsgSHR0cE1ldGhvZCB1cmwgbWV0aG9kfSBpbXBsZW1lbnRhdGlvbgotICAgICAqCi0gICAgICogQHJldHVybiBhIEh0dHBVcmxNZXRob2QgaW1wbGVtZW50YXRpb24KLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB3aGVuIHRoZSB7QGxpbmsgZ2V0VXJsKCkgdXJsfSBvcgotICAgICAqIHtAbGluayAjZ2V0UGF0aCgpIHBhdGh9IGlzIGludmFsaWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgSHR0cE1ldGhvZCBnZXRIdHRwTWV0aG9kKCkKLSAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFBlcmZvcm0gdGhlIHRhZyBmdW5jdGlvbmFsaXR5LiBJbiB0aGlzIGNhc2UsIGdldCB0aGUgaHR0cCB1cmwgbWV0aG9kCi0gICAgICogZXhlY3V0ZSBpdCBhbmQgbWFrZSBpdCBhdmFpbGFibGUgZm9yIHZhbGlkYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSB4bWxPdXRwdXQgd2hlcmUgdG8gc2VuZCBvdXRwdXQKLSAgICAgKiBAdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHdoZW4gYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IHhtbE91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gYWxsb3cgbmVzdGVkIHRhZ3MgZmlyc3QsIGUuZyBib2R5Ci0gICAgICAgIGludm9rZUJvZHkoeG1sT3V0cHV0KTsKLQotICAgICAgICAvLyB0cmFjayByZXF1ZXN0IGV4ZWN1dGlvbgotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIEh0dHBNZXRob2QgdXJsTWV0aG9kID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHVybE1ldGhvZCA9IGdldENvbmZpZ3VyZWRIdHRwTWV0aG9kKCk7Ci0gICAgICAgICAgICBnZXRIdHRwQ2xpZW50KCkuZXhlY3V0ZU1ldGhvZCh1cmxNZXRob2QpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotICAgICAgICAvLyBzZXQgdmFyaWFibGUgdG8gdmFsdWUKLSAgICAgICAgaWYgKGdldFZhcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldENvbnRleHQoKS5zZXRWYXJpYWJsZShnZXRWYXIoKSwgdXJsTWV0aG9kKTsKLSAgICAgICAgICAgIGdldENvbnRleHQoKS5zZXRWYXJpYWJsZShnZXRWYXIoKSArICIucmVzcG9uc2VUaW1lIiwKLSAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihlbmQgLSBzdGFydCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmV0cmlldmUgdGhlIHtAbGluayBIdHRwVXJsTWV0aG9kIG1ldGhvZH0gZnJvbSB0aGUgc3ViY2xhc3MgYW5kCi0gICAgICogY29uZmlndXJlIGl0IHJlYWR5IGZvciBleGVjdXRpb24KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBjb25maWd1cmVkIHtAbGluayBIdHRwVXJsTWV0aG9kIG1ldGhvZH0KLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB3aGVuIHJldHJpZXZpbmcgdGhlIFVSTCBmYWlscwotICAgICAqLwotICAgIHByaXZhdGUgSHR0cE1ldGhvZCBnZXRDb25maWd1cmVkSHR0cE1ldGhvZCgpIHRocm93cwotICAgIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHJldHJpZXZlIGFuZCBjb25maWd1cmUgdXJsIG1ldGhvZAotICAgICAgICBIdHRwTWV0aG9kIHVybE1ldGhvZCA9IGdldEh0dHBNZXRob2QoKTsKLSAgICAgICAgdXJsTWV0aG9kLnNldEZvbGxvd1JlZGlyZWN0cyhpc0ZvbGxvd1JlZGlyZWN0cygpKTsKLSAgICAgICAgLy8gYWRkIHJlcXVlc3QgaGVhZGVycwotICAgICAgICBOYW1lVmFsdWVQYWlyIGhlYWRlciA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBnZXRSZXF1ZXN0SGVhZGVycygpLnNpemUoKTsgaW5kZXgrKykgewotICAgICAgICAgICAgaGVhZGVyID0gKE5hbWVWYWx1ZVBhaXIpIGdldFJlcXVlc3RIZWFkZXJzKCkuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgIHVybE1ldGhvZC5hZGRSZXF1ZXN0SGVhZGVyKGhlYWRlci5nZXROYW1lKCksIGhlYWRlci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBhZGQgcGFyYW1ldGVycwotICAgICAgICBzZXRQYXJhbWV0ZXJzKHVybE1ldGhvZCk7Ci0gICAgICAgIC8vIGFkZCB0aGUgZGVmYXVsdCB1c2VyIGFnZW50IHRvIHRoZSBsaXN0IGlmIG9uZSBkb2Vzbid0IGV4aXN0Ci0gICAgICAgIC8vIGFuZCB0aGUgc2Vzc2lvbiB0YWcgZG9lcyBleGlzdCBhbmQgaGF2ZSBhIHVzZXIgYWdlbnQKLSAgICAgICAgaWYgKHVybE1ldGhvZC5nZXRSZXF1ZXN0SGVhZGVyKEh0dHBUYWdTdXBwb3J0LkhFQURFUl9OQU1FX1VTRVJfQUdFTlQpCi0gICAgICAgICAgICA9PSBudWxsICYmIGdldFNlc3Npb25UYWcoKSAhPSBudWxsCi0gICAgICAgICAgICAmJiBnZXRTZXNzaW9uVGFnKCkuZ2V0VXNlckFnZW50KCkgIT0gbnVsbCkgewotCi0gICAgICAgICAgICB1cmxNZXRob2QuYWRkUmVxdWVzdEhlYWRlcihIdHRwVGFnU3VwcG9ydC5IRUFERVJfTkFNRV9VU0VSX0FHRU5ULAotICAgICAgICAgICAgICAgICAgICBnZXRTZXNzaW9uVGFnKCkuZ2V0VXNlckFnZW50KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1cmxNZXRob2Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjdXJyZW50IHBhcmFtZXRlcnMgb24gdGhlIHVybCBtZXRob2QgcmVhZHkgZm9yIHByb2Nlc3NpbmcKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIHtAbGluayBIdHRwVXJsTWV0aG9kIG1ldGhvZH0gdG8gY29uZmlndXJlCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gd2hlbiB7QGxpbmsgI2dldEh0dHBVcmxNZXRob2QoKX0gZG9lcwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFBhcmFtZXRlcnMoSHR0cE1ldGhvZCBtZXRob2QpIHRocm93cwotICAgIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChnZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgTmFtZVZhbHVlUGFpcltdIHBhcmFtZXRlcnMgPSAoTmFtZVZhbHVlUGFpcltdKSBnZXRQYXJhbWV0ZXJzKCkuCi0gICAgICAgICAgICAgICAgdG9BcnJheShuZXcgTmFtZVZhbHVlUGFpclswXSk7Ci0gICAgICAgICAgICBtZXRob2Quc2V0UXVlcnlTdHJpbmcocGFyYW1ldGVycyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXRyaWV2ZSB0aGUgb3B0aW9uYWwgcGFyZW50IHNlc3Npb24gdGFnCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBhbmNlc3RvciB0YWcgd2l0aCBjbGFzcyB7QGxpbmsgU2Vzc2lvblRhZ30gb3IgbnVsbCBpZgotICAgICAqICAgICAgbm90IGZvdW5kCi0gICAgICovCi0gICAgcHJpdmF0ZSBTZXNzaW9uVGFnIGdldFNlc3Npb25UYWcoKSB7Ci0gICAgICAgIFNlc3Npb25UYWcgc2Vzc2lvblRhZyA9IChTZXNzaW9uVGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoCi0gICAgICAgICAgICBTZXNzaW9uVGFnLmNsYXNzKTsKLSAgICAgICAgcmV0dXJuIHNlc3Npb25UYWc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmV0dXJuIGEgSHR0cENsaWVudCBzaGFyZWQgb24gdGhlIHNlc3Npb24gdGFnLCBvciBhIG5ldyBvbmUgaWYgbm8KLSAgICAgKiBzZXNzaW9uIHRhZyBleGlzdHMKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHNoYXJlZCBodHRwIGNsaWVudCBmcm9tIHRoZSBzZXNzaW9uIHRhZywgb3IgY3JlYXRlIGEgbmV3IG9uZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEh0dHBDbGllbnQgZ2V0SHR0cENsaWVudCgpIHsKLSAgICAgICAgU2Vzc2lvblRhZyBzZXNzaW9uID0gZ2V0U2Vzc2lvblRhZygpOwotICAgICAgICBIdHRwQ2xpZW50IGNsaWVudCA9IG51bGw7Ci0gICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNsaWVudCA9IHNlc3Npb24uZ2V0SHR0cENsaWVudCgpOwotICAgICAgICAgICAgY2xpZW50LnNldFN0cmljdE1vZGUoc2Vzc2lvbi5pc1N0cmljdE1vZGUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjbGllbnQgPSBuZXcgSHR0cENsaWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbGllbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgcGFyYW1ldGVyIHRvIHRoZSBsaXN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgcGFyYW1ldGVyIG5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHBhcmFtZXRlciB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGdldFBhcmFtZXRlcnMoKS5hZGQobmV3IE5hbWVWYWx1ZVBhaXIobmFtZSwgdmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSByZXF1ZXN0IGhlYWRlciB0byB0aGUgbGlzdAotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIGhlYWRlciBuYW1lCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBoZWFkZXIgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRSZXF1ZXN0SGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgZ2V0UmVxdWVzdEhlYWRlcnMoKS5hZGQobmV3IE5hbWVWYWx1ZVBhaXIobmFtZSwgdmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUHJvcGVydHkgYWNjZXNzb3JzL211dGF0b3JzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogR2V0dGVyIGZvciBwcm9wZXJ0eSB2YXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHByb3BlcnR5IHZhci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhcigpIHsKLSAgICAgICAgcmV0dXJuIF92YXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciBwcm9wZXJ0eSB2YXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFyIE5ldyB2YWx1ZSBvZiBwcm9wZXJ0eSB2YXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgX3ZhciA9IHZhcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIHByb3BlcnR5IHBhdGguCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHByb3BlcnR5IHBhdGguCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotICAgICAgICByZXR1cm4gX3BhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciBwcm9wZXJ0eSBwYXRoLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhdGggTmV3IHZhbHVlIG9mIHByb3BlcnR5IHBhdGguCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkgewotICAgICAgICBfcGF0aCA9IHBhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0dGVyIGZvciBwcm9wZXJ0eSB1cmkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHByb3BlcnR5IHVyaS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVyaSgpIHsKLSAgICAgICAgcmV0dXJuIF91cmk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciBwcm9wZXJ0eSB1cmkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJpIE5ldyB2YWx1ZSBvZiBwcm9wZXJ0eSB1cmkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXJpKFN0cmluZyB1cmkpIHsKLSAgICAgICAgX3VyaSA9IHVyaTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIHByb3BlcnR5IGZvbGxvd1JlZGlyZWN0cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVmFsdWUgb2YgcHJvcGVydHkgZm9sbG93UmVkaXJlY3RzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRm9sbG93UmVkaXJlY3RzKCkgewotICAgICAgICByZXR1cm4gX2ZvbGxvd1JlZGlyZWN0czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgZm9yIHByb3BlcnR5IGZvbGxvd1JlZGlyZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmb2xsb3dSZWRpcmVjdHMgTmV3IHZhbHVlIG9mIHByb3BlcnR5IGZvbGxvd1JlZGlyZWN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb2xsb3dSZWRpcmVjdHMoYm9vbGVhbiBmb2xsb3dSZWRpcmVjdHMpIHsKLSAgICAgICAgX2ZvbGxvd1JlZGlyZWN0cyA9IGZvbGxvd1JlZGlyZWN0czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIHByb3BlcnR5IHBhcmFtZXRlcnMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHByb3BlcnR5IHBhcmFtZXRlcnMuCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0UGFyYW1ldGVycygpIHsKLSAgICAgICAgcmV0dXJuIF9wYXJhbWV0ZXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHRlciBmb3IgcHJvcGVydHkgcGFyYW1ldGVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIE5ldyB2YWx1ZSBvZiBwcm9wZXJ0eSBwYXJhbWV0ZXJzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoTGlzdCBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIF9wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIHByb3BlcnR5IHJlcXVlc3RIZWFkZXJzLgotICAgICAqCi0gICAgICogQHJldHVybiBWYWx1ZSBvZiBwcm9wZXJ0eSByZXF1ZXN0SGVhZGVycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRSZXF1ZXN0SGVhZGVycygpIHsKLSAgICAgICAgcmV0dXJuIF9yZXF1ZXN0SGVhZGVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgZm9yIHByb3BlcnR5IHJlcXVlc3RIZWFkZXJzLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcXVlc3RIZWFkZXJzIE5ldyB2YWx1ZSBvZiBwcm9wZXJ0eSByZXF1ZXN0SGVhZGVycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0SGVhZGVycyhMaXN0IHJlcXVlc3RIZWFkZXJzKSB7Ci0gICAgICAgIF9yZXF1ZXN0SGVhZGVycyA9IHJlcXVlc3RIZWFkZXJzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9odHRwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2h0dHAvTXVsdGlwYXJ0UG9zdFRhZy5qYXZhIGIvamVsbHktdGFncy9odHRwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2h0dHAvTXVsdGlwYXJ0UG9zdFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjVlYTFkLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvaHR0cC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9odHRwL011bHRpcGFydFBvc3RUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5odHRwOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwTWV0aG9kOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lk5hbWVWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5NdWx0aXBhcnRQb3N0TWV0aG9kOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMubXVsdGlwYXJ0LlBhcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5tdWx0aXBhcnQuU3RyaW5nUGFydDsKLQotLyoqCi0gKiBBIE11bHRpcGFydCBNSU1FIG1lc3NhZ2UgcG9zdAotICoKLSAqIFRoaXMgdGFnIHNob3VsZCBjb250YWluIG9uZSBvciBtb3JlICZsdDtwYXJ0Jmd0OyB0YWdzLCB0bwotICogc3BlY2lmeSB0aGUgbXVsdGlwbGUgcGFydHMgb2YgdGhlIG1lc3NhZ2UKLSAqCi0gKiBFeGFtcGxlOgotICogPHByZT4KLSAqICAgJmx0O21wcG9zdCB1cmk9Imh0dHA6Ly9sb2NhbGhvc3Q/ZG9pdCImZ3Q7Ci0gKiAgICAgICAmbHQ7cGFydCBuYW1lPSJ1c2VyIiB0eXBlPSJ0ZXh0L3BsYWluIiZndDtGcmVkJmx0Oy9wYXJ0Jmd0OwotICogICAgICAgJmx0O3BhcnQgbmFtZT0iZGF0YSIgIHR5cGU9InRleHQvcGxhaW4iJmd0O1RoaXMgaXMgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBtZXNzYWdlJmx0Oy9wYXJ0Jmd0OwotICogICAmbHQ7L21wcG9zdCZndDsKLSAqPC9wcmU+Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86d2tlZXNlQHlhaG9vLmNvbSI+QmlsbCBLZWVzZTwvYT4KLSAqCi0gKiBAc2luY2UgPz8/Ci0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aXBhcnRQb3N0VGFnIGV4dGVuZHMgUG9zdFRhZyB7Ci0KLSAgICAvKiogdGhlIHBvc3QgbWV0aG9kICovCi0gICAgcHJpdmF0ZSBNdWx0aXBhcnRQb3N0TWV0aG9kIF9wb3N0TWV0aG9kOwotCi0gICAgLyoqIGxpc3Qgb2YgcGFydHMgYXMgbmFtZSB2YWx1ZSBwYWlycyAqLwotICAgIHByaXZhdGUgTGlzdCBfcGFydHM7Ci0KLSAgICAvKiogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBNcHBvc3RUYWcgKi8KLSAgICBwdWJsaWMgTXVsdGlwYXJ0UG9zdFRhZygpIHsKLSAgICAgIF9wYXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSB7QGxpbmsgSHR0cFVybE1ldGhvZCBtZXRob2R9IHRvIGJlIHVzZWQgZm9yIG11bHRpLXBhcnQgcG9zdCdpbmcKLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBIdHRwVXJsTWV0aG9kIGltcGxlbWVudGF0aW9uCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gd2hlbiB0aGUge0BsaW5rIGdldFVybCgpIHVybH0gb3IKLSAgICAgKiB7QGxpbmsgI2dldFBhdGgoKSBwYXRofSBpcyBpbnZhbGlkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEh0dHBNZXRob2QgZ2V0SHR0cE1ldGhvZCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICBpZiAoX3Bvc3RNZXRob2QgPT0gbnVsbCkgewotICAgICAgICAgICAgX3Bvc3RNZXRob2QgPSBuZXcgTXVsdGlwYXJ0UG9zdE1ldGhvZChnZXRSZXNvbHZlZFVybCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gX3Bvc3RNZXRob2Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgcGFydCB0byB0aGUgbWVzc2FnZQotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIHBhcmFtZXRlciBuYW1lCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBwYXJhbWV0ZXIgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJ0KFBhcnQgcCkgewotICAgICAgICBfcGFydHMuYWRkKHApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY3VycmVudCBwYXJhbWV0ZXJzIG9uIHRoZSB1cmwgbWV0aG9kIHJlYWR5IGZvciBwcm9jZXNzaW5nCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBiYXNpY2FsbHkKLSAgICAgKiBJdCA8c3Ryb25nPm11c3Q8L3N0cm9uZz4gYmUgY2FsbGVkIGFmdGVyCi0gICAgICogIHtAbGluayBnZXRIdHRwVXJsTWV0aG9kfQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFBhcmFtZXRlcnMoSHR0cE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IF9wYXJ0cy5zaXplKCk7IGluZGV4KyspIHsKLSAgICAgICAgICAgICgoTXVsdGlwYXJ0UG9zdE1ldGhvZCkgbWV0aG9kKS5hZGRQYXJ0KCAoUGFydCkgX3BhcnRzLmdldChpbmRleCkgKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaHR0cC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9odHRwL09wdGlvbnNUYWcuamF2YSBiL2plbGx5LXRhZ3MvaHR0cC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9odHRwL09wdGlvbnNUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA3NTkxZS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2h0dHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHR0cC9PcHRpb25zVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuaHR0cDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBNZXRob2Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5PcHRpb25zTWV0aG9kOwotCi0vKioKLSAqIEEgaHR0cCBnZXQgdGFnCi0gKgotICogQGF1dGhvciAgZGlvbgotICogQHZlcnNpb24gJElkOiBPcHRpb25zVGFnLmphdmEsdiAxLjIgMjAwMi8wNy8xNCAxMjozODoyMiBkaW9uIEV4cCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBPcHRpb25zVGFnIGV4dGVuZHMgSHR0cFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIHRoZSBvcHRpb25zIG1ldGhvZCAqLwotICAgIHByaXZhdGUgT3B0aW9uc01ldGhvZCBfb3B0aW9uc01ldGhvZDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgT3B0aW9uc1RhZwotICAgICAqLwotICAgIHB1YmxpYyBPcHRpb25zVGFnKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYSB1cmwgbWV0aG9kIGZvciBhbiBvcHRpb25zIHJlcXVlc3QKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB3aGVuIHRoZSB1cmwgaXMgYmFkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEh0dHBNZXRob2QgZ2V0SHR0cE1ldGhvZCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICBpZiAoX29wdGlvbnNNZXRob2QgPT0gbnVsbCkgewotICAgICAgICAgICAgX29wdGlvbnNNZXRob2QgPSBuZXcgT3B0aW9uc01ldGhvZChnZXRSZXNvbHZlZFVybCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gX29wdGlvbnNNZXRob2Q7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2h0dHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHR0cC9QYXJhbWV0ZXJUYWcuamF2YSBiL2plbGx5LXRhZ3MvaHR0cC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9odHRwL1BhcmFtZXRlclRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWQyN2U0Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvaHR0cC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9odHRwL1BhcmFtZXRlclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmh0dHA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqCi0gKiBBIHRhZyB0byBob2xkIHBhcmFtZXRlcnMKLSAqCi0gKiBAYXV0aG9yICBkaW9uCi0gKiBAdmVyc2lvbiAkSWQ6IFBhcmFtZXRlclRhZy5qYXZhLHYgMS4zIDIwMDIvMDcvMTQgMTI6Mzg6MjIgZGlvbiBFeHAgJAotICovCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0gICAgLyoqIHBhcmFtZXRlciBuYW1lICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgX25hbWU7Ci0gICAgLyoqIHBhcmFtZXRlciB2YWx1ZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIF92YWx1ZTsKLQotICAgIC8qKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFBhcmFtZXRlclRhZyAqLwotICAgIHB1YmxpYyBQYXJhbWV0ZXJUYWcoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybSB0aGUgdGFnIGZ1bmN0aW9uYWxpdHkuIEluIHRoaXMgY2FzZSwgc2ltcGx5IGV2YWx1YXRlIHRoZSBib2R5LgotICAgICAqCi0gICAgICogQHBhcmFtIHhtbE91dHB1dCB3aGVyZSB0byBzZW5kIG91dHB1dAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIHdoZW4gYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IHhtbE91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgSHR0cFRhZ1N1cHBvcnQgaHR0cCA9IChIdHRwVGFnU3VwcG9ydCkgZmluZEFuY2VzdG9yV2l0aENsYXNzKAotICAgICAgICAgICAgSHR0cFRhZ1N1cHBvcnQuY2xhc3MpOwotICAgICAgICBodHRwLmFkZFBhcmFtZXRlcihnZXROYW1lKCksIGdldFZhbHVlKCkpOwotICAgICAgICBpbnZva2VCb2R5KHhtbE91dHB1dCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFByb3BlcnR5IGFjY2Vzc29ycy9tdXRhdG9ycwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIHByb3BlcnR5IG5hbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHByb3BlcnR5IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gX25hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciBwcm9wZXJ0eSBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgTmV3IHZhbHVlIG9mIHByb3BlcnR5IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBfbmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0dGVyIGZvciBwcm9wZXJ0eSB2YWx1ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVmFsdWUgb2YgcHJvcGVydHkgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgZm9yIHByb3BlcnR5IHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIE5ldyB2YWx1ZSBvZiBwcm9wZXJ0eSB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgX3ZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2h0dHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHR0cC9QYXJ0VGFnLmphdmEgYi9qZWxseS10YWdzL2h0dHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHR0cC9QYXJ0VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZjBmMjUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9odHRwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2h0dHAvUGFydFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5odHRwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5tdWx0aXBhcnQuU3RyaW5nUGFydDsKLQotLyoqCi0gKiBBIHRhZyB0byBob2xkIGEgcGFydCBvZiBhIG11bHRpUGFydFBvc3QKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJ0VGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0gICAgLyoqIHBhcmFtZXRlciBuYW1lICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgX25hbWU7Ci0gICAgLyoqIHBhcmFtZXRlciB2YWx1ZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIF92YWx1ZTsKLSAgICAvKiogcGFyYW1ldGVyIHR5cGUgKGxpa2UgdGV4dC9wbGFpbikgKi8KLSAgICBwcml2YXRlIFN0cmluZyBfY29udGVudFR5cGUgPSAidGV4dC9wbGFpbiI7Ci0KLSAgICAvKiogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBQYXJ0VGFnICovCi0gICAgcHVibGljIFBhcnRUYWcoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXh0ZW5kIFN0cmluZ1BhcnQgc28gdGhhdCBJIGNhbiBzcGVjaWZ5IHRoZSBjb250ZW50IHR5cGUgKGV4OiB0ZXh0L3BsYWluKQotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgTXlTdHJpbmdQYXJ0IGV4dGVuZHMgU3RyaW5nUGFydCB7Ci0gICAgICBTdHJpbmcgX2NvbnRlbnRUeXBlOwotICAgICAgcHVibGljIE15U3RyaW5nUGFydChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLSAgICAgICAgc3VwZXIobmFtZSwgdmFsdWUsICJ1dGYtOCIpOwotICAgICAgICBfY29udGVudFR5cGU9Y29udGVudFR5cGU7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgeyByZXR1cm4gX2NvbnRlbnRUeXBlOyB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybSB0aGUgdGFnIGZ1bmN0aW9uYWxpdHkuIEluIHRoaXMgY2FzZSwgc3RvcmUgdGhpcyBwYXJhbWV0ZXIKLSAgICAgKiBpbiB0aGUgJmx0O21wcG9zdCZndDsgdGFnIGFib3ZlIG1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sT3V0cHV0IHdoZXJlIHRvIHNlbmQgb3V0cHV0Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24gd2hlbiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgeG1sT3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBNdWx0aXBhcnRQb3N0VGFnIGh0dHAgPSAoTXVsdGlwYXJ0UG9zdFRhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKE11bHRpcGFydFBvc3RUYWcuY2xhc3MpOwotICAgICAgICBTdHJpbmdQYXJ0IHNwID0gbmV3IE15U3RyaW5nUGFydChnZXROYW1lKCksIGdldFZhbHVlKCksIGdldENvbnRlbnRUeXBlKCkpOwotICAgICAgICBodHRwLmFkZFBhcnQoc3ApOwotICAgICAgICBpbnZva2VCb2R5KHhtbE91dHB1dCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFByb3BlcnR5IGFjY2Vzc29ycy9tdXRhdG9ycwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIHByb3BlcnR5IG5hbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHByb3BlcnR5IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gX25hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciBwcm9wZXJ0eSBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgTmV3IHZhbHVlIG9mIHByb3BlcnR5IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBfbmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0dGVyIGZvciBwcm9wZXJ0eSB2YWx1ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVmFsdWUgb2YgcHJvcGVydHkgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgZm9yIHByb3BlcnR5IHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIE5ldyB2YWx1ZSBvZiBwcm9wZXJ0eSB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgX3ZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0dGVyIGZvciBwcm9wZXJ0eSBjb250ZW50VHlwZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVmFsdWUgb2YgY29udGVudFR5cGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIF9jb250ZW50VHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgZm9yIHByb3BlcnR5IGNvbnRlbnRUeXBlLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIE5ldyB2YWx1ZSBvZiBjb250ZW50VHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGUpIHsKLSAgICAgICAgX2NvbnRlbnRUeXBlID0gY29udGVudFR5cGU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2h0dHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHR0cC9Qb3N0VGFnLmphdmEgYi9qZWxseS10YWdzL2h0dHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHR0cC9Qb3N0VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNDNlMTkuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9odHRwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2h0dHAvUG9zdFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmh0dHA7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cE1ldGhvZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5OYW1lVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMuUG9zdE1ldGhvZDsKLQotCi0vKioKLSAqIEEgaHR0cCBwb3N0Ci0gKgotICogQGF1dGhvciAgZGlvbgotICovCi1wdWJsaWMgY2xhc3MgUG9zdFRhZyBleHRlbmRzIEh0dHBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiB0aGUgcG9zdCBtZXRob2QgKi8KLSAgICBwcml2YXRlIFBvc3RNZXRob2QgX3Bvc3RNZXRob2Q7Ci0KLSAgICAvKiogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBQb3N0VGFnICovCi0gICAgcHVibGljIFBvc3RUYWcoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEge0BsaW5rIEh0dHBVcmxNZXRob2QgbWV0aG9kfSB0byBiZSB1c2VkIGZvciBwb3N0J2luZwotICAgICAqCi0gICAgICogQHJldHVybiBhIEh0dHBVcmxNZXRob2QgaW1wbGVtZW50YXRpb24KLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB3aGVuIHRoZSB7QGxpbmsgZ2V0VXJsKCkgdXJsfSBvcgotICAgICAqIHtAbGluayAjZ2V0UGF0aCgpIHBhdGh9IGlzIGludmFsaWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSHR0cE1ldGhvZCBnZXRIdHRwTWV0aG9kKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChfcG9zdE1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBfcG9zdE1ldGhvZCA9IG5ldyBQb3N0TWV0aG9kKGdldFJlc29sdmVkVXJsKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBfcG9zdE1ldGhvZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGN1cnJlbnQgcGFyYW1ldGVycyBvbiB0aGUgdXJsIG1ldGhvZCByZWFkeSBmb3IgcHJvY2Vzc2luZwotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgPHN0cm9uZz5tdXN0PC9zdHJvbmc+IGJlIGNhbGxlZCBhZnRlcgotICAgICAqICB7QGxpbmsgZ2V0SHR0cFVybE1ldGhvZH0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRQYXJhbWV0ZXJzKEh0dHBNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIE5hbWVWYWx1ZVBhaXIgbnZwID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGdldFBhcmFtZXRlcnMoKS5zaXplKCk7IGluZGV4KyspIHsKLSAgICAgICAgICAgIE5hbWVWYWx1ZVBhaXIgcGFyYW1ldGVyID0gKE5hbWVWYWx1ZVBhaXIpIGdldFBhcmFtZXRlcnMoKS4KLSAgICAgICAgICAgICAgICBnZXQoaW5kZXgpOwotICAgICAgICAgICAgKChQb3N0TWV0aG9kKSBtZXRob2QpLmFkZFBhcmFtZXRlcihwYXJhbWV0ZXIpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2h0dHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHR0cC9Qcm94eS5qYXZhIGIvamVsbHktdGFncy9odHRwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2h0dHAvUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjYmFkNC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2h0dHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHR0cC9Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmh0dHA7Ci0KLS8qKgotICogQSBjbGFzcyB0aGF0IGhvbGRzIHByb3h5IGRldGFpbHMgZm9yIGEgc2Vzc2lvbi4KLSAqIEF0IHRoZSBtb21lbnQgdGhpcyBpcyBhIHBsYWNlaG9sZGVyIGZvciB0d28gc2ltcGxlIHByb3BlcnRpZXMgdGhhdCBtYXkKLSAqIGdldCBhZGRlZCB0byBhcyB0aW1lIGdvZXMgYnkKLSAqCi0gKiBAYXV0aG9yICBkaW9uCi0gKiBAdmVyc2lvbiAkSWQ6IFByb3h5LmphdmEsdiAxLjMgMjAwMi8wNy8wNCAxNDowNjozMiBkaW9uIEV4cCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm94eSB7Ci0KLSAgICAvKiogdGhlIGhvc3QgdG8gdXNlIGFzIGEgcHJveHkgKi8KLSAgICBwcml2YXRlIFN0cmluZyBfaG9zdDsKLSAgICAvKiogdGhlIHBvcnQgdG8gc2VuZCBwcm94aWVkIHJlcXVlc3RzIG9uICovCi0gICAgcHJpdmF0ZSBpbnQgX3BvcnQ7Ci0gICAgLyoqIHRoZSBwb3J0IG51bWJlciB0aGF0IHJlcHJlc2VudHMgcG9ydCBpcyB1bmFzc2lnbmVkICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9SVF9VTlNQRUNJRklFRCA9IC0xOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBQcm94eQotICAgICAqLwotICAgIHB1YmxpYyBQcm94eSgpIHsKLSAgICAgICAgdGhpcyhudWxsLCBQcm94eS5QT1JUX1VOU1BFQ0lGSUVEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcm94eSBnaXZlbiBhIGhvc3QgbmFtZSBhbmQgcG9ydCBudW1iZXIgLgotICAgICAqCi0gICAgICogQHBhcmFtIGhvc3QgdGhlIGhvc3QgbmFtZSBvZiB0aGUgcHJveHkgdG8gYmUgdXNlZC4KLSAgICAgKiBAcGFyYW0gcG9ydCB0aGUgcG9ydCB0byBzZW5kIHByb3hpZWQgcmVxdWVzdHMgb24uCi0gICAgICovCi0gICAgcHVibGljIFByb3h5KFN0cmluZyBob3N0LCBpbnQgcG9ydCkgewotICAgICAgICBzZXRIb3N0KGhvc3QpOwotICAgICAgICBzZXRQb3J0KHBvcnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHRlciBmb3IgcHJvcGVydHkgaG9zdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGhvc3QgbmFtZSBvZiB0aGUgcHJveHkgdG8gYmUgdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7Ci0gICAgICAgIHJldHVybiBfaG9zdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgZm9yIHByb3BlcnR5IGhvc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaG9zdCB0aGUgaG9zdCBuYW1lIG9mIHRoZSBwcm94eSB0byBiZSB1c2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpIHsKLSAgICAgICAgX2hvc3QgPSBob3N0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHRlciBmb3IgcHJvcGVydHkgcG9ydC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHBvcnQgdG8gc2VuZCBwcm94aWVkIHJlcXVlc3RzIG9uLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIF9wb3J0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHRlciBmb3IgcHJvcGVydHkgcG9ydC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwb3J0IHRoZSBwb3J0IHRvIHNlbmQgcHJveGllZCByZXF1ZXN0cyBvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQb3J0KGludCBwb3J0KSB7Ci0gICAgICAgIF9wb3J0ID0gcG9ydDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaHR0cC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9odHRwL1B1dFRhZy5qYXZhIGIvamVsbHktdGFncy9odHRwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2h0dHAvUHV0VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYmEzNGEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9odHRwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2h0dHAvUHV0VGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuaHR0cDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwTWV0aG9kOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMuUHV0TWV0aG9kOwotCi0KLS8qKgotICogQSBodHRwIHB1dAotICoKLSAqIEBhdXRob3IgIGRpb24KLSAqIEB2ZXJzaW9uICRJZDogUHV0VGFnLmphdmEsdiAxLjMgMjAwMi8wNy8xNCAxMjozODoyMiBkaW9uIEV4cCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBQdXRUYWcgZXh0ZW5kcyBIdHRwVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogdGhlIHB1dCBtZXRob2QgKi8KLSAgICBwcml2YXRlIFB1dE1ldGhvZCBfcHV0TWV0aG9kOwotCi0gICAgLyoqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUHV0VGFnICovCi0gICAgcHVibGljIFB1dFRhZygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSB7QGxpbmsgSHR0cE1ldGhvZCBtZXRob2R9IHRvIGJlIHVzZWQgZm9yIHB1dCdpbmcKLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBIdHRwTWV0aG9kIGltcGxlbWVudGF0aW9uCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gd2hlbiB0aGUge0BsaW5rIGdldFVybCgpIHVybH0gb3IKLSAgICAgKiB7QGxpbmsgI2dldFBhdGgoKSBwYXRofSBpcyBpbnZhbGlkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEh0dHBNZXRob2QgZ2V0SHR0cE1ldGhvZCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICBpZiAoX3B1dE1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBfcHV0TWV0aG9kID0gbmV3IFB1dE1ldGhvZChnZXRSZXNvbHZlZFVybCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gX3B1dE1ldGhvZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGN1cnJlbnQgcGFyYW1ldGVycyBvbiB0aGUgdXJsIG1ldGhvZCByZWFkeSBmb3IgcHJvY2Vzc2luZwotICAgICAqCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0UGFyYW1ldGVycygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGYWlsIGFzIFBVVCByZXF1ZXN0cyBkb24ndCBoYXZlIHBhcmFtZXRlcnMKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBwYXJhbWV0ZXIgbmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgcGFyYW1ldGVyIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUFVUIHJlcXVlc3RzIGRvbid0IGhhdmUgcGFyYW1zIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2h0dHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHR0cC9TZXNzaW9uVGFnLmphdmEgYi9qZWxseS10YWdzL2h0dHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHR0cC9TZXNzaW9uVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNjQzYzMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9odHRwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2h0dHAvU2Vzc2lvblRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5odHRwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cENsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqCi0gKiBBIGh0dHAgc2Vzc2lvbi4gVGhpcyBpcyB0aGUgY29udGFpbmVyIGZvciBkYXRhIHNoYXJlZCBhY3Jvc3MgcmVxdWVzdHMKLSAqCi0gKiBAYXV0aG9yIGRpb24KLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25UYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBkZWZhdWx0IGhvc3QgZm9yIHJlcXVlc3RzICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2hvc3Q7Ci0gICAgLyoqIGRlZmF1bHQgcG9ydCBmb3IgcmVxdWVzdHMgKi8KLSAgICBwcml2YXRlIFN0cmluZyBfcG9ydDsKLSAgICAvKiogUHJveHkgZGV0YWlscyBmb3IgcmVxdWVzdHMgKi8KLSAgICBwcml2YXRlIFByb3h5IF9wcm94eSA9IG5ldyBQcm94eSgpOwotICAgIC8qKiB3aGV0aGVyIHRoZSBkZWZhdWx0IGlzIGZvciBzZWN1cmUgY29tbXMgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gX3NlY3VyZTsKLSAgICAvKiogdGhlIGJyb3dzZXIgaWRlbnRpZmllciAqLwotICAgIHByaXZhdGUgU3RyaW5nIF91c2VyQWdlbnQ7Ci0gICAgLyoqIHN0cmljdCBjb21wbGlhbmNlICovCi0gICAgcHJpdmF0ZSBib29sZWFuIF9zdHJpY3RNb2RlID0gZmFsc2U7Ci0KLSAgICAvKiogaHR0cCBjbGllbnQgdXNlZCB0byBzdG9yZSBzdGF0ZSBhbmQgZXhlY3V0ZSByZXF1ZXN0cyAqLwotICAgIHByaXZhdGUgSHR0cENsaWVudCBfaHR0cENsaWVudDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgU2Vzc2lvblRhZwotICAgICAqLwotICAgIHB1YmxpYyBTZXNzaW9uVGFnKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgdGhlIHRhZwotICAgICAqCi0gICAgICogQHBhcmFtIHhtbE91dHB1dCB0byB3cml0ZSBvdXRwdXQKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiB3aGVuIGFueSBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgeG1sT3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAoX2h0dHBDbGllbnQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX2h0dHBDbGllbnQgPSBuZXcgSHR0cENsaWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoaXNQcm94eUF2YWlsYWJsZSgpKSB7Ci0gICAgICAgICAgICBfaHR0cENsaWVudC5nZXRIb3N0Q29uZmlndXJhdGlvbigpLnNldFByb3h5KGdldFByb3h5SG9zdCgpLCBnZXRQcm94eVBvcnQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnZva2VCb2R5KHhtbE91dHB1dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0dGVyIGZvciBwcm9wZXJ0eSBodHRwQ2xpZW50LgotICAgICAqCi0gICAgICogQHJldHVybiBWYWx1ZSBvZiBwcm9wZXJ0eSBodHRwQ2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBIdHRwQ2xpZW50IGdldEh0dHBDbGllbnQoKSB7Ci0gICAgICAgIHJldHVybiBfaHR0cENsaWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgZm9yIHByb3BlcnR5IGh0dHBDbGllbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaHR0cENsaWVudCBOZXcgdmFsdWUgb2YgcHJvcGVydHkgaHR0cENsaWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIdHRwQ2xpZW50KEh0dHBDbGllbnQgaHR0cENsaWVudCkgewotICAgICAgICBfaHR0cENsaWVudCA9IGh0dHBDbGllbnQ7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgdGhlIHtAbGluayAjZ2V0UHJveHkoKSBwcm94eX0gaXMgcmVhZHkgZm9yIHVzZQotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB7QGxpbmsgI2dldFByb3h5KCkgcHJveHl9IGlzIGNvbmZpZ3VyZWQgZm9yIHVzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUHJveHlBdmFpbGFibGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQcm94eSgpICE9IG51bGwgJiYgZ2V0UHJveHkoKS5nZXRIb3N0KCkgIT0gbnVsbAotICAgICAgICAgICAgJiYgZ2V0UHJveHkoKS5nZXRQb3J0KCkgIT0gUHJveHkuUE9SVF9VTlNQRUNJRklFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIGZvciBwcm94eSBob3N0IHByb3BlcnR5Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgI2dldFByb3h5KCkgcHJveHknc30gaG9zdCBwcm9wZXJ0eQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJveHlIb3N0KCkgewotICAgICAgICByZXR1cm4gZ2V0UHJveHkoKS5nZXRIb3N0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZCBmb3IgcHJveHkgPGNvZGU+aG9zdDwvY29kZT4gcHJvcGVydHkKLSAgICAgKgotICAgICAqIEBwYXJhbSBob3N0IHRoZSB7QGxpbmsgI2dldFByb3h5KCkgcHJveHknc30gaG9zdCBwcm9wZXJ0eQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb3h5SG9zdChTdHJpbmcgaG9zdCkgewotICAgICAgICBnZXRQcm94eSgpLnNldEhvc3QoaG9zdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZCBmb3IgcHJveHkgPGNvZGU+cG9ydDwvY29kZT4gcHJvcGVydHkKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHtAbGluayAjZ2V0UHJveHkoKSBwcm94eSdzfSBwb3J0IHByb3BlcnR5Ci0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQcm94eVBvcnQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQcm94eSgpLmdldFBvcnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIGZvciBwcm94eSA8Y29kZT5wb3J0PC9jb2RlPiBwcm9wZXJ0eQotICAgICAqCi0gICAgICogQHBhcmFtIHBvcnQgdGhlIHtAbGluayAjZ2V0UHJveHkoKSBwcm94eSdzfSBwb3J0IHByb3BlcnR5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJveHlQb3J0KGludCBwb3J0KSB7Ci0gICAgICAgIGdldFByb3h5KCkuc2V0UG9ydChwb3J0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIHByb3BlcnR5IGhvc3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHByb3BlcnR5IGhvc3QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRIb3N0KCkgewotICAgICAgICByZXR1cm4gX2hvc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciBwcm9wZXJ0eSBob3N0LgotICAgICAqCi0gICAgICogQHBhcmFtIGhvc3QgTmV3IHZhbHVlIG9mIHByb3BlcnR5IGhvc3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SG9zdChTdHJpbmcgaG9zdCkgewotICAgICAgICBfaG9zdCA9IGhvc3Q7Ci0gICAgfQotCi0gICAgLyoqIEdldHRlciBmb3IgcHJvcGVydHkgcG9ydC4KLSAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHByb3BlcnR5IHBvcnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQb3J0KCkgewotICAgICAgICByZXR1cm4gX3BvcnQ7Ci0gICAgfQotCi0gICAgLyoqIFNldHRlciBmb3IgcHJvcGVydHkgcG9ydC4KLSAgICAgKiBAcGFyYW0gcG9ydCBOZXcgdmFsdWUgb2YgcHJvcGVydHkgcG9ydC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQb3J0KFN0cmluZyBwb3J0KSB7Ci0gICAgICAgIF9wb3J0ID0gcG9ydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIHByb3BlcnR5IHByb3h5LgotICAgICAqCi0gICAgICogQHJldHVybiBWYWx1ZSBvZiBwcm9wZXJ0eSBwcm94eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJveHkgZ2V0UHJveHkoKSB7Ci0gICAgICAgIHJldHVybiBfcHJveHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciBwcm9wZXJ0eSBwcm94eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm94eSBOZXcgdmFsdWUgb2YgcHJvcGVydHkgcHJveHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJveHkoUHJveHkgcHJveHkpIHsKLSAgICAgICAgX3Byb3h5ID0gcHJveHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0dGVyIGZvciBwcm9wZXJ0eSBzZWN1cmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHByb3BlcnR5IHNlY3VyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKLSAgICAgICAgcmV0dXJuIF9zZWN1cmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciBwcm9wZXJ0eSBzZWN1cmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VjdXJlIE5ldyB2YWx1ZSBvZiBwcm9wZXJ0eSBzZWN1cmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VjdXJlKGJvb2xlYW4gc2VjdXJlKSB7Ci0gICAgICAgIF9zZWN1cmUgPSBzZWN1cmU7Ci0gICAgfQotCi0gICAgLyoqIEdldHRlciBmb3IgcHJvcGVydHkgdXNlckFnZW50LgotICAgICAqIEByZXR1cm4gVmFsdWUgb2YgcHJvcGVydHkgdXNlckFnZW50LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlckFnZW50KCkgewotICAgICAgICByZXR1cm4gX3VzZXJBZ2VudDsKLSAgICB9Ci0KLSAgICAvKiogU2V0dGVyIGZvciBwcm9wZXJ0eSB1c2VyQWdlbnQuCi0gICAgICogQHBhcmFtIHVzZXJBZ2VudCBOZXcgdmFsdWUgb2YgcHJvcGVydHkgdXNlckFnZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVzZXJBZ2VudChTdHJpbmcgdXNlckFnZW50KSB7Ci0gICAgICAgIF91c2VyQWdlbnQgPSB1c2VyQWdlbnQ7Ci0gICAgfQotCi0gICAgLyoqIEdldHRlciBmb3IgcHJvcGVydHkgc3RyaWN0TW9kZS4KLSAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHByb3BlcnR5IHN0cmljdE1vZGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdHJpY3RNb2RlKCkgewotICAgICAgICByZXR1cm4gX3N0cmljdE1vZGU7Ci0gICAgfQotCi0gICAgLyoqIFNldHRlciBmb3IgcHJvcGVydHkgc3RyaWN0TW9kZS4KLSAgICAgKiBAcGFyYW0gc3RyaWN0TW9kZSBOZXcgdmFsdWUgb2YgcHJvcGVydHkgc3RyaWN0TW9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHJpY3RNb2RlKGJvb2xlYW4gc3RyaWN0TW9kZSkgewotICAgICAgICBfc3RyaWN0TW9kZSA9IHN0cmljdE1vZGU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2h0dHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHR0cC9wYWNrYWdlLmh0bWwgYi9qZWxseS10YWdzL2h0dHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaHR0cC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmODI5N2IuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9odHRwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2h0dHAvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxodG1sPgotPGhlYWQ+Ci08L2hlYWQ+Ci08Ym9keT4KLQotICA8cD5BIHRhZyBsaWJyYXJ5IGZvciB3b3JraW5nIHdpdGggSFRUUCwgcGVyZm9ybWluZyBIVFRQIEdFVCwgUE9TVCBhbmQgb3RoZXIgYWN0aW9ucwotICA8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2h0dHAvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2dvb2dsZS9kZWZpbmVUYWdzLmplbGx5IGIvamVsbHktdGFncy9odHRwL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9nb29nbGUvZGVmaW5lVGFncy5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzOTRhNy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2h0dHAvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2dvb2dsZS9kZWZpbmVUYWdzLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uDQotICANCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICANCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICANCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiIHhtbG5zOmRlZmluZT0iamVsbHk6ZGVmaW5lIiB4bWxuczpodHRwPSJqZWxseTpodHRwIj4NCi0gIDxkZWZpbmU6dGFnbGliIHVyaT0iamVsbHk6YmFiZWxmaXNoIj4gIA0KLQ0KLQ0KLSAgICA8IS0tIGRlZmluZXMgdGhlIDxzZWFyY2g+IHRhZyAgLS0+DQotICAgIDxkZWZpbmU6dGFnIG5hbWU9InNlYXJjaCI+DQotICAgICAgPGo6aWYgdGVzdD0iJHtrZXkgPT0gbnVsbH0iPg0KLSAgICAgICAgICA8ajpzZXQgdmFyPSJrZXkiIHZhbHVlPSIwMDAwMDAwMDAwMCIvPg0KLSAgICAgIDwvajppZj4gICAgICANCi0gICAgICA8aHR0cDpwb3N0IHVybD0iaHR0cDovL3d3dy5nb29nbGUuY29tL3NvYXAiPg0KLSAgICAgICA8aHR0cDpoZWFkZXIgbmFtZT0iU09BUEFjdGlvbiIgdmFsdWU9InVybjpHb29nbGVTZWFyY2giLz4NCi0gICAgICAgPGh0dHA6aGVhZGVyIG5hbWU9IkNvbnRlbnQtVHlwZSIgdmFsdWU9InRleHQveG1sIi8+DQotICAgICAgIDxodHRwOmJvZHk+DQotICAgICAgICA8U09BUC1FTlY6RW52ZWxvcGUgeG1sbnM6U09BUC1FTlY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWE1MU2NoZW1hIj4NCi0gICAgICAgICAgPFNPQVAtRU5WOkJvZHk+DQotICAgICAgICAgICAgPG5zMTpkb0dvb2dsZVNlYXJjaCB4bWxuczpuczE9InVybjpHb29nbGVTZWFyY2giIA0KLSAgICAgICAgICAgICAgICAgU09BUC1FTlY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPg0KLSAgICAgICAgICAgICAgPGtleSB4c2k6dHlwZT0ieHNkOnN0cmluZyI+JHtnb29nbGVLZXl9PC9rZXk+DQotICAgICAgICAgICAgICA8cSB4c2k6dHlwZT0ieHNkOnN0cmluZyI+JHtxdWVyeX08L3E+DQotICAgICAgICAgICAgICA8c3RhcnQgeHNpOnR5cGU9InhzZDppbnQiPjA8L3N0YXJ0Pg0KLSAgICAgICAgICAgICAgPG1heFJlc3VsdHMgeHNpOnR5cGU9InhzZDppbnQiPjEwPC9tYXhSZXN1bHRzPg0KLSAgICAgICAgICAgICAgPGZpbHRlciB4c2k6dHlwZT0ieHNkOmJvb2xlYW4iPnRydWU8L2ZpbHRlcj4NCi0gICAgICAgICAgICAgIDxyZXN0cmljdCB4c2k6dHlwZT0ieHNkOnN0cmluZyI+PC9yZXN0cmljdD4NCi0gICAgICAgICAgICAgIDxzYWZlU2VhcmNoIHhzaTp0eXBlPSJ4c2Q6Ym9vbGVhbiI+ZmFsc2U8L3NhZmVTZWFyY2g+DQotICAgICAgICAgICAgICA8bHIgeHNpOnR5cGU9InhzZDpzdHJpbmciPjwvbHI+DQotICAgICAgICAgICAgICA8aWUgeHNpOnR5cGU9InhzZDpzdHJpbmciPmxhdGluMTwvaWU+DQotICAgICAgICAgICAgICA8b2UgeHNpOnR5cGU9InhzZDpzdHJpbmciPmxhdGluMTwvb2U+DQotICAgICAgICAgICAgPC9uczE6ZG9Hb29nbGVTZWFyY2g+DQotICAgICAgICAgIDwvU09BUC1FTlY6Qm9keT4NCi0gICAgICAgIDwvU09BUC1FTlY6RW52ZWxvcGU+DQotICAgICAgIDwvaHR0cDpib2R5Pg0KLSAgICAgIDwvaHR0cDpwb3N0Pg0KLSAgICA8L2RlZmluZTp0YWc+DQotICAgIA0KLSAgPC9kZWZpbmU6dGFnbGliPiAgICANCi08L2o6amVsbHk+DQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9odHRwL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9nb29nbGUvc2VhcmNoLmplbGx5IGIvamVsbHktdGFncy9odHRwL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9nb29nbGUvc2VhcmNoLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjE5YmNhLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvaHR0cC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZ29vZ2xlL3NlYXJjaC5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLQ0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uDQotICANCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICANCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICANCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiIHhtbG5zOmh0dHA9ImplbGx5Omh0dHAiPg0KLQ0KLTxodHRwOnBvc3QgdXJpPSJodHRwOi8vYXBpLmdvb2dsZS5jb20vc2VhcmNoL2JldGEyIj4NCi08aHR0cDpib2R5Pg0KLTxTT0FQLUVOVjpFbnZlbG9wZSB4bWxuczpTT0FQLUVOVj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YTUxTY2hlbWEiPg0KLSAgPFNPQVAtRU5WOkJvZHk+DQotICAgIDxuczE6ZG9Hb29nbGVTZWFyY2ggeG1sbnM6bnMxPSJ1cm46R29vZ2xlU2VhcmNoIiANCi0gICAgICAgICBTT0FQLUVOVjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+DQotICAgICAgPGtleSB4c2k6dHlwZT0ieHNkOnN0cmluZyI+JHtnb29nbGVLZXl9PC9rZXk+DQotICAgICAgPHEgeHNpOnR5cGU9InhzZDpzdHJpbmciPmplbGx5IGphdmEgeG1sPC9xPg0KLSAgICAgIDxzdGFydCB4c2k6dHlwZT0ieHNkOmludCI+MDwvc3RhcnQ+DQotICAgICAgPG1heFJlc3VsdHMgeHNpOnR5cGU9InhzZDppbnQiPjEwPC9tYXhSZXN1bHRzPg0KLSAgICAgIDxmaWx0ZXIgeHNpOnR5cGU9InhzZDpib29sZWFuIj50cnVlPC9maWx0ZXI+DQotICAgICAgPHJlc3RyaWN0IHhzaTp0eXBlPSJ4c2Q6c3RyaW5nIj48L3Jlc3RyaWN0Pg0KLSAgICAgIDxzYWZlU2VhcmNoIHhzaTp0eXBlPSJ4c2Q6Ym9vbGVhbiI+ZmFsc2U8L3NhZmVTZWFyY2g+DQotICAgICAgPGxyIHhzaTp0eXBlPSJ4c2Q6c3RyaW5nIj48L2xyPg0KLSAgICAgIDxpZSB4c2k6dHlwZT0ieHNkOnN0cmluZyI+bGF0aW4xPC9pZT4NCi0gICAgICA8b2UgeHNpOnR5cGU9InhzZDpzdHJpbmciPmxhdGluMTwvb2U+DQotICAgIDwvbnMxOmRvR29vZ2xlU2VhcmNoPg0KLSAgPC9TT0FQLUVOVjpCb2R5Pg0KLTwvU09BUC1FTlY6RW52ZWxvcGU+DQotPC9odHRwOmJvZHk+DQotPC9odHRwOnBvc3Q+DQotDQotPC9qOmplbGx5PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaHR0cC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaHR0cC9odHRwLmplbGx5IGIvamVsbHktdGFncy9odHRwL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9odHRwL2h0dHAuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMDA2MzUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9odHRwL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9odHRwL2h0dHAuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uDQotICANCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICANCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICANCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxqOmplbGx5DQotICAgIHhtbG5zOmo9ImplbGx5OmNvcmUiDQotICAgIHhtbG5zPSJqZWxseTpodHRwIg0KLSAgICB0cmltPSJmYWxzZSI+DQotICAgIDwhLS0gYSBzZXNzaW9uIGhvbGRzIHNoYXJlZCBodHRwIHN0YXRlIGluZm8gLS0+DQotICAgIDxzZXNzaW9uPg0KLVRlc3RzIGZvciBHZXQgdGFnDQotLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgICAgIDxnZXQgdmFyPSJtdGMiIHVyaT0iaHR0cDovL3d3dy5tdWx0aXRhc2suY29tLmF1LyIvPg0KLSAgICAgICAgPGo6aWYgdGVzdD0nJHttdGMuc3RhdHVzQ29kZSA9PSAyMDB9Jz4NCi0gICAgICAgICAgICByZXF1ZXN0IG9rDQotICAgICAgICA8L2o6aWY+DQotICAgICAgICAgICAgUmVzdWx0cyBmb3IgbXRjIHVybCBhcmU6DQotICAgICAgICAgICAgaHR0cCByZXR1cm4gY29kZSA9ICR7bXRjLnN0YXR1c0NvZGV9DQotICAgICAgICAgICAgaHR0cCBzdGF0dXMgdGV4dCA9ICcke210Yy5zdGF0dXNUZXh0fScNCi0gICAgICAgICAgICBzaXplIG9mIHJlc3VsdCA9ICR7bXRjLnJlc3BvbnNlQm9keUFzU3RyaW5nLmxlbmd0aCgpfQ0KLSAgICAgICAgICAgIHJlc3BvbnNlIHRpbWUgPSAke210Yy5yZXNwb25zZVRpbWV9DQotICAgICAgICAgICAgDQotICAgICAgICA8ajpmb3JFYWNoIGl0ZW1zPSIke210Yy5yZXNwb25zZUhlYWRlcnN9IiB2YXI9ImhlYWRlciIgaW5kZXhWYXI9ImkiPg0KLSAgICAgICAgICAgIGhlYWRlclske2l9XSA9ICR7aGVhZGVyfQ0KLSAgICAgICAgPC9qOmZvckVhY2g+DQotICAgICAgICANCi0gICAgICAgIDwhLS0gdGVzdCBwYXJhbWV0ZXJzIGFuZCBoZWFkZXJzIC0tPg0KLSAgICAgICAgPGdldCB2YXI9Im10YzIiIHVyaT0iaHR0cDovL3d3dy5tdWx0aXRhc2suY29tLmF1L2RlZmF1bHQuaHRtbCI+DQotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYWdlIiB2YWx1ZT0ibXQgQE5ld3MiLz4NCi0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhZ2UyIiB2YWx1ZT0ianVuayIvPg0KLSAgICAgICAgICAgIDxoZWFkZXIgbmFtZT0iQ29udGVudC1UeXBlIiB2YWx1ZT0idGV4dC9wbGFpbiIvPg0KLSAgICAgICAgPC9nZXQ+DQotICAgICAgICBxdWVyeVN0cmluZyA9ICR7bXRjMi5xdWVyeVN0cmluZ30sIGxlbmd0aCA9ICR7bXRjMi5yZXNwb25zZUJvZHlBc1N0cmluZy5sZW5ndGgoKX0NCi0gICAgICAgIHJlc3BvbnNlIHRpbWUgPSAke210YzIucmVzcG9uc2VUaW1lfQ0KLSAgICAgICAgPGo6Zm9yRWFjaCBpdGVtcz0iJHttdGMyLnJlcXVlc3RIZWFkZXJzfSIgdmFyPSJySGVhZGVyIiBpbmRleFZhcj0iaSI+DQotICAgICAgICAgICAgcmVxSGVhZGVyWyR7aX1dID0gJHtySGVhZGVyfQ0KLSAgICAgICAgPC9qOmZvckVhY2g+DQotICAgICAgICA8IS0tIHRlc3QgYSA0MDQgLS0+DQotICAgICAgICA8Z2V0IHZhcj0iYmFkdXJsIiB1cmk9Imh0dHA6Ly93d3cubXVsdGl0YXNrLmNvbS5hdS9zbmFmdS5odG1sIi8+DQotICAgICAgICBodHRwIHJldHVybiBjb2RlID0gJHtiYWR1cmwuc3RhdHVzQ29kZX0NCi0gICAgICAgIGJhZCByZXNwb25zZSB0aW1lID0gJHtiYWR1cmwucmVzcG9uc2VUaW1lfSBpbiBtc2VjDQotVGVzdHMgZm9yIFBvc3QgdGFnDQotLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgICAgICA8cG9zdCB2YXI9ImpkYyIgdXJpPSJodHRwOi8vZGV2ZWxvcGVyLmphdmEuc3VuLmNvbS9zZXJ2bGV0L1Nlc3Npb25TZXJ2bGV0Ij4NCi0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImFjdGlvbiIgdmFsdWU9ImxvZ2luIiAvPg0KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0idXJsIiB2YWx1ZT0iL2RldmVsb3Blci9pbmRleC5qc2h0bWwiIC8+DQotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJVc2VySWQiIHZhbHVlPSJYWFhYIiAvPg0KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUGFzc3dvcmQiIHZhbHVlPSJYWFhYIiAvPg0KLSAgICAgICAgPC9wb3N0Pg0KLSAgICAgICAgamRjIGxvZ2luIHJlc3VsdCA9ICR7amRjLnN0YXR1c0NvZGV9DQotICAgICAgICBnb29kIGxvZ2luID0gJHtqZGMucmVzcG9uc2VCb2R5QXNTdHJpbmcuaW5kZXhPZigiU29ycnkhIikgPT0gIi0xIn0NCi0NCi0gICAgICAgIGpkYyByZXNwb25zZSB0aW1lID0gJHtqZGMucmVzcG9uc2VUaW1lfSBpbiBtc2VjDQotICAgICAgICA8ajpmb3JFYWNoIGl0ZW1zPSIke2pkYy5yZXNwb25zZUhlYWRlcnN9IiB2YXI9ImhlYWRlciIgaW5kZXhWYXI9ImkiPg0KLSAgICAgICAgICAgIGpkYy5oZWFkZXJbJHtpfV0gPSAke2hlYWRlcn0NCi0gICAgICAgIDwvajpmb3JFYWNoPg0KLVRlc3RzIGZvciBIZWFkIHRhZw0KLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAgICAgPGhlYWQgdmFyPSJqYWthcnRhIiB1cmk9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvIi8+DQotICAgICAgICA8ajpmb3JFYWNoIGl0ZW1zPSIke2pha2FydGEucmVzcG9uc2VIZWFkZXJzfSIgdmFyPSJoZWFkZXIiIGluZGV4VmFyPSJpIj4NCi0gICAgICAgICAgICBoZWFkZXJbJHtpfV0gPSAke2hlYWRlcn0NCi0gICAgICAgIDwvajpmb3JFYWNoPg0KLVRlc3RzIGZvciBPcHRpb25zIHRhZw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAgICAgPG9wdGlvbnMgdmFyPSJtcyIgdXJpPSJodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vIi8+DQotICAgICAgICA8ajpmb3JFYWNoIGl0ZW1zPSIke21zLnJlc3BvbnNlSGVhZGVyc30iIHZhcj0iaGVhZGVyIiBpbmRleFZhcj0iaSI+DQotICAgICAgICAgICAgaGVhZGVyWyR7aX1dID0gJHtoZWFkZXJ9DQotICAgICAgICA8L2o6Zm9yRWFjaD4NCi1UZXN0cyBmb3IgQm9keSB0YWcNCi0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgICAgIDxqOnNldCB2YXI9Imdvb2dsZUtleSIgdmFsdWU9IjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiAvPg0KLSAgICAgICAgPHBvc3QgdmFyPSJnb29nbGUiIHVyaT0iaHR0cDovL2FwaS5nb29nbGUuY29tL3NlYXJjaC9iZXRhMiI+DQotICAgICAgICAgICAgPGhlYWRlciBuYW1lPSJDb250ZW50LVR5cGUiIHZhbHVlPSJ0ZXh0L3htbCIvPg0KLSAgICAgICAgICAgIDxib2R5Pg0KLSAgICAgICAgICAgIDxlbnY6RW52ZWxvcGUNCi0gICAgICAgICAgICAgICAgeG1sbnM6ZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyINCi0gICAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hNTFNjaGVtYS1pbnN0YW5jZSIgDQotICAgICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YTUxTY2hlbWEiPg0KLSAgICAgICAgICAgICAgPGVudjpCb2R5Pg0KLSAgICAgICAgICAgICAgICA8bnMxOmRvR29vZ2xlU2VhcmNoIHhtbG5zOm5zMT0idXJuOkdvb2dsZVNlYXJjaCINCi0gICAgICAgICAgICAgICAgICAgICBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPg0KLSAgICAgICAgICAgICAgICAgIDxuczE6a2V5IHhzaTp0eXBlPSJ4c2Q6c3RyaW5nIj4ke2dvb2dsZUtleX08L25zMTprZXk+DQotICAgICAgICAgICAgICAgICAgPG5zMTpxIHhzaTp0eXBlPSJ4c2Q6c3RyaW5nIj5qZWxseSBqYXZhIHhtbDwvbnMxOnE+DQotICAgICAgICAgICAgICAgICAgPG5zMTpzdGFydCB4c2k6dHlwZT0ieHNkOmludCI+MDwvbnMxOnN0YXJ0Pg0KLSAgICAgICAgICAgICAgICAgIDxuczE6bWF4UmVzdWx0cyB4c2k6dHlwZT0ieHNkOmludCI+MTA8L25zMTptYXhSZXN1bHRzPg0KLSAgICAgICAgICAgICAgICAgIDxuczE6ZmlsdGVyIHhzaTp0eXBlPSJ4c2Q6Ym9vbGVhbiI+dHJ1ZTwvbnMxOmZpbHRlcj4NCi0gICAgICAgICAgICAgICAgICA8bnMxOnJlc3RyaWN0IHhzaTp0eXBlPSJ4c2Q6c3RyaW5nIj48L25zMTpyZXN0cmljdD4NCi0gICAgICAgICAgICAgICAgICA8bnMxOnNhZmVTZWFyY2ggeHNpOnR5cGU9InhzZDpib29sZWFuIj5mYWxzZTwvbnMxOnNhZmVTZWFyY2g+DQotICAgICAgICAgICAgICAgICAgPG5zMTpsciB4c2k6dHlwZT0ieHNkOnN0cmluZyI+PC9uczE6bHI+DQotICAgICAgICAgICAgICAgICAgPG5zMTppZSB4c2k6dHlwZT0ieHNkOnN0cmluZyI+bGF0aW4xPC9uczE6aWU+DQotICAgICAgICAgICAgICAgICAgPG5zMTpvZSB4c2k6dHlwZT0ieHNkOnN0cmluZyI+bGF0aW4xPC9uczE6b2U+DQotICAgICAgICAgICAgICAgIDwvbnMxOmRvR29vZ2xlU2VhcmNoPg0KLSAgICAgICAgICAgICAgPC9lbnY6Qm9keT4NCi0gICAgICAgICAgICA8L2VudjpFbnZlbG9wZT4NCi0gICAgICAgICAgICA8L2JvZHk+DQotICAgICAgICA8L3Bvc3Q+DQotICAgICAgICA8ajpmb3JFYWNoIGl0ZW1zPSIke2dvb2dsZS5yZXF1ZXN0SGVhZGVyc30iIHZhcj0ickhlYWRlciIgaW5kZXhWYXI9ImkiPg0KLSAgICAgICAgICAgIHJlcUhlYWRlclske2l9XSA9ICR7ckhlYWRlcn0NCi0gICAgICAgIDwvajpmb3JFYWNoPg0KLSAgICAgICAgZ29vZ2xlIHJlc3BvbnNlID0gJHtnb29nbGUuc3RhdHVzQ29kZX0sICR7Z29vZ2xlLnN0YXR1c1RleHR9DQotICAgICAgICAke2dvb2dsZS5yZXNwb25zZUJvZHlBc1N0cmluZ30NCi0gICAgPC9zZXNzaW9uPg0KLSAgICANCi0gICAgPHNlc3Npb24+DQotVGVzdHMgZm9yIENvb2tpZSB0YWcNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgICAgIDxwb3N0IHZhcj0icGgiIHVyaT0iaHR0cDovL3d3dy5waXp6YWh1dC5jb20uYXUvbG9nb24uZG8iPg0KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlcm5hbWUiIHZhbHVlPSJ4eHgiLz4NCi0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIiB2YWx1ZT0ieHh4Ii8+DQotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJhY3Rpb25Ub0RvIiB2YWx1ZT0iY29udGludWUiLz4NCi0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InRhcmdldCIgdmFsdWU9InJlZ2lzdHJhdGlvbiIvPg0KLSAgICAgICAgPC9wb3N0Pg0KLSAgICAgICAgU0M6ICR7cGguZ2V0UmVzcG9uc2VIZWFkZXIoIlNldC1Db29raWUiKX0NCi0gICAgICAgIDwhLS0gc2hvdyBob3cgdG8gZHVtcCBjb29raWUgbmFtZS92YWx1ZSBwYWlyc2UgLS0+DQotICAgICAgICA8ajpmb3JFYWNoIGl0ZW1zPScke3BoLmdldFJlc3BvbnNlSGVhZGVyKCJTZXQtQ29va2llIikudmFsdWVzfScNCi0gICAgICAgICAgICB2YXI9ImVsZW1lbnQiIGluZGV4VmFyPSJpIj4NCi0gICAgICAgICAgICBlbGVtZW50WyR7aX1dID0gJHtlbGVtZW50fQ0KLSAgICAgICAgPC9qOmZvckVhY2g+DQotICAgICAgICANCi0gICAgPC9zZXNzaW9uPg0KLSANCi0gICAgPGdldCB2YXI9Im5vc2Vzc2lvbkJhZCIgdXJpPSJodHRwOi8vd3d3Lm11bHRpdGFzay5jb20uYXUvc25hZnUuaHRtbCIvPg0KLSAgICBvdXRzaWRlIHNlc3Npb24gZ2V0IC0gJHtub3Nlc3Npb25CYWQuc3RhdHVzVGV4dH0NCi0gICAgPGdldCB2YXI9Im5vc2Vzc2lvbkdvb2QiIHVyaT0iaHR0cDovL3d3dy5tdWx0aXRhc2suY29tLmF1LyIvPg0KLSAgICBvdXRzaWRlIHNlc3Npb24gZ2V0IGdvb2QgLSAke25vc2Vzc2lvbkdvb2Quc3RhdHVzVGV4dH0NCi0gICAgDQotPC9qOmplbGx5Pg0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaHR0cC94ZG9jcy9jaGFuZ2VzLnhtbCBiL2plbGx5LXRhZ3MvaHR0cC94ZG9jcy9jaGFuZ2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q0ZGUyYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2h0dHAveGRvY3MvY2hhbmdlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tIAotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotIC0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5DaGFuZ2VzPC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0gIDxib2R5PgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMS1TTkFQU0hPVCIgZGF0ZT0iaW4gQ1ZTIj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJhZGQiIGlzc3VlPSJKRUxMWS01OSIgZHVlLXRvPSJCaWxsIEtlZXNlIj5tdWx0aS1wYXJ0IG1pbWUgaHR0cCByZXF1ZXN0PC9hY3Rpb24+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0iZml4IiBpc3N1ZT0iSkVMTFktOTYiIGR1ZS10bz0iSmFzb24gSG9ybmUiPkh0dHBDbGllbnQgY2Fubm90IGJlIHNwZWNpZmllZCBpbiBIdHRwU2Vzc2lvbjwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjAiIGRhdGU9IjIwMDQtMDktMTIiPjwvcmVsZWFzZT4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaHR0cC94ZG9jcy9pbmRleC54bWwgYi9qZWxseS10YWdzL2h0dHAveGRvY3MvaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjkxZGRmLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvaHR0cC94ZG9jcy9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5IVFRQIFRhZyBMaWJyYXJ5PC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0KLSAgPGJvZHk+Ci0gICAgPHNlY3Rpb24gbmFtZT0iT3ZlcnZpZXciPgotICAgICAgPHA+Ci0gICAgICAgIEEgdGFnIGxpYnJhcnkgZm9yIHdvcmtpbmcgd2l0aCB0aGUgSFRUUCBwcm90b2NvbCwgcGVyZm9ybWluZyBIVFRQIEdFVCwgUE9TVCBhbmQgb3RoZXIgYWN0aW9ucy4KLSAgICAgICAgICBTZWUgdGhlIDxhIGhyZWY9InRhZ3MuaHRtbCI+dGFnczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICA8L3A+Ci0gICAgPC9zZWN0aW9uPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2h0dHAveGRvY3MvbmF2aWdhdGlvbi54bWwgYi9qZWxseS10YWdzL2h0dHAveGRvY3MvbmF2aWdhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NzNhZjkuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9odHRwL3hkb2NzL25hdmlnYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBuYW1lPSJIVFRQIFRhZyBMaWJyYXJ5Ij4KLQotICA8dGl0bGU+SFRUUCBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gIAotICA8Ym9keT4KLSAgICA8bWVudSBuYW1lPSJIVFRQIFRhZyBMaWJyYXJ5Ij4KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICAgICAgICAgICBocmVmPSIvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iVGFncyIgICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWdzLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaW50ZXJhY3Rpb24vLmN2c2lnbm9yZSBiL2plbGx5LXRhZ3MvaW50ZXJhY3Rpb24vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRkMzFmNy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ludGVyYWN0aW9uLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLW1hdmVuLmxvZwotdGFyZ2V0Ci12ZWxvY2l0eS5sb2cKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaW50ZXJhY3Rpb24vYnVpbGQueG1sIGIvamVsbHktdGFncy9pbnRlcmFjdGlvbi9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NTBiZDQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9pbnRlcmFjdGlvbi9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLWJ1aWxkLnhtbCBnZW5lcmF0ZWQgYnkgbWF2ZW4gZnJvbSBwcm9qZWN0LnhtbCB2ZXJzaW9uIDEuMC1TTkFQU0hPVAotICBvbiBkYXRlIE1heSAyNCAyMDA0LCB0aW1lIDIzMDEtLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImphciIgbmFtZT0iY29tbW9ucy1qZWxseS10YWdzLWludGVyYWN0aW9uIiBiYXNlZGlyPSIuIj4KLSAgPHByb3BlcnR5IG5hbWU9ImRlZmF1bHR0YXJnZXRkaXIiIHZhbHVlPSJ0YXJnZXQiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0ibGliZGlyIiB2YWx1ZT0idGFyZ2V0L2xpYiI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L2NsYXNzZXMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0idGVzdGNsYXNzZXNkaXIiIHZhbHVlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RyZXBvcnRkaXIiIHZhbHVlPSJ0YXJnZXQvdGVzdC1yZXBvcnRzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImRpc3RkaXIiIHZhbHVlPSJkaXN0Ij4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImphdmFkb2NkaXIiIHZhbHVlPSJkaXN0L2RvY3MvYXBpIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImZpbmFsLm5hbWUiIHZhbHVlPSJjb21tb25zLWplbGx5LXRhZ3MtaW50ZXJhY3Rpb24tMS4wLVNOQVBTSE9UIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0ibyBJbml0aWFsaXplcyBzb21lIHByb3BlcnRpZXMiPgotICAgIDxta2RpciBkaXI9IiR7bGliZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJub2dldCI+Ci0gICAgICA8ZXF1YWxzIGFyZzI9Im9ubHkiIGFyZzE9IiR7YnVpbGQuc3lzY2xhc3NwYXRofSI+Ci0gICAgICA8L2VxdWFscz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249Im8gQ29tcGlsZSB0aGUgY29kZSIgZGVwZW5kcz0iZ2V0LWRlcHMiPgotICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7Y2xhc3Nlc2Rpcn0iIGRlcHJlY2F0aW9uPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSIgb3B0aW1pemU9ImZhbHNlIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIj4KLSAgICAgIDxzcmM+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL2phdmEiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9zcmM+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgICA8Y29weSB0b2Rpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy9qYXZhIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgICA8Y29weSB0b2Rpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamVsbHkiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhzbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5ybmciPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouZHRkIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouaHRtbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphciIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIHRoZSBqYXIiIGRlcGVuZHM9ImNvbXBpbGUsdGVzdCI+Ci0gICAgPGphciBqYXJmaWxlPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiIGJhc2VkaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgIDwvamFyPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249Im8gQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBkaXJlY3RvcmllcyI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iPgotICAgIDwvZGVsZXRlPgotICAgIDxkZWxldGUgZGlyPSIke2Rpc3RkaXJ9Ij4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIGEgZGlzdHJpYnV0aW9uIiBkZXBlbmRzPSJqYXIsIGphdmFkb2MiPgotICAgIDxta2RpciBkaXI9ImRpc3QiPgotICAgIDwvbWtkaXI+Ci0gICAgPGNvcHkgdG9kaXI9ImRpc3QiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2RlZmF1bHR0YXJnZXRkaXJ9IiBpbmNsdWRlcz0iKi5qYXIiPgotICAgICAgPC9maWxlc2V0PgotICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRlcz0iTElDRU5TRSosIFJFQURNRSoiPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249Im8gUnVuIHRoZSB0ZXN0IGNhc2VzIiBpZj0idGVzdC5mYWlsdXJlIiBkZXBlbmRzPSJpbnRlcm5hbC10ZXN0Ij4KLSAgICA8ZmFpbCBtZXNzYWdlPSJUaGVyZSB3ZXJlIHRlc3QgZmFpbHVyZXMuIj4KLSAgICA8L2ZhaWw+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImludGVybmFsLXRlc3QiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdHMiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdHJlcG9ydGRpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGp1bml0IGRpcj0iLi8iIGZhaWx1cmVwcm9wZXJ0eT0idGVzdC5mYWlsdXJlIiBwcmludFN1bW1hcnk9InllcyIgZm9yaz0idHJ1ZSIgaGFsdG9uZXJyb3I9InRydWUiPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYmFzZWRpciIgdmFsdWU9Ii4iPgotICAgICAgPC9zeXNwcm9wZXJ0eT4KLSAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIj4KLSAgICAgIDwvZm9ybWF0dGVyPgotICAgICAgPGZvcm1hdHRlciB1c2VmaWxlPSJmYWxzZSIgdHlwZT0icGxhaW4iPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdHJlcG9ydGRpcn0iPgotICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9UZXN0Ki5qYXZhIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvYmF0Y2h0ZXN0PgotICAgIDwvanVuaXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtdGVzdHMiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqYXZhYyBkZXN0ZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvdGVzdCI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MiIGRlc2NyaXB0aW9uPSJvIEdlbmVyYXRlIGphdmFkb2MiIGRlcGVuZHM9ImphciI+Ci0gICAgPG1rZGlyIGRpcj0iJHtqYXZhZG9jZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8dHN0YW1wPgotICAgICAgPGZvcm1hdCBwYXR0ZXJuPSIyMDAyLXl5eXkiIHByb3BlcnR5PSJ5ZWFyIj4KLSAgICAgIDwvZm9ybWF0PgotICAgIDwvdHN0YW1wPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb3B5cmlnaHQiIHZhbHVlPSJDb3B5cmlnaHQgJmFtcDtjb3B5OyAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSIgdmFsdWU9ImNvbW1vbnMtamVsbHktdGFncy1pbnRlcmFjdGlvbiAxLjAtU05BUFNIT1QgQVBJIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxqYXZhZG9jIHVzZT0idHJ1ZSIgcHJpdmF0ZT0idHJ1ZSIgZGVzdGRpcj0iJHtqYXZhZG9jZGlyfSIgYXV0aG9yPSJ0cnVlIiB2ZXJzaW9uPSJ0cnVlIiBzb3VyY2VwYXRoPSJzcmMvamF2YSIgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5pbnRlcmFjdGlvbi4qIj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0idGFyZ2V0LyR7ZmluYWwubmFtZX0uamFyIj4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWRvYz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iZ2V0LWRlcHMiIHVubGVzcz0ibm9nZXQiIGRlcGVuZHM9ImluaXQiPgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamVsbHkvamFycy9jb21tb25zLWplbGx5LVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZXhsLVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWpleGwvamFycy9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS94bWwtYXBpcy0xLjAuYjIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3htbC1hcGlzL2phcnMveG1sLWFwaXMtMS4wLmIyLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1iZWFudXRpbHMtMS42LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWJlYW51dGlscy9qYXJzL2NvbW1vbnMtYmVhbnV0aWxzLTEuNi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtY29sbGVjdGlvbnMtMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWNvbGxlY3Rpb25zL2phcnMvY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWxvZ2dpbmctMS4wLjMuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtbG9nZ2luZy9qYXJzL2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2RvbTRqLTEuNS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2RvbTRqL2phcnMvZG9tNGotMS41LWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2pheGVuLTEuMS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2pheGVuL2phcnMvamF4ZW4tMS4xLWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3hlcmNlcy0yLjIuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veGVyY2VzL2phcnMveGVyY2VzLTIuMi4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vanVuaXQtMy44LjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2p1bml0L2phcnMvanVuaXQtMy44LjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vYW50LW9wdGlvbmFsLTEuNS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vYW50L2phcnMvYW50LW9wdGlvbmFsLTEuNS5qYXIiPgotICAgIDwvZ2V0PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJpbnN0YWxsLW1hdmVuIj4KLSAgICA8Z2V0IGRlc3Q9IiR7dXNlci5ob21lfS9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgc3JjPSIke3JlcG99L21hdmVuL21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPHVuamFyIGRlc3Q9IiR7bWF2ZW4uaG9tZX0iIHNyYz0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC91bmphcj4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9pbnRlcmFjdGlvbi9tYXZlbi54bWwgYi9qZWxseS10YWdzL2ludGVyYWN0aW9uL21hdmVuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3YWRiMy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ludGVyYWN0aW9uL21hdmVuLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXZhOmphciI+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaW50ZXJhY3Rpb24vcHJvamVjdC5wcm9wZXJ0aWVzIGIvamVsbHktdGFncy9pbnRlcmFjdGlvbi9wcm9qZWN0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMTljYmMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9pbnRlcmFjdGlvbi9wcm9qZWN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIyAKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFAgUiBPIEogRSBDIFQgIFAgUiBPIFAgRSBSIFQgSSBFIFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9pbnRlcmFjdGlvbi9wcm9qZWN0LnhtbCBiL2plbGx5LXRhZ3MvaW50ZXJhY3Rpb24vcHJvamVjdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZjg2ZDUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9pbnRlcmFjdGlvbi9wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0PgotICA8ZXh0ZW5kPiR7YmFzZWRpcn0vLi4vdGFnLXByb2plY3QueG1sPC9leHRlbmQ+Ci0gIDxpZD5jb21tb25zLWplbGx5LXRhZ3MtaW50ZXJhY3Rpb248L2lkPgotICA8bmFtZT5jb21tb25zLWplbGx5LXRhZ3MtaW50ZXJhY3Rpb248L25hbWU+Ci0gIDxjdXJyZW50VmVyc2lvbj4xLjA8L2N1cnJlbnRWZXJzaW9uPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5pbnRlcmFjdGlvbjwvcGFja2FnZT4KLSAgPGRlc2NyaXB0aW9uPlRoaXMgaXMgYSBKZWxseSBpbnRlcmZhY2UgdG8gdGhlIHVzZXIuPC9kZXNjcmlwdGlvbj4KLSAgPHNob3J0RGVzY3JpcHRpb24+Q29tbW9ucyBKZWxseSBJbnRlcmFjdGlvbiBUYWcgTGlicmFyeTwvc2hvcnREZXNjcmlwdGlvbj4KLSAgPHZlcnNpb25zPgotICAgIDx2ZXJzaW9uPgotICAgICAgPGlkPjEuMDwvaWQ+Ci0gICAgICA8bmFtZT4xLjA8L25hbWU+Ci0gICAgICA8dGFnPkNPTU1PTlMtSkVMTFktSU5URVJBQ1RJT04tMV8wPC90YWc+Ci0gICAgPC92ZXJzaW9uPgotICA8L3ZlcnNpb25zPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2ludGVyYWN0aW9uL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ludGVyYWN0aW9uL0Fza1RhZy5qYXZhIGIvamVsbHktdGFncy9pbnRlcmFjdGlvbi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9pbnRlcmFjdGlvbi9Bc2tUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I3OGY1Zi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ludGVyYWN0aW9uL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ludGVyYWN0aW9uL0Fza1RhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuaW50ZXJhY3Rpb247Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLS8qKgotICogSmVsbHkgVGFnIHRoYXQgYXNrcyB0aGUgdXNlciBhIHF1ZXN0aW9uLCBhbmQgcHV0cyBoaXMgYW5zd2VyIGludG8KLSAqIGEgdmFyaWFibGUsIHdpdGggdGhlIGF0dHJpYnV0ZSAiYW5zd2VyIi4KLSAqIFRoaXMgdmFyaWFibGUgbWF5IGJlIHJldXNlZCBmdXJ0aGVyIGFzIGFueSBvdGhlciBKZWxseSB2YXJpYWJsZS4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNtb3JAaGFzZ2FyZC5uZXQiPlN06XBoYW5lIE1vcjwvYT4KLSAqLwotcHVibGljIGNsYXNzIEFza1RhZyBleHRlbmRzIFRhZ1N1cHBvcnQKLXsKLSAgICAvKiogVGhlIHF1ZXN0aW9uIHRvIGFzayB0byB0aGUgdXNlciAqLwotICAgIHByaXZhdGUgU3RyaW5nIHF1ZXN0aW9uOwotCi0gICAgLyoqCi0gICAgICogVGhlIHZhcmlhYmxlIGluIHdoaWNoIHdlIHdpbGwgc3RvY2sgdGhlIHVzZXIncyBpbnB1dC4KLSAgICAgKiBUaGlzIGRlZmF1bHRzIHRvICJpbnRlcmFjdC5hbnN3ZXIiLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGFuc3dlciA9ICJpbnRlcmFjdC5hbnN3ZXIiOwotCi0gICAgLyoqIFRoZSBkZWZhdWx0IHZhbHVlLCBpZiB0aGUgdXNlciBkb2Vzbid0IGFuc3dlciAqLwotICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRJbnB1dDsKLQotICAgIC8qKiBUaGUgdXNlcidzIGlucHV0ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgaW5wdXQgPSAiIjsKLQotICAgIC8qKiBUaGUgcHJvbXB0IHRvIGRpc3BsYXkgYmVmb3JlIHRoZSB1c2VyIGlucHV0ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvbXB0ID0gIj4iOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcXVlc3Rpb24gdG8gYXNrIHRvIHRoZSB1c2VyLiBJZiBhICJkZWZhdWx0IiBhdHRyaWJ1dGUKLSAgICAgKiBpcyBwcmVzZW50LCBpdCB3aWxsIGFwcGVhciBpbnNpZGUgW10uCi0gICAgICogQHBhcmFtIHF1ZXN0aW9uIFRoZSBxdWVzdGlvbiB0byBhc2sgdG8gdGhlIHVzZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRRdWVzdGlvbihTdHJpbmcgcXVlc3Rpb24pCi0gICAgewotICAgICAgICB0aGlzLnF1ZXN0aW9uID0gcXVlc3Rpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdGhhdCB3aWxsIGhvbGQgdGhlIGFuc3dlcgotICAgICAqIFRoaXMgZGVmYXVsdHMgdG8gImludGVyYWN0LmFuc3dlciIuCi0gICAgICogQHBhcmFtIGFuc3dlciB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdGhhdCB3aWxsIGhvbGQgdGhlIGFuc3dlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFuc3dlcihTdHJpbmcgYW5zd2VyKQotICAgIHsKLSAgICAgICAgdGhpcy5hbnN3ZXIgPSBhbnN3ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCBhbnN3ZXIgdG8gdGhlIHF1ZXN0aW9uLgotICAgICAqIElmIGl0IGlzIHByZXNlbnQsIGl0IHdpbGwgYXBwZWFyIGluc2lkZSBbXS4KLSAgICAgKiBAcGFyYW0gZGVmYXVsdCB0aGUgZGVmYXVsdCBhbnN3ZXIgdG8gdGhlIHF1ZXN0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgZGVmYXVsdElucHV0KQotICAgIHsKLSAgICAgICAgdGhpcy5kZWZhdWx0SW5wdXQgPSBkZWZhdWx0SW5wdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJvbXB0IHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgYmVmb3JlIHRoZSB1c2VyJ3MgaW5wdXQuCi0gICAgICogQHBhcmFtIHByb210IHRoZSBwcm9tcHQgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBiZWZvcmUgdGhlIHVzZXIncyBpbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9tcHQoU3RyaW5nIHByb21wdCkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvbXB0ID0gcHJvbXB0OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5IHRoZSB0YWcKLSAgICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBwbGFjZSB0byB3cml0ZSBvdXRwdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KQotICAgIHsKLSAgICAgICAgaWYgKHF1ZXN0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0SW5wdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocXVlc3Rpb24gKyAiIFsiICsgZGVmYXVsdElucHV0ICsgIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocXVlc3Rpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVGhlIHByb21wdCBzaG91bGQgYmUganVzdCBiZWZvcmUgdGhlIHVzZXIncyBpbnB1dCwKLSAgICAgICAgICAgIC8vIGJ1dCBpdCBkb2Vzbid0IHdvcmsgLi4uCi0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnQocHJvbXB0ICsgIiAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihTeXN0ZW0uaW4pKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5wdXQgPSBici5yZWFkTGluZSgpOwotICAgICAgICAgICAgaWYgKGRlZmF1bHRJbnB1dCAhPSBudWxsICYmIGlucHV0LnRyaW0oKS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlucHV0ID0gZGVmYXVsdElucHV0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgfQotICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKGFuc3dlciwgaW5wdXQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaW50ZXJhY3Rpb24vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaW50ZXJhY3Rpb24vSW50ZXJhY3Rpb25UYWdMaWJyYXJ5LmphdmEgYi9qZWxseS10YWdzL2ludGVyYWN0aW9uL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ludGVyYWN0aW9uL0ludGVyYWN0aW9uVGFnTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzE3MmRlLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvaW50ZXJhY3Rpb24vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaW50ZXJhY3Rpb24vSW50ZXJhY3Rpb25UYWdMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmludGVyYWN0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ0xpYnJhcnk7Ci0KLS8qKgotICAqIEEgVGFnTGlicmFyeSB0byBpbnRlcmFjdCB3aXRoIHRoZSB1c2VyLgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNtb3JAaGFzZ2FyZC5uZXQiPlN06XBoYW5lIE1PUjwvYT4KLSAgKi8KLXB1YmxpYyBjbGFzcyBJbnRlcmFjdGlvblRhZ0xpYnJhcnkgZXh0ZW5kcyBUYWdMaWJyYXJ5IHsKLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhbGwgdGhlIFRhZ3MuCi0gICAgICovCi0gICAgcHVibGljIEludGVyYWN0aW9uVGFnTGlicmFyeSgpIHsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImFzayIsIEFza1RhZy5jbGFzcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2ludGVyYWN0aW9uL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ludGVyYWN0aW9uL3BhY2thZ2UuaHRtbCBiL2plbGx5LXRhZ3MvaW50ZXJhY3Rpb24vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaW50ZXJhY3Rpb24vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjAwYjkwLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvaW50ZXJhY3Rpb24vc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvaW50ZXJhY3Rpb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxodG1sPgotPGhlYWQ+Ci08L2hlYWQ+Ci08Ym9keT4KLQotICA8cD5BIHNpbXBsZSBpbnRlcmFjdGlvbiB0YWcgbGlicmFyeSBzbyB0aGF0IEplbGx5IHNjcmlwdHMgY2FuIGJlIGludGVyYWN0aXZlLgotICA8L3A+Ci0gIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9pbnRlcmFjdGlvbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9pbnRlcmFjdGlvbi9zYW1wbGUuamVsbHkgYi9qZWxseS10YWdzL2ludGVyYWN0aW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ludGVyYWN0aW9uL3NhbXBsZS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3N2E2Ny4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ludGVyYWN0aW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ludGVyYWN0aW9uL3NhbXBsZS5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM6aW50ZXJhY3Rpb249ImplbGx5OmludGVyYWN0aW9uIj4KLQotICAgIDwhLS0gc29tZSBzYW1wbGUgc2NyaXB0cyB3b3VsZCBiZSBhIGdvb2QgaWRlYSAtLT4KLQotPC9qZWxseT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2ludGVyYWN0aW9uL3hkb2NzL2NoYW5nZXMueG1sIGIvamVsbHktdGFncy9pbnRlcmFjdGlvbi94ZG9jcy9jaGFuZ2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAzMDgxMC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ludGVyYWN0aW9uL3hkb2NzL2NoYW5nZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLSAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSAtLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+Q2hhbmdlczwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotICA8Ym9keT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjAiIGRhdGU9IjIwMDQtMDktMTIiPjwvcmVsZWFzZT4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaW50ZXJhY3Rpb24veGRvY3MvaW5kZXgueG1sIGIvamVsbHktdGFncy9pbnRlcmFjdGlvbi94ZG9jcy9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMmFmNzMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9pbnRlcmFjdGlvbi94ZG9jcy9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5JbnRlcmFjdGlvbiBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotICAgIDxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KLSAgICAgIDxwPgotICAgICAgICBBIHRhZyBsaWJyYXJ5IHNvIHRoYXQgSmVsbHkgc2NyaXB0cyBjYW4gcmVxdWVzdCBpbnB1dCBmb3JtIHRoZSBjb25zb2xlLgotICAgICAgICAgIFNlZSB0aGUgPGEgaHJlZj0idGFncy5odG1sIj50YWdzPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvaW50ZXJhY3Rpb24veGRvY3MvbmF2aWdhdGlvbi54bWwgYi9qZWxseS10YWdzL2ludGVyYWN0aW9uL3hkb2NzL25hdmlnYXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDVjMGRiLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvaW50ZXJhY3Rpb24veGRvY3MvbmF2aWdhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IG5hbWU9IkludGVyYWN0aW9uIFRhZyBMaWJyYXJ5Ij4KLQotICA8dGl0bGU+SW50ZXJhY3Rpb24gVGFnIExpYnJhcnk8L3RpdGxlPgotICAKLSAgPGJvZHk+Ci0gICAgPG1lbnUgbmFtZT0iSW50ZXJhY3Rpb24gVGFnIExpYnJhcnkiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgICAgICAgICAgIGhyZWY9Ii9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJUYWdzIiAgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZ3MuaHRtbCIvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qYXhtZS8uY3ZzaWdub3JlIGIvamVsbHktdGFncy9qYXhtZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDE5NzdjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamF4bWUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotdGFyZ2V0Ci0qLmxvZwpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qYXhtZS9idWlsZC54bWwgYi9qZWxseS10YWdzL2pheG1lL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkyMjFiYi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pheG1lL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tYnVpbGQueG1sIGdlbmVyYXRlZCBieSBtYXZlbiBmcm9tIHByb2plY3QueG1sIHZlcnNpb24gMC4xCi0gIG9uIGRhdGUgTWF5IDI0IDIwMDQsIHRpbWUgMjMwMS0tPgotPHByb2plY3QgZGVmYXVsdD0iamFyIiBuYW1lPSJjb21tb25zLWplbGx5LXRhZ3MtamF4bWUiIGJhc2VkaXI9Ii4iPgotICA8cHJvcGVydHkgbmFtZT0iZGVmYXVsdHRhcmdldGRpciIgdmFsdWU9InRhcmdldCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJkaXIiIHZhbHVlPSJ0YXJnZXQvbGliIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXNkaXIiIHZhbHVlPSJ0YXJnZXQvY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Y2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0idGVzdHJlcG9ydGRpciIgdmFsdWU9InRhcmdldC90ZXN0LXJlcG9ydHMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZGlzdGRpciIgdmFsdWU9ImRpc3QiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iamF2YWRvY2RpciIgdmFsdWU9ImRpc3QvZG9jcy9hcGkiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZmluYWwubmFtZSIgdmFsdWU9ImNvbW1vbnMtamVsbHktdGFncy1qYXhtZS0wLjEiPgotICA8L3Byb3BlcnR5PgotICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlc2NyaXB0aW9uPSJvIEluaXRpYWxpemVzIHNvbWUgcHJvcGVydGllcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im5vZ2V0Ij4KLSAgICAgIDxlcXVhbHMgYXJnMj0ib25seSIgYXJnMT0iJHtidWlsZC5zeXNjbGFzc3BhdGh9Ij4KLSAgICAgIDwvZXF1YWxzPgotICAgIDwvY29uZGl0aW9uPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXNjcmlwdGlvbj0ibyBDb21waWxlIHRoZSBjb2RlIiBkZXBlbmRzPSJnZXQtZGVwcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHtjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvamF2YSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICAgIDxjb3B5IHRvZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmplbGx5Ij4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgICA8Y29weSB0b2Rpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamVsbHkiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhzbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5ybmciPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouZHRkIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouaHRtbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphciIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIHRoZSBqYXIiIGRlcGVuZHM9ImNvbXBpbGUsdGVzdCI+Ci0gICAgPGphciBqYXJmaWxlPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiIGJhc2VkaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgIDwvamFyPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249Im8gQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBkaXJlY3RvcmllcyI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iPgotICAgIDwvZGVsZXRlPgotICAgIDxkZWxldGUgZGlyPSIke2Rpc3RkaXJ9Ij4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIGEgZGlzdHJpYnV0aW9uIiBkZXBlbmRzPSJqYXIsIGphdmFkb2MiPgotICAgIDxta2RpciBkaXI9ImRpc3QiPgotICAgIDwvbWtkaXI+Ci0gICAgPGNvcHkgdG9kaXI9ImRpc3QiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2RlZmF1bHR0YXJnZXRkaXJ9IiBpbmNsdWRlcz0iKi5qYXIiPgotICAgICAgPC9maWxlc2V0PgotICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRlcz0iTElDRU5TRSosIFJFQURNRSoiPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249Im8gUnVuIHRoZSB0ZXN0IGNhc2VzIiBpZj0idGVzdC5mYWlsdXJlIiBkZXBlbmRzPSJpbnRlcm5hbC10ZXN0Ij4KLSAgICA8ZmFpbCBtZXNzYWdlPSJUaGVyZSB3ZXJlIHRlc3QgZmFpbHVyZXMuIj4KLSAgICA8L2ZhaWw+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImludGVybmFsLXRlc3QiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdHMiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdHJlcG9ydGRpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGp1bml0IGRpcj0iLi8iIGZhaWx1cmVwcm9wZXJ0eT0idGVzdC5mYWlsdXJlIiBwcmludFN1bW1hcnk9InllcyIgZm9yaz0idHJ1ZSIgaGFsdG9uZXJyb3I9InRydWUiPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYmFzZWRpciIgdmFsdWU9Ii4iPgotICAgICAgPC9zeXNwcm9wZXJ0eT4KLSAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIj4KLSAgICAgIDwvZm9ybWF0dGVyPgotICAgICAgPGZvcm1hdHRlciB1c2VmaWxlPSJmYWxzZSIgdHlwZT0icGxhaW4iPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdHJlcG9ydGRpcn0iPgotICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qVGVzdENhc2UuamF2YSI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2JhdGNodGVzdD4KLSAgICA8L2p1bml0PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlLXRlc3RzIiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iIGRlcHJlY2F0aW9uPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSIgb3B0aW1pemU9ImZhbHNlIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIj4KLSAgICAgIDxzcmM+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL3Rlc3QiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9zcmM+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJqYXZhZG9jIiBkZXNjcmlwdGlvbj0ibyBHZW5lcmF0ZSBqYXZhZG9jIiBkZXBlbmRzPSJqYXIiPgotICAgIDxta2RpciBkaXI9IiR7amF2YWRvY2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPHRzdGFtcD4KLSAgICAgIDxmb3JtYXQgcGF0dGVybj0iMjAwNC15eXl5IiBwcm9wZXJ0eT0ieWVhciI+Ci0gICAgICA8L2Zvcm1hdD4KLSAgICA8L3RzdGFtcD4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29weXJpZ2h0IiB2YWx1ZT0iQ29weXJpZ2h0ICZhbXA7Y29weTsgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLiI+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgICA8cHJvcGVydHkgbmFtZT0idGl0bGUiIHZhbHVlPSJjb21tb25zLWplbGx5LXRhZ3MtamF4bWUgMC4xIEFQSSI+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgICA8amF2YWRvYyB1c2U9InRydWUiIHByaXZhdGU9InRydWUiIGRlc3RkaXI9IiR7amF2YWRvY2Rpcn0iIGF1dGhvcj0idHJ1ZSIgdmVyc2lvbj0idHJ1ZSIgc291cmNlcGF0aD0ic3JjL2phdmEiIHBhY2thZ2VuYW1lcz0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamF4bWUuKiI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFkb2M+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImdldC1kZXBzIiB1bmxlc3M9Im5vZ2V0IiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWxvZ2dpbmctMS4wLjMuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtbG9nZ2luZy9qYXJzL2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2pheG1lLTAuMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vamF4bWUvamFycy9qYXhtZS0wLjIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qYXhtZS1qcy0wLjIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2pheG1lL2phcnMvamF4bWUtanMtMC4yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vamF4bWUteHMtMC4yLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qYXhtZS9qYXJzL2pheG1lLXhzLTAuMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2pheG1lLWFwaS0wLjIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2pheG1lL2phcnMvamF4bWUtYXBpLTAuMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamVsbHkvamFycy9jb21tb25zLWplbGx5LVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS10YWdzLWp1bml0LVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS10YWdzLWp1bml0LVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS10YWdzLXhtbHVuaXQtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamVsbHkvamFycy9jb21tb25zLWplbGx5LXRhZ3MteG1sdW5pdC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktdGFncy14bWwtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamVsbHkvamFycy9jb21tb25zLWplbGx5LXRhZ3MteG1sLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veG1sdW5pdC0wLjguamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3htbHVuaXQvamFycy94bWx1bml0LTAuOC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamV4bC1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZXhsL2phcnMvY29tbW9ucy1qZXhsLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veG1sLWFwaXMtMS4wLmIyLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94bWwtYXBpcy9qYXJzL3htbC1hcGlzLTEuMC5iMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtYmVhbnV0aWxzLTEuNi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1iZWFudXRpbHMvamFycy9jb21tb25zLWJlYW51dGlscy0xLjYuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1jb2xsZWN0aW9ucy9qYXJzL2NvbW1vbnMtY29sbGVjdGlvbnMtMi4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vZG9tNGotMS41LWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vZG9tNGovamFycy9kb200ai0xLjUtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vamF4ZW4tMS4xLWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vamF4ZW4vamFycy9qYXhlbi0xLjEtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veGVyY2VzLTIuMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94ZXJjZXMvamFycy94ZXJjZXMtMi4yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qdW5pdC0zLjguMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vanVuaXQvamFycy9qdW5pdC0zLjguMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FudC0xLjUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC0xLjUuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtb3B0aW9uYWwtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtb3B0aW9uYWwtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtbWF2ZW4iPgotICAgIDxnZXQgZGVzdD0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBzcmM9IiR7cmVwb30vbWF2ZW4vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8dW5qYXIgZGVzdD0iJHttYXZlbi5ob21lfSIgc3JjPSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L3VuamFyPgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pheG1lL21hdmVuLnhtbCBiL2plbGx5LXRhZ3MvamF4bWUvbWF2ZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWIyYmUyLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamF4bWUvbWF2ZW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IAotICAgIGRlZmF1bHQ9J2Rpc3QnCi0gICAgeG1sbnM6aj0namVsbHk6Y29yZSc+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qYXhtZS9wcm9qZWN0LnByb3BlcnRpZXMgYi9qZWxseS10YWdzL2pheG1lL3Byb2plY3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNhNWZhOC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pheG1lL3Byb2plY3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIwotIyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIyAgCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAgCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAgCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMjIwotCi1tYXZlbi5yZXBvLnJlbW90ZT1odHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pheG1lL3Byb2plY3QueG1sIGIvamVsbHktdGFncy9qYXhtZS9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA0N2U2NC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pheG1lL3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdD4KLSAgPGV4dGVuZD4ke2Jhc2VkaXJ9Ly4uL3RhZy1wcm9qZWN0LnhtbDwvZXh0ZW5kPgotICA8cG9tVmVyc2lvbj4zPC9wb21WZXJzaW9uPgotICA8aWQ+Y29tbW9ucy1qZWxseS10YWdzLWpheG1lPC9pZD4KLSAgPG5hbWU+Y29tbW9ucy1qZWxseS10YWdzLWpheG1lPC9uYW1lPgotICA8Y3VycmVudFZlcnNpb24+MS4wPC9jdXJyZW50VmVyc2lvbj4KLSAgPGluY2VwdGlvblllYXI+MjAwNDwvaW5jZXB0aW9uWWVhcj4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamF4bWU8L3BhY2thZ2U+Ci0gIDxsb2dvLz4KLSAgPGRlc2NyaXB0aW9uPkpheE1lIFRhZyBMaWJyYXJ5LiBBcGFjaGUgSmF4TWUgaXMgYW4gb3BlbiBzb3VyY2UgZ2VuZXJhdGl2ZSB4bWwtb2JqZWN0IGJpbmRlci4gVGFncyBhcmUgcHJvdmlkZWQgdGhhdCBnZW5lcmF0ZSBqYXZhIG9iamVjdHMgZnJvbSBzY2hlbWEgdXNpbmcgSmF4TWUgYW5kIHRoYXQgd2lsbCBtYXJzaGFsbCBhbmQgdW5tYXJzaGFsbCBhbnkgSkFYQiBjb21wbGllbnQgaW1wbGVtZW50YXRpb25zLjwvZGVzY3JpcHRpb24+Ci0gIDxzaG9ydERlc2NyaXB0aW9uPkpheE1lIFRhZyBMaWJyYXJ5PC9zaG9ydERlc2NyaXB0aW9uPgotICA8dmVyc2lvbnM+Ci0gICAgPHZlcnNpb24+Ci0gICAgICA8aWQ+MS4wPC9pZD4KLSAgICAgIDxuYW1lPjEuMDwvbmFtZT4KLSAgICAgIDx0YWc+Q09NTU9OUy1KRUxMWS1KQVhNRS0xXzA8L3RhZz4KLSAgICA8L3ZlcnNpb24+Ci0gIDwvdmVyc2lvbnM+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+Y29tbW9ucy1sb2dnaW5nPC9pZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC4zPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8IS0tIFRPRE86IFRoZXNlIHZlcnNpb25zIHByb2JhYmx5IHdhbnQgdXBkYXRpbmcgLS0+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8YXJ0aWZhY3RJZD5qYXhtZTwvYXJ0aWZhY3RJZD4KLSAgICAgIDxncm91cElkPmpheG1lPC9ncm91cElkPgotICAgICAgPHZlcnNpb24+MC4yPC92ZXJzaW9uPgotICAgICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxndW1wLnByb2plY3Q+d3MtamF4bWU8L2d1bXAucHJvamVjdD4KLSAgICAgICAgPGd1bXAuaWQ+amF4bWUyPC9ndW1wLmlkPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxhcnRpZmFjdElkPmpheG1lLWpzPC9hcnRpZmFjdElkPgotICAgICAgPGdyb3VwSWQ+amF4bWU8L2dyb3VwSWQ+Ci0gICAgICA8dmVyc2lvbj4wLjI8L3ZlcnNpb24+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGd1bXAucHJvamVjdD53cy1qYXhtZTwvZ3VtcC5wcm9qZWN0PgotICAgICAgICA8Z3VtcC5pZD5qczwvZ3VtcC5pZD4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8YXJ0aWZhY3RJZD5qYXhtZS14czwvYXJ0aWZhY3RJZD4KLSAgICAgIDxncm91cElkPmpheG1lPC9ncm91cElkPgotICAgICAgPHZlcnNpb24+MC4yPC92ZXJzaW9uPgotICAgICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxndW1wLnByb2plY3Q+d3MtamF4bWU8L2d1bXAucHJvamVjdD4KLSAgICAgICAgPGd1bXAuaWQ+eHM8L2d1bXAuaWQ+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGFydGlmYWN0SWQ+amF4bWUtYXBpPC9hcnRpZmFjdElkPgotICAgICAgPGdyb3VwSWQ+amF4bWU8L2dyb3VwSWQ+Ci0gICAgICA8dmVyc2lvbj4wLjI8L3ZlcnNpb24+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGd1bXAucHJvamVjdD53cy1qYXhtZTwvZ3VtcC5wcm9qZWN0PgotICAgICAgICA8Z3VtcC5pZD5hcGk8L2d1bXAuaWQ+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1qZWxseS10YWdzLWp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1qZWxseTwvZ3JvdXBJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWplbGx5LXRhZ3MteG1sdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtamVsbHk8L2dyb3VwSWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1qZWxseS10YWdzLXhtbDwvYXJ0aWZhY3RJZD4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtamVsbHk8L2dyb3VwSWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGFydGlmYWN0SWQ+eG1sdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDxncm91cElkPnhtbHVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8dmVyc2lvbj4wLjg8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgPGJ1aWxkPgotICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjL2phdmE8L3NvdXJjZURpcmVjdG9yeT4KLSAgICA8dW5pdFRlc3RTb3VyY2VEaXJlY3Rvcnk+c3JjL3Rlc3Q8L3VuaXRUZXN0U291cmNlRGlyZWN0b3J5PgotICAgIDx1bml0VGVzdD4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+KiovKlRlc3RDYXNlLmphdmE8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvdW5pdFRlc3Q+Ci0gICAgPHJlc291cmNlcz4KLSAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgPGRpcmVjdG9yeT5zcmMvdGVzdDwvZGlyZWN0b3J5PgotICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgPGluY2x1ZGU+KiovKi5qZWxseTwvaW5jbHVkZT4KLSAgICAgICAgICA8aW5jbHVkZT4qKi8qLnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgPGluY2x1ZGU+KiovKi54bWw8L2luY2x1ZGU+Ci0gICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8L3Jlc291cmNlPgotICAgIDwvcmVzb3VyY2VzPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qYXhtZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qYXhtZS9HZW5lcmF0b3JUYWcuamF2YSBiL2plbGx5LXRhZ3MvamF4bWUvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamF4bWUvR2VuZXJhdG9yVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMjQwN2EuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qYXhtZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qYXhtZS9HZW5lcmF0b3JUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioKLSogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKiAKLSogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qIAotKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKiAKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpheG1lOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF4bWUuZ2VuZXJhdG9yLkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmpheG1lLmdlbmVyYXRvci5TY2hlbWFSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5qYXhtZS5nZW5lcmF0b3Iuc2cuaW1wbC5KQVhCU2NoZW1hUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF4bWUuZ2VuZXJhdG9yLnNnLlNjaGVtYVNHOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF4bWUuZ2VuZXJhdG9yLmltcGwuR2VuZXJhdG9ySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmpheG1lLmpzLkphdmFTb3VyY2VGYWN0b3J5OwotCi0vKiogCi0gKiBHZW5lcmF0ZXMgamF2YSBvYmplY3RzIHVzaW5nIEpheE1lLgotICogVGhpcyBvYmplY3QgY2FuIGJlIG1hcnNoYWxsZWQgaW50byB4bWwgYW5kIHRoZSByZXN1bHRzIHVubWFyc2hhbGxlZCAKLSAqIHVzaW5nIEpheE1lLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpvZUBpc3Bzb2Z0LmRlIj5Kb2NoZW4gV2llZG1hbm48L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjb21tb25zLWRldiBhdCBqYWthcnRhLmFwYWNoZS5vcmciPkpha2FydGEgQ29tbW9ucyBEZXZlbG9wbWVudCBUZWFtPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjIgJAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdG9yVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0gICAgICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHNjaGVtYVVybDsKLSAgICBwcml2YXRlIFN0cmluZyB0YXJnZXQ7Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWFVcmwoKSB7Ci0gICAgICAgIHJldHVybiBzY2hlbWFVcmw7Ci0gICAgfQotICAgICAgICAKLSAgICAvKioKLSAgICAgKiBEZWZpbmVzIHRoZSBzY2hlbWEgYWdhaW5zdCB3aGljaCB0aGUgamF2YSBvYmplY3QgcmVwcmVzZW50YXRpb25zCi0gICAgICogc2hvdWxkIGJlIGdlbmVyYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFVcmwoU3RyaW5nIHNjaGVtYVVybCkgewotICAgICAgICB0aGlzLnNjaGVtYVVybCA9IHNjaGVtYVVybDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXQoKSB7Ci0gICAgICAgIHJldHVybiB0YXJnZXQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIERlZmluZXMgdGhlIHRhcmdldCBkaXJlY3RvcnkgaW50byB3aGljaCAKLSAgICAgKiB0aGUgZ2VuZXJhdGVkIG9iamVjdHMgd2lsbCBiZSBwbGFjZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KFN0cmluZyB0YXJnZXQpIHsKLSAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgfQotICAgIAotICAgICAgICAKLSAgICBwcml2YXRlIEZpbGUgZ2V0U2NoZW1hRmlsZSgpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZShzY2hlbWFVcmwpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEZpbGUgZ2V0VGFyZ2V0RGlyZWN0b3J5KCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHRhcmdldCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgCi0gICAgICAgIGlmIChzY2hlbWFVcmwgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oICJzY2hlbWFVcmwiICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oICJ0YXJnZXQiICk7Ci0gICAgICAgIH0gICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIEdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgR2VuZXJhdG9ySW1wbCgpOwotICAgICAgICAKLSAgICAgICAgSkFYQlNjaGVtYVJlYWRlciByZWFkZXIgPSBuZXcgSkFYQlNjaGVtYVJlYWRlcigpOwotICAgICAgICBnZW5lcmF0b3Iuc2V0U2NoZW1hUmVhZGVyKHJlYWRlcik7Ci0gICAgICAgIHJlYWRlci5zZXRHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKLSAgICAgICAgZ2VuZXJhdG9yLnNldFRhcmdldERpcmVjdG9yeShnZXRUYXJnZXREaXJlY3RvcnkoKSk7Ci0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRhcmdldDogIiArIGdldFRhcmdldERpcmVjdG9yeSgpKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFTRyBzY2hlbWFTRyA9IGdlbmVyYXRvci5nZW5lcmF0ZShnZXRTY2hlbWFGaWxlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamF4bWUvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamF4bWUvSmF4TWVUYWdMaWJyYXJ5LmphdmEgYi9qZWxseS10YWdzL2pheG1lL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pheG1lL0pheE1lVGFnTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTFkMzc4Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamF4bWUvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamF4bWUvSmF4TWVUYWdMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioKLSogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKiAKLSogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qIAotKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKiAKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpheG1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ0xpYnJhcnk7Ci0KLS8qKiAKLSAqIDxhIGhyZWY9J2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIvJz5KQVhCPC9hPiB0YWcgbGlicmFyeSAKLSAqIHVzaW5nIHRoZSA8YSBocmVmPSdodHRwOi8vd3MuYXBhY2hlLm9yZy9qYXhtZSc+QXBhY2hlIEpheE1lPC9hPiBpbXBsZW1lbnRhdGlvbi4KLSAqIFRoZSBtYXJzaGFsbGluZyBhbmQgdW5tYXJzaGFsbGluZyB0YWdzIHNob3VsZCB3b3JrIHdpdGggYW55IEpBWEIgaW1wbGVtZW50YXRpb24uCi0gKiBUaGUgZ2VuZXJhdGlvbiB0YWcgaXMgSmF4TWUgc3BlY2lmaWMuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29tbW9ucy1kZXYgYXQgamFrYXJ0YS5hcGFjaGUub3JnIj5KYWthcnRhIENvbW1vbnMgRGV2ZWxvcG1lbnQgVGVhbTwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKLSAqLwotcHVibGljIGNsYXNzIEpheE1lVGFnTGlicmFyeSBleHRlbmRzIFRhZ0xpYnJhcnkgewotICAgICAgICAKLSAgICBwdWJsaWMgSmF4TWVUYWdMaWJyYXJ5KCkgewotICAgICAgICByZWdpc3RlclRhZyggImdlbmVyYXRvciIsIEdlbmVyYXRvclRhZy5jbGFzcyApOwotICAgICAgICByZWdpc3RlclRhZyggIm1hcnNoYWxsIiwgTWFyc2hhbGxUYWcuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoICJ1bm1hcnNoYWxsIiwgVW5tYXJzaGFsbFRhZy5jbGFzcyApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamF4bWUvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamF4bWUvTWFyc2hhbGxUYWcuamF2YSBiL2plbGx5LXRhZ3MvamF4bWUvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamF4bWUvTWFyc2hhbGxUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UwNmI3Yi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pheG1lL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pheG1lL01hcnNoYWxsVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioKLSogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKiAKLSogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qIAotKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKiAKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpheG1lOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqIAotICogPHA+TWFyc2hhbGxzIGEgZ2VuZXJhdGVkIG9iamVjdCBnZW5lcmF0ZWQgYnkgYSBKQVhCIGltcGxlbWVudGF0aW9uIGludG8geG1sLjwvcD4KLSAqIDxwPgotICogVGhlIHJlc3VsdCBpcyBwbGFjZWQgaW50byB0aGUgcHJvY2Vzc2VkIGNvbnRlbnQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyBieSBlbmNsb3NpbmcgCi0gKiB0YWdzLjwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqb2VAaXNwc29mdC5kZSI+Sm9jaGVuIFdpZWRtYW5uPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29tbW9ucy1kZXYgYXQgamFrYXJ0YS5hcGFjaGUub3JnIj5KYWthcnRhIENvbW1vbnMgRGV2ZWxvcG1lbnQgVGVhbTwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKLSAqLwotcHVibGljIGNsYXNzIE1hcnNoYWxsVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0gICAgICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VzOwotICAgIHByaXZhdGUgT2JqZWN0IG9iamVjdDsKLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VzKCkgewotICAgICAgICByZXR1cm4gcGFja2FnZXM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIERlZmluZXMgdGhlIGdlbmVyYXRlZCBvYmplY3RzIHdoaWNoIHdpbGwgYmUgbWFyc2hhbGxlZCBieSBzcGVjaWZ5aW5nIHRoZSBwYWNrYWdlIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFja2FnZXMoU3RyaW5nIHBhY2thZ2VzKSB7Ci0gICAgICAgIHRoaXMucGFja2FnZXMgPSBwYWNrYWdlczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0gICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgKiBEZWZpbmVzIHRoZSBvYmplY3QgdG8gYmUgdW5tYXJzaGFsbGVkIGludG8geG1sIGJ5IHNwZWNpZnlpbmcgYSBqZWxseSB2YXJpYWJsZSBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiwgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAocGFja2FnZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oICJwYWNrYWdlcyIgKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCAib2JqZWN0IiApOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7ICAgCi0KLSAgICAgICAgICAgIEpBWEJDb250ZXh0IGpheGJDb250ZXh0ID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UocGFja2FnZXMpOwotICAgICAgICAgICAgTWFyc2hhbGxlciBtYXJzaGFsbGVyID0gamF4YkNvbnRleHQuY3JlYXRlTWFyc2hhbGxlcigpOwotICAgICAgICAgICAgbWFyc2hhbGxlci5tYXJzaGFsKG9iamVjdCwgb3V0cHV0KTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGV4KSAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamF4bWUvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamF4bWUvVW5tYXJzaGFsbFRhZy5qYXZhIGIvamVsbHktdGFncy9qYXhtZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qYXhtZS9Vbm1hcnNoYWxsVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MDQ3MjIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qYXhtZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qYXhtZS9Vbm1hcnNoYWxsVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqCi0qIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSogCi0qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKiAKLSogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSogCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qYXhtZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVySGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS53cy5qYXhtZS5nZW5lcmF0b3IuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF4bWUuZ2VuZXJhdG9yLlNjaGVtYVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmpheG1lLmdlbmVyYXRvci5zZy5pbXBsLkpBWEJTY2hlbWFSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5qYXhtZS5nZW5lcmF0b3Iuc2cuU2NoZW1hU0c7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5qYXhtZS5nZW5lcmF0b3IuaW1wbC5HZW5lcmF0b3JJbXBsOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKiogCi0gKiA8cD5Vbm1hcnNoYWxscyB4bWwgZG9jdW1lbnRzIGludG8gamF2YSBvYmplY3RzLjwvcD4KLSAqIDxwPgotICogVGhpcyB0YWcgdW5tYXJzaGFsbHMgdGhlIHhtbCBjb250ZW50IGNvbnRhaW5lZCAKLSAqIGludG8gdGhlIEpheE1lIGdlbmVyYXRlZCBqYXZhIG9iamVjdHMgaW4gdGhlIHBhY2thZ2VzIHNwZWNpZmllZC4KLSAqIDwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqb2VAaXNwc29mdC5kZSI+Sm9jaGVuIFdpZWRtYW5uPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29tbW9ucy1kZXYgYXQgamFrYXJ0YS5hcGFjaGUub3JnIj5KYWthcnRhIENvbW1vbnMgRGV2ZWxvcG1lbnQgVGVhbTwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKLSAqLwotcHVibGljIGNsYXNzIFVubWFyc2hhbGxUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLSAgICAgICAKLSAgICBwcml2YXRlIFN0cmluZyBwYWNrYWdlczsKLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlcygpIHsKLSAgICAgICAgcmV0dXJuIHBhY2thZ2VzOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEZWZpbmVzIHRoZSBnZW5lcmF0ZWQgb2JqZWN0cyB0byB3aGljaCB0aGUgeG1sIHNob3VsZCBiZSB1bm1hcnNoYWxsZWQuIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VzKFN0cmluZyBwYWNrYWdlcykgewotICAgICAgICB0aGlzLnBhY2thZ2VzID0gcGFja2FnZXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFyKCkgewotICAgICAgICByZXR1cm4gdmFyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBqZWxseSB2YXJpYWJsZSB0byB3aGljaCAKLSAgICAgKiB0aGUgdW5tYXJzaGFsbGVkIGphdmEgb2JqZWN0IHNob3VsZCBiZSBib3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBhY2thZ2VzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCAicGFja2FnZXMiICk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCB2YXIgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCAidmFyIiApOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7ICAgCi0KLSAgICAgICAgICAgIEpBWEJDb250ZXh0IGpheGJDb250ZXh0ID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UocGFja2FnZXMpOwotICAgICAgICAgICAgVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlciA9IGpheGJDb250ZXh0LmNyZWF0ZVVubWFyc2hhbGxlcigpOwotICAgICAgICAgICAgVW5tYXJzaGFsbGVySGFuZGxlciBoYW5kbGVyID0gdW5tYXJzaGFsbGVyLmdldFVubWFyc2hhbGxlckhhbmRsZXIoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaGFuZGxlci5zdGFydERvY3VtZW50KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFhNTE91dHB1dCBuZXdPdXRwdXQgPSBuZXcgWE1MT3V0cHV0KCBoYW5kbGVyICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludm9rZUJvZHkobmV3T3V0cHV0KTsKLSAgICAgICAgICAgIGhhbmRsZXIuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGhhbmRsZXIuZ2V0UmVzdWx0KCk7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKCB2YXIsIHJlc3VsdCApOwotICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZXgpICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZXgpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihleCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qYXhtZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qYXhtZS9wYWNrYWdlLmh0bWwgYi9qZWxseS10YWdzL2pheG1lL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pheG1lL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc2ZTU0Yy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pheG1lL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pheG1lL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci0KLSAgPHA+QSA8YSBocmVmPSdodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiLyc+SkFYQjwvYT4gdGFnIGxpYnJhcnkgdXNpbmcgdGhlIAotICA8YSBocmVmPSdodHRwOi8vd3MuYXBhY2hlLm9yZy9qYXhtZSc+QXBhY2hlIEpheE1lPC9hPiBpbXBsZW1lbnRhdGlvbi4KLSAgVGFncyBhcmUgcHJvdmlkZWQgZm9yIG1hcnNoYWxsaW5nIGphdmEgb2JqZWN0cyBpbnRvIHhtbCAKLSAgYW5kIHVubWFyc2hhbGxpbmcgeG1sIGludG8gamF2YSBvYmplY3RzIHdoaWNoIHdpbGwgd29yayB3aXRoIGFueSBKQVhCIGltcGxlbWVudGF0aW9uLgotICBUaGUgZ2VuZXJhdGlvbiB0YWcgZ2VuZXJhdGVzIGphdmEgb2JqZWN0cyB3aGljaCBjYW4gYmUgbWFyc2hhbGxlZCBhbmQgdW5tYXJzaGFsbGVkIGJ5Ci0gIEpheE1lIGFuZCBhcmUgc3BlY2lmaWMgdG8gdGhhdCBpbXBsZW1lbnRhdGlvbi4KLSAgPC9wPgotICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamF4bWUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamF4bWUvRXhlY3V0aW9uVGVzdENhc2UuamF2YSBiL2plbGx5LXRhZ3MvamF4bWUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamF4bWUvRXhlY3V0aW9uVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY5ZTc4ZC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pheG1lL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pheG1lL0V4ZWN1dGlvblRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioKLSogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoKLSogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpheG1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuanVuaXQuSmVsbHlUZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbW1vbnMtZGV2IGF0IGpha2FydGEuYXBhY2hlLm9yZyI+SmFrYXJ0YSBDb21tb25zIERldmVsb3BtZW50IFRlYW08L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMiAkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGVjdXRpb25UZXN0Q2FzZSBleHRlbmRzIEplbGx5VGVzdFN1aXRlIHsKLQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0U3VpdGUgc3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVRlc3RTdWl0ZShFeGVjdXRpb25UZXN0Q2FzZS5jbGFzcywgInN1aXRlLmplbGx5Iik7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pheG1lL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pheG1lL2FkZHJlc3MueHNkIGIvamVsbHktdGFncy9qYXhtZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qYXhtZS9hZGRyZXNzLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJhYWEwYS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pheG1lL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pheG1lL2FkZHJlc3MueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHhzOnNjaGVtYQotICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICB4bWw6bGFuZz0iRU4iCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9qYXhtZS9leGFtcGxlcy9taXNjL2FkZHJlc3MiCi0gICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIj4KLSAgPHhzOmVsZW1lbnQgbmFtZT0iQWRkcmVzcyI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJOYW1lIj4KLSAgICAgICAgICA8eHM6YW5ub3RhdGlvbj48eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgQSBuYW1lIGNvbnNpc3RzIG9mIHR3byByZXF1aXJlZCAoZmlyc3QgYW5kIGxhc3QgbmFtZSkKLSAgICAgICAgICAgICAgYW5kIHR3byBvcHRpb25hbCBwYXJ0cyAobWlkZGxlIG5hbWUgYW5kIGluaXRpYWxzKS4KLSAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+PC94czphbm5vdGF0aW9uPgotICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRmlyc3QiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJNaWRkbGUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMYXN0IiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSW5pdGlhbHMiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIi8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pheG1lL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pheG1lL3N1aXRlLmplbGx5IGIvamVsbHktdGFncy9qYXhtZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qYXhtZS9zdWl0ZS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdmZmY5Ny4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pheG1lL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pheG1lL3N1aXRlLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx0ZXN0OnN1aXRlIAotICAgICAgICB4bWxuczpqPSJqZWxseTpjb3JlIiAKLSAgICAgICAgeG1sbnM6dGVzdD0iamVsbHk6anVuaXQiIAotICAgICAgICB4bWxuczpqYXhtZT0iamVsbHk6b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamF4bWUuSmF4TWVUYWdMaWJyYXJ5IgotICAgICAgICB4bWxuczp4bWx1bml0PSdqZWxseTp4bWx1bml0Jz4KLQotICAgIDwhLS0KLSAgICA8dGVzdDpjYXNlIG5hbWU9J2dlbmVyYXRlLWFkZHJlc3MnPgotICAgICAgICA8amF4bWU6Z2VuZXJhdG9yIAotICAgICAgICAgICAgICAgICAgICBzY2hlbWFVcmw9J3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pheG1lL2FkZHJlc3MueHNkJyAKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PSdvdXQnLz4gICAgICAgIAotICAgIDwvdGVzdDpjYXNlPgotICAgIC0tPgotCi0gICAgPHRlc3Q6Y2FzZSBuYW1lPSdtYXJzaGFsbC1lbXB0eS1hZGRyZXNzJz4KLSAgICAgICAgPGo6bmV3IGNsYXNzTmFtZT0nb3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuaW1wbC5BZGRyZXNzSW1wbCcgdmFyPSdhZGRyZXNzJy8+Ci0gICAgICAgIDx4bWx1bml0OmFzc2VydERvY3VtZW50c0VxdWFsPgotICAgICAgICAgICAgPHhtbHVuaXQ6YWN0dWFsPgotICAgICAgICAgICAgICAgIDxqYXhtZTptYXJzaGFsbCAKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0PScke2FkZHJlc3N9JyAKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZXM9J29yZy5hcGFjaGUud3MuamF4bWUuZXhhbXBsZXMubWlzYy5hZGRyZXNzJy8+Ci0gICAgICAgICAgICA8L3htbHVuaXQ6YWN0dWFsPgotICAgICAgICAgICAgPHhtbHVuaXQ6ZXhwZWN0ZWQ+Ci0gICAgICAgICAgICAgICAgPEFkZHJlc3MgeG1sbnM9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2pheG1lL2V4YW1wbGVzL21pc2MvYWRkcmVzcyIvPgotICAgICAgICAgICAgPC94bWx1bml0OmV4cGVjdGVkPgotICAgICAgICA8L3htbHVuaXQ6YXNzZXJ0RG9jdW1lbnRzRXF1YWw+Ci0gICAgPC90ZXN0OmNhc2U+Ci0gICAgCi0gICAgPHRlc3Q6Y2FzZSBuYW1lPSd1bm1hcnNoYWxsLWVtcHR5LWFkZHJlc3MnPgotICAgICAgICA8amF4bWU6dW5tYXJzaGFsbCAKLSAgICAgICAgICAgIHZhcj0nYWRkcmVzcycgCi0gICAgICAgICAgICBwYWNrYWdlcz0nb3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MnPgotICAgICAgICAgICAgPEFkZHJlc3MgeG1sbnM9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2pheG1lL2V4YW1wbGVzL21pc2MvYWRkcmVzcyIvPgotICAgICAgICA8L2pheG1lOnVubWFyc2hhbGw+Ci0gICAgPC90ZXN0OmNhc2U+Ci0KLTwvdGVzdDpzdWl0ZT4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamF4bWUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhtZS9leGFtcGxlcy9taXNjL2FkZHJlc3MvQWRkcmVzcy5qYXZhIGIvamVsbHktdGFncy9qYXhtZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3dzL2pheG1lL2V4YW1wbGVzL21pc2MvYWRkcmVzcy9BZGRyZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZTZmYzAuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qYXhtZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3dzL2pheG1lL2V4YW1wbGVzL21pc2MvYWRkcmVzcy9BZGRyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioKLSogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKiAKLSogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qIAotKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKiAKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUud3MuamF4bWUuZXhhbXBsZXMubWlzYy5hZGRyZXNzOwotCi1wdWJsaWMgaW50ZXJmYWNlIEFkZHJlc3MgZXh0ZW5kcyBqYXZheC54bWwuYmluZC5FbGVtZW50ICwgb3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuQWRkcmVzc1R5cGUgewotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qYXhtZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3dzL2pheG1lL2V4YW1wbGVzL21pc2MvYWRkcmVzcy9BZGRyZXNzVHlwZS5qYXZhIGIvamVsbHktdGFncy9qYXhtZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3dzL2pheG1lL2V4YW1wbGVzL21pc2MvYWRkcmVzcy9BZGRyZXNzVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTM4NjRjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamF4bWUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhtZS9leGFtcGxlcy9taXNjL2FkZHJlc3MvQWRkcmVzc1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKgotKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qIAotKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSogCi0qICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qIAotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3M7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQWRkcmVzc1R5cGUgewotICBwdWJsaWMgaW50ZXJmYWNlIE5hbWVUeXBlIHsKLSAgICAKLSAgCi0gIAotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEZpcnN0KCk7Ci0gIAotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0KGphdmEubGFuZy5TdHJpbmcgcEZpcnN0KTsKLSAgCi0gICAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldE1pZGRsZSgpOwotICAKLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRMYXN0KCk7Ci0gIAotICAgIHB1YmxpYyB2b2lkIHNldExhc3QoamF2YS5sYW5nLlN0cmluZyBwTGFzdCk7Ci0gIAotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEluaXRpYWxzKCk7Ci0gIAotICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxzKGphdmEubGFuZy5TdHJpbmcgcEluaXRpYWxzKTsKLSAgCi0gIH0KLQotICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpOwotCi0gIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgcElkKTsKLQotICBwdWJsaWMgb3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuQWRkcmVzc1R5cGUuTmFtZVR5cGUgZ2V0TmFtZSgpOwotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUob3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuQWRkcmVzc1R5cGUuTmFtZVR5cGUgcE5hbWUpOwotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pheG1lL3NyYy90ZXN0L29yZy9hcGFjaGUvd3MvamF4bWUvZXhhbXBsZXMvbWlzYy9hZGRyZXNzL0NvbmZpZ3VyYXRpb24ueG1sIGIvamVsbHktdGFncy9qYXhtZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3dzL2pheG1lL2V4YW1wbGVzL21pc2MvYWRkcmVzcy9Db25maWd1cmF0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYwNWY2ZC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pheG1lL3NyYy90ZXN0L29yZy9hcGFjaGUvd3MvamF4bWUvZXhhbXBsZXMvbWlzYy9hZGRyZXNzL0NvbmZpZ3VyYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPCEtLQotIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAKLSBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAKLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxDb25maWd1cmF0aW9uIHhtbG5zPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9qYXhtZS9uYW1lc3BhY2VzL2pheG1lMi9jb25maWd1cmF0aW9uIj48TWFuYWdlciB2YWxpZGF0b3JDbGFzcz0ib3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuaW1wbC5BZGRyZXNzVHlwZVZhbGlkYXRvciIgcU5hbWU9IntodHRwOi8vd3MuYXBhY2hlLm9yZy9qYXhtZS9leGFtcGxlcy9taXNjL2FkZHJlc3N9QWRkcmVzcyIgbWFyc2hhbGxlckNsYXNzPSJvcmcuYXBhY2hlLndzLmpheG1lLmV4YW1wbGVzLm1pc2MuYWRkcmVzcy5pbXBsLkFkZHJlc3NUeXBlU2VyaWFsaXplciIgaGFuZGxlckNsYXNzPSJvcmcuYXBhY2hlLndzLmpheG1lLmV4YW1wbGVzLm1pc2MuYWRkcmVzcy5pbXBsLkFkZHJlc3NIYW5kbGVyIiBlbGVtZW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLndzLmpheG1lLmV4YW1wbGVzLm1pc2MuYWRkcmVzcy5BZGRyZXNzIiBlbGVtZW50Q2xhc3M9Im9yZy5hcGFjaGUud3MuamF4bWUuZXhhbXBsZXMubWlzYy5hZGRyZXNzLmltcGwuQWRkcmVzc0ltcGwiLz48L0NvbmZpZ3VyYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qYXhtZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3dzL2pheG1lL2V4YW1wbGVzL21pc2MvYWRkcmVzcy9PYmplY3RGYWN0b3J5LmphdmEgYi9qZWxseS10YWdzL2pheG1lL3NyYy90ZXN0L29yZy9hcGFjaGUvd3MvamF4bWUvZXhhbXBsZXMvbWlzYy9hZGRyZXNzL09iamVjdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmYTEwYS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pheG1lL3NyYy90ZXN0L29yZy9hcGFjaGUvd3MvamF4bWUvZXhhbXBsZXMvbWlzYy9hZGRyZXNzL09iamVjdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKgotKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qIAotKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSogCi0qICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qIAotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3M7Ci0KLXB1YmxpYyBjbGFzcyBPYmplY3RGYWN0b3J5IHsKLSAgcHJpdmF0ZSBvcmcuYXBhY2hlLndzLmpheG1lLmltcGwuSkFYQkNvbnRleHRJbXBsIGpheGJDb250ZXh0OwotCi0gIHByaXZhdGUgamF2YS51dGlsLk1hcCBwcm9wZXJ0aWVzOwotCi0KLSAgcHVibGljIE9iamVjdEZhY3RvcnkoKSB0aHJvd3MgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbiB7Ci0gICAgamF4YkNvbnRleHQgPSAob3JnLmFwYWNoZS53cy5qYXhtZS5pbXBsLkpBWEJDb250ZXh0SW1wbCkgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoIm9yZy5hcGFjaGUud3MuamF4bWUuZXhhbXBsZXMubWlzYy5hZGRyZXNzIik7Ci0gIH0KLQotICBwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBuZXdJbnN0YW5jZShqYXZhLmxhbmcuQ2xhc3MgcEVsZW1lbnRJbnRlcmZhY2UpIHRocm93cyBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gamF4YkNvbnRleHQuZ2V0RWxlbWVudChwRWxlbWVudEludGVyZmFjZSk7Ci0gIH0KLQotICBwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nIHBOYW1lKSB7Ci0gICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIHJldHVybiBwcm9wZXJ0aWVzLmdldChwTmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nIHBOYW1lLCBqYXZhLmxhbmcuT2JqZWN0IHBWYWx1ZSkgewotICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwpIHsKLSAgICAgIHByb3BlcnRpZXMgPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKLSAgICB9Ci0gICAgcHJvcGVydGllcy5wdXQocE5hbWUsIHBWYWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgb3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuQWRkcmVzcyBjcmVhdGVBZGRyZXNzKCkgdGhyb3dzIGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb24gewotICAgIHJldHVybiAob3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuQWRkcmVzcykgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuQWRkcmVzcy5jbGFzcyk7Ci0gIH0KLQotICBwdWJsaWMgb3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuQWRkcmVzc1R5cGUgY3JlYXRlQWRkcmVzc1R5cGUoKSB0aHJvd3MgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIChvcmcuYXBhY2hlLndzLmpheG1lLmV4YW1wbGVzLm1pc2MuYWRkcmVzcy5BZGRyZXNzVHlwZSkgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuQWRkcmVzc1R5cGUuY2xhc3MpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamF4bWUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhtZS9leGFtcGxlcy9taXNjL2FkZHJlc3MvaW1wbC9BZGRyZXNzSGFuZGxlci5qYXZhIGIvamVsbHktdGFncy9qYXhtZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3dzL2pheG1lL2V4YW1wbGVzL21pc2MvYWRkcmVzcy9pbXBsL0FkZHJlc3NIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOGNmYzUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qYXhtZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3dzL2pheG1lL2V4YW1wbGVzL21pc2MvYWRkcmVzcy9pbXBsL0FkZHJlc3NIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioKLSogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKiAKLSogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qIAotKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKiAKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUud3MuamF4bWUuZXhhbXBsZXMubWlzYy5hZGRyZXNzLmltcGw7Ci0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzSGFuZGxlciBleHRlbmRzIG9yZy5hcGFjaGUud3MuamF4bWUuZXhhbXBsZXMubWlzYy5hZGRyZXNzLmltcGwuQWRkcmVzc1R5cGVIYW5kbGVyIGltcGxlbWVudHMgb3JnLmFwYWNoZS53cy5qYXhtZS5KTUhhbmRsZXIgewotICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuQWRkcmVzc1R5cGUgbmV3UmVzdWx0KCkgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiAob3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuQWRkcmVzc1R5cGUpIGdldERhdGEoKS5nZXRGYWN0b3J5KCkuZ2V0RWxlbWVudChvcmcuYXBhY2hlLndzLmpheG1lLmV4YW1wbGVzLm1pc2MuYWRkcmVzcy5BZGRyZXNzLmNsYXNzKTsKLSAgICB9IGNhdGNoIChqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uIF8xKSB7Ci0gICAgICB0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uKF8xKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qYXhtZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3dzL2pheG1lL2V4YW1wbGVzL21pc2MvYWRkcmVzcy9pbXBsL0FkZHJlc3NJbXBsLmphdmEgYi9qZWxseS10YWdzL2pheG1lL3NyYy90ZXN0L29yZy9hcGFjaGUvd3MvamF4bWUvZXhhbXBsZXMvbWlzYy9hZGRyZXNzL2ltcGwvQWRkcmVzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVkMDljYS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pheG1lL3NyYy90ZXN0L29yZy9hcGFjaGUvd3MvamF4bWUvZXhhbXBsZXMvbWlzYy9hZGRyZXNzL2ltcGwvQWRkcmVzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKgotKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qIAotKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSogCi0qICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qIAotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuaW1wbDsKLQotcHVibGljIGNsYXNzIEFkZHJlc3NJbXBsIGV4dGVuZHMgb3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuaW1wbC5BZGRyZXNzVHlwZUltcGwgaW1wbGVtZW50cyBvcmcuYXBhY2hlLndzLmpheG1lLmV4YW1wbGVzLm1pc2MuYWRkcmVzcy5BZGRyZXNzICwgb3JnLmFwYWNoZS53cy5qYXhtZS5KTUVsZW1lbnQgewotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIF9fcU5hbWUgPSBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvamF4bWUvZXhhbXBsZXMvbWlzYy9hZGRyZXNzIiwgIkFkZHJlc3MiKTsKLQotCi0gIHB1YmxpYyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIGdldFFOYW1lKCkgewotICAgIHJldHVybiBfX3FOYW1lOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamF4bWUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhtZS9leGFtcGxlcy9taXNjL2FkZHJlc3MvaW1wbC9BZGRyZXNzVHlwZUhhbmRsZXIuamF2YSBiL2plbGx5LXRhZ3MvamF4bWUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhtZS9leGFtcGxlcy9taXNjL2FkZHJlc3MvaW1wbC9BZGRyZXNzVHlwZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIwNWFmYS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pheG1lL3NyYy90ZXN0L29yZy9hcGFjaGUvd3MvamF4bWUvZXhhbXBsZXMvbWlzYy9hZGRyZXNzL2ltcGwvQWRkcmVzc1R5cGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoqCi0qIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSogCi0qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKiAKLSogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSogCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLndzLmpheG1lLmV4YW1wbGVzLm1pc2MuYWRkcmVzcy5pbXBsOwotCi1wdWJsaWMgY2xhc3MgQWRkcmVzc1R5cGVIYW5kbGVyIGV4dGVuZHMgb3JnLmFwYWNoZS53cy5qYXhtZS5pbXBsLkpNSGFuZGxlckltcGwgewotICBwdWJsaWMgc3RhdGljIGNsYXNzIE5hbWVUeXBlSGFuZGxlciBleHRlbmRzIG9yZy5hcGFjaGUud3MuamF4bWUuaW1wbC5KTUhhbmRsZXJJbXBsIHsKLSAgICAvKiogVGhlIGN1cnJlbnQgbGV2ZWwgb2YgbmVzdGVkIGVsZW1lbnRzLiAwLCBpZiBvdXRzaWRlIHRoZSByb290IGVsZW1lbnQuCi0gICAgICogCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgX19sZXZlbDsKLSAgCi0gICAgLyoqIFRoZSBjdXJyZW50IHN0YXRlLiBUaGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgdmFsaWQgc3RhdGVzOgotICAgICAqICAwID0gQmVmb3JlIHBhcnNpbmcgdGhlIGVsZW1lbnQKLSAgICAgKiAgMSA9IFBhcnNpbmcgYW4gdW5rbm93biBlbGVtZW50Ci0gICAgICogIDIgPSBBZnRlciBwYXJzaW5nIHRoZSBlbGVtZW50Ci0gICAgICogIDMgPSBXaGlsZSBwYXJzaW5nIHRoZSBjaGlsZCBlbGVtZW50IHtodHRwOi8vd3MuYXBhY2hlLm9yZy9qYXhtZS9leGFtcGxlcy9taXNjL2FkZHJlc3N9Rmlyc3QKLSAgICAgKiAgNCA9IFdoaWxlIHBhcnNpbmcgdGhlIGNoaWxkIGVsZW1lbnQge2h0dHA6Ly93cy5hcGFjaGUub3JnL2pheG1lL2V4YW1wbGVzL21pc2MvYWRkcmVzc31NaWRkbGUKLSAgICAgKiAgNSA9IFdoaWxlIHBhcnNpbmcgdGhlIGNoaWxkIGVsZW1lbnQge2h0dHA6Ly93cy5hcGFjaGUub3JnL2pheG1lL2V4YW1wbGVzL21pc2MvYWRkcmVzc31MYXN0Ci0gICAgICogIDYgPSBXaGlsZSBwYXJzaW5nIHRoZSBjaGlsZCBlbGVtZW50IHtodHRwOi8vd3MuYXBhY2hlLm9yZy9qYXhtZS9leGFtcGxlcy9taXNjL2FkZHJlc3N9SW5pdGlhbHMKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBfX3N0YXRlOwotICAKLSAgICAvKiogVGhlIGN1cnJlbnQgaGFuZGxlciBmb3IgcGFyc2luZyBjaGlsZCBlbGVtZW50cyBvciBzaW1wbGUgY29udGVudC4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIG9yZy5hcGFjaGUud3MuamF4bWUuSk1IYW5kbGVyIF9faGFuZGxlcjsKLSAgCi0gIAotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHsKLSAgICAgIF9fbGV2ZWwgPSAwOwotICAgICAgX19zdGF0ZSA9IDA7Ci0gICAgICBfX3N0YXRlID0gMDsKLSAgICAgIF9faGFuZGxlciA9IG51bGw7Ci0gICAgfQotICAKLSAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuQWRkcmVzc1R5cGUuTmFtZVR5cGUgbmV3UmVzdWx0KCkgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUud3MuamF4bWUuZXhhbXBsZXMubWlzYy5hZGRyZXNzLmltcGwuQWRkcmVzc1R5cGVJbXBsLk5hbWVUeXBlSW1wbCgpOwotICAgIH0KLSAgCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcgcE5hbWVzcGFjZVVSSSwgamF2YS5sYW5nLlN0cmluZyBwTG9jYWxOYW1lLCBqYXZhLmxhbmcuU3RyaW5nIHBRTmFtZSwgb3JnLnhtbC5zYXguQXR0cmlidXRlcyBwQXR0cikgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiB7Ci0gICAgICBzd2l0Y2ggKF9fbGV2ZWwrKykgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgc2V0UmVzdWx0KG5ld1Jlc3VsdCgpKTsKLSAgICAgICAgICBpZiAocEF0dHIgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgXzEgPSAwOyAgXzEgPCBwQXR0ci5nZXRMZW5ndGgoKTsgIF8xKyspIHsKLSAgICAgICAgICAgICAgc3VwZXIuYWRkQXR0cmlidXRlKHBBdHRyLmdldFVSSShfMSksIHBBdHRyLmdldExvY2FsTmFtZShfMSksIHBBdHRyLmdldFZhbHVlKF8xKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgaWYgKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9qYXhtZS9leGFtcGxlcy9taXNjL2FkZHJlc3MiLmVxdWFscyhwTmFtZXNwYWNlVVJJKSkgewotICAgICAgICAgICAgaWYgKCJGaXJzdCIuZXF1YWxzKHBMb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICAgIHN3aXRjaCAoX19zdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgIF9fc3RhdGUgPSAzOwotICAgICAgICAgICAgICAgICAgX19oYW5kbGVyID0gZ2V0RGF0YSgpLmdldEF0b21pY0hhbmRsZXIoKTsKLSAgICAgICAgICAgICAgICAgIF9faGFuZGxlci5zdGFydERvY3VtZW50KCk7Ci0gICAgICAgICAgICAgICAgICBfX2hhbmRsZXIuc3RhcnRFbGVtZW50KHBOYW1lc3BhY2VVUkksIHBMb2NhbE5hbWUsIHBRTmFtZSwgcEF0dHIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25FdmVudChqYXZheC54bWwuYmluZC5WYWxpZGF0aW9uRXZlbnQuV0FSTklORywgIlRoZSBlbGVtZW50ICIgKyBwUU5hbWUgKyAiIHdhcyB1bmV4cGVjdGVkIGF0IHRoaXMgcGxhY2UuIiwgb3JnLmFwYWNoZS53cy5qYXhtZS5WYWxpZGF0aW9uRXZlbnRzLkVWRU5UX1VORVhQRUNURURfQ0hJTERfU1RBVEUpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIk1pZGRsZSIuZXF1YWxzKHBMb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICAgIHN3aXRjaCAoX19zdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICBfX3N0YXRlID0gNDsKLSAgICAgICAgICAgICAgICAgIF9faGFuZGxlciA9IGdldERhdGEoKS5nZXRBdG9taWNIYW5kbGVyKCk7Ci0gICAgICAgICAgICAgICAgICBfX2hhbmRsZXIuc3RhcnREb2N1bWVudCgpOwotICAgICAgICAgICAgICAgICAgX19oYW5kbGVyLnN0YXJ0RWxlbWVudChwTmFtZXNwYWNlVVJJLCBwTG9jYWxOYW1lLCBwUU5hbWUsIHBBdHRyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRXZlbnQoamF2YXgueG1sLmJpbmQuVmFsaWRhdGlvbkV2ZW50LldBUk5JTkcsICJUaGUgZWxlbWVudCAiICsgcFFOYW1lICsgIiB3YXMgdW5leHBlY3RlZCBhdCB0aGlzIHBsYWNlLiIsIG9yZy5hcGFjaGUud3MuamF4bWUuVmFsaWRhdGlvbkV2ZW50cy5FVkVOVF9VTkVYUEVDVEVEX0NISUxEX1NUQVRFKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJMYXN0Ii5lcXVhbHMocExvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgc3dpdGNoIChfX3N0YXRlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgIF9fc3RhdGUgPSA1OwotICAgICAgICAgICAgICAgICAgX19oYW5kbGVyID0gZ2V0RGF0YSgpLmdldEF0b21pY0hhbmRsZXIoKTsKLSAgICAgICAgICAgICAgICAgIF9faGFuZGxlci5zdGFydERvY3VtZW50KCk7Ci0gICAgICAgICAgICAgICAgICBfX2hhbmRsZXIuc3RhcnRFbGVtZW50KHBOYW1lc3BhY2VVUkksIHBMb2NhbE5hbWUsIHBRTmFtZSwgcEF0dHIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25FdmVudChqYXZheC54bWwuYmluZC5WYWxpZGF0aW9uRXZlbnQuV0FSTklORywgIlRoZSBlbGVtZW50ICIgKyBwUU5hbWUgKyAiIHdhcyB1bmV4cGVjdGVkIGF0IHRoaXMgcGxhY2UuIiwgb3JnLmFwYWNoZS53cy5qYXhtZS5WYWxpZGF0aW9uRXZlbnRzLkVWRU5UX1VORVhQRUNURURfQ0hJTERfU1RBVEUpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIkluaXRpYWxzIi5lcXVhbHMocExvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgc3dpdGNoIChfX3N0YXRlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgICAgX19zdGF0ZSA9IDY7Ci0gICAgICAgICAgICAgICAgICBfX2hhbmRsZXIgPSBnZXREYXRhKCkuZ2V0QXRvbWljSGFuZGxlcigpOwotICAgICAgICAgICAgICAgICAgX19oYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgIF9faGFuZGxlci5zdGFydEVsZW1lbnQocE5hbWVzcGFjZVVSSSwgcExvY2FsTmFtZSwgcFFOYW1lLCBwQXR0cik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkV2ZW50KGphdmF4LnhtbC5iaW5kLlZhbGlkYXRpb25FdmVudC5XQVJOSU5HLCAiVGhlIGVsZW1lbnQgIiArIHBRTmFtZSArICIgd2FzIHVuZXhwZWN0ZWQgYXQgdGhpcyBwbGFjZS4iLCBvcmcuYXBhY2hlLndzLmpheG1lLlZhbGlkYXRpb25FdmVudHMuRVZFTlRfVU5FWFBFQ1RFRF9DSElMRF9TVEFURSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBpZiAoX19oYW5kbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHN1cGVyLnN0YXJ0RWxlbWVudChwTmFtZXNwYWNlVVJJLCBwTG9jYWxOYW1lLCBwUU5hbWUsIHBBdHRyKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgX19oYW5kbGVyLnN0YXJ0RWxlbWVudChwTmFtZXNwYWNlVVJJLCBwTG9jYWxOYW1lLCBwUU5hbWUsIHBBdHRyKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAKLSAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcgcE5hbWVzcGFjZVVSSSwgamF2YS5sYW5nLlN0cmluZyBwTG9jYWxOYW1lLCBqYXZhLmxhbmcuU3RyaW5nIHBRTmFtZSkgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiB7Ci0gICAgICBpZiAoX19oYW5kbGVyID09IG51bGwpIHsKLSAgICAgICAgaWYgKF9fbGV2ZWwgPiAxKSB7Ci0gICAgICAgICAgc3VwZXIuZW5kRWxlbWVudChwTmFtZXNwYWNlVVJJLCBwTG9jYWxOYW1lLCBwUU5hbWUpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBfX2hhbmRsZXIuZW5kRWxlbWVudChwTmFtZXNwYWNlVVJJLCBwTG9jYWxOYW1lLCBwUU5hbWUpOwotICAgICAgfQotICAgICAgc3dpdGNoICgtLV9fbGV2ZWwpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgb3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuQWRkcmVzc1R5cGUuTmFtZVR5cGUgXzEgPSAob3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuQWRkcmVzc1R5cGUuTmFtZVR5cGUpIGdldFJlc3VsdCgpOwotICAgICAgICAgIHN3aXRjaCAoX19zdGF0ZSkgewotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICBpZiAoX19oYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBfX2hhbmRsZXIuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBfMS5zZXRGaXJzdCgoKGphdmEubGFuZy5TdHJpbmcpIF9faGFuZGxlci5nZXRSZXN1bHQoKSkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgaWYgKF9faGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgX19oYW5kbGVyLmVuZERvY3VtZW50KCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgXzEuZ2V0TWlkZGxlKCkuYWRkKF9faGFuZGxlci5nZXRSZXN1bHQoKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICBpZiAoX19oYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBfX2hhbmRsZXIuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBfMS5zZXRMYXN0KCgoamF2YS5sYW5nLlN0cmluZykgX19oYW5kbGVyLmdldFJlc3VsdCgpKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICBpZiAoX19oYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBfX2hhbmRsZXIuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBfMS5zZXRJbml0aWFscygoKGphdmEubGFuZy5TdHJpbmcpIF9faGFuZGxlci5nZXRSZXN1bHQoKSkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbGxlZ2FsIHN0YXRlOiAiICsgX19zdGF0ZSk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgCi0gICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gcENoYXJzLCBpbnQgcE9mZnNldCwgaW50IHBMZW4pIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gewotICAgICAgaWYgKF9faGFuZGxlciA9PSBudWxsKSB7Ci0gICAgICAgIHN1cGVyLmNoYXJhY3RlcnMocENoYXJzLCBwT2Zmc2V0LCBwTGVuKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIF9faGFuZGxlci5jaGFyYWN0ZXJzKHBDaGFycywgcE9mZnNldCwgcExlbik7Ci0gICAgICB9Ci0gICAgfQotICAKLSAgfQotCi0gIC8qKiBUaGUgY3VycmVudCBsZXZlbCBvZiBuZXN0ZWQgZWxlbWVudHMuIDAsIGlmIG91dHNpZGUgdGhlIHJvb3QgZWxlbWVudC4KLSAgICogCi0gICAqLwotICBwcml2YXRlIGludCBfX2xldmVsOwotCi0gIC8qKiBUaGUgY3VycmVudCBzdGF0ZS4gVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHZhbGlkIHN0YXRlczoKLSAgICogIDAgPSBCZWZvcmUgcGFyc2luZyB0aGUgZWxlbWVudAotICAgKiAgMSA9IFBhcnNpbmcgYW4gdW5rbm93biBlbGVtZW50Ci0gICAqICAyID0gQWZ0ZXIgcGFyc2luZyB0aGUgZWxlbWVudAotICAgKiAgMyA9IFdoaWxlIHBhcnNpbmcgdGhlIGNoaWxkIGVsZW1lbnQge2h0dHA6Ly93cy5hcGFjaGUub3JnL2pheG1lL2V4YW1wbGVzL21pc2MvYWRkcmVzc31OYW1lCi0gICAqIAotICAgKi8KLSAgcHJpdmF0ZSBpbnQgX19zdGF0ZTsKLQotICAvKiogVGhlIGN1cnJlbnQgaGFuZGxlciBmb3IgcGFyc2luZyBjaGlsZCBlbGVtZW50cyBvciBzaW1wbGUgY29udGVudC4KLSAgICogCi0gICAqLwotICBwcml2YXRlIG9yZy5hcGFjaGUud3MuamF4bWUuSk1IYW5kbGVyIF9faGFuZGxlcjsKLQotICBwcml2YXRlIG9yZy5hcGFjaGUud3MuamF4bWUuSk1IYW5kbGVyIF9faGFuZGxlcl9OYW1lOwotCi0KLSAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gewotICAgIF9fbGV2ZWwgPSAwOwotICAgIF9fc3RhdGUgPSAwOwotICAgIF9fc3RhdGUgPSAwOwotICAgIF9faGFuZGxlciA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwVVJJLCBqYXZhLmxhbmcuU3RyaW5nIHBMb2NhbE5hbWUsIGphdmEubGFuZy5TdHJpbmcgcFZhbHVlKSB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHsKLSAgICBpZiAocFVSSSA9PSBudWxsKSB7Ci0gICAgICBwVVJJID0gIiI7Ci0gICAgfQotICAgIG9yZy5hcGFjaGUud3MuamF4bWUuZXhhbXBsZXMubWlzYy5hZGRyZXNzLkFkZHJlc3NUeXBlIF8xID0gKG9yZy5hcGFjaGUud3MuamF4bWUuZXhhbXBsZXMubWlzYy5hZGRyZXNzLkFkZHJlc3NUeXBlKSBnZXRSZXN1bHQoKTsKLSAgICBpZiAoIiIuZXF1YWxzKHBVUkkpKSB7Ci0gICAgICBpZiAoImlkIi5lcXVhbHMocExvY2FsTmFtZSkpIHsKLSAgICAgICAgXzEuc2V0SWQocFZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5hZGRBdHRyaWJ1dGUocFVSSSwgcExvY2FsTmFtZSwgcFZhbHVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBvcmcuYXBhY2hlLndzLmpheG1lLmV4YW1wbGVzLm1pc2MuYWRkcmVzcy5BZGRyZXNzVHlwZSBuZXdSZXN1bHQoKSB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIChvcmcuYXBhY2hlLndzLmpheG1lLmV4YW1wbGVzLm1pc2MuYWRkcmVzcy5BZGRyZXNzVHlwZSkgZ2V0RGF0YSgpLmdldEZhY3RvcnkoKS5nZXRFbGVtZW50KG9yZy5hcGFjaGUud3MuamF4bWUuZXhhbXBsZXMubWlzYy5hZGRyZXNzLkFkZHJlc3NUeXBlLmNsYXNzKTsKLSAgICB9IGNhdGNoIChqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uIF8xKSB7Ci0gICAgICB0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uKF8xKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZyBwTmFtZXNwYWNlVVJJLCBqYXZhLmxhbmcuU3RyaW5nIHBMb2NhbE5hbWUsIGphdmEubGFuZy5TdHJpbmcgcFFOYW1lLCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzIHBBdHRyKSB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHsKLSAgICBzd2l0Y2ggKF9fbGV2ZWwrKykgewotICAgICAgY2FzZSAwOgotICAgICAgICBzZXRSZXN1bHQobmV3UmVzdWx0KCkpOwotICAgICAgICBpZiAocEF0dHIgIT0gbnVsbCkgewotICAgICAgICAgIGZvciAoaW50IF8xID0gMDsgIF8xIDwgcEF0dHIuZ2V0TGVuZ3RoKCk7ICBfMSsrKSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUocEF0dHIuZ2V0VVJJKF8xKSwgcEF0dHIuZ2V0TG9jYWxOYW1lKF8xKSwgcEF0dHIuZ2V0VmFsdWUoXzEpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIGlmICgiaHR0cDovL3dzLmFwYWNoZS5vcmcvamF4bWUvZXhhbXBsZXMvbWlzYy9hZGRyZXNzIi5lcXVhbHMocE5hbWVzcGFjZVVSSSkpIHsKLSAgICAgICAgICBpZiAoIk5hbWUiLmVxdWFscyhwTG9jYWxOYW1lKSkgewotICAgICAgICAgICAgc3dpdGNoIChfX3N0YXRlKSB7Ci0gICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBfX3N0YXRlID0gMzsKLSAgICAgICAgICAgICAgICBfX2hhbmRsZXIgPSBnZXRIYW5kbGVyRm9yTmFtZSgpOwotICAgICAgICAgICAgICAgIF9faGFuZGxlci5zdGFydERvY3VtZW50KCk7Ci0gICAgICAgICAgICAgICAgX19oYW5kbGVyLnN0YXJ0RWxlbWVudChwTmFtZXNwYWNlVVJJLCBwTG9jYWxOYW1lLCBwUU5hbWUsIHBBdHRyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRXZlbnQoamF2YXgueG1sLmJpbmQuVmFsaWRhdGlvbkV2ZW50LldBUk5JTkcsICJUaGUgZWxlbWVudCAiICsgcFFOYW1lICsgIiB3YXMgdW5leHBlY3RlZCBhdCB0aGlzIHBsYWNlLiIsIG9yZy5hcGFjaGUud3MuamF4bWUuVmFsaWRhdGlvbkV2ZW50cy5FVkVOVF9VTkVYUEVDVEVEX0NISUxEX1NUQVRFKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBpZiAoX19oYW5kbGVyID09IG51bGwpIHsKLSAgICAgICAgICBzdXBlci5zdGFydEVsZW1lbnQocE5hbWVzcGFjZVVSSSwgcExvY2FsTmFtZSwgcFFOYW1lLCBwQXR0cik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgX19oYW5kbGVyLnN0YXJ0RWxlbWVudChwTmFtZXNwYWNlVVJJLCBwTG9jYWxOYW1lLCBwUU5hbWUsIHBBdHRyKTsKLSAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZyBwTmFtZXNwYWNlVVJJLCBqYXZhLmxhbmcuU3RyaW5nIHBMb2NhbE5hbWUsIGphdmEubGFuZy5TdHJpbmcgcFFOYW1lKSB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHsKLSAgICBpZiAoX19oYW5kbGVyID09IG51bGwpIHsKLSAgICAgIGlmIChfX2xldmVsID4gMSkgewotICAgICAgICBzdXBlci5lbmRFbGVtZW50KHBOYW1lc3BhY2VVUkksIHBMb2NhbE5hbWUsIHBRTmFtZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIF9faGFuZGxlci5lbmRFbGVtZW50KHBOYW1lc3BhY2VVUkksIHBMb2NhbE5hbWUsIHBRTmFtZSk7Ci0gICAgfQotICAgIHN3aXRjaCAoLS1fX2xldmVsKSB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxOgotICAgICAgICBvcmcuYXBhY2hlLndzLmpheG1lLmV4YW1wbGVzLm1pc2MuYWRkcmVzcy5BZGRyZXNzVHlwZSBfMSA9IChvcmcuYXBhY2hlLndzLmpheG1lLmV4YW1wbGVzLm1pc2MuYWRkcmVzcy5BZGRyZXNzVHlwZSkgZ2V0UmVzdWx0KCk7Ci0gICAgICAgIHN3aXRjaCAoX19zdGF0ZSkgewotICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGlmIChfX2hhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICBfX2hhbmRsZXIuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF8xLnNldE5hbWUoKChvcmcuYXBhY2hlLndzLmpheG1lLmV4YW1wbGVzLm1pc2MuYWRkcmVzcy5BZGRyZXNzVHlwZS5OYW1lVHlwZSkgX19oYW5kbGVyLmdldFJlc3VsdCgpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24oIklsbGVnYWwgc3RhdGU6ICIgKyBfX3N0YXRlKTsKLSAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIHBDaGFycywgaW50IHBPZmZzZXQsIGludCBwTGVuKSB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHsKLSAgICBpZiAoX19oYW5kbGVyID09IG51bGwpIHsKLSAgICAgIHN1cGVyLmNoYXJhY3RlcnMocENoYXJzLCBwT2Zmc2V0LCBwTGVuKTsKLSAgICB9IGVsc2UgewotICAgICAgX19oYW5kbGVyLmNoYXJhY3RlcnMocENoYXJzLCBwT2Zmc2V0LCBwTGVuKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbml0KG9yZy5hcGFjaGUud3MuamF4bWUuSk1IYW5kbGVyLkRhdGEgcERhdGEpIHRocm93cyBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uIHsKLSAgICBzdXBlci5pbml0KHBEYXRhKTsKLSAgICBpZiAoX19oYW5kbGVyX05hbWUgIT0gbnVsbCkgewotICAgICAgX19oYW5kbGVyX05hbWUuaW5pdChwRGF0YSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIG9yZy5hcGFjaGUud3MuamF4bWUuSk1IYW5kbGVyIGdldEhhbmRsZXJGb3JOYW1lKCkgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiB7Ci0gICAgaWYgKF9faGFuZGxlcl9OYW1lID09IG51bGwpIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIF9faGFuZGxlcl9OYW1lID0gbmV3IG9yZy5hcGFjaGUud3MuamF4bWUuZXhhbXBsZXMubWlzYy5hZGRyZXNzLmltcGwuQWRkcmVzc1R5cGVIYW5kbGVyLk5hbWVUeXBlSGFuZGxlcigpOwotICAgICAgICBfX2hhbmRsZXJfTmFtZS5pbml0KGdldERhdGEoKSk7Ci0gICAgICB9IGNhdGNoIChqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uIF8xKSB7Ci0gICAgICAgIHRocm93IG5ldyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24oXzEpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gX19oYW5kbGVyX05hbWU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qYXhtZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3dzL2pheG1lL2V4YW1wbGVzL21pc2MvYWRkcmVzcy9pbXBsL0FkZHJlc3NUeXBlSW1wbC5qYXZhIGIvamVsbHktdGFncy9qYXhtZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3dzL2pheG1lL2V4YW1wbGVzL21pc2MvYWRkcmVzcy9pbXBsL0FkZHJlc3NUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTkwMjI0Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamF4bWUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhtZS9leGFtcGxlcy9taXNjL2FkZHJlc3MvaW1wbC9BZGRyZXNzVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKgotKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qIAotKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSogCi0qICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qIAotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuaW1wbDsKLQotcHVibGljIGNsYXNzIEFkZHJlc3NUeXBlSW1wbCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUud3MuamF4bWUuZXhhbXBsZXMubWlzYy5hZGRyZXNzLkFkZHJlc3NUeXBlIHsKLSAgcHVibGljIHN0YXRpYyBjbGFzcyBOYW1lVHlwZUltcGwgaW1wbGVtZW50cyBvcmcuYXBhY2hlLndzLmpheG1lLmV4YW1wbGVzLm1pc2MuYWRkcmVzcy5BZGRyZXNzVHlwZS5OYW1lVHlwZSB7Ci0gICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIEZpcnN0OwotICAKLSAgICBwcml2YXRlIGphdmEudXRpbC5MaXN0IE1pZGRsZSA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gIAotICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBMYXN0OwotICAKLSAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgSW5pdGlhbHM7Ci0gIAotICAKLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGaXJzdCgpIHsKLSAgICAgIHJldHVybiBGaXJzdDsKLSAgICB9Ci0gIAotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0KGphdmEubGFuZy5TdHJpbmcgcEZpcnN0KSB7Ci0gICAgICBGaXJzdCA9IHBGaXJzdDsKLSAgICB9Ci0gIAotICAgIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRNaWRkbGUoKSB7Ci0gICAgICByZXR1cm4gTWlkZGxlOwotICAgIH0KLSAgCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TGFzdCgpIHsKLSAgICAgIHJldHVybiBMYXN0OwotICAgIH0KLSAgCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdChqYXZhLmxhbmcuU3RyaW5nIHBMYXN0KSB7Ci0gICAgICBMYXN0ID0gcExhc3Q7Ci0gICAgfQotICAKLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbml0aWFscygpIHsKLSAgICAgIHJldHVybiBJbml0aWFsczsKLSAgICB9Ci0gIAotICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxzKGphdmEubGFuZy5TdHJpbmcgcEluaXRpYWxzKSB7Ci0gICAgICBJbml0aWFscyA9IHBJbml0aWFsczsKLSAgICB9Ci0gIAotICB9Ci0KLSAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIElkOwotCi0gIHByaXZhdGUgb3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuQWRkcmVzc1R5cGUuTmFtZVR5cGUgTmFtZTsKLQotCi0gIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgIHJldHVybiBJZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgcElkKSB7Ci0gICAgSWQgPSBwSWQ7Ci0gIH0KLQotICBwdWJsaWMgb3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuQWRkcmVzc1R5cGUuTmFtZVR5cGUgZ2V0TmFtZSgpIHsKLSAgICByZXR1cm4gTmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUob3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuQWRkcmVzc1R5cGUuTmFtZVR5cGUgcE5hbWUpIHsKLSAgICBOYW1lID0gcE5hbWU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qYXhtZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3dzL2pheG1lL2V4YW1wbGVzL21pc2MvYWRkcmVzcy9pbXBsL0FkZHJlc3NUeXBlU2VyaWFsaXplci5qYXZhIGIvamVsbHktdGFncy9qYXhtZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3dzL2pheG1lL2V4YW1wbGVzL21pc2MvYWRkcmVzcy9pbXBsL0FkZHJlc3NUeXBlU2VyaWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGM3MDgyLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamF4bWUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhtZS9leGFtcGxlcy9taXNjL2FkZHJlc3MvaW1wbC9BZGRyZXNzVHlwZVNlcmlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKgotKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qIAotKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSogCi0qICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qIAotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLndzLmpheG1lLmV4YW1wbGVzLm1pc2MuYWRkcmVzcy5pbXBsOwotCi1wdWJsaWMgY2xhc3MgQWRkcmVzc1R5cGVTZXJpYWxpemVyIGV4dGVuZHMgb3JnLmFwYWNoZS53cy5qYXhtZS5pbXBsLkpNWG1sU2VyaWFsaXplckltcGwgewotICBwdWJsaWMgc3RhdGljIGNsYXNzIE5hbWVUeXBlU2VyaWFsaXplciBleHRlbmRzIG9yZy5hcGFjaGUud3MuamF4bWUuaW1wbC5KTVhtbFNlcmlhbGl6ZXJJbXBsIHsKLSAgICBmaW5hbCBzdGF0aWMgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBfX3Nlcl9GaXJzdF9xbmFtZSA9IG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9qYXhtZS9leGFtcGxlcy9taXNjL2FkZHJlc3MiLCAiRmlyc3QiKTsKLSAgCi0gICAgZmluYWwgc3RhdGljIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgX19zZXJfTWlkZGxlX3FuYW1lID0gbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2pheG1lL2V4YW1wbGVzL21pc2MvYWRkcmVzcyIsICJNaWRkbGUiKTsKLSAgCi0gICAgZmluYWwgc3RhdGljIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgX19zZXJfTGFzdF9xbmFtZSA9IG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9qYXhtZS9leGFtcGxlcy9taXNjL2FkZHJlc3MiLCAiTGFzdCIpOwotICAKLSAgICBmaW5hbCBzdGF0aWMgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBfX3Nlcl9Jbml0aWFsc19xbmFtZSA9IG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9qYXhtZS9leGFtcGxlcy9taXNjL2FkZHJlc3MiLCAiSW5pdGlhbHMiKTsKLSAgCi0gIAotICAgIHByb3RlY3RlZCB2b2lkIG1hcnNoYWxDaGlsZHMob3JnLmFwYWNoZS53cy5qYXhtZS5KTVhtbFNlcmlhbGl6ZXIuRGF0YSBwRGF0YSwgamF2YS5sYW5nLk9iamVjdCBwT2JqZWN0KSB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHsKLSAgICAgIG9yZy5hcGFjaGUud3MuamF4bWUuZXhhbXBsZXMubWlzYy5hZGRyZXNzLkFkZHJlc3NUeXBlLk5hbWVUeXBlIF8xID0gKG9yZy5hcGFjaGUud3MuamF4bWUuZXhhbXBsZXMubWlzYy5hZGRyZXNzLkFkZHJlc3NUeXBlLk5hbWVUeXBlKSBwT2JqZWN0OwotICAgICAgamF2YS5sYW5nLlN0cmluZyBfMiA9IF8xLmdldEZpcnN0KCk7Ci0gICAgICBpZiAoXzIgIT0gbnVsbCkgewotICAgICAgICBtYXJzaGFsQXRvbWljQ2hpbGQocERhdGEsIF9fc2VyX0ZpcnN0X3FuYW1lLCBfMS5nZXRGaXJzdCgpKTsKLSAgICAgIH0KLSAgICAgIGphdmEudXRpbC5MaXN0IF8zID0gXzEuZ2V0TWlkZGxlKCk7Ci0gICAgICBmb3IgKGludCBfNCA9IDA7ICBfNCA8IChfMykuc2l6ZSgpOyAgXzQrKykgewotICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF81ID0gKGphdmEubGFuZy5TdHJpbmcpXzMuZ2V0KF80KTsKLSAgICAgICAgaWYgKF81ICE9IG51bGwpIHsKLSAgICAgICAgICBtYXJzaGFsQXRvbWljQ2hpbGQocERhdGEsIF9fc2VyX01pZGRsZV9xbmFtZSwgKGphdmEubGFuZy5TdHJpbmcpXzMuZ2V0KF80KSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGphdmEubGFuZy5TdHJpbmcgXzYgPSBfMS5nZXRMYXN0KCk7Ci0gICAgICBpZiAoXzYgIT0gbnVsbCkgewotICAgICAgICBtYXJzaGFsQXRvbWljQ2hpbGQocERhdGEsIF9fc2VyX0xhc3RfcW5hbWUsIF8xLmdldExhc3QoKSk7Ci0gICAgICB9Ci0gICAgICBqYXZhLmxhbmcuU3RyaW5nIF83ID0gXzEuZ2V0SW5pdGlhbHMoKTsKLSAgICAgIGlmIChfNyAhPSBudWxsKSB7Ci0gICAgICAgIG1hcnNoYWxBdG9taWNDaGlsZChwRGF0YSwgX19zZXJfSW5pdGlhbHNfcW5hbWUsIF8xLmdldEluaXRpYWxzKCkpOwotICAgICAgfQotICAgIH0KLSAgCi0gIH0KLQotICBwcml2YXRlIG9yZy5hcGFjaGUud3MuamF4bWUuZXhhbXBsZXMubWlzYy5hZGRyZXNzLmltcGwuQWRkcmVzc1R5cGVTZXJpYWxpemVyLk5hbWVUeXBlU2VyaWFsaXplciBfX3Nlcl9OYW1lOwotCi0gIGZpbmFsIHN0YXRpYyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIF9fc2VyX05hbWVfcW5hbWUgPSBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvamF4bWUvZXhhbXBsZXMvbWlzYy9hZGRyZXNzIiwgIk5hbWUiKTsKLQotCi0gIHByb3RlY3RlZCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsIGdldEF0dHJpYnV0ZXMob3JnLmFwYWNoZS53cy5qYXhtZS5KTVhtbFNlcmlhbGl6ZXIuRGF0YSBwRGF0YSwgamF2YS5sYW5nLk9iamVjdCBwRWxlbWVudCkgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiB7Ci0gICAgb3JnLnhtbC5zYXguaGVscGVycy5BdHRyaWJ1dGVzSW1wbCBfMSA9IHN1cGVyLmdldEF0dHJpYnV0ZXMocERhdGEsIHBFbGVtZW50KTsKLSAgICBvcmcuYXBhY2hlLndzLmpheG1lLmV4YW1wbGVzLm1pc2MuYWRkcmVzcy5BZGRyZXNzVHlwZSBfMiA9IChvcmcuYXBhY2hlLndzLmpheG1lLmV4YW1wbGVzLm1pc2MuYWRkcmVzcy5BZGRyZXNzVHlwZSkgcEVsZW1lbnQ7Ci0gICAgamF2YS5sYW5nLlN0cmluZyBfMyA9IF8yLmdldElkKCk7Ci0gICAgaWYgKF8zICE9IG51bGwpIHsKLSAgICAgIF8xLmFkZEF0dHJpYnV0ZSgiIiwgImlkIiwgZ2V0QXR0cmlidXRlUU5hbWUocERhdGEsICIiLCAiaWQiKSwgIkNEQVRBIiwgXzIuZ2V0SWQoKSk7Ci0gICAgfQotICAgIHJldHVybiBfMTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQob3JnLmFwYWNoZS53cy5qYXhtZS5pbXBsLkpBWEJDb250ZXh0SW1wbCBwRmFjdG9yeSkgdGhyb3dzIGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb24gewotICAgIHN1cGVyLmluaXQocEZhY3RvcnkpOwotICAgIF9fc2VyX05hbWUgPSBuZXcgb3JnLmFwYWNoZS53cy5qYXhtZS5leGFtcGxlcy5taXNjLmFkZHJlc3MuaW1wbC5BZGRyZXNzVHlwZVNlcmlhbGl6ZXIuTmFtZVR5cGVTZXJpYWxpemVyKCk7Ci0gICAgX19zZXJfTmFtZS5pbml0KHBGYWN0b3J5KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIG1hcnNoYWxDaGlsZHMob3JnLmFwYWNoZS53cy5qYXhtZS5KTVhtbFNlcmlhbGl6ZXIuRGF0YSBwRGF0YSwgamF2YS5sYW5nLk9iamVjdCBwT2JqZWN0KSB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHsKLSAgICBvcmcuYXBhY2hlLndzLmpheG1lLmV4YW1wbGVzLm1pc2MuYWRkcmVzcy5BZGRyZXNzVHlwZSBfMSA9IChvcmcuYXBhY2hlLndzLmpheG1lLmV4YW1wbGVzLm1pc2MuYWRkcmVzcy5BZGRyZXNzVHlwZSkgcE9iamVjdDsKLSAgICBvcmcuYXBhY2hlLndzLmpheG1lLmV4YW1wbGVzLm1pc2MuYWRkcmVzcy5BZGRyZXNzVHlwZS5OYW1lVHlwZSBfMiA9IF8xLmdldE5hbWUoKTsKLSAgICBpZiAoXzIgIT0gbnVsbCkgewotICAgICAgX19zZXJfTmFtZS5tYXJzaGFsKHBEYXRhLCBfX3Nlcl9OYW1lX3FuYW1lLCBfMS5nZXROYW1lKCkpOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pheG1lL3NyYy90ZXN0L29yZy9hcGFjaGUvd3MvamF4bWUvZXhhbXBsZXMvbWlzYy9hZGRyZXNzL2pheGIucHJvcGVydGllcyBiL2plbGx5LXRhZ3MvamF4bWUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhtZS9leGFtcGxlcy9taXNjL2FkZHJlc3MvamF4Yi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjllN2JlLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamF4bWUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhtZS9leGFtcGxlcy9taXNjL2FkZHJlc3MvamF4Yi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjCi0jIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMgCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jIyMKLQotamF2YXgueG1sLmJpbmQuY29udGV4dC5mYWN0b3J5PW9yZy5hcGFjaGUud3MuamF4bWUuaW1wbC5KQVhCQ29udGV4dEltcGwKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamF4bWUveGRvY3MvY2hhbmdlcy54bWwgYi9qZWxseS10YWdzL2pheG1lL3hkb2NzL2NoYW5nZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2FkYzhkLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamF4bWUveGRvY3MvY2hhbmdlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tIAotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotIC0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5DaGFuZ2VzPC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0gIDxib2R5PgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMCIgZGF0ZT0iMjAwNC0wOS0xMSI+Ci0gICAgPC9yZWxlYXNlPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qYXhtZS94ZG9jcy9pbmRleC54bWwgYi9qZWxseS10YWdzL2pheG1lL3hkb2NzL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhiNzM4Yi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pheG1lL3hkb2NzL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkpheE1lIFRhZyBMaWJyYXJ5PC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0KLSAgPGJvZHk+Ci0gICAgPHNlY3Rpb24gbmFtZT0iT3ZlcnZpZXciPgotICAgICAgPHA+Ci0gICAgICAgIEEgPGEgaHJlZj0naHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4Yi8nPkpBWEI8L2E+IHRhZyBsaWJyYXJ5IHVzaW5nIHRoZSAKLSAgICAgICAgPGEgaHJlZj0naHR0cDovL3dzLmFwYWNoZS5vcmcvamF4bWUnPkFwYWNoZSBKYXhNZTwvYT4gaW1wbGVtZW50YXRpb24uCi0gICAgICAgIFRhZ3MgYXJlIHByb3ZpZGVkIGZvciBtYXJzaGFsbGluZyBqYXZhIG9iamVjdHMgaW50byB4bWwgCi0gICAgICAgIGFuZCB1bm1hcnNoYWxsaW5nIHhtbCBpbnRvIGphdmEgb2JqZWN0cyB3aGljaCB3aWxsIHdvcmsgd2l0aCBhbnkgSkFYQiBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgVGhlIGdlbmVyYXRpb24gdGFnIGdlbmVyYXRlcyBqYXZhIG9iamVjdHMgd2hpY2ggY2FuIGJlIG1hcnNoYWxsZWQgYW5kIHVubWFyc2hhbGxlZCBieQotICAgICAgICBKYXhNZSBhbmQgYXJlIHNwZWNpZmljIHRvIHRoYXQgaW1wbGVtZW50YXRpb24uCi0gICAgICA8L3A+Ci0KLSAgICAgIDxwPgotICAgICAgICAgIFNlZSB0aGUgPGEgaHJlZj0idGFncy5odG1sIj50YWdzPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamF4bWUveGRvY3MvbmF2aWdhdGlvbi54bWwgYi9qZWxseS10YWdzL2pheG1lL3hkb2NzL25hdmlnYXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Zjk5ZGU2Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamF4bWUveGRvY3MvbmF2aWdhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IG5hbWU9IkpheE1lIFRhZyBMaWJyYXJ5Ij4KLQotICA8dGl0bGU+SmF4TWUgVGFnIExpYnJhcnk8L3RpdGxlPgotICAKLSAgPGJvZHk+Ci0gICAgPG1lbnUgbmFtZT0iSmF4TWUgVGFnIExpYnJhcnkiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgICAgICAgICAgIGhyZWY9Ii9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJUYWdzIiAgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZ3MuaHRtbCIvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qZXR0eS8uY3ZzaWdub3JlIGIvamVsbHktdGFncy9qZXR0eS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGQzMWY3Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamV0dHkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotbWF2ZW4ubG9nCi10YXJnZXQKLXZlbG9jaXR5LmxvZwpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qZXR0eS9idWlsZC54bWwgYi9qZWxseS10YWdzL2pldHR5L2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIyMDc5MS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pldHR5L2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tYnVpbGQueG1sIGdlbmVyYXRlZCBieSBtYXZlbiBmcm9tIHByb2plY3QueG1sIHZlcnNpb24gMS4wLVNOQVBTSE9UCi0gIG9uIGRhdGUgTWF5IDI0IDIwMDQsIHRpbWUgMjMwMS0tPgotPHByb2plY3QgZGVmYXVsdD0iamFyIiBuYW1lPSJjb21tb25zLWplbGx5LXRhZ3MtamV0dHkiIGJhc2VkaXI9Ii4iPgotICA8cHJvcGVydHkgbmFtZT0iZGVmYXVsdHRhcmdldGRpciIgdmFsdWU9InRhcmdldCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJkaXIiIHZhbHVlPSJ0YXJnZXQvbGliIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXNkaXIiIHZhbHVlPSJ0YXJnZXQvY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Y2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0idGVzdHJlcG9ydGRpciIgdmFsdWU9InRhcmdldC90ZXN0LXJlcG9ydHMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZGlzdGRpciIgdmFsdWU9ImRpc3QiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iamF2YWRvY2RpciIgdmFsdWU9ImRpc3QvZG9jcy9hcGkiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZmluYWwubmFtZSIgdmFsdWU9ImNvbW1vbnMtamVsbHktdGFncy1qZXR0eS0xLjAtU05BUFNIT1QiPgotICA8L3Byb3BlcnR5PgotICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlc2NyaXB0aW9uPSJvIEluaXRpYWxpemVzIHNvbWUgcHJvcGVydGllcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im5vZ2V0Ij4KLSAgICAgIDxlcXVhbHMgYXJnMj0ib25seSIgYXJnMT0iJHtidWlsZC5zeXNjbGFzc3BhdGh9Ij4KLSAgICAgIDwvZXF1YWxzPgotICAgIDwvY29uZGl0aW9uPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXNjcmlwdGlvbj0ibyBDb21waWxlIHRoZSBjb2RlIiBkZXBlbmRzPSJnZXQtZGVwcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHtjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvamF2YSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICAgIDxjb3B5IHRvZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL2phdmEiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICAgIDxjb3B5IHRvZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qZWxseSI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueHNsIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnJuZyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5kdGQiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5odG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamFyIiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgdGhlIGphciIgZGVwZW5kcz0iY29tcGlsZSx0ZXN0Ij4KLSAgICA8amFyIGphcmZpbGU9InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCIgYmFzZWRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0ibyBDbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIGRpcmVjdG9yaWVzIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGlzdGRpcn0iPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgYSBkaXN0cmlidXRpb24iIGRlcGVuZHM9ImphciwgamF2YWRvYyI+Ci0gICAgPG1rZGlyIGRpcj0iZGlzdCI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29weSB0b2Rpcj0iZGlzdCI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iIGluY2x1ZGVzPSIqLmphciI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iIGluY2x1ZGVzPSJMSUNFTlNFKiwgUkVBRE1FKiI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0ibyBSdW4gdGhlIHRlc3QgY2FzZXMiIGlmPSJ0ZXN0LmZhaWx1cmUiIGRlcGVuZHM9ImludGVybmFsLXRlc3QiPgotICAgIDxmYWlsIG1lc3NhZ2U9IlRoZXJlIHdlcmUgdGVzdCBmYWlsdXJlcy4iPgotICAgIDwvZmFpbD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iaW50ZXJuYWwtdGVzdCIgZGVwZW5kcz0iY29tcGlsZS10ZXN0cyI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8anVuaXQgZGlyPSIuLyIgZmFpbHVyZXByb3BlcnR5PSJ0ZXN0LmZhaWx1cmUiIHByaW50U3VtbWFyeT0ieWVzIiBmb3JrPSJ0cnVlIiBoYWx0b25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJiYXNlZGlyIiB2YWx1ZT0iLiI+Ci0gICAgICA8L3N5c3Byb3BlcnR5PgotICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Zm9ybWF0dGVyIHVzZWZpbGU9ImZhbHNlIiB0eXBlPSJwbGFpbiI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL1Rlc3QqLmphdmEiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgPC9qdW5pdD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZS10ZXN0cyIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy90ZXN0Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamF2YWRvYyIgZGVzY3JpcHRpb249Im8gR2VuZXJhdGUgamF2YWRvYyIgZGVwZW5kcz0iamFyIj4KLSAgICA8bWtkaXIgZGlyPSIke2phdmFkb2NkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDx0c3RhbXA+Ci0gICAgICA8Zm9ybWF0IHBhdHRlcm49IjIwMDIteXl5eSIgcHJvcGVydHk9InllYXIiPgotICAgICAgPC9mb3JtYXQ+Ci0gICAgPC90c3RhbXA+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvcHlyaWdodCIgdmFsdWU9IkNvcHlyaWdodCAmYW1wO2NvcHk7ICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLWpldHR5IDEuMC1TTkFQU0hPVCBBUEkiPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPGphdmFkb2MgdXNlPSJ0cnVlIiBwcml2YXRlPSJ0cnVlIiBkZXN0ZGlyPSIke2phdmFkb2NkaXJ9IiBhdXRob3I9InRydWUiIHZlcnNpb249InRydWUiIHNvdXJjZXBhdGg9InNyYy9qYXZhIiBwYWNrYWdlbmFtZXM9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpldHR5LioiPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhZG9jPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJnZXQtZGVwcyIgdW5sZXNzPSJub2dldCIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWh0dHBjbGllbnQtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtaHR0cGNsaWVudC9qYXJzL2NvbW1vbnMtaHR0cGNsaWVudC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2pldHR5LTQuMi4zLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qZXR0eS9qYXJzL2pldHR5LTQuMi4zLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS10YWdzLWh0dHAtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamVsbHkvamFycy9jb21tb25zLWplbGx5LXRhZ3MtaHR0cC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3NlcnZsZXRhcGktMi4yLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9zZXJ2bGV0YXBpL2phcnMvc2VydmxldGFwaS0yLjIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamV4bC9qYXJzL2NvbW1vbnMtamV4bC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3htbC1hcGlzLTEuMC5iMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veG1sLWFwaXMvamFycy94bWwtYXBpcy0xLjAuYjIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWJlYW51dGlscy0xLjYuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtYmVhbnV0aWxzL2phcnMvY29tbW9ucy1iZWFudXRpbHMtMS42LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtY29sbGVjdGlvbnMvamFycy9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1sb2dnaW5nL2phcnMvY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vZG9tNGotMS41LWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vZG9tNGovamFycy9kb200ai0xLjUtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vamF4ZW4tMS4xLWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vamF4ZW4vamFycy9qYXhlbi0xLjEtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veGVyY2VzLTIuMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94ZXJjZXMvamFycy94ZXJjZXMtMi4yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qdW5pdC0zLjguMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vanVuaXQvamFycy9qdW5pdC0zLjguMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FudC0xLjUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC0xLjUuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtb3B0aW9uYWwtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtb3B0aW9uYWwtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtbWF2ZW4iPgotICAgIDxnZXQgZGVzdD0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBzcmM9IiR7cmVwb30vbWF2ZW4vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8dW5qYXIgZGVzdD0iJHttYXZlbi5ob21lfSIgc3JjPSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L3VuamFyPgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L21hdmVuLnhtbCBiL2plbGx5LXRhZ3MvamV0dHkvbWF2ZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yjg0NGExLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamV0dHkvbWF2ZW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImphdmE6amFyIj4KLQotICA8ZWNobz4KLVdhcm5pbmc6Ci1UaGlzIHRhZyBsaWJyYXJ5IHJlcXVpcmVzIEpESzEuNCBvciBKREsxLjMgd2l0aCBKU1NFIGluc3RhbGxlZCB0byBidWlsZC4KLVlvdSBhcmUgdXNpbmcgdmVyc2lvbiAke2phdmEudmVyc2lvbn0KLSAgPC9lY2hvPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3Byb2plY3QucHJvcGVydGllcyBiL2plbGx5LXRhZ3MvamV0dHkvcHJvamVjdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDE5Y2JjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamV0dHkvcHJvamVjdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMgCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQIFIgTyBKIEUgQyBUICBQIFIgTyBQIEUgUiBUIEkgRSBTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamV0dHkvcHJvamVjdC54bWwgYi9qZWxseS10YWdzL2pldHR5L3Byb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2ZmZmRmLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamV0dHkvcHJvamVjdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdD4KLSAgPGV4dGVuZD4ke2Jhc2VkaXJ9Ly4uL3RhZy1wcm9qZWN0LnhtbDwvZXh0ZW5kPgotICA8aWQ+Y29tbW9ucy1qZWxseS10YWdzLWpldHR5PC9pZD4KLSAgPG5hbWU+Y29tbW9ucy1qZWxseS10YWdzLWpldHR5PC9uYW1lPgotICA8Y3VycmVudFZlcnNpb24+MS4wPC9jdXJyZW50VmVyc2lvbj4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamV0dHk8L3BhY2thZ2U+Ci0gIDxkZXNjcmlwdGlvbj5UaGVzZSBhcmUgSmVsbHkgdGFncyB0aGF0IGNhbiBzZXQgdXAgYW4gaW4tcHJvY2VzcyB3ZWIgc2VydmVyLjwvZGVzY3JpcHRpb24+Ci0gIDxzaG9ydERlc2NyaXB0aW9uPkNvbW1vbnMgSmVsbHkgSmV0dHkgVGFnIExpYnJhcnk8L3Nob3J0RGVzY3JpcHRpb24+Ci0gIDx2ZXJzaW9ucz4KLSAgICA8dmVyc2lvbj4KLSAgICAgIDxpZD4xLjA8L2lkPgotICAgICAgPG5hbWU+MS4wPC9uYW1lPgotICAgICAgPHRhZz5DT01NT05TLUpFTExZLUpFVFRZLTFfMDwvdGFnPgotICAgIDwvdmVyc2lvbj4KLSAgPC92ZXJzaW9ucz4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDwhLS0gU1RBUlQgZm9yIGNvbXBpbGF0aW9uIC0tPgotICAgIDwhLS0gbWF5IG5lZWQgSkRLIDEuNCBvciBqc3NlIC0tPgotCi0gICAgPCEtLSBodHRwIHRhZ2xpYiAtLT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5jb21tb25zLWh0dHBjbGllbnQ8L2lkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5qZXR0eTwvaWQ+Ci0gICAgICA8dmVyc2lvbj40LjIuMzwvdmVyc2lvbj4KLSAgICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8Z3VtcC5wcm9qZWN0PmpldHR5NDwvZ3VtcC5wcm9qZWN0PgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8IS0tIEVORCBmb3IgY29tcGlsYXRpb24gLS0+Ci0KLSAgICA8IS0tIGZvciB0ZXN0aW5nIC0tPgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWplbGx5PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1qZWxseS10YWdzLWh0dHA8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDwhLS0gUEw6IENvbW1lbnRlZCBvdXQgYXMgaXQgbWlnaHQgYmUgdGhpcyBpcyBwYXJ0IG9mIEpESyAxLjQuLi4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5qc3NlPC9pZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC4zPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPmpzc2Uram5ldDwvaWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAuMzwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+IC0tPgotICAgIDwhLS0gRU5EIGZvciB0ZXN0aW5nIC0tPgotICAgIDwhLS0gZm9yIHJ1bnRpbWUgLS0+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5zZXJ2bGV0YXBpPC9pZD4KLSAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgIDx1cmw+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90b21jYXQvPC91cmw+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGd1bXAucHJvamVjdD5qYWthcnRhLXNlcnZsZXRhcGktNS1zZXJ2bGV0PC9ndW1wLnByb2plY3Q+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDwhLS0gRU5EIGZvciBydW50aW1lIC0tPgotCi0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qZXR0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZXR0eS9BYnN0cmFjdE1ldGhvZEhhbmRsZXJUYWcuamF2YSBiL2plbGx5LXRhZ3MvamV0dHkvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamV0dHkvQWJzdHJhY3RNZXRob2RIYW5kbGVyVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MjBmZTcuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qZXR0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZXR0eS9BYnN0cmFjdE1ldGhvZEhhbmRsZXJUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZXR0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKioKLSAqIEFuIGFic3RyYWN0IGJhc2UgdGFnIHRvIGRlY2xhcmUgYSBoYW5kbGVyIGZvciBhIHBhcnRpY3VsYXIgcmVxdWVzdCBtZXRob2QKLSAqIGluIGFuIGh0dHAgY29udGV4dCBpbiBhbiBodHRwIHNlcnZlcgotICoKLSAqIEBhdXRob3IgIHJ0bAotICogQHZlcnNpb24gJElkOiBBYnN0cmFjdE1ldGhvZEhhbmRsZXJUYWcuamF2YSx2IDEuMyAyMDAyLzA3LzE0IDEyOjM4OjIyIGRpb24gRXhwICQKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEFic3RyYWN0TWV0aG9kSGFuZGxlclRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIE92ZXJyaWRlIHRoaXMgdG8gcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBodHRwIG1ldGhvZCBoYW5kbGVkIGJ5IHRoaXMgdGFnICovCi0gICAgYWJzdHJhY3QgcHVibGljIFN0cmluZyBnZXRNZXRob2RIYW5kbGVkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIHRoZSB0YWcgZnVuY3Rpb25hbGl0eS4gSW4gdGhpcyBjYXNlLCBhZGQgYSBodHRwIG1ldGhvZCBoYW5kbGVyCi0gICAgICogdG8gdGhlIHBhcmVudCB0aGF0IGludm9rZXMgdGhlIHNjcmlwdCBpbiB0aGUgYm9keSBvZiB0aGlzIHRhZyB3aGVuCi0gICAgICogcHJvY2Vzc2luZyBhbiBodHRwIHJlcXVlc3QKLSAgICAgKgotICAgICAqIEBwYXJhbSB4bWxPdXRwdXQgd2hlcmUgdG8gc2VuZCBvdXRwdXQKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiB3aGVuIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCB4bWxPdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIEplbGx5UmVzb3VyY2VIYW5kbGVyVGFnIHBhcmVudFRhZyA9Ci0gICAgICAgICAgICAoSmVsbHlSZXNvdXJjZUhhbmRsZXJUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcygKLSAgICAgICAgICAgICAgICBKZWxseVJlc291cmNlSGFuZGxlclRhZy5jbGFzcyk7Ci0KLSAgICAgICAgaWYgKCBwYXJlbnRUYWcgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIjwiICsgZ2V0TWV0aG9kSGFuZGxlZCgpLnRvTG93ZXJDYXNlKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVxdWVzdD4gdGFnIG11c3QgYmUgZW5jbG9zZWQgaW5zaWRlIGEgPGplbGx5UmVzb3VyY2VIYW5kbGVyPiB0YWciICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZWdpc3RlciB0aGlzIHRhZyB3aXRoIHRoZSBodHRwIGhhbmRsZXIgZm9yIHRoZSBhcHByb3ByaWF0ZSBtZXRob2QKLSAgICAgICAgcGFyZW50VGFnLmdldEplbGx5UmVzb3VyY2VIdHRwSGFuZGxlcigpLnJlZ2lzdGVyVGFnKHRoaXMsIGdldE1ldGhvZEhhbmRsZWQoKSk7Ci0KLSAgICAgICAgLy8gTk9URSAtIGRvbid0IGludm9rZUJvZHkgaGVyZSBhcyB3ZSBvbmx5IHdhbnQgdG8gZG8gaXQgZHVyaW5nIGEgcmVxdWVzdAotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pldHR5L0RlbGV0ZVJlcXVlc3RUYWcuamF2YSBiL2plbGx5LXRhZ3MvamV0dHkvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamV0dHkvRGVsZXRlUmVxdWVzdFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2NiMDdlLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamV0dHkvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamV0dHkvRGVsZXRlUmVxdWVzdFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpldHR5OwotCi0KLS8qKgotICogUmVzcG9uZCB0byBhIERFTEVURSByZXF1ZXN0IHRvIGEgSmV0dHkgaHR0cCBzZXJ2ZXIKLSAqCi0gKiBAYXV0aG9yICBydGwKLSAqIEB2ZXJzaW9uICRJZDogRGVsZXRlUmVxdWVzdFRhZy5qYXZhLHYgMS4zIDIwMDIvMDcvMTQgMTI6Mzg6MjIgZGlvbiBFeHAgJAotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlUmVxdWVzdFRhZyBleHRlbmRzIEFic3RyYWN0TWV0aG9kSGFuZGxlclRhZyB7Ci0KLSAgICAvKiogcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBodHRwIG1ldGhvZCBoYW5kbGVkIGJ5IHRoaXMgdGFnICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXRob2RIYW5kbGVkKCkgewotICAgICAgICByZXR1cm4gIkRFTEVURSI7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pldHR5L0dldFJlcXVlc3RUYWcuamF2YSBiL2plbGx5LXRhZ3MvamV0dHkvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamV0dHkvR2V0UmVxdWVzdFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGY5OTczLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamV0dHkvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamV0dHkvR2V0UmVxdWVzdFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpldHR5OwotCi0vKioKLSAqIFJlc3BvbmQgdG8gYSBHRVQgcmVxdWVzdCB0byBhIEpldHR5IGh0dHAgc2VydmVyCi0gKgotICogQGF1dGhvciAgcnRsCi0gKiBAdmVyc2lvbiAkSWQ6IFB1dFJlcXVlc3RUYWcuamF2YSx2IDEuMyAyMDAyLzA3LzE0IDEyOjM4OjIyIGRpb24gRXhwICQKLSAqLwotcHVibGljIGNsYXNzIEdldFJlcXVlc3RUYWcgZXh0ZW5kcyBBYnN0cmFjdE1ldGhvZEhhbmRsZXJUYWcgewotCi0gICAgLyoqIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgaHR0cCBtZXRob2QgaGFuZGxlZCBieSB0aGlzIHRhZyAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kSGFuZGxlZCgpIHsKLSAgICAgICAgcmV0dXJuICJHRVQiOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qZXR0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZXR0eS9IdHRwQ29udGV4dFRhZy5qYXZhIGIvamVsbHktdGFncy9qZXR0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZXR0eS9IdHRwQ29udGV4dFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjA4YjdjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamV0dHkvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamV0dHkvSHR0cENvbnRleHRUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamV0dHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotaW1wb3J0IG9yZy5tb3J0YmF5Lmh0dHAuSHR0cENvbnRleHQ7Ci1pbXBvcnQgb3JnLm1vcnRiYXkuaHR0cC5IdHRwSGFuZGxlcjsKLWltcG9ydCBvcmcubW9ydGJheS5odHRwLlNlY3VyaXR5Q29uc3RyYWludDsKLWltcG9ydCBvcmcubW9ydGJheS5odHRwLlNlY3VyaXR5Q29uc3RyYWludC5BdXRoZW50aWNhdG9yOwotaW1wb3J0IG9yZy5tb3J0YmF5LnV0aWwuUmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci0KLS8qKgotICogRGVjbGFyZSBhIGNvbnRleHQgZm9yIGEgSmV0dHkgaHR0cCBzZXJ2ZXIKLSAqCi0gKiBAYXV0aG9yICBydGwKLSAqIEB2ZXJzaW9uICRJZDogSHR0cENvbnRleHRUYWcuamF2YSx2IDEuMyAyMDAyLzA3LzE0IDEyOjM4OjIyIGRpb24gRXhwICQKLSAqLwotcHVibGljIGNsYXNzIEh0dHBDb250ZXh0VGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogcGFyYW1ldGVyIHBhdGggd2l0aCBkZWZhdWx0Ki8KLSAgICBwcml2YXRlIFN0cmluZyBfY29udGV4dFBhdGggPSBKZXR0eUh0dHBTZXJ2ZXJUYWcuREVGQVVMVF9DT05URVhUX1BBVEg7Ci0KLSAgICAvKiogcGFyYW1ldGVyIHJlc291cmNlQmFzZSwgd2l0aCBkZWZhdWx0ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgX3Jlc291cmNlQmFzZSA9IEpldHR5SHR0cFNlcnZlclRhZy5ERUZBVUxUX1JFU09VUkNFX0JBU0U7Ci0KLSAgICAvKiogcGFyYW1ldGVyIHJlYWxtTmFtZSovCi0gICAgcHJpdmF0ZSBTdHJpbmcgX3JlYWxtTmFtZTsKLQotICAgIC8qKiB0aGUgYWN0dWFsIGNvbnRleHQgdGhpcyB0YWcgcmVmZXJzIHRvICovCi0gICAgcHJpdmF0ZSBIdHRwQ29udGV4dCBfY29udGV4dDsKLQotICAgIC8qKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEh0dHBDb250ZXh0VGFnICovCi0gICAgcHVibGljIEh0dHBDb250ZXh0VGFnKCkgewotICAgICAgICAvLyBjcmVhdGUgYW4gYWN0dWFsIGNvbnRleHQgZm9yIHRoaXMgdGFnCi0gICAgICAgIF9jb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybSB0aGUgdGFnIGZ1bmN0aW9uYWxpdHkuIEluIHRoaXMgY2FzZSwgc2V0dXAgdGhlIGNvbnRleHQgcGF0aAotICAgICAqIGFuZCByZXNvdXJjZSBiYXNlIGJlZm9yZSBhZGRpbmcgdGhlIGNvbnRleHQgdG8gdGhlIHBhcmVudCBzZXJ2ZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSB4bWxPdXRwdXQgd2hlcmUgdG8gc2VuZCBvdXRwdXQKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiB3aGVuIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCB4bWxPdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgSmV0dHlIdHRwU2VydmVyVGFnIGh0dHBzZXJ2ZXIgPSAoSmV0dHlIdHRwU2VydmVyVGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoCi0gICAgICAgICAgICBKZXR0eUh0dHBTZXJ2ZXJUYWcuY2xhc3MpOwotICAgICAgICBpZiAoIGh0dHBzZXJ2ZXIgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIjxodHRwQ29udGV4dD4gdGFnIG11c3QgYmUgZW5jbG9zZWQgaW5zaWRlIGEgPHNlcnZlcj4gdGFnIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWxsb3cgbmVzdGVkIHRhZ3MgZmlyc3QsIGUuZyBib2R5Ci0gICAgICAgIGludm9rZUJvZHkoeG1sT3V0cHV0KTsKLQotICAgICAgICBfY29udGV4dC5zZXRDb250ZXh0UGF0aChnZXRDb250ZXh0UGF0aCgpKTsKLQotICAgICAgICAvLyBjb252ZXJ0IHRoZSByZXNvdXJjZSBzdHJpbmcgdG8gYSBVUkwKLSAgICAgICAgLy8gKHRoaXMgbWFrZXMgVVJMJ3MgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBzY3JpcHQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSTCBiYXNlUmVzb3VyY2VVUkwgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2UoZ2V0UmVzb3VyY2VCYXNlKCkpOwotICAgICAgICAgICAgX2NvbnRleHQuc2V0QmFzZVJlc291cmNlKFJlc291cmNlLm5ld1Jlc291cmNlKGJhc2VSZXNvdXJjZVVSTCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobnVsbCAhPSBnZXRSZWFsbU5hbWUoKSkgewotICAgICAgICAgICAgX2NvbnRleHQuc2V0UmVhbG1OYW1lKGdldFJlYWxtTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICBodHRwc2VydmVyLmFkZENvbnRleHQoX2NvbnRleHQpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGFuIGh0dHAgaGFuZGxlciB0byB0aGUgY29udGV4dCBpbnN0YW5jZQotICAgICAqCi0gICAgICogQHBhcmFtIGhhbmRsZXIgdGhlIGhhbmRsZXIgdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSGFuZGxlcihIdHRwSGFuZGxlciBodHRIYW5kbGVyKSB7Ci0gICAgICAgIF9jb250ZXh0LmFkZEhhbmRsZXIoaHR0SGFuZGxlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgc2VjdXJpdHkgY29uc3RyYWludCBmb3IgdGhlIHNwZWNpZmllZCBwYXRoIHNwZWNpZmljYXRpb24KLSAgICAgKiB0byB0aGUgY29udGV4dCBpbnN0YW5jZQotICAgICAqCi0gICAgICogQHBhcmFtIHBhdGhTcGVjIHRoZSBwYXRoIHNwZWNpZmljYXRpb24gZm9yIHRoZSBzZWN1cml0eSBjb25zdHJhaW50Ci0gICAgICogQHBhcmFtIHNjIHRoZSBzZWN1cml0eSBjb25zdHJhaW50IHRvIGFkZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFNlY3VyaXR5Q29uc3RyYWludChTdHJpbmcgcGF0aFNwZWMsIFNlY3VyaXR5Q29uc3RyYWludCBzYykgewotICAgICAgICBfY29udGV4dC5hZGRTZWN1cml0eUNvbnN0cmFpbnQocGF0aFNwZWMsIHNjKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYW4gYXV0aGVudGljYXRvciB0byB0aGUgY29udGV4dCBpbnN0YW5jZQotICAgICAqCi0gICAgICogQHBhcmFtIGF1dGhlbnRpY2F0b3IgdGhlIGF1dGhlbnRpY2F0b3IgdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QXV0aGVudGljYXRvcihBdXRoZW50aWNhdG9yIGF1dGhlbnRpY2F0b3IpCi0gICAgewotICAgICAgICBfY29udGV4dC5zZXRBdXRoZW50aWNhdG9yKGF1dGhlbnRpY2F0b3IpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBQcm9wZXJ0eSBhY2Nlc3NvcnMvbXV0YXRvcnMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogR2V0dGVyIGZvciBwcm9wZXJ0eSBjb250ZXh0IHBhdGguCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHByb3BlcnR5IGNvbnRleHQgcGF0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRQYXRoKCkgewotICAgICAgICByZXR1cm4gX2NvbnRleHRQYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHRlciBmb3IgcHJvcGVydHkgY29udGV4dCBwYXRoLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhdGggTmV3IHJlc291cmNlQmFzZSBvZiBwcm9wZXJ0eSBjb250ZXh0IHBhdGguCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGV4dFBhdGgoU3RyaW5nIGNvbnRleHRQYXRoKSB7Ci0gICAgICAgIF9jb250ZXh0UGF0aCA9IGNvbnRleHRQYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHRlciBmb3IgcHJvcGVydHkgcmVzb3VyY2VCYXNlLgotICAgICAqCi0gICAgICogQHJldHVybiB2YWx1ZSBvZiBwcm9wZXJ0eSByZXNvdXJjZUJhc2UuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUJhc2UoKSB7Ci0gICAgICAgIHJldHVybiBfcmVzb3VyY2VCYXNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHRlciBmb3IgcHJvcGVydHkgcmVzb3VyY2VCYXNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc291cmNlQmFzZSBOZXcgdmFsdWUgb2YgcHJvcGVydHkgcmVzb3VyY2VCYXNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQmFzZShTdHJpbmcgcmVzb3VyY2VCYXNlKSB7Ci0gICAgICAgIF9yZXNvdXJjZUJhc2UgPSByZXNvdXJjZUJhc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0dGVyIGZvciBwcm9wZXJ0eSByZWFsbSBuYW1lLgotICAgICAqCi0gICAgICogQHJldHVybiB2YWx1ZSBvZiBwcm9wZXJ0eSByZWFsbSBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhbG1OYW1lKCkgewotICAgICAgICByZXR1cm4gX3JlYWxtTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgZm9yIHByb3BlcnR5IGNvbnRleHQgcGF0aC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXRoIE5ldyByZXNvdXJjZUJhc2Ugb2YgcHJvcGVydHkgY29udGV4dCBwYXRoLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlYWxtTmFtZShTdHJpbmcgcmVhbG1OYW1lKSB7Ci0gICAgICAgIF9yZWFsbU5hbWUgPSByZWFsbU5hbWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pldHR5L0plbGx5UmVzb3VyY2VIYW5kbGVyVGFnLmphdmEgYi9qZWxseS10YWdzL2pldHR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pldHR5L0plbGx5UmVzb3VyY2VIYW5kbGVyVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYTM4ODkuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qZXR0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZXR0eS9KZWxseVJlc291cmNlSGFuZGxlclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpldHR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLS8qKgotICogQSByZXNvdXJjZSBoYW5kbGVyIHRoYXQgdXNlcyBKZWxseSBzY3JpcHRzIHRvIHByb3ZpZGUgcmVzb3VyY2VzCi0gKiB0byBhIGNvbnRleHQgaW4gYSBKZXR0eSBodHRwIHNlcnZlcgotICoKLSAqIEBhdXRob3IgIHJ0bAotICogQHZlcnNpb24gJElkOiBKZWxseVJlc291cmNlSGFuZGxlclRhZy5qYXZhLHYgMS4zIDIwMDIvMDcvMTQgMTI6Mzg6MjIgZGlvbiBFeHAgJAotICovCi1wdWJsaWMgY2xhc3MgSmVsbHlSZXNvdXJjZUhhbmRsZXJUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgaHR0cCBoYW5kbGVyIHRoYXQgY2FsbHMgdGhlIGJvZHkgb2YgdGhlIHRhZy4gKi8KLSAgICBwcml2YXRlIEplbGx5UmVzb3VyY2VIdHRwSGFuZGxlciBfamVsbHlSZXNvdXJjZUh0dHBIYW5kbGVyOwotCi0gICAgLyoqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgSmVsbHlSZXNvdXJjZUhhbmRsZXJUYWcgKi8KLSAgICBwdWJsaWMgSmVsbHlSZXNvdXJjZUhhbmRsZXJUYWcoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybSB0aGUgdGFnIGZ1bmN0aW9uYWxpdHkuIEluIHRoaXMgY2FzZSwgYWRkIGFuIGh0dHAgaGFuZGxlcgotICAgICAqIHRvIHRoZSBwYXJlbnQgY29udGV4dCB0aGF0IHJ1bnMgdGhlIHNjcmlwdCBpbiB0aGUgYm9keSBvZiB0aGlzIHRhZwotICAgICAqCi0gICAgICogQHBhcmFtIHhtbE91dHB1dCB3aGVyZSB0byBzZW5kIG91dHB1dAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIHdoZW4gYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IHhtbE91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgSHR0cENvbnRleHRUYWcgaHR0cENvbnRleHQgPSAoSHR0cENvbnRleHRUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcygKLSAgICAgICAgICAgIEh0dHBDb250ZXh0VGFnLmNsYXNzKTsKLSAgICAgICAgaWYgKCBodHRwQ29udGV4dCA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCAiPGplbGx5UmVzb3VyY2VIYW5kbGVyPiB0YWcgbXVzdCBiZSBlbmNsb3NlZCBpbnNpZGUgYSA8aHR0cENvbnRleHQ+IHRhZyIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIF9qZWxseVJlc291cmNlSHR0cEhhbmRsZXIgPQotICAgICAgICAgICAgbmV3IEplbGx5UmVzb3VyY2VIdHRwSGFuZGxlcih4bWxPdXRwdXQpOwotCi0gICAgICAgIGh0dHBDb250ZXh0LmFkZEhhbmRsZXIoX2plbGx5UmVzb3VyY2VIdHRwSGFuZGxlcik7Ci0KLSAgICAgICAgLy8gcHJvY2VzcyBhbnkgY2hpbGQgbWV0aG9kIGhhbmRsZXJzCi0gICAgICAgIGludm9rZUJvZHkoeG1sT3V0cHV0KTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUHJvcGVydHkgYWNjZXNzb3JzL211dGF0b3JzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHJvdGVjdGVkIEplbGx5UmVzb3VyY2VIdHRwSGFuZGxlciBnZXRKZWxseVJlc291cmNlSHR0cEhhbmRsZXIoKSB7Ci0gICAgICAgIHJldHVybiBfamVsbHlSZXNvdXJjZUh0dHBIYW5kbGVyOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qZXR0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZXR0eS9KZWxseVJlc291cmNlSHR0cEhhbmRsZXIuamF2YSBiL2plbGx5LXRhZ3MvamV0dHkvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamV0dHkvSmVsbHlSZXNvdXJjZUh0dHBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkODFiMWQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qZXR0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZXR0eS9KZWxseVJlc291cmNlSHR0cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamV0dHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotaW1wb3J0IG9yZy5tb3J0YmF5Lmh0dHAuSHR0cEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcubW9ydGJheS5odHRwLkh0dHBSZXF1ZXN0OwotaW1wb3J0IG9yZy5tb3J0YmF5Lmh0dHAuSHR0cFJlc3BvbnNlOwotaW1wb3J0IG9yZy5tb3J0YmF5Lmh0dHAuaGFuZGxlci5BYnN0cmFjdEh0dHBIYW5kbGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEubGFuZy5TdHJpbmdCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGUgYWN0dWFsIGh0dHAgaGFuZGxlciBpbXBsZW1lbnRhdGlvbiBmb3IgYW4gaHR0cCBjb250ZXh0IGluIGFuIGh0dHAgc2VydmVyCi0gKgotICogQGF1dGhvciAgcnRsCi0gKiBAdmVyc2lvbiAkSWQ6IEplbGx5UmVzb3VyY2VIdHRwSGFuZGxlci5qYXZhLHYgMS4zIDIwMDIvMDcvMTQgMTI6Mzg6MjIgZGlvbiBFeHAgJAotICovCi1jbGFzcyBKZWxseVJlc291cmNlSHR0cEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEh0dHBIYW5kbGVyIHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKZWxseVJlc291cmNlSHR0cEhhbmRsZXIuY2xhc3MpOwotCi0gICAgLyoqIFRoZSBuYW1lIG9mIHRoZSB2YXIgdG8gY2hlY2sgaWYgc2V0SGFuZGxlZCBzaG91bGQgbm90IGJlIHNldCB0byB0cnVlIC4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1ZFUlJJREVfU0VUX0hBTkRMRURfVkFSID0gIm92ZXJyaWRlU2V0SGFuZGxlZCI7Ci0KLSAgICAvKiogVGhlIGxpc3Qgb2YgIHRhZ3MgcmVnaXN0ZXJlZCB0byBoYW5kbGUgYSByZXF1ZXN0IG1ldGhvZCAgKi8KLSAgICBwcml2YXRlIE1hcCBfdGFnTWFwOwotCi0gICAgLyoqIFRoZSBwbGFjZSB3aGVyZSB0byBvdXRwdXQgdGhlIHJlc3VsdHMgb2YgdGhlIHRhZyBib2R5ICovCi0gICAgcHJpdmF0ZSBYTUxPdXRwdXQgX3htbE91dHB1dDsKLQotICAgIC8qKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEplbGx5UmVzb3VyY2VIdHRwSGFuZGxlciAqLwotICAgIHB1YmxpYyBKZWxseVJlc291cmNlSHR0cEhhbmRsZXIoIFhNTE91dHB1dCB4bWxPdXRwdXQgKSB7Ci0gICAgICAgIF90YWdNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBfeG1sT3V0cHV0ID0geG1sT3V0cHV0OwotICAgIH0KLQotICAgIC8qCi0gICAgICogcmVnaXN0ZXIgdGhpcyB0YWcgYXMgdGhlIGhhbmRsZXIgZm9yIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFnIHRoZSB0YWcgdG8gYmUgcmVnaXN0ZXJlZAotICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIG5hbWUgb2YgdGhlIGh0dHAgbWV0aG9kIHdoaWNoIHRoaXMgdGFnIHByb2Nlc3NlcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyVGFnKFRhZyB0YWcsIFN0cmluZyBtZXRob2QpewotICAgICAgICBfdGFnTWFwLnB1dChtZXRob2QudG9Mb3dlckNhc2UoKSwgdGFnKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGhhbmRsZSBhbiBodHRwIHJlcXVlc3QKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXRoSW5Db250ZXh0IHRoZSBwYXRoIG9mIHRoZSBodHRwIHJlcXVlc3QKLSAgICAgKiBAcGFyYW0gcGF0aFBhcmFtcyB0aGUgcGFyYW1ldGVycyAoaWYgYW55KSBvZiB0aGUgaHR0cCByZXF1ZXN0Ci0gICAgICogQHBhcmFtIHJlcXVlc3QgdGhlIGFjdHVhbCBodHRwIHJlcXVlc3QKLSAgICAgKiBAcGFyYW0gcmVzcG9uc2UgdGhlIHBsYWNlIGZvciBhbnkgcmVzcG9uc2UKLSAgICAgKgotICAgICAqIEB0aHJvd3MgSHR0cEV4Y2VwdGlvbiB3aGVuIGFuIGVycm9yIG9jY3VycwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gd2hlbiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGUoU3RyaW5nIHBhdGhJbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICBIdHRwUmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICBIdHRwUmVzcG9uc2UgcmVzcG9uc2UpCi0gICAgICAgIHRocm93cyBIdHRwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgVGFnIGhhbmRsZXJUYWcgPSAoVGFnKSBfdGFnTWFwLmdldChyZXF1ZXN0LmdldE1ldGhvZCgpLnRvTG93ZXJDYXNlKCkpOwotICAgICAgICBpZiAobnVsbCAhPSBoYW5kbGVyVGFnKSB7Ci0gICAgICAgICAgICAvLyBzZXR1cCB0aGUgcGFyYW1ldGVycyBpbiB0aGUgamVsbHkgY29udGV4dAotICAgICAgICAgICAgSmVsbHlDb250ZXh0IGplbGx5Q29udGV4dCA9IGhhbmRsZXJUYWcuZ2V0Q29udGV4dCgpOwotICAgICAgICAgICAgamVsbHlDb250ZXh0LnNldFZhcmlhYmxlKCAicGF0aEluQ29udGV4dCIsIHBhdGhJbkNvbnRleHQpOwotICAgICAgICAgICAgamVsbHlDb250ZXh0LnNldFZhcmlhYmxlKCAicGF0aFBhcmFtcyIsIHBhdGhQYXJhbXMpOwotICAgICAgICAgICAgamVsbHlDb250ZXh0LnNldFZhcmlhYmxlKCAicmVxdWVzdCIsIHJlcXVlc3QpOwotICAgICAgICAgICAgamVsbHlDb250ZXh0LnNldFZhcmlhYmxlKCAicmVxdWVzdEJvZHkiLCBnZXRSZXF1ZXN0Qm9keShyZXF1ZXN0KSk7Ci0gICAgICAgICAgICBqZWxseUNvbnRleHQuc2V0VmFyaWFibGUoICJyZXNwb25zZSIsIHJlc3BvbnNlKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBoYW5kbGVyVGFnLmludm9rZUJvZHkoX3htbE91dHB1dCk7Ci0gICAgICAgICAgICAgICAgLy8gb25seSBjYWxsIHNldCBoYW5kbGVkIGlmIHRhZyBoYXMgbm90IHJlcXVlc3RlZCBhbiBvdmVycmlkZQotICAgICAgICAgICAgICAgIC8vIGlmIGl0IGhhcyByZXF1ZXN0ZWQgYW4gb3ZlcnJpZGUgdGhlbiByZXNldCB0aGUgcmVxdWVzdAotICAgICAgICAgICAgICAgIGlmIChudWxsID09IGplbGx5Q29udGV4dC5nZXRWYXJpYWJsZShPVkVSUklERV9TRVRfSEFORExFRF9WQVIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0SGFuZGxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuY29tbWl0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgamVsbHlDb250ZXh0LnJlbW92ZVZhcmlhYmxlKE9WRVJSSURFX1NFVF9IQU5ETEVEX1ZBUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4ICkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKEh0dHBSZXNwb25zZS5fXzUwMF9JbnRlcm5hbF9TZXJ2ZXJfRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGludm9raW5nIG1ldGhvZCBoYW5kbGVyIHRhZzogIiArIGV4LmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiTm8gaGFuZGxlciBmb3IgcmVxdWVzdDoiICsKLSAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiBwYXRoOiIgKwotICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldEh0dHBDb250ZXh0KCkuZ2V0Q29udGV4dFBhdGgoKSArCi0gICAgICAgICAgICAgICAgICAgICAgcGF0aEluQ29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0Qm9keShIdHRwUmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIC8vIHJlYWQgdGhlIGJvZHkgYXMgYSBzdHJpbmcgZnJvbSB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICAgIElucHV0U3RyZWFtIGlzID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpc3IpOwotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGNoYXJbXSBidWZmZXIgPSBuZXcgY2hhclsxMDI0XTsKLSAgICAgICAgaW50IGxlbjsKLQotICAgICAgICB3aGlsZSAoKGxlbiA9IGlzci5yZWFkKGJ1ZmZlciwgMCwgMTAyNCkpICE9IC0xKQotICAgICAgICAgIHNiLmFwcGVuZChidWZmZXIsIDAsIGxlbik7Ci0KLSAgICAgICAgaWYgKHNiLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pldHR5L0pldHR5SHR0cFNlcnZlclRhZy5qYXZhIGIvamVsbHktdGFncy9qZXR0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZXR0eS9KZXR0eUh0dHBTZXJ2ZXJUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZjMWZiNy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pldHR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pldHR5L0pldHR5SHR0cFNlcnZlclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZXR0eTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcubW9ydGJheS5odHRwLkh0dHBDb250ZXh0OwotaW1wb3J0IG9yZy5tb3J0YmF5Lmh0dHAuSHR0cExpc3RlbmVyOwotaW1wb3J0IG9yZy5tb3J0YmF5Lmh0dHAuSHR0cFNlcnZlcjsKLWltcG9ydCBvcmcubW9ydGJheS5odHRwLlNvY2tldExpc3RlbmVyOwotaW1wb3J0IG9yZy5tb3J0YmF5Lmh0dHAuVXNlclJlYWxtOwotaW1wb3J0IG9yZy5tb3J0YmF5Lmh0dHAuaGFuZGxlci5Ob3RGb3VuZEhhbmRsZXI7Ci1pbXBvcnQgb3JnLm1vcnRiYXkuaHR0cC5oYW5kbGVyLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcubW9ydGJheS51dGlsLkxvZzsKLWltcG9ydCBvcmcubW9ydGJheS51dGlsLk11bHRpRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5tb3J0YmF5LnV0aWwuT3V0cHV0U3RyZWFtTG9nU2luazsKLWltcG9ydCBvcmcubW9ydGJheS51dGlsLlJlc291cmNlOwotCi0vKioKLSAqIERlY2xhcmUgYW4gaW5zdGFuY2Ugb2YgYSBKZXR0eSBodHRwIHNlcnZlcgotICoKLSAqIEBhdXRob3IgIHJ0bAotICogQHZlcnNpb24gJElkOiBKZXR0eUh0dHBTZXJ2ZXJUYWcuamF2YSx2IDEuMyAyMDAyLzA3LzE0IDEyOjM4OjIyIGRpb24gRXhwICQKLSAqLwotcHVibGljIGNsYXNzIEpldHR5SHR0cFNlcnZlclRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIGRlZmF1bHQgcG9ydCB0byBjcmVhdGUgbGlzdGVuZXJzIGZvciAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUE9SVCA9IDgxMDA7Ci0KLSAgICAvKiogZGVmYXVsdCBob3N0IHRvIGNyZWF0ZSBsaXN0ZW5lcnMvY29udGV4dCBmb3IgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0hPU1QgPSAibG9jYWxob3N0IjsKLQotICAgIC8qKiBkZWZhdWx0IGNvbnRleHQgdG8gY3JlYXRlIGNvbnRleHQgZm9yICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT05URVhUX1BBVEggPSAiLyI7Ci0KLSAgICAvKiogZGVmYXVsdCByZXNvdXJjZSBiYXNlIHRvIHVzZSBmb3IgY29udGV4dCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUkVTT1VSQ0VfQkFTRSA9ICIuL2RvY1Jvb3QiOwotCi0gICAgLyoqIGRlZmF1bHQgbG9nIGZpbGUgZm9yIEpldHR5ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MT0dfRklMRSA9ICJqZXR0eS5sb2ciOwotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9Ci0gICAgICAgIExvZ0ZhY3RvcnkuZ2V0TG9nKEpldHR5SHR0cFNlcnZlclRhZy5jbGFzcyk7Ci0KLSAgICAvKiogdGhlIGxvZyBzaW5rIGZvciB0aGUgSmV0eSBzZXJ2ZXIgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBPdXRwdXRTdHJlYW1Mb2dTaW5rIF9sb2dTaW5rOwotCi0gICAgLy8gc3RhdGljIGluaXRpYWxpc2F0aW9uCi0gICAgewotICAgICAgICAvLyBzZXR1cCBhIGxvZyBmb3IgSmV0dHkgd2l0aCBhIGRlZmF1bHQgZmlsZW5hbWUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIF9sb2dTaW5rID0gbmV3IE91dHB1dFN0cmVhbUxvZ1NpbmsoREVGQVVMVF9MT0dfRklMRSk7Ci0gICAgICAgICAgICAvL19sb2dTaW5rLnN0YXJ0KCk7Ci0gICAgICAgICAgICBMb2cuaW5zdGFuY2UoKS5hZGQoX2xvZ1NpbmspOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXggKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZXguZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0YWcvIHZhcmlhYmxlIHRvIHN0b3JlIHJlc3VsdCBpbiAqLwotICAgIHByaXZhdGUgU3RyaW5nIF92YXI7Ci0KLSAgICAvKiogdGhlIGh0dHAgc2VydmVyIGZvciB0aGlzIHRhZyAqLwotICAgIHByaXZhdGUgSHR0cFNlcnZlciBfc2VydmVyOwotCi0gICAgLyoqIGZpbGVuYW1lIG9mIEpldHR5IGxvZyBmaWxlIC0gd2l0aCBkZWZhdWx0ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2xvZ0ZpbGVOYW1lID0gREVGQVVMVF9MT0dfRklMRTsKLQotICAgIC8qKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEpldHR5SHR0cFNlcnZlclRhZyAqLwotICAgIHB1YmxpYyBKZXR0eUh0dHBTZXJ2ZXJUYWcoKSB7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBzZXJ2ZXIKLSAgICAgICAgX3NlcnZlcj1uZXcgSHR0cFNlcnZlcigpOwotCi0gICAgICAgIC8vIHR1cm4gb2ZmIGFsaWFzIGNoZWNraW5nIGluIEpldHR5J3MgRmlsZVJlc291cmNlLAotICAgICAgICAvLyBzbyB0aGF0IHdlIGRvbid0IG5lZWQgZXhhY3QgY2FzZSBpbiByZXNvdXJjZSBuYW1lcwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoIm9yZy5tb3J0YmF5LnV0aWwuRmlsZVJlc291cmNlLmNoZWNrQWxpYXNlcyIsICJmYWxzZSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm0gdGhlIHRhZyBmdW5jdGlvbmFsaXR5LiBJbiB0aGlzIGNhc2UsIGNyZWF0ZSBhbiBodHRwIHNlcnZlciBhZnRlcgotICAgICAqIG1ha2luZyBzdXJlIHRoYXQgaXQgaGFzIGF0IGxlYXN0IG9uZSBjb250ZXh0IGFuZCBhc3NvY2lhdGVkIGh0dHAgaGFuZGxlciwKLSAgICAgKiBjcmVhdGluZyBkZWZhdWx0cyBpZiBpdCBkb2Vzbid0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sT3V0cHV0IHdoZXJlIHRvIHNlbmQgb3V0cHV0Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24gd2hlbiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgeG1sT3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVUkwgbG9nRmlsZVVSTCA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZShnZXRMb2dGaWxlTmFtZSgpKTsKLSAgICAgICAgICAgIF9sb2dTaW5rLnNldEZpbGVuYW1lKGxvZ0ZpbGVVUkwuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIF9sb2dTaW5rLnN0YXJ0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCApIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihleC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWxsb3cgbmVzdGVkIHRhZ3MgZmlyc3QsIGUuZyBib2R5Ci0gICAgICAgIGludm9rZUJvZHkoeG1sT3V0cHV0KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gaWYgbm8gbGlzdGVuZXJzIGNyZWF0ZSBhIGRlZmF1bHQgcG9ydCBsaXN0ZW5lcgotICAgICAgICAgICAgaWYgKF9zZXJ2ZXIuZ2V0TGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICBTb2NrZXRMaXN0ZW5lciBsaXN0ZW5lcj1uZXcgU29ja2V0TGlzdGVuZXIoKTsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci5zZXRQb3J0KERFRkFVTFRfUE9SVCk7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXIuc2V0SG9zdChERUZBVUxUX0hPU1QpOwotICAgICAgICAgICAgICAgIF9zZXJ2ZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBpZiBubyBjb250ZXh0L3MgY3JlYXRlIGEgZGVmYXVsdCBjb250ZXh0Ci0gICAgICAgICAgICBpZiAoX3NlcnZlci5nZXRDb250ZXh0cygpLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oIkNyZWF0aW5nIGEgZGVmYXVsdCBjb250ZXh0Iik7Ci0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgY29udGV4dAotICAgICAgICAgICAgICAgIEh0dHBDb250ZXh0IGNvbnRleHQgPSBfc2VydmVyLmdldENvbnRleHQoREVGQVVMVF9IT1NULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0NPTlRFWFRfUEFUSCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBTZXJ2ZSBzdGF0aWMgY29udGVudCBmcm9tIHRoZSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgVVJMIGJhc2VSZXNvdXJjZVVSTCA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZShERUZBVUxUX1JFU09VUkNFX0JBU0UpOwotICAgICAgICAgICAgICAgIFJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2UubmV3UmVzb3VyY2UoYmFzZVJlc291cmNlVVJMKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEJhc2VSZXNvdXJjZShyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgX3NlcnZlci5hZGRDb250ZXh0KGNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIHRoYXQgYWxsIHRoZSBjb250ZXh0cyBoYXZlIGF0IGxlYXN0IG9uZSBoYW5kbGVyCi0gICAgICAgIC8vIGlmIG5vdCB0aGVuIGFkZCBhIGRlZmF1bHQgcmVzb3VyY2UgaGFuZGxlciBhbmQgYSBub3QgZm91bmQgaGFuZGxlcgotICAgICAgICBIdHRwQ29udGV4dFtdIGFsbENvbnRleHRzID0gX3NlcnZlci5nZXRDb250ZXh0cygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbENvbnRleHRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBIdHRwQ29udGV4dCBjdXJyQ29udGV4dCA9IGFsbENvbnRleHRzW2ldOwotICAgICAgICAgICAgaWYgKGN1cnJDb250ZXh0LmdldEhhbmRsZXJzKCkubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiQWRkaW5nIHJlc291cmNlIGFuZCBub3QgZm91bmQgaGFuZGxlcnMgdG8gY29udGV4dDoiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpKTsKLSAgICAgICAgICAgICAgICBjdXJyQ29udGV4dC5hZGRIYW5kbGVyKG5ldyBSZXNvdXJjZUhhbmRsZXIoKSk7Ci0gICAgICAgICAgICAgICAgY3VyckNvbnRleHQuYWRkSGFuZGxlcihuZXcgTm90Rm91bmRIYW5kbGVyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU3RhcnQgdGhlIGh0dHAgc2VydmVyCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBfc2VydmVyLnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE11bHRpRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCB2YXJpYWJsZSB0byB2YWx1ZSBpZiByZXF1aXJlZAotICAgICAgICBpZiAoZ2V0VmFyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnNldFZhcmlhYmxlKGdldFZhcigpLCBfc2VydmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhbiBodHRwIGxpc3RlbmVyIHRvIHRoZSBzZXJ2ZXIgaW5zdGFuY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSHR0cExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIF9zZXJ2ZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhbiBodHRwIGNvbnRleHQgdG8gdGhlIHNlcnZlciBpbnN0YW5jZQotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ29udGV4dChIdHRwQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIF9zZXJ2ZXIuYWRkQ29udGV4dChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAvKioKLSAgICAgKiBBZGQgYSB1c2VyIGF1dGhlbnRpY2F0aW9uIHJlYWxtIHRvIHRoZSBzZXJ2ZXIgaW5zdGFuY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSByZWFsbSB0aGUgcmVhbG0gdG8gYWRkCi0gICAgICogQHJldHVybiB0aGUgcmVhbG0gYWRkZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVXNlclJlYWxtIGFkZFJlYWxtKFVzZXJSZWFsbSByZWFsbSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc2VydmVyLmFkZFJlYWxtKHJlYWxtKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUHJvcGVydHkgYWNjZXNzb3JzL211dGF0b3JzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogR2V0dGVyIGZvciBwcm9wZXJ0eSB2YXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHByb3BlcnR5IHZhci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhcigpIHsKLSAgICAgICAgcmV0dXJuIF92YXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciBwcm9wZXJ0eSB2YXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFyIE5ldyB2YWx1ZSBvZiBwcm9wZXJ0eSB2YXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgX3ZhciA9IHZhcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIHByb3BlcnR5IGxvZ0ZpbGVOYW1lLgotICAgICAqCi0gICAgICogQHJldHVybiBWYWx1ZSBvZiBwcm9wZXJ0eSBsb2dGaWxlTmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvZ0ZpbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gX2xvZ0ZpbGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHRlciBmb3IgcHJvcGVydHkgbG9nRmlsZU5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbG9nRmlsZU5hbWUgTmV3IHZhbHVlIG9mIHByb3BlcnR5IGxvZ0ZpbGVOYW1lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvZ0ZpbGVOYW1lKFN0cmluZyBsb2dGaWxlTmFtZSkgewotICAgICAgICBfbG9nRmlsZU5hbWUgPSBsb2dGaWxlTmFtZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamV0dHkvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamV0dHkvSmV0dHlUYWdMaWJyYXJ5LmphdmEgYi9qZWxseS10YWdzL2pldHR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pldHR5L0pldHR5VGFnTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDUyMGJjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamV0dHkvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamV0dHkvSmV0dHlUYWdMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamV0dHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ0xpYnJhcnk7Ci0KLS8qKgotICogQSBzZXQgb2YgamVsbHkgdGFncyBmb3IgaW5zdGFudGlhdGluZyBhIEpldHR5IEhUVFAgc2VydmVyCi0gKgotICogQGF1dGhvciBydGwKLSAqIEB2ZXJzaW9uICRJZDogSmV0dHlUYWdMaWJyYXJ5LmphdmEsdiAxLjEgMjAwMi8wNy8xNCAxMzowNToxNCBkaW9uIEV4cCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBKZXR0eVRhZ0xpYnJhcnkgZXh0ZW5kcyBUYWdMaWJyYXJ5IHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgTGF0a2FUYWdMaWJyYXJ5Ci0gICAgICovCi0gICAgcHVibGljIEpldHR5VGFnTGlicmFyeSgpIHsKLQotICAgICAgICByZWdpc3RlclRhZygiamV0dHlIdHRwU2VydmVyIiwgSmV0dHlIdHRwU2VydmVyVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInNvY2tldExpc3RlbmVyIiwgU29ja2V0TGlzdGVuZXJUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygicmVhbG0iLCBSZWFsbVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJodHRwQ29udGV4dCIsIEh0dHBDb250ZXh0VGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInJlc291cmNlSGFuZGxlciIsIFJlc291cmNlSGFuZGxlclRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJub3RGb3VuZEhhbmRsZXIiLCBOb3RGb3VuZEhhbmRsZXJUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygic2VjdXJpdHlIYW5kbGVyIiwgU2VjdXJpdHlIYW5kbGVyVGFnLmNsYXNzKTsKLQotICAgICAgICByZWdpc3RlclRhZygiamVsbHlSZXNvdXJjZUhhbmRsZXIiLCBKZWxseVJlc291cmNlSGFuZGxlclRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJnZXRSZXF1ZXN0IiwgR2V0UmVxdWVzdFRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJwb3N0UmVxdWVzdCIsIFBvc3RSZXF1ZXN0VGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInB1dFJlcXVlc3QiLCBQdXRSZXF1ZXN0VGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImRlbGV0ZVJlcXVlc3QiLCBEZWxldGVSZXF1ZXN0VGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInJlc3BvbnNlSGVhZGVyIiwgUmVzcG9uc2VIZWFkZXJUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygicmVzcG9uc2VCb2R5IiwgUmVzcG9uc2VCb2R5VGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInJlc3BvbnNlQ29kZSIsIFJlc3BvbnNlQ29kZVRhZy5jbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBUYWdMaWJhcmFyeSNnZXRUYWdDbGFzc2VzKCkKLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBNYXAgb2YgdGFnIG5hbWUgdG8gdGFnIGNsYXNzCi0gICAgICovCi0gICAgcHVibGljIE1hcCBnZXRUYWdDbGFzc2VzKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VGFnQ2xhc3NlcygpOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pldHR5L05vdEZvdW5kSGFuZGxlclRhZy5qYXZhIGIvamVsbHktdGFncy9qZXR0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZXR0eS9Ob3RGb3VuZEhhbmRsZXJUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwN2VlNC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pldHR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pldHR5L05vdEZvdW5kSGFuZGxlclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpldHR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLm1vcnRiYXkuaHR0cC5oYW5kbGVyLk5vdEZvdW5kSGFuZGxlcjsKLQotLyoqCi0gKiBEZWNsYXJlIGEgbm90IGZvdW5kIHJlc291cmNlIGhhbmRsZXIgZm9yIGEgSmV0dHkgaHR0cCBzZXJ2ZXIKLSAqCi0gKiBAYXV0aG9yICBydGwKLSAqIEB2ZXJzaW9uICRJZDogTm90Rm91bmRIYW5kbGVyVGFnLmphdmEsdiAxLjMgMjAwMi8wNy8xNCAxMjozODoyMiBkaW9uIEV4cCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3RGb3VuZEhhbmRsZXJUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIE5vdEZvdW5kSGFuZGxlclRhZyAqLwotICAgIHB1YmxpYyBOb3RGb3VuZEhhbmRsZXJUYWcoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybSB0aGUgdGFnIGZ1bmN0aW9uYWxpdHkuIEluIHRoaXMgY2FzZSwgYWRkIGEgcmVzb3VyY2UgaGFuZGxlcgotICAgICAqIHRvIHRoZSBwYXJlbnQgY29udGV4dCwgc2V0dGluZyB0aGUgYWxsb3dlZCBtZXRob2RzIGlmIHJlcXVpcmVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sT3V0cHV0IHdoZXJlIHRvIHNlbmQgb3V0cHV0Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24gd2hlbiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgeG1sT3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBIdHRwQ29udGV4dFRhZyBodHRwQ29udGV4dCA9IChIdHRwQ29udGV4dFRhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKAotICAgICAgICAgICAgSHR0cENvbnRleHRUYWcuY2xhc3MpOwotICAgICAgICBpZiAoIGh0dHBDb250ZXh0ID09IG51bGwgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICI8bm90Rm91bmRIYW5kbGVyPiB0YWcgbXVzdCBiZSBlbmNsb3NlZCBpbnNpZGUgYSA8aHR0cENvbnRleHQ+IHRhZyIgKTsKLSAgICAgICAgfQotICAgICAgICBOb3RGb3VuZEhhbmRsZXIgbm90Rm91bmRIYW5kbGVyID0gbmV3IE5vdEZvdW5kSGFuZGxlcigpOwotICAgICAgICBodHRwQ29udGV4dC5hZGRIYW5kbGVyKG5vdEZvdW5kSGFuZGxlcik7Ci0gICAgICAgIGludm9rZUJvZHkoeG1sT3V0cHV0KTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUHJvcGVydHkgYWNjZXNzb3JzL211dGF0b3JzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pldHR5L1Bvc3RSZXF1ZXN0VGFnLmphdmEgYi9qZWxseS10YWdzL2pldHR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pldHR5L1Bvc3RSZXF1ZXN0VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMjMyZTguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qZXR0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZXR0eS9Qb3N0UmVxdWVzdFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpldHR5OwotCi0vKioKLSAqIFJlc3BvbmQgdG8gYSBQT1NUIHJlcXVlc3QgdG8gYSBKZXR0eSBodHRwIHNlcnZlcgotICoKLSAqIEBhdXRob3IgIHJ0bAotICogQHZlcnNpb24gJElkOiBQdXRSZXF1ZXN0VGFnLmphdmEsdiAxLjMgMjAwMi8wNy8xNCAxMjozODoyMiBkaW9uIEV4cCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3N0UmVxdWVzdFRhZyBleHRlbmRzIEFic3RyYWN0TWV0aG9kSGFuZGxlclRhZyB7Ci0KLSAgICAvKiogcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBodHRwIG1ldGhvZCBoYW5kbGVkIGJ5IHRoaXMgdGFnICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXRob2RIYW5kbGVkKCkgewotICAgICAgICByZXR1cm4gIlBPU1QiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamV0dHkvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamV0dHkvUHV0UmVxdWVzdFRhZy5qYXZhIGIvamVsbHktdGFncy9qZXR0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZXR0eS9QdXRSZXF1ZXN0VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NTk4OWYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qZXR0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZXR0eS9QdXRSZXF1ZXN0VGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamV0dHk7Ci0KLS8qKgotICogUmVzcG9uZCB0byBhIFBVVCByZXF1ZXN0IHRvIGEgSmV0dHkgaHR0cCBzZXJ2ZXIKLSAqCi0gKiBAYXV0aG9yICBydGwKLSAqIEB2ZXJzaW9uICRJZDogUHV0UmVxdWVzdFRhZy5qYXZhLHYgMS4zIDIwMDIvMDcvMTQgMTI6Mzg6MjIgZGlvbiBFeHAgJAotICovCi0vKiogQSB0YWcgZm9yIHRoZSBodHRwIFBVVCBtZXRob2QgKi8KLXB1YmxpYyBjbGFzcyBQdXRSZXF1ZXN0VGFnIGV4dGVuZHMgQWJzdHJhY3RNZXRob2RIYW5kbGVyVGFnIHsKLQotICAgIC8qKiByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGh0dHAgbWV0aG9kIGhhbmRsZWQgYnkgdGhpcyB0YWcgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZEhhbmRsZWQoKSB7Ci0gICAgICAgIHJldHVybiAiUFVUIjsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamV0dHkvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamV0dHkvUmVhbG1UYWcuamF2YSBiL2plbGx5LXRhZ3MvamV0dHkvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamV0dHkvUmVhbG1UYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU2NzhhNS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pldHR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pldHR5L1JlYWxtVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpldHR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLWltcG9ydCBvcmcubW9ydGJheS5odHRwLkhhc2hVc2VyUmVhbG07Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBEZWNsYXJlIGEgdXNlciByZWFsbSBmb3IgYSBKZXR0eSBodHRwIHNlcnZlcgotICoKLSAqIEBhdXRob3IgIHJ0bAotICogQHZlcnNpb24gJElkOiBSZWFsbVRhZy5qYXZhLHYgMS4zIDIwMDIvMDcvMTQgMTI6Mzg6MjIgZGlvbiBFeHAgJAotICovCi1wdWJsaWMgY2xhc3MgUmVhbG1UYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBwYXJhbWV0ZXIgbmFtZSB3aXRoIGRlZmF1bHQqLwotICAgIHByaXZhdGUgU3RyaW5nIF9uYW1lOwotCi0gICAgLyoqIHBhcmFtZXRlciBjb25maWcsIHdpdGggZGVmYXVsdCAqLwotICAgIHByaXZhdGUgU3RyaW5nIF9jb25maWc7Ci0KLSAgICAvKiogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBSZWFsbVRhZyAqLwotICAgIHB1YmxpYyBSZWFsbVRhZygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIHRoZSB0YWcgZnVuY3Rpb25hbGl0eS4gSW4gdGhpcyBjYXNlLCBhZGQgYSByZWFsbSB3aXRoIHRoZQotICAgICAqIHNwZWNpZmllZCBuYW1lIHVzaW5nIHRoZSBzcGVjaWZpZWQgY29uZmlnIChwcmVwZXJ0aWVzKSBmaWxlIHRvIHRoZQotICAgICAqIHBhcmVudCBzZXJ2ZXIsCi0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sT3V0cHV0IHdoZXJlIHRvIHNlbmQgb3V0cHV0Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24gd2hlbiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgeG1sT3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBKZXR0eUh0dHBTZXJ2ZXJUYWcgaHR0cHNlcnZlciA9IChKZXR0eUh0dHBTZXJ2ZXJUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcygKLSAgICAgICAgICAgIEpldHR5SHR0cFNlcnZlclRhZy5jbGFzcyk7Ci0gICAgICAgIGlmICggaHR0cHNlcnZlciA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCAiPHJlYWxtPiB0YWcgbXVzdCBiZSBlbmNsb3NlZCBpbnNpZGUgYSA8c2VydmVyPiB0YWciICk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG51bGwgPT0gZ2V0TmFtZSgpIHx8IG51bGwgPT0gZ2V0Q29uZmlnKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIjxyZWFsbT4gdGFnIG11c3QgaGF2ZSBhIG5hbWUgYW5kIGEgY29uZmlnIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29udmVydCB0aGUgY29uZmlnIHN0cmluZyB0byBhIFVSTAotICAgICAgICAvLyAodGhpcyBtYWtlcyBVUkwncyByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHNjcmlwdAotICAgICAgICB0cnkgewotICAgICAgICAgICAgVVJMIGNvbmZpZ1VSTCA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZShnZXRDb25maWcoKSk7Ci0gICAgICAgICAgICBodHRwc2VydmVyLmFkZFJlYWxtKCBuZXcgSGFzaFVzZXJSZWFsbShnZXROYW1lKCksIGNvbmZpZ1VSTC50b1N0cmluZygpICkgKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW52b2tlQm9keSh4bWxPdXRwdXQpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBQcm9wZXJ0eSBhY2Nlc3NvcnMvbXV0YXRvcnMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIHByb3BlcnR5IG5hbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHByb3BlcnR5IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gX25hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciBwcm9wZXJ0eSBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgTmV3IHZhbHVlIG9mIHByb3BlcnR5IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBfbmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0dGVyIGZvciBwcm9wZXJ0eSBjb25maWcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHByb3BlcnR5IGNvbmZpZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbmZpZygpIHsKLSAgICAgICAgcmV0dXJuIF9jb25maWc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciBwcm9wZXJ0eSBjb25maWcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlnIE5ldyB2YWx1ZSBvZiBwcm9wZXJ0eSBjb25maWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlnKFN0cmluZyBjb25maWcpIHsKLSAgICAgICAgX2NvbmZpZyA9IGNvbmZpZzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamV0dHkvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamV0dHkvUmVzb3VyY2VIYW5kbGVyVGFnLmphdmEgYi9qZWxseS10YWdzL2pldHR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pldHR5L1Jlc291cmNlSGFuZGxlclRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGUwMzBlLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamV0dHkvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamV0dHkvUmVzb3VyY2VIYW5kbGVyVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamV0dHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotaW1wb3J0IG9yZy5tb3J0YmF5Lmh0dHAuaGFuZGxlci5SZXNvdXJjZUhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIERlY2xhcmUgYSBzdGF0aWMgZmlsZSByZXNvdXJjZSBoYW5kbGVyIGZvciBhIEpldHR5IGh0dHAgc2VydmVyCi0gKgotICogQGF1dGhvciAgcnRsCi0gKiBAdmVyc2lvbiAkSWQ6IFJlc291cmNlSGFuZGxlclRhZy5qYXZhLHYgMS4zIDIwMDIvMDcvMTQgMTI6Mzg6MjIgZGlvbiBFeHAgJAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VIYW5kbGVyVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogcGFyYW1ldGVyIGFsbG93ZWQgbWV0aG9kcyAqLwotICAgIHByaXZhdGUgU3RyaW5nIF9hbGxvd2VkTWV0aG9kczsKLQotICAgIC8qKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFJlc291cmNlSGFuZGxlclRhZyAqLwotICAgIHB1YmxpYyBSZXNvdXJjZUhhbmRsZXJUYWcoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybSB0aGUgdGFnIGZ1bmN0aW9uYWxpdHkuIEluIHRoaXMgY2FzZSwgYWRkIGEgcmVzb3VyY2UgaGFuZGxlcgotICAgICAqIHRvIHRoZSBwYXJlbnQgY29udGV4dCwgc2V0dGluZyB0aGUgYWxsb3dlZCBtZXRob2RzIGlmIHJlcXVpcmVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sT3V0cHV0IHdoZXJlIHRvIHNlbmQgb3V0cHV0Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24gd2hlbiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgeG1sT3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBIdHRwQ29udGV4dFRhZyBodHRwQ29udGV4dCA9IChIdHRwQ29udGV4dFRhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKAotICAgICAgICAgICAgSHR0cENvbnRleHRUYWcuY2xhc3MpOwotICAgICAgICBpZiAoIGh0dHBDb250ZXh0ID09IG51bGwgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICI8cmVzb3VyY2VIYW5kbGVyPiB0YWcgbXVzdCBiZSBlbmNsb3NlZCBpbnNpZGUgYSA8aHR0cENvbnRleHQ+IHRhZyIgKTsKLSAgICAgICAgfQotICAgICAgICBSZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyID0gbmV3IFJlc291cmNlSGFuZGxlcigpOwotICAgICAgICBpZiAoZ2V0QWxsb3dlZE1ldGhvZHMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBzcGxpdCBjb21tYS1zZXBhcmF0ZWQgbGlzdCB1cCBpbnRvIHRva2VucyBhbmQgY29udmVydCB0byBhbiBhcnJheQotICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9Ci0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1Rva2VuaXplciggZ2V0QWxsb3dlZE1ldGhvZHMoKSwgIiAsIiApOwotICAgICAgICAgICAgU3RyaW5nW10gYWxsb3dlZE1ldGhvZHMgPSBuZXcgU3RyaW5nW3Rva2VuaXplci5jb3VudFRva2VucygpXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsb3dlZE1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBhbGxvd2VkTWV0aG9kc1tpXSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc291cmNlSGFuZGxlci5zZXRBbGxvd2VkTWV0aG9kcyhhbGxvd2VkTWV0aG9kcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaHR0cENvbnRleHQuYWRkSGFuZGxlcihyZXNvdXJjZUhhbmRsZXIpOwotICAgICAgICBpbnZva2VCb2R5KHhtbE91dHB1dCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFByb3BlcnR5IGFjY2Vzc29ycy9tdXRhdG9ycwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEdldHRlciBmb3IgcHJvcGVydHkgYWxsb3dlZE1ldGhvZHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHByb3BlcnR5IGFsbG93ZWRNZXRob2RzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxsb3dlZE1ldGhvZHMoKSB7Ci0gICAgICAgIHJldHVybiBfYWxsb3dlZE1ldGhvZHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciBwcm9wZXJ0eSBhbGxvd2VkTWV0aG9kcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhbGxvd2VkTWV0aG9kcyBDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBhbGxvd2VkIG1ldGhvZHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWxsb3dlZE1ldGhvZHMoU3RyaW5nIGFsbG93ZWRNZXRob2RzKSB7Ci0gICAgICAgIF9hbGxvd2VkTWV0aG9kcyA9IGFsbG93ZWRNZXRob2RzOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pldHR5L1Jlc3BvbnNlQm9keVRhZy5qYXZhIGIvamVsbHktdGFncy9qZXR0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZXR0eS9SZXNwb25zZUJvZHlUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U2YTRjNS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pldHR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pldHR5L1Jlc3BvbnNlQm9keVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpldHR5OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi1pbXBvcnQgb3JnLm1vcnRiYXkuaHR0cC5IdHRwUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLm1vcnRiYXkudXRpbC5CeXRlQXJyYXlJU084ODU5V3JpdGVyOwotCi0vKioKLSAqIFNldCB0aGUgcmVzcG9uc2UgYm9keSBpbiBhIHJlc3BvbnNlIGhhbmRsZXIgZm9yIGEgSmV0dHkgaHR0cCBzZXJ2ZXIKLSAqCi0gKiBAYXV0aG9yICBydGwKLSAqLwotcHVibGljIGNsYXNzIFJlc3BvbnNlQm9keVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybSB0aGUgdGFnIGZ1bmN0aW9uYWxpdHkuIEluIHRoaXMgY2FzZSwgc2V0IHRoZSBib2R5IG9mIGEKLSAgICAgKiBodHRwIHJlc3BvbnNlIGZvdW5kIGluIHRoZSBqZWxseSBjb250ZXh0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sT3V0cHV0IHdoZXJlIHRvIHNlbmQgb3V0cHV0Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24gd2hlbiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgeG1sT3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotCi0gICAgICAgIC8vIGdldCB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgY29udGV4dAotICAgICAgICBIdHRwUmVzcG9uc2UgaHR0cFJlc3BvbnNlID0gKEh0dHBSZXNwb25zZSkgZ2V0Q29udGV4dCgpLmdldFZhcmlhYmxlKCJyZXNwb25zZSIpOwotICAgICAgICBpZiAobnVsbCA9PSBodHRwUmVzcG9uc2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiSHR0cFJlc3BvbnNlIHZhcmlhYmxlIG5vdCBhdmFpbGFibGUgaW4gSmVsbHkgY29udGV4dCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQnl0ZUFycmF5SVNPODg1OVdyaXRlciB3cml0ZXIgPSBuZXcgQnl0ZUFycmF5SVNPODg1OVdyaXRlcigxNTAwKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICB3cml0ZXIud3JpdGUoZ2V0Qm9keVRleHQoKSk7Ci0gICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgICAgICAgaHR0cFJlc3BvbnNlLnNldENvbnRlbnRMZW5ndGgod3JpdGVyLnNpemUoKSk7Ci0gICAgICAgICAgICAgd3JpdGVyLndyaXRlVG8oaHR0cFJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pldHR5L1Jlc3BvbnNlQ29kZVRhZy5qYXZhIGIvamVsbHktdGFncy9qZXR0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZXR0eS9SZXNwb25zZUNvZGVUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM4MWJmMC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pldHR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pldHR5L1Jlc3BvbnNlQ29kZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpldHR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLWltcG9ydCBvcmcubW9ydGJheS5odHRwLkh0dHBSZXNwb25zZTsKLQotLyoqCi0gKiBTZXQgdGhlIHJlc3BvbnNlIGNvZGUgaW4gdGhlIHJlcXVlc3QgaGFuZGxlciBvZiBhIEpldHR5IGh0dHAgc2VydmVyCi0gKgotICogQGF1dGhvciAgcnRsCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNwb25zZUNvZGVUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBwYXJhbWV0ZXIgdmFsdWUgKi8KLSAgICBwcml2YXRlIGludCBfdmFsdWU7Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIHRoZSB0YWcgZnVuY3Rpb25hbGl0eS4gSW4gdGhpcyBjYXNlLCBzZXQgdGhlIHJlc3BvbnNlIGNvZGUgaW4gdGhlCi0gICAgICogaHR0cCByZXNwb25zZSBmb3VuZCBpbiB0aGUgamVsbHkgY29udGV4dAotICAgICAqCi0gICAgICogQHBhcmFtIHhtbE91dHB1dCB3aGVyZSB0byBzZW5kIG91dHB1dAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIHdoZW4gYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IHhtbE91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoZ2V0VmFsdWUoKSA8PSAxMDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiPHJlc3BvbnNlQ29kZT4gdGFnIG11c3QgaGF2ZSBhIHZhbHVlIG9mIGF0IGxlYXN0IDEwMCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSByZXNwb25zZSBmcm9tIHRoZSBjb250ZXh0Ci0gICAgICAgIEh0dHBSZXNwb25zZSBodHRwUmVzcG9uc2UgPSAoSHR0cFJlc3BvbnNlKSBnZXRDb250ZXh0KCkuZ2V0VmFyaWFibGUoInJlc3BvbnNlIik7Ci0gICAgICAgIGlmIChudWxsID09IGh0dHBSZXNwb25zZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJIdHRwUmVzcG9uc2UgdmFyaWFibGUgbm90IGF2YWlsYWJsZSBpbiBKZWxseSBjb250ZXh0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgcmVzcG9uc2UgY29kZQotICAgICAgICBodHRwUmVzcG9uc2Uuc2V0U3RhdHVzKGdldFZhbHVlKCkpOwotCi0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFByb3BlcnR5IGFjY2Vzc29ycy9tdXRhdG9ycwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEdldHRlciBmb3IgcHJvcGVydHkgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHByb3BlcnR5IHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBfdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciBwcm9wZXJ0eSB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBOZXcgdmFsdWUgb2YgcHJvcGVydHkgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoaW50IHZhbHVlKSB7Ci0gICAgICAgIF92YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pldHR5L1Jlc3BvbnNlSGVhZGVyVGFnLmphdmEgYi9qZWxseS10YWdzL2pldHR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pldHR5L1Jlc3BvbnNlSGVhZGVyVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NDQ1MDMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qZXR0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZXR0eS9SZXNwb25zZUhlYWRlclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZXR0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi1pbXBvcnQgb3JnLm1vcnRiYXkuaHR0cC5IdHRwUmVzcG9uc2U7Ci0KLS8qKgotICogU2V0IGEgcmVzcG9uc2UgaGVhZGVyIGluIHRoZSByZXF1ZXN0IGhhbmRsZXIgb2YgYSBKZXR0eSBodHRwIHNlcnZlcgotICoKLSAqIEBhdXRob3IgIHJ0bAotICovCi1wdWJsaWMgY2xhc3MgUmVzcG9uc2VIZWFkZXJUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBwYXJhbWV0ZXIgbmFtZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIF9uYW1lOwotCi0gICAgLyoqIHBhcmFtZXRlciB2YWx1ZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIF92YWx1ZTsKLQotICAgIC8qKgotICAgICAqIFBlcmZvcm0gdGhlIHRhZyBmdW5jdGlvbmFsaXR5LiBJbiB0aGlzIGNhc2UsIHNldCBhIGhlYWRlciBpbiB0aGUKLSAgICAgKiBodHRwIHJlc3BvbnNlIGZvdW5kIGluIHRoZSBqZWxseSBjb250ZXh0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sT3V0cHV0IHdoZXJlIHRvIHNlbmQgb3V0cHV0Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24gd2hlbiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgeG1sT3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChudWxsID09IGdldE5hbWUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCI8cmVzcG9uc2VIZWFkZXI+IHRhZyBtdXN0IGhhdmUgYSBuYW1lIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIHJlc3BvbnNlIGZyb20gdGhlIGNvbnRleHQKLSAgICAgICAgSHR0cFJlc3BvbnNlIGh0dHBSZXNwb25zZSA9IChIdHRwUmVzcG9uc2UpIGdldENvbnRleHQoKS5nZXRWYXJpYWJsZSgicmVzcG9uc2UiKTsKLSAgICAgICAgaWYgKG51bGwgPT0gaHR0cFJlc3BvbnNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIkh0dHBSZXNwb25zZSB2YXJpYWJsZSBub3QgYXZhaWxhYmxlIGluIEplbGx5IGNvbnRleHQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHZhbHVlIGlzIHZhbGlkIHRoZW4gc2V0IGl0Ci0gICAgICAgIC8vIG90aGVyd2lzZSByZW1vdmUgdGhlIGZpZWxkCi0gICAgICAgIGlmIChudWxsICE9IGdldFZhbHVlKCkpIHsKLSAgICAgICAgICAgIGh0dHBSZXNwb25zZS5zZXRGaWVsZChnZXROYW1lKCksIGdldFZhbHVlKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaHR0cFJlc3BvbnNlLnJlbW92ZUZpZWxkKGdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBQcm9wZXJ0eSBhY2Nlc3NvcnMvbXV0YXRvcnMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIHByb3BlcnR5IGNvbnRleHQgcGF0aC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdmFsdWUgb2YgcHJvcGVydHkgY29udGV4dCBwYXRoLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIF9uYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHRlciBmb3IgcHJvcGVydHkgY29udGV4dCBwYXRoLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhdGggTmV3IHZhbHVlIG9mIHByb3BlcnR5IGNvbnRleHQgcGF0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIF9uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIHByb3BlcnR5IHZhbHVlLgotICAgICAqCi0gICAgICogQHJldHVybiB2YWx1ZSBvZiBwcm9wZXJ0eSB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gX3ZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHRlciBmb3IgcHJvcGVydHkgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgTmV3IHZhbHVlIG9mIHByb3BlcnR5IHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBfdmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qZXR0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZXR0eS9TZWN1cml0eUhhbmRsZXJUYWcuamF2YSBiL2plbGx5LXRhZ3MvamV0dHkvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamV0dHkvU2VjdXJpdHlIYW5kbGVyVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NWYwNzIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qZXR0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZXR0eS9TZWN1cml0eUhhbmRsZXJUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamV0dHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotaW1wb3J0IG9yZy5tb3J0YmF5Lmh0dHAuQmFzaWNBdXRoZW50aWNhdG9yOwotaW1wb3J0IG9yZy5tb3J0YmF5Lmh0dHAuQ2xpZW50Q2VydEF1dGhlbnRpY2F0b3I7Ci1pbXBvcnQgb3JnLm1vcnRiYXkuaHR0cC5EaWdlc3RBdXRoZW50aWNhdG9yOwotaW1wb3J0IG9yZy5tb3J0YmF5Lmh0dHAuU2VjdXJpdHlDb25zdHJhaW50LkF1dGhlbnRpY2F0b3I7Ci1pbXBvcnQgb3JnLm1vcnRiYXkuaHR0cC5TZWN1cml0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLm1vcnRiYXkuaHR0cC5oYW5kbGVyLlNlY3VyaXR5SGFuZGxlcjsKLWltcG9ydCBvcmcubW9ydGJheS5qZXR0eS5zZXJ2bGV0LkZvcm1BdXRoZW50aWNhdG9yOwotaW1wb3J0IG9yZy5tb3J0YmF5LnV0aWwuQ29kZTsKLWltcG9ydCBvcmcubW9ydGJheS54bWwuWG1sUGFyc2VyOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogRGVjbGFyZSBhIHNlY3VyaXR5IGhhbmRsZXIgZm9yIGEgSmV0dHkgaHR0cCBzZXJ2ZXIKLSAqCi0gKiBAYXV0aG9yICBydGwKLSAqIEB2ZXJzaW9uICRJZDogU2VjdXJpdHlIYW5kbGVyVGFnLmphdmEsdiAxLjMgMjAwMi8wNy8xNCAxMjozODoyMiBkaW9uIEV4cCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN1cml0eUhhbmRsZXJUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBhIGZvcm0gYXV0aGVudGljYXRvciB1c2VkIGJ5IHRoaXMgdGFnICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgRm9ybUF1dGhlbnRpY2F0b3IgX2Zvcm1BdXRoZW50aWNhdG9yOwotCi0gICAgLyoqIHBhcmFtZXRlciBhdXRoZW50aWNhdGlvbiBtZXRob2QsIGRlZmF1bHRzIHRvIEJBU0lDIGluIEpldHR5ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2F1dGhlbnRpY2F0aW9uTWV0aG9kOwotCi0gICAgLyoqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgU2VjdXJpdHlIYW5kbGVyVGFnICovCi0gICAgcHVibGljIFNlY3VyaXR5SGFuZGxlclRhZygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIHRoZSB0YWcgZnVuY3Rpb25hbGl0eS4gSW4gdGhpcyBjYXNlLCBhZGQgYSBzZWN1cml0eSBoYW5kbGVyCi0gICAgICogdG8gdGhlIHBhcmVudCBjb250ZXh0LCBzZXR0aW5nIHRoZSBhdXRoZW50aWNhdGlvbiBtZXRob2QgaWYgcmVxdWlyZWQKLSAgICAgKiBUaGUgc2VjdXJpdHkgY29uc3RyYWludHMgc2hvdWxkIGJlIHNwZWNpZmllZCBhcyB0aGUgYm9keSBvZiB0aGlzIHRhZwotICAgICAqIHVzaW5nIHRoZSBzYW1lIGZvcm1hdCBhcyBhIHdlYi54bWwgZmlsZSB3cmFwcGVkIGluIGEgc2luZ2xlCi0gICAgICogPGNvbnN0cmFpbnRzPiB0YWcgdG8gYWxsb3cgcGFyc2luZyBvZiBhIHdlbGwtZm9ybWVkIHNuaXBwZXQsIGUuZy4KLSAgICAgKgotICAgICAqIDxjb25zdHJhaW50cz4KLSAgICAgKiAgIDxzZWN1cml0eS1jb25zdHJhaW50PgotICAgICAqICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgKiAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPkRlZmF1bHQ8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAqICAgICAgPHVybC1wYXR0ZXJuPi88L3VybC1wYXR0ZXJuPgotICAgICAqICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICogICAgPGF1dGgtY29uc3RyYWludC8+Ci0gICAgICogICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0gICAgICoKLSAgICAgKiAgIDxzZWN1cml0eS1jb25zdHJhaW50PgotICAgICAqICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICogICAgICAgPHVybC1wYXR0ZXJuPi9kb2NSb290L3Jlc291cmNlSGFuZGxlclRlc3QvKjwvdXJsLXBhdHRlcm4+Ci0gICAgICogICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICogICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAqICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAqICAgICA8YXV0aC1jb25zdHJhaW50PgotICAgICAqICAgICAgIDxyb2xlLW5hbWU+Kjwvcm9sZS1uYW1lPgotICAgICAqICAgICA8L2F1dGgtY29uc3RyYWludD4KLSAgICAgKiAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KLSAgICAgKgotICAgICAqICAgPGxvZ2luLWNvbmZpZz4KLSAgICAgKiAgICAgPGF1dGgtbWV0aG9kPkJBU0lDPC9hdXRoLW1ldGhvZD4KLSAgICAgKiAgICAgPHJlYWxtLW5hbWU+SmV0dHkgRGVtbyBSZWFsbTwvcmVhbG0tbmFtZT4KLSAgICAgKiAgIDwvbG9naW4tY29uZmlnPgotICAgICAqCi0gICAgICogPC9jb25zdHJhaW50cz4KLSAgICAgKgotICAgICAqIEBwYXJhbSB4bWxPdXRwdXQgd2hlcmUgdG8gc2VuZCBvdXRwdXQKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiB3aGVuIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCB4bWxPdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIEh0dHBDb250ZXh0VGFnIGh0dHBDb250ZXh0ID0gKEh0dHBDb250ZXh0VGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoCi0gICAgICAgICAgICBIdHRwQ29udGV4dFRhZy5jbGFzcyk7Ci0gICAgICAgIGlmICggaHR0cENvbnRleHQgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIjxzZWN1cml0eUhhbmRsZXI+IHRhZyBtdXN0IGJlIGVuY2xvc2VkIGluc2lkZSBhIDxodHRwQ29udGV4dD4gdGFnIiApOwotICAgICAgICB9Ci0gICAgICAgIFNlY3VyaXR5SGFuZGxlciBzZWN1cml0eUhhbmRsZXIgPSBuZXcgU2VjdXJpdHlIYW5kbGVyKCk7Ci0gICAgICAgIGlmIChnZXRhdXRoZW50aWNhdGlvbk1ldGhvZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlY3VyaXR5SGFuZGxlci5zZXRBdXRoTWV0aG9kKGdldGF1dGhlbnRpY2F0aW9uTWV0aG9kKCkpOwotICAgICAgICB9Ci0gICAgICAgIGh0dHBDb250ZXh0LmFkZEhhbmRsZXIoc2VjdXJpdHlIYW5kbGVyKTsKLQotICAgICAgICAvLyBnZXQgdGhlIHNlY3VyaXR5IGNvbnN0cmFpbnRzIGZyb20gdGhlIGJvZHkgb2YgdGhpcyB0YWcKLSAgICAgICAgLy8gYnkgcGFyc2luZyB0aGUgYm9keSBvZiB0aGUgcGFyZW50IChzbyBpdCB3aWxsIGJlIHdlbGwgZm9ybWVkKQotICAgICAgICBTdHJpbmcgYm9keVRleHQgPSBnZXRCb2R5VGV4dCgpOwotICAgICAgICBTdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcihib2R5VGV4dCk7Ci0gICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHJlYWRlcik7Ci0KLSAgICAgICAgLy8gY3JhdGUgYSBub24tdmFsaWRhdGluZyBwYXJzZXIKLSAgICAgICAgWG1sUGFyc2VyIHhtbFBhcnNlciA9IG5ldyBYbWxQYXJzZXIoZmFsc2UpOwotCi0gICAgICAgIFhtbFBhcnNlci5Ob2RlIG5vZGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbm9kZSA9IHhtbFBhcnNlci5wYXJzZShpbnB1dFNvdXJjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXI9bm9kZS5pdGVyYXRvcigpOwotICAgICAgICBYbWxQYXJzZXIuTm9kZSBjdXJyTm9kZSA9IG51bGw7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIE9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFhtbFBhcnNlci5Ob2RlKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICBjdXJyTm9kZT0oWG1sUGFyc2VyLk5vZGUpbzsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZT1jdXJyTm9kZS5nZXRUYWcoKTsKLQotICAgICAgICAgICAgICAgIGlmICgic2VjdXJpdHktY29uc3RyYWludCIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluaXRTZWN1cml0eUNvbnN0cmFpbnQoY3Vyck5vZGUsIGh0dHBDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJsb2dpbi1jb25maWciLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBpbml0TG9naW5Db25maWcoY3Vyck5vZGUsIGh0dHBDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIkludmFsaWQgZWxlbWVudCBpbiA8c2VjdXJpdHlIYW5kbGVyPiB0YWcuIEFyZSB5b3UgdXNpbmcgdGhlIDxjb25zdHJhaW50cz4gdGFnPzogIiArIGN1cnJOb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqIFRoaXMgaXMgdGhlIGNvZGUgZnJvbSBKZXR0eSdzIFdlYkFwcGxpY2F0aW9uQ29udGV4dAotICAgICAqIHdpdGggdGhlIEh0dHBDb250ZXh0VGFnIHBhcmFtZXRlciBhZGRlZAotICAgICAqCi0gICAgICogUHJvY2VzcyBhIHBhcnNlZCB4bWwgbm9kZSB0byBzZXR1cCB0aGUgc2VjdXJpdHkgY29uc3RyYWludHMKLSAgICAgKiBmb3IgYW4gaHR0cCBzZXJ2ZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlIHRoZSBwYXJzZWQgeG1sIHN0YXJ0aW5nIG5vZGUgb2YgdGhlIGNvbnN0cmFpbnRzCi0gICAgICogQHBhcmFtIGh0dHBDb250ZXh0IHRoZSB0YWcgdG8gYWRkIHRoZSBzZWN1cml0eSBjb25zdHJhaW50IHRvCi0gICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0U2VjdXJpdHlDb25zdHJhaW50KFhtbFBhcnNlci5Ob2RlIG5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwQ29udGV4dFRhZyBodHRwQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIFNlY3VyaXR5Q29uc3RyYWludCBzY0Jhc2UgPSBuZXcgU2VjdXJpdHlDb25zdHJhaW50KCk7Ci0KLSAgICAgICAgWG1sUGFyc2VyLk5vZGUgYXV0aHM9bm9kZS5nZXQoImF1dGgtY29uc3RyYWludCIpOwotICAgICAgICBpZiAoYXV0aHMhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNjQmFzZS5zZXRBdXRoZW50aWNhdGUodHJ1ZSk7Ci0gICAgICAgICAgICAvLyBhdXRoLWNvbnN0cmFpbnQKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXI9IGF1dGhzLml0ZXJhdG9yKCJyb2xlLW5hbWUiKTsKLSAgICAgICAgICAgIHdoaWxlKGl0ZXIuaGFzTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyByb2xlPSgoWG1sUGFyc2VyLk5vZGUpaXRlci5uZXh0KCkpLnRvU3RyaW5nKGZhbHNlLHRydWUpOwotICAgICAgICAgICAgICAgIHNjQmFzZS5hZGRSb2xlKHJvbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgWG1sUGFyc2VyLk5vZGUgZGF0YT1ub2RlLmdldCgidXNlci1kYXRhLWNvbnN0cmFpbnQiKTsKLSAgICAgICAgaWYgKGRhdGEhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRhdGE9ZGF0YS5nZXQoInRyYW5zcG9ydC1ndWFyYW50ZWUiKTsKLSAgICAgICAgICAgIFN0cmluZyBndWFyYW50ZWUgPSBkYXRhLnRvU3RyaW5nKGZhbHNlLHRydWUpLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICBpZiAoZ3VhcmFudGVlPT1udWxsIHx8IGd1YXJhbnRlZS5sZW5ndGgoKT09MCB8fAotICAgICAgICAgICAgICAgICJOT05FIi5lcXVhbHMoZ3VhcmFudGVlKSkKLSAgICAgICAgICAgICAgICBzY0Jhc2Uuc2V0RGF0YUNvbnN0cmFpbnQoU2VjdXJpdHlDb25zdHJhaW50LkRDX05PTkUpOwotICAgICAgICAgICAgZWxzZSBpZiAoIklOVEVHUkFMIi5lcXVhbHMoZ3VhcmFudGVlKSkKLSAgICAgICAgICAgICAgICBzY0Jhc2Uuc2V0RGF0YUNvbnN0cmFpbnQoU2VjdXJpdHlDb25zdHJhaW50LkRDX0lOVEVHUkFMKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCJDT05GSURFTlRJQUwiLmVxdWFscyhndWFyYW50ZWUpKQotICAgICAgICAgICAgICAgIHNjQmFzZS5zZXREYXRhQ29uc3RyYWludChTZWN1cml0eUNvbnN0cmFpbnQuRENfQ09ORklERU5USUFMKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb2RlLndhcm5pbmcoIlVua25vd24gdXNlci1kYXRhLWNvbnN0cmFpbnQ6IitndWFyYW50ZWUpOwotICAgICAgICAgICAgICAgIHNjQmFzZS5zZXREYXRhQ29uc3RyYWludChTZWN1cml0eUNvbnN0cmFpbnQuRENfQ09ORklERU5USUFMKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXI9IG5vZGUuaXRlcmF0b3IoIndlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIik7Ci0gICAgICAgIHdoaWxlKGl0ZXIuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxQYXJzZXIuTm9kZSBjb2xsZWN0aW9uPShYbWxQYXJzZXIuTm9kZSlpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lPWNvbGxlY3Rpb24uZ2V0U3RyaW5nKCJ3ZWItcmVzb3VyY2UtbmFtZSIsZmFsc2UsdHJ1ZSk7Ci0gICAgICAgICAgICBTZWN1cml0eUNvbnN0cmFpbnQgc2MgPSAoU2VjdXJpdHlDb25zdHJhaW50KXNjQmFzZS5jbG9uZSgpOwotICAgICAgICAgICAgc2Muc2V0TmFtZShuYW1lKTsKLQotICAgICAgICAgICAgSXRlcmF0b3IgaXRlcjI9IGNvbGxlY3Rpb24uaXRlcmF0b3IoImh0dHAtbWV0aG9kIik7Ci0gICAgICAgICAgICB3aGlsZShpdGVyMi5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgc2MuYWRkTWV0aG9kKCgoWG1sUGFyc2VyLk5vZGUpaXRlcjIubmV4dCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoZmFsc2UsdHJ1ZSkpOwotCi0gICAgICAgICAgICBpdGVyMj0gY29sbGVjdGlvbi5pdGVyYXRvcigidXJsLXBhdHRlcm4iKTsKLSAgICAgICAgICAgIHdoaWxlKGl0ZXIyLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJsPQotICAgICAgICAgICAgICAgICAgICAoKFhtbFBhcnNlci5Ob2RlKWl0ZXIyLm5leHQoKSkudG9TdHJpbmcoZmFsc2UsdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgaHR0cENvbnRleHQuYWRkU2VjdXJpdHlDb25zdHJhaW50KHVybCxzYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiBUaGlzIGlzIHRoZSBjb2RlIGZyb20gSmV0dHkncyBXZWJBcHBsaWNhdGlvbkNvbnRleHQKLSAgICAgKiB3aXRoIHRoZSBIdHRwQ29udGV4dFRhZyBwYXJhbWV0ZXIgYWRkZWQKLSAgICAgKgotICAgICAqCi0gICAgICogUHJvY2VzcyBhIHBhcnNlZCB4bWwgbm9kZSB0byBzZXR1cCB0aGUgYXV0aGVudGljYXRvciBhbmQgcmVhbG0KLSAgICAgKiBmb3IgYW4gaHR0cCBzZXJ2ZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlIHRoZSBwYXJzZWQgeG1sIHN0YXJ0aW5nIG5vZGUgb2YgdGhlIGxvZ2luIGNvbmZpZ3VyYXRpb24KLSAgICAgKiBAcGFyYW0gaHR0cENvbnRleHQgdGhlIHRhZyB0byBhZGQgdGhlIGF1dGhlbnRpY2F0b3IgYW5kIHJlYWxtIHRvCi0gICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0TG9naW5Db25maWcoWG1sUGFyc2VyLk5vZGUgbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cENvbnRleHRUYWcgaHR0cENvbnRleHQpCi0gICAgewotICAgICAgICBYbWxQYXJzZXIuTm9kZSBtZXRob2Q9bm9kZS5nZXQoImF1dGgtbWV0aG9kIik7Ci0gICAgICAgIGlmIChtZXRob2QhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEF1dGhlbnRpY2F0b3IgYXV0aGVudGljYXRvcj1udWxsOwotICAgICAgICAgICAgU3RyaW5nIG09bWV0aG9kLnRvU3RyaW5nKGZhbHNlLHRydWUpOwotCi0gICAgICAgICAgICBpZiAoU2VjdXJpdHlDb25zdHJhaW50Ll9fRk9STV9BVVRILmVxdWFscyhtKSkKLSAgICAgICAgICAgICAgICBhdXRoZW50aWNhdG9yPV9mb3JtQXV0aGVudGljYXRvcj1uZXcgRm9ybUF1dGhlbnRpY2F0b3IoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKFNlY3VyaXR5Q29uc3RyYWludC5fX0JBU0lDX0FVVEguZXF1YWxzKG0pKQotICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0b3I9bmV3IEJhc2ljQXV0aGVudGljYXRvcigpOwotICAgICAgICAgICAgZWxzZSBpZiAoU2VjdXJpdHlDb25zdHJhaW50Ll9fRElHRVNUX0FVVEguZXF1YWxzKG0pKQotICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0b3I9bmV3IERpZ2VzdEF1dGhlbnRpY2F0b3IoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKFNlY3VyaXR5Q29uc3RyYWludC5fX0NFUlRfQVVUSC5lcXVhbHMobSkpCi0gICAgICAgICAgICAgICAgYXV0aGVudGljYXRvcj1uZXcgQ2xpZW50Q2VydEF1dGhlbnRpY2F0b3IoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBDb2RlLndhcm5pbmcoIlVOS05PV04gQVVUSCBNRVRIT0Q6ICIrbSk7Ci0KLSAgICAgICAgICAgIGh0dHBDb250ZXh0LnNldEF1dGhlbnRpY2F0b3IoYXV0aGVudGljYXRvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBYbWxQYXJzZXIuTm9kZSBuYW1lPW5vZGUuZ2V0KCJyZWFsbS1uYW1lIik7Ci0gICAgICAgIGlmIChuYW1lIT1udWxsKQotICAgICAgICAgICAgaHR0cENvbnRleHQuc2V0UmVhbG1OYW1lKG5hbWUudG9TdHJpbmcoZmFsc2UsdHJ1ZSkpOwotCi0gICAgICAgIFhtbFBhcnNlci5Ob2RlIGZvcm1Db25maWcgPSBub2RlLmdldCgiZm9ybS1sb2dpbi1jb25maWciKTsKLSAgICAgICAgaWYoZm9ybUNvbmZpZyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2Zvcm1BdXRoZW50aWNhdG9yPT1udWxsKQotICAgICAgICAgICAgICAgIENvZGUud2FybmluZygiRk9STSBBdXRoZW50aWNhdGlvbiBtaXNzLWNvbmZpZ3VyZWQiKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYbWxQYXJzZXIuTm9kZSBsb2dpblBhZ2UgPSBmb3JtQ29uZmlnLmdldCgiZm9ybS1sb2dpbi1wYWdlIik7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZ2luUGFnZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBfZm9ybUF1dGhlbnRpY2F0b3Iuc2V0TG9naW5QYWdlKGxvZ2luUGFnZS50b1N0cmluZyhmYWxzZSx0cnVlKSk7Ci0gICAgICAgICAgICAgICAgWG1sUGFyc2VyLk5vZGUgZXJyb3JQYWdlID0gZm9ybUNvbmZpZy5nZXQoImZvcm0tZXJyb3ItcGFnZSIpOwotICAgICAgICAgICAgICAgIGlmIChlcnJvclBhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgX2Zvcm1BdXRoZW50aWNhdG9yLnNldEVycm9yUGFnZShlcnJvclBhZ2UudG9TdHJpbmcoZmFsc2UsdHJ1ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFByb3BlcnR5IGFjY2Vzc29ycy9tdXRhdG9ycwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEdldHRlciBmb3IgcHJvcGVydHkgYXV0aGVudGljYXRpb25NZXRob2QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHByb3BlcnR5IGF1dGhlbnRpY2F0aW9uTWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0YXV0aGVudGljYXRpb25NZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiBfYXV0aGVudGljYXRpb25NZXRob2Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciBwcm9wZXJ0eSBhdXRoZW50aWNhdGlvbk1ldGhvZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhdXRoZW50aWNhdGlvbk1ldGhvZCBUeXBlIG9mIGF1dGhlbnRpY2F0aW9uIChCQVNJQywgRk9STSwgRElHRVNULCBDTElFTlQtQ0VSVCkKLSAgICAgKiBOb3RlIHRoYXQgb25seSBCQVNJQyBhbmQgQ0xJRU5ULUNFUlQgYXJlIHN1cHBvcnRlZCBieSBKZXR0eSBhcyBvZiB2NC4xLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRhdXRoZW50aWNhdGlvbk1ldGhvZChTdHJpbmcgYXV0aGVudGljYXRpb25NZXRob2QpIHsKLSAgICAgICAgX2F1dGhlbnRpY2F0aW9uTWV0aG9kID0gYXV0aGVudGljYXRpb25NZXRob2Q7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamV0dHkvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamV0dHkvU29ja2V0TGlzdGVuZXJUYWcuamF2YSBiL2plbGx5LXRhZ3MvamV0dHkvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamV0dHkvU29ja2V0TGlzdGVuZXJUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODczYzBjOC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pldHR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pldHR5L1NvY2tldExpc3RlbmVyVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpldHR5OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi1pbXBvcnQgb3JnLm1vcnRiYXkuaHR0cC5Tb2NrZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcubW9ydGJheS51dGlsLkluZXRBZGRyUG9ydDsKLQotLyoqCi0gKiBEZWNsYXJlIGEgc29ja2V0IGxpc3RlbmVyIGZvciBhIEpldHR5IGh0dHAgc2VydmVyCi0gKgotICogQGF1dGhvciAgcnRsCi0gKiBAdmVyc2lvbiAkSWQ6IFNvY2tldExpc3RlbmVyVGFnLmphdmEsdiAxLjMgMjAwMi8wNy8xNCAxMjozODoyMiBkaW9uIEV4cCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBTb2NrZXRMaXN0ZW5lclRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIHBhcmFtZXRlciBwb3J0IHdpdGggZGVmYXVsdCovCi0gICAgcHJpdmF0ZSBpbnQgX3BvcnQgPSBKZXR0eUh0dHBTZXJ2ZXJUYWcuREVGQVVMVF9QT1JUOwotCi0gICAgLyoqIHBhcmFtZXRlciBob3N0LCB3aXRoIGRlZmF1bHQgKi8KLSAgICBwcml2YXRlIFN0cmluZyBfaG9zdCA9IEpldHR5SHR0cFNlcnZlclRhZy5ERUZBVUxUX0hPU1Q7Ci0KLSAgICAvKiogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBTb2NrZXRMaXN0ZW5lclRhZyAqLwotICAgIHB1YmxpYyBTb2NrZXRMaXN0ZW5lclRhZygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIHRoZSB0YWcgZnVuY3Rpb25hbGl0eS4gSW4gdGhpcyBjYXNlLCBhZGQgYSBzb2NrZXQgbGlzdGVuZXIKLSAgICAgKiBmb3IgdGhlIHNwZWNpZmllZCBob3N0IGFuZCBwb3J0IHRvIHRoZSBwYXJlbnQgc2VydmVyLAotICAgICAqCi0gICAgICogQHBhcmFtIHhtbE91dHB1dCB3aGVyZSB0byBzZW5kIG91dHB1dAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIHdoZW4gYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IHhtbE91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgSmV0dHlIdHRwU2VydmVyVGFnIGh0dHBzZXJ2ZXIgPSAoSmV0dHlIdHRwU2VydmVyVGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoCi0gICAgICAgICAgICBKZXR0eUh0dHBTZXJ2ZXJUYWcuY2xhc3MpOwotICAgICAgICBpZiAoIGh0dHBzZXJ2ZXIgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIjxzb2NrZXRMaXN0ZW5lcj4gdGFnIG11c3QgYmUgZW5jbG9zZWQgaW5zaWRlIGEgPHNlcnZlcj4gdGFnIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGh0dHBzZXJ2ZXIuYWRkTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgbmV3IFNvY2tldExpc3RlbmVyKG5ldyBJbmV0QWRkclBvcnQoZ2V0SG9zdCgpLCBnZXRQb3J0KCkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludm9rZUJvZHkoeG1sT3V0cHV0KTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUHJvcGVydHkgYWNjZXNzb3JzL211dGF0b3JzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEdldHRlciBmb3IgcHJvcGVydHkgcG9ydC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdmFsdWUgb2YgcHJvcGVydHkgcG9ydC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBvcnQoKSB7Ci0gICAgICAgIHJldHVybiBfcG9ydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgZm9yIHByb3BlcnR5IHBvcnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcG9ydCBOZXcgdmFsdWUgb2YgcHJvcGVydHkgcG9ydC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQb3J0KGludCBwb3J0KSB7Ci0gICAgICAgIF9wb3J0ID0gcG9ydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIHByb3BlcnR5IGhvc3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHByb3BlcnR5IGhvc3QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRIb3N0KCkgewotICAgICAgICByZXR1cm4gX2hvc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciBwcm9wZXJ0eSBob3N0LgotICAgICAqCi0gICAgICogQHBhcmFtIGhvc3QgTmV3IHZhbHVlIG9mIHByb3BlcnR5IGhvc3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SG9zdChTdHJpbmcgaG9zdCkgewotICAgICAgICBfaG9zdCA9IGhvc3Q7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pldHR5L3BhY2thZ2UuaHRtbCBiL2plbGx5LXRhZ3MvamV0dHkvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamV0dHkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDNjZmE3Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamV0dHkvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamV0dHkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxodG1sPgotPGhlYWQ+Ci08L2hlYWQ+Ci08Ym9keT4KLQotICA8cD5UYWdzIGZvciBzdGFydGluZyBKZXR0eSBIVFRQIHNlcnZlcnMgYW5kIHByb2Nlc2luZyBIVFRQIHJlcXVlc3RzIHVzaW5nIEplbGx5IHNjcmlwdHMKLSAgPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS8uY3ZzaWdub3JlIGIvamVsbHktdGFncy9qZXR0eS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvamV0dHkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQzYWIwYi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1KZWxseUxvZ0ZpbGVUZXN0LmxvZwotamV0dHkubG9nCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9UZXN0SmV0dHlIdHRwU2VydmVyVGFncy5qYXZhIGIvamVsbHktdGFncy9qZXR0eS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvamV0dHkvVGVzdEpldHR5SHR0cFNlcnZlclRhZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc1N2EzOS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9UZXN0SmV0dHlIdHRwU2VydmVyVGFncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMTk5OS0yMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuamV0dHk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqIFRlc3RzIHRoZSBwYXJzZXIsIHRoZSBlbmdpbmUgYW5kIHRoZSBYTUwgdGFncwotICAqCi0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS42ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBUZXN0SmV0dHlIdHRwU2VydmVyVGFncyBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUZXN0SmV0dHlIdHRwU2VydmVyVGFncy5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGVzdEpldHR5SHR0cFNlcnZlclRhZ3MuY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0SmV0dHlIdHRwU2VydmVyVGFncyhTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0U2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gZXZhbHV0ZVNjcmlwdEFzVGV4dCgKLSAgICAgICAgICAgICJzcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvamV0dHkvZGVmYXVsdFNlcnZlci5qZWxseSIKLSAgICAgICAgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9kdWNlcyB0aGUgY29ycmVjdCBvdXRwdXQiLCAiSXQgd29ya3MhIiwgdGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEpldHR5TG9nRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlIGxvZ0ZpbGUgPSBuZXcgRmlsZSgic3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pldHR5L0plbGx5TG9nRmlsZVRlc3QubG9nIik7Ci0gICAgICAgIGlmIChsb2dGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBsb2dGaWxlLmRlbGV0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoIkxvZ2ZpbGUgZG9lcyBub3QgZXhpc3QiLCAhbG9nRmlsZS5leGlzdHMoKSk7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gZXZhbHV0ZVNjcmlwdEFzVGV4dCgKLSAgICAgICAgICAgICJzcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvamV0dHkvamV0dHlMb2dGaWxlLmplbGx5IgotICAgICAgICApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlByb2R1Y2VzIHRoZSBjb3JyZWN0IG91dHB1dCIsICJJdCB3b3JrcyEiLCB0ZXh0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTG9nZmlsZSBleGlzdHMiLCBsb2dGaWxlLmV4aXN0cygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U29ja2V0TGlzdGVuZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBldmFsdXRlU2NyaXB0QXNUZXh0KAotICAgICAgICAgICAgInNyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9zb2NrZXRMaXN0ZW5lci5qZWxseSIKLSAgICAgICAgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9kdWNlcyB0aGUgY29ycmVjdCBvdXRwdXQiLCAiSXQgd29ya3MhIiwgdGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEh0dHBDb250ZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gZXZhbHV0ZVNjcmlwdEFzVGV4dCgKLSAgICAgICAgICAgICJzcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvamV0dHkvaHR0cENvbnRleHQuamVsbHkiCi0gICAgICAgICk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUHJvZHVjZXMgdGhlIGNvcnJlY3Qgb3V0cHV0IiwgIkl0IHdvcmtzISIsIHRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUhhbmRsZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBldmFsdXRlU2NyaXB0QXNUZXh0KAotICAgICAgICAgICAgInNyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9yZXNvdXJjZUhhbmRsZXIuamVsbHkiCi0gICAgICAgICk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUHJvZHVjZXMgdGhlIGNvcnJlY3Qgb3V0cHV0IiwgIkl0IHdvcmtzISIsIHRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZWN1cml0eUhhbmRsZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBldmFsdXRlU2NyaXB0QXNUZXh0KAotICAgICAgICAgICAgInNyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9zZWN1cml0eUhhbmRsZXJGb3JiaWRkZW4uamVsbHkiCi0gICAgICAgICk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRm9yYmlkZGVuIHRlc3QgcHJvZHVjZXMgdGhlIGNvcnJlY3Qgb3V0cHV0IiwgIkl0IHdvcmtzISIsIHRleHQpOwotCi0gICAgICAgIHRleHQgPSBldmFsdXRlU2NyaXB0QXNUZXh0KAotICAgICAgICAgICAgInNyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9zZWN1cml0eUhhbmRsZXJVbmF1dGhvcml6ZWQuamVsbHkiCi0gICAgICAgICk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVW5hdXRob3JpemVkIHByb2R1Y2VzIHRoZSBjb3JyZWN0IG91dHB1dCIsICJJdCB3b3JrcyEiLCB0ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmVsbHlSZXNvdXJjZUhhbmRsZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBldmFsdXRlU2NyaXB0QXNUZXh0KAotICAgICAgICAgICAgInNyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9qZWxseVJlc291cmNlSGFuZGxlci5qZWxseSIKLSAgICAgICAgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqZWxseVJlc291cmNlSGFuZGxlciBwcm9kdWNlcyB0aGUgY29ycmVjdCBvdXRwdXQiLCAiSXQgd29ya3MhIiwgdGV4dCk7Ci0KLSAgICAgICAgdGV4dCA9IGV2YWx1dGVTY3JpcHRBc1RleHQoCi0gICAgICAgICAgICAic3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pldHR5L2plbGx5UmVzb3VyY2VIYW5kbGVyUmVxdWVzdEJvZHkuamVsbHkiCi0gICAgICAgICk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamVsbHlSZXNvdXJjZUhhbmRsZXJSZXF1ZXN0Qm9keSBwcm9kdWNlcyB0aGUgY29ycmVjdCBvdXRwdXQiLCAiSXQgd29ya3MhIiwgdGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXZhbHVhdGVzIHRoZSBzY3JpcHQgYnkgdGhlIGdpdmVuIGZpbGUgbmFtZSBhbmQKLSAgICAgKiByZXR1cm5zIHRoZSB3aGl0ZXNwYWNlIHRyaW1tZWQgb3V0cHV0IGFzIHRleHQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGV2YWx1dGVTY3JpcHRBc1RleHQoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSmVsbHlDb250ZXh0IGNvbnRleHQgPSBuZXcgSmVsbHlDb250ZXh0KCk7Ci0KLSAgICAgICAgLy8gYWxsb3cgc2NyaXB0cyB0byByZWZlciB0byBhbnkgcmVzb3VyY2UgaW5zaWRlIHRoaXMgcHJvamVjdAotICAgICAgICAvLyB1c2luZyBhbiBhYnNvbHV0ZSBVUkkgbGlrZSAvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9mb28ueG1sCi0gICAgICAgIGNvbnRleHQuc2V0Um9vdFVSTChuZXcgRmlsZSgiLiIpLnRvVVJMKCkpOwotCi0gICAgICAgIC8vIGNhdHVyZSB0aGUgb3V0cHV0Ci0gICAgICAgIFN0cmluZ1dyaXRlciBidWZmZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIFhNTE91dHB1dCBvdXRwdXQgPSBYTUxPdXRwdXQuY3JlYXRlWE1MT3V0cHV0KGJ1ZmZlcik7Ci0KLSAgICAgICAgY29udGV4dC5ydW5TY3JpcHQoIG5ldyBGaWxlKGZpbGVOYW1lKSwgb3V0cHV0ICk7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gYnVmZmVyLnRvU3RyaW5nKCkudHJpbSgpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXZhbHVhdGVkIHNjcmlwdCBhcy4uLiIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKHRleHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ZXh0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamV0dHkvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pldHR5L2RlZmF1bHRTZXJ2ZXIuamVsbHkgYi9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9kZWZhdWx0U2VydmVyLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODIxMTc2Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamV0dHkvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pldHR5L2RlZmF1bHRTZXJ2ZXIuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseQotICAgIHhtbG5zOmo9ImplbGx5OmNvcmUiCi0gICAgeG1sbnM9ImplbGx5OmpldHR5IgotICAgIHhtbG5zOmh0dHA9ImplbGx5Omh0dHAiCi0gICAgdHJpbT0iZmFsc2UiPgotCi0gICAgPGo6c2V0IHZhcj0iY29udGV4dFBhdGhWYXIiIHZhbHVlPSIiLz4KLSAgICA8ajpzZXQgdmFyPSJ0ZXN0UG9ydCIgdmFsdWU9IjgxMDAiLz4KLSAgICA8ajpzZXQgdmFyPSJ0ZXN0VXJpIiB2YWx1ZT0iaHR0cDovL2xvY2FsaG9zdDoke3Rlc3RQb3J0fSR7Y29udGV4dFBhdGhWYXJ9L3Rlc3QxLnR4dCIvPgotCi0gICAgPGpldHR5SHR0cFNlcnZlciB2YXI9Imh0dHBTZXJ2ZXIiLz4KLQotICAgIDxodHRwOmdldCB2YXI9Im10YyIgdXJpPSIke3Rlc3RVcml9Ii8+Ci0gICAgPGo6aWYgdGVzdD0nJHttdGMuc3RhdHVzQ29kZSA9PSAyMDB9Jz4KLSAgICAgICAgJHttdGMucmVzcG9uc2VCb2R5QXNTdHJpbmd9Ci0gICAgPC9qOmlmPgotICAgIDxqOmlmIHRlc3Q9JyR7bXRjLnN0YXR1c0NvZGUgIT0gMjAwfSc+Ci0gICAgICAgIFJlc3VsdHMgZm9yIG10YyB1cmwgYXJlOgotICAgICAgICBodHRwIHJldHVybiBjb2RlID0gJHttdGMuc3RhdHVzQ29kZX0KLSAgICAgICAgaHR0cCBzdGF0dXMgdGV4dCA9ICcke210Yy5zdGF0dXNUZXh0fScKLSAgICAgICAgc2l6ZSBvZiByZXN1bHQgPSAke210Yy5yZXNwb25zZUJvZHlBc1N0cmluZy5sZW5ndGgoKX0KLSAgICAgICAgcmVzcG9uc2UgdGltZSA9ICR7bXRjLnJlc3BvbnNlVGltZX0KLQotICAgICAgICAgICAgPGo6Zm9yRWFjaCBpdGVtcz0iJHttdGMucmVzcG9uc2VIZWFkZXJzfSIgdmFyPSJoZWFkZXIiIGluZGV4VmFyPSJpIj4KLSAgICAgICAgICAgICAgICBoZWFkZXJbJHtpfV0gPSAke2hlYWRlcn0KLSAgICAgICAgICAgIDwvajpmb3JFYWNoPgotICAgIDwvajppZj4KLSAgICAke2h0dHBTZXJ2ZXIuc3RvcCgpfQotCi08L2o6amVsbHk+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9kb2NSb290L2NvbnRleHRUZXN0L2NvbnRleHRUZXN0LnR4dCBiL2plbGx5LXRhZ3MvamV0dHkvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pldHR5L2RvY1Jvb3QvY29udGV4dFRlc3QvY29udGV4dFRlc3QudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODMwMGI4Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamV0dHkvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pldHR5L2RvY1Jvb3QvY29udGV4dFRlc3QvY29udGV4dFRlc3QudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotSXQgd29ya3MhCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9kb2NSb290L3Jlc291cmNlSGFuZGxlclRlc3QvcmVzb3VyY2VIYW5kbGVyVGVzdC50eHQgYi9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9kb2NSb290L3Jlc291cmNlSGFuZGxlclRlc3QvcmVzb3VyY2VIYW5kbGVyVGVzdC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MzAwYjguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qZXR0eS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvamV0dHkvZG9jUm9vdC9yZXNvdXJjZUhhbmRsZXJUZXN0L3Jlc291cmNlSGFuZGxlclRlc3QudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotSXQgd29ya3MhCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9kb2NSb290L3Rlc3QxLnR4dCBiL2plbGx5LXRhZ3MvamV0dHkvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pldHR5L2RvY1Jvb3QvdGVzdDEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODMwMGI4Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamV0dHkvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pldHR5L2RvY1Jvb3QvdGVzdDEudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotSXQgd29ya3MhCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9odHRwQ29udGV4dC5qZWxseSBiL2plbGx5LXRhZ3MvamV0dHkvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pldHR5L2h0dHBDb250ZXh0LmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDk5ZGFkLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamV0dHkvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pldHR5L2h0dHBDb250ZXh0LmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGo6amVsbHkKLSAgICB4bWxuczpqPSJqZWxseTpjb3JlIgotICAgIHhtbG5zPSJqZWxseTpqZXR0eSIKLSAgICB4bWxuczpodHRwPSJqZWxseTpodHRwIgotICAgIHRyaW09ImZhbHNlIj4KLQotICAgIDxqOnNldCB2YXI9ImNvbnRleHRQYXRoVmFyIiB2YWx1ZT0iL2NvbnRleHRUZXN0Ii8+Ci0gICAgPGo6c2V0IHZhcj0idGVzdFBvcnQiIHZhbHVlPSI4MTAwIi8+Ci0gICAgPGo6c2V0IHZhcj0idGVzdFVyaSIgdmFsdWU9Imh0dHA6Ly9sb2NhbGhvc3Q6JHt0ZXN0UG9ydH0ke2NvbnRleHRQYXRoVmFyfS9jb250ZXh0VGVzdC50eHQiLz4KLQotICAgIDxqZXR0eUh0dHBTZXJ2ZXIgdmFyPSJodHRwU2VydmVyIj4KLSAgICAgIDxzb2NrZXRMaXN0ZW5lciBwb3J0PSIke3Rlc3RQb3J0fSIvPgotICAgICAgPGh0dHBDb250ZXh0IGNvbnRleHRQYXRoPSIke2NvbnRleHRQYXRoVmFyfSIgcmVzb3VyY2VCYXNlPSIuL2RvY1Jvb3QvY29udGV4dFRlc3QiLz4KLSAgICA8L2pldHR5SHR0cFNlcnZlcj4KLQotICAgIDxodHRwOmdldCB2YXI9Im10YyIgdXJpPSIke3Rlc3RVcml9Ii8+Ci0KLSAgICA8ajppZiB0ZXN0PScke210Yy5zdGF0dXNDb2RlID09IDIwMH0nPgotICAgICAgICAke210Yy5yZXNwb25zZUJvZHlBc1N0cmluZ30KLSAgICA8L2o6aWY+Ci0gICAgPGo6aWYgdGVzdD0nJHttdGMuc3RhdHVzQ29kZSAhPSAyMDB9Jz4KLSAgICAgICAgUmVzdWx0cyBmb3IgbXRjIHVybCBhcmU6Ci0gICAgICAgIGh0dHAgcmV0dXJuIGNvZGUgPSAke210Yy5zdGF0dXNDb2RlfQotICAgICAgICBodHRwIHN0YXR1cyB0ZXh0ID0gJyR7bXRjLnN0YXR1c1RleHR9JwotICAgICAgICBzaXplIG9mIHJlc3VsdCA9ICR7bXRjLnJlc3BvbnNlQm9keUFzU3RyaW5nLmxlbmd0aCgpfQotICAgICAgICByZXNwb25zZSB0aW1lID0gJHttdGMucmVzcG9uc2VUaW1lfQotCi0gICAgICAgICAgICA8ajpmb3JFYWNoIGl0ZW1zPSIke210Yy5yZXNwb25zZUhlYWRlcnN9IiB2YXI9ImhlYWRlciIgaW5kZXhWYXI9ImkiPgotICAgICAgICAgICAgICAgIGhlYWRlclske2l9XSA9ICR7aGVhZGVyfQotICAgICAgICAgICAgPC9qOmZvckVhY2g+Ci0gICAgPC9qOmlmPgotICAgICR7aHR0cFNlcnZlci5zdG9wKGZhbHNlKX0KLQotPC9qOmplbGx5PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qZXR0eS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvamV0dHkvamVsbHlSZXNvdXJjZUhhbmRsZXIuamVsbHkgYi9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9qZWxseVJlc291cmNlSGFuZGxlci5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1MDhkOS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9qZWxseVJlc291cmNlSGFuZGxlci5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqOmplbGx5Ci0gICAgeG1sbnM6aj0iamVsbHk6Y29yZSIKLSAgICB4bWxucz0iamVsbHk6amV0dHkiCi0gICAgeG1sbnM6aHR0cD0iamVsbHk6aHR0cCIKLSAgICB0cmltPSJmYWxzZSI+Ci0KLSAgICA8ajpzZXQgdmFyPSJjb250ZXh0UGF0aFZhciIgdmFsdWU9Ii9yZXNvdXJjZUhhbmRsZXJUZXN0Ii8+Ci0gICAgPGo6c2V0IHZhcj0idGVzdFBvcnQxIiB2YWx1ZT0iODEwMCIvPgotICAgIDxqOnNldCB2YXI9InRlc3RQb3J0MiIgdmFsdWU9IjgyMDAiLz4KLSAgICA8ajpzZXQgdmFyPSJ0ZXN0VXJpMSIgdmFsdWU9Imh0dHA6Ly9sb2NhbGhvc3Q6JHt0ZXN0UG9ydDF9JHtjb250ZXh0UGF0aFZhcn0vcmVzb3VyY2VIYW5kbGVyVGVzdC50eHQiLz4KLSAgICA8ajpzZXQgdmFyPSJ0ZXN0VXJpMiIgdmFsdWU9Imh0dHA6Ly9sb2NhbGhvc3Q6JHt0ZXN0UG9ydDJ9JHtjb250ZXh0UGF0aFZhcn0vcmVzb3VyY2VIYW5kbGVyVGVzdC50eHQiLz4KLQotICAgIDxqZXR0eUh0dHBTZXJ2ZXIgdmFyPSJodHRwU2VydmVyTm9PcCI+Ci0gICAgICA8c29ja2V0TGlzdGVuZXIgcG9ydD0iJHt0ZXN0UG9ydDF9Ii8+Ci0gICAgICA8aHR0cENvbnRleHQgY29udGV4dFBhdGg9IiR7Y29udGV4dFBhdGhWYXJ9IiByZXNvdXJjZUJhc2U9Ii4vZG9jUm9vdC9yZXNvdXJjZUhhbmRsZXJUZXN0Ij4KLSAgICAgICAgICA8amVsbHlSZXNvdXJjZUhhbmRsZXIvPgotICAgICAgPC9odHRwQ29udGV4dD4KLSAgICA8L2pldHR5SHR0cFNlcnZlcj4KLQotICAgIDxqZXR0eUh0dHBTZXJ2ZXIgdmFyPSJodHRwU2VydmVyT3AiPgotICAgICAgPHNvY2tldExpc3RlbmVyIHBvcnQ9IiR7dGVzdFBvcnQyfSIvPgotICAgICAgPGh0dHBDb250ZXh0IGNvbnRleHRQYXRoPSIke2NvbnRleHRQYXRoVmFyfSIgcmVzb3VyY2VCYXNlPSIuL2RvY1Jvb3QvcmVzb3VyY2VIYW5kbGVyVGVzdCI+Ci0gICAgICAgICAgPGplbGx5UmVzb3VyY2VIYW5kbGVyPgotCi0gICAgICAgICAgICA8Z2V0UmVxdWVzdD4KLSAgICAgICAgICAgICAgICA8ajpzZXQgdmFyPSJuZXcuY29udGVudC50eXBlIiB2YWx1ZT0idGV4dC9wbGFpbiIvPgotICAgICAgICAgICAgICAgIDxqOnNldCB2YXI9Im5ldy5sb2NhdGlvbiIgdmFsdWU9Im5ldyBsb2NhdGlvbiIvPgotCi0gICAgICAgICAgICAgICAgPHJlc3BvbnNlSGVhZGVyIG5hbWU9IkNvbnRlbnQtVHlwZSIgdmFsdWU9IiR7bmV3LmNvbnRlbnQudHlwZX0iLz4KLSAgICAgICAgICAgICAgICA8cmVzcG9uc2VIZWFkZXIgbmFtZT0iTG9jYXRpb24iIHZhbHVlPSIke25ldy5sb2NhdGlvbn0iLz4KLSAgICAgICAgICAgICAgICA8cmVzcG9uc2VCb2R5PgotICAgICAgICAgICAgICAgICAgICBJdCB3b3JrcyEKLSAgICAgICAgICAgICAgICA8L3Jlc3BvbnNlQm9keT4KLQotICAgICAgICAgICAgPC9nZXRSZXF1ZXN0PgotCi0gICAgICAgICAgPC9qZWxseVJlc291cmNlSGFuZGxlcj4KLSAgICAgIDwvaHR0cENvbnRleHQ+Ci0gICAgPC9qZXR0eUh0dHBTZXJ2ZXI+Ci0KLSAgICA8aHR0cDpnZXQgdmFyPSJtdGMxIiB1cmk9IiR7dGVzdFVyaTF9Ii8+Ci0gICAgPGo6Y2hvb3NlPgotICAgICAgPGo6d2hlbiB0ZXN0PSIke210YzEuc3RhdHVzQ29kZSA9PSA0MDR9Ij4KLSAgICAgICAgICA8aHR0cDpnZXQgdmFyPSJtdGMyIiB1cmk9IiR7dGVzdFVyaTJ9Ii8+Ci0gICAgICAgICAgPGo6Y2hvb3NlPgotICAgICAgICAgICAgICA8ajp3aGVuIHRlc3Q9IiR7bXRjMi5zdGF0dXNDb2RlID09IDIwMH0iPgotICAgICAgICAgICAgICAgIEl0IHdvcmtzIQotICAgICAgICAgICAgICA8L2o6d2hlbj4KLSAgICAgICAgICAgICAgPGo6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIFJlc3VsdHMgZm9yIG10YzIgdXJsIGFyZToKLSAgICAgICAgICAgICAgICBodHRwIHJldHVybiBjb2RlID0gJHttdGMyLnN0YXR1c0NvZGV9Ci0gICAgICAgICAgICAgICAgaHR0cCBzdGF0dXMgdGV4dCA9ICcke210YzIuc3RhdHVzVGV4dH0nCi0gICAgICAgICAgICAgICAgQ29udGVudC1UeXBlID0gJHttdGMyLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKX0KLSAgICAgICAgICAgICAgICBMb2NhdGlvbiA9ICR7bXRjMi5nZXRSZXNwb25zZUhlYWRlcigiTG9jYXRpb24iKX0KLSAgICAgICAgICAgICAgPC9qOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwvajpjaG9vc2U+Ci0gICAgICA8L2o6d2hlbj4KLQotICAgICAgPGo6b3RoZXJ3aXNlPgotICAgICAgICBSZXN1bHRzIGZvciBtdGMxIHVybCBhcmU6Ci0gICAgICAgIGh0dHAgcmV0dXJuIGNvZGUgPSAke210YzEuc3RhdHVzQ29kZX0KLSAgICAgICAgaHR0cCBzdGF0dXMgdGV4dCA9ICcke210YzEuc3RhdHVzVGV4dH0nCi0gICAgICA8L2o6b3RoZXJ3aXNlPgotICAgIDwvajpjaG9vc2U+Ci0KLSAgICAke2h0dHBTZXJ2ZXJOb09wLnN0b3AoZmFsc2UpfQotICAgICR7aHR0cFNlcnZlck9wLnN0b3AoZmFsc2UpfQotCi08L2o6amVsbHk+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9qZWxseVJlc291cmNlSGFuZGxlclJlcXVlc3RCb2R5LmplbGx5IGIvamVsbHktdGFncy9qZXR0eS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvamV0dHkvamVsbHlSZXNvdXJjZUhhbmRsZXJSZXF1ZXN0Qm9keS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwYmQ0Yy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9qZWxseVJlc291cmNlSGFuZGxlclJlcXVlc3RCb2R5LmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uDQotICANCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICANCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICANCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxqOmplbGx5DQotICAgIHhtbG5zOmo9ImplbGx5OmNvcmUiDQotICAgIHhtbG5zPSJqZWxseTpqZXR0eSINCi0gICAgeG1sbnM6aHR0cD0iamVsbHk6aHR0cCINCi0gICAgdHJpbT0iZmFsc2UiPg0KLQ0KLSAgICA8ajpzZXQgdmFyPSJjb250ZXh0UGF0aFZhciIgdmFsdWU9Ii9yZXNvdXJjZUhhbmRsZXJUZXN0Ii8+DQotICAgIDxqOnNldCB2YXI9InRlc3RQb3J0MSIgdmFsdWU9IjgxMDAiLz4NCi0gICAgPGo6c2V0IHZhcj0idGVzdFVyaTEiIHZhbHVlPSJodHRwOi8vbG9jYWxob3N0OiR7dGVzdFBvcnQxfSR7Y29udGV4dFBhdGhWYXJ9L3Jlc291cmNlSGFuZGxlclRlc3QudHh0Ii8+DQotDQotICAgIDxqZXR0eUh0dHBTZXJ2ZXIgdmFyPSJodHRwU2VydmVyIj4NCi0gICAgICA8c29ja2V0TGlzdGVuZXIgcG9ydD0iJHt0ZXN0UG9ydDF9Ii8+DQotICAgICAgPGh0dHBDb250ZXh0IGNvbnRleHRQYXRoPSIke2NvbnRleHRQYXRoVmFyfSIgcmVzb3VyY2VCYXNlPSIuL2RvY1Jvb3QvcmVzb3VyY2VIYW5kbGVyVGVzdCI+DQotICAgICAgICAgIDxqZWxseVJlc291cmNlSGFuZGxlcj4NCi0NCi0gICAgICAgICAgICA8cG9zdFJlcXVlc3Q+DQotICAgICAgICAgICAgICAgIDwhLS0gcmV0dXJuIHRoZSByZXF1ZXN0IGJvZHkgLS0+DQotICAgICAgICAgICAgICAgIDxyZXNwb25zZUhlYWRlciBuYW1lPSJDb250ZW50LVR5cGUiIHZhbHVlPSJ0ZXh0L3BsYWluIi8+DQotICAgICAgICAgICAgICAgIDxyZXNwb25zZUJvZHk+DQotICAgICAgICAgICAgICAgICAgICAke3JlcXVlc3RCb2R5fQ0KLSAgICAgICAgICAgICAgICA8L3Jlc3BvbnNlQm9keT4NCi0gICAgICAgICAgICAgICAgPCEtLSBhbHNvIHRlc3QgcmVzcG9uc2UgY29kZSAtLT4NCi0gICAgICAgICAgICAgICAgPHJlc3BvbnNlQ29kZSB2YWx1ZT0iMjAyIi8+DQotICAgICAgICAgICAgPC9wb3N0UmVxdWVzdD4NCi0NCi0gICAgICAgICAgPC9qZWxseVJlc291cmNlSGFuZGxlcj4NCi0gICAgICA8L2h0dHBDb250ZXh0Pg0KLSAgICA8L2pldHR5SHR0cFNlcnZlcj4NCi0NCi0gICAgPCEtLSBwb3N0IHNvbWV0aGluZyAtLT4NCi0gICAgPGh0dHA6cG9zdCB2YXI9Im10YzEiIHVyaT0iJHt0ZXN0VXJpMX0iPg0KLSAgICAgICAgPGh0dHA6aGVhZGVyIG5hbWU9IkNvbnRlbnQtVHlwZSIgdmFsdWU9InRleHQvcGxhaW4iLz4NCi0gICAgICAgIDxodHRwOmJvZHk+DQotICAgICAgICAgICAgSXQgd29ya3MhDQotICAgICAgICA8L2h0dHA6Ym9keT4NCi0gICAgPC9odHRwOnBvc3Q+DQotDQotICAgIDxqOmNob29zZT4NCi0gICAgICA8ajp3aGVuIHRlc3Q9IiR7bXRjMS5zdGF0dXNDb2RlID09IDIwMn0iPg0KLSAgICAgICAgICAke210YzEucmVzcG9uc2VCb2R5QXNTdHJpbmd9DQotICAgICAgPC9qOndoZW4+DQotDQotICAgICAgPGo6b3RoZXJ3aXNlPg0KLSAgICAgICAgUmVzdWx0cyBmb3IgbXRjMSB1cmwgYXJlOg0KLSAgICAgICAgaHR0cCByZXR1cm4gY29kZSA9ICR7bXRjMS5zdGF0dXNDb2RlfQ0KLSAgICAgICAgaHR0cCBzdGF0dXMgdGV4dCA9ICcke210YzEuc3RhdHVzVGV4dH0nDQotICAgICAgPC9qOm90aGVyd2lzZT4NCi0gICAgPC9qOmNob29zZT4NCi0NCi0gICAgJHtodHRwU2VydmVyLnN0b3AoZmFsc2UpfQ0KLQ0KLTwvajpqZWxseT4NCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9qZXR0eUxvZ0ZpbGUuamVsbHkgYi9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9qZXR0eUxvZ0ZpbGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzODY1ZDIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qZXR0eS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvamV0dHkvamV0dHlMb2dGaWxlLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uDQotICANCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICANCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICANCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxqOmplbGx5DQotICAgIHhtbG5zOmo9ImplbGx5OmNvcmUiDQotICAgIHhtbG5zPSJqZWxseTpqZXR0eSINCi0gICAgeG1sbnM6aHR0cD0iamVsbHk6aHR0cCINCi0gICAgdHJpbT0iZmFsc2UiPg0KLQ0KLSAgICA8ajpzZXQgdmFyPSJjb250ZXh0UGF0aFZhciIgdmFsdWU9IiIvPg0KLSAgICA8ajpzZXQgdmFyPSJ0ZXN0UG9ydCIgdmFsdWU9IjgxMDAiLz4NCi0gICAgPGo6c2V0IHZhcj0idGVzdFVyaSIgdmFsdWU9Imh0dHA6Ly9sb2NhbGhvc3Q6JHt0ZXN0UG9ydH0ke2NvbnRleHRQYXRoVmFyfS90ZXN0MS50eHQiLz4NCi0NCi0gICAgPGpldHR5SHR0cFNlcnZlciB2YXI9Imh0dHBTZXJ2ZXIiIGxvZ0ZpbGVOYW1lPSJKZWxseUxvZ0ZpbGVUZXN0LmxvZyIvPg0KLQ0KLSAgICA8aHR0cDpnZXQgdmFyPSJtdGMiIHVyaT0iJHt0ZXN0VXJpfSIvPg0KLSAgICA8ajppZiB0ZXN0PScke210Yy5zdGF0dXNDb2RlID09IDIwMH0nPg0KLSAgICAgICAgJHttdGMucmVzcG9uc2VCb2R5QXNTdHJpbmd9DQotICAgIDwvajppZj4NCi0gICAgPGo6aWYgdGVzdD0nJHttdGMuc3RhdHVzQ29kZSAhPSAyMDB9Jz4NCi0gICAgICAgIFJlc3VsdHMgZm9yIG10YyB1cmwgYXJlOg0KLSAgICAgICAgaHR0cCByZXR1cm4gY29kZSA9ICR7bXRjLnN0YXR1c0NvZGV9DQotICAgICAgICBodHRwIHN0YXR1cyB0ZXh0ID0gJyR7bXRjLnN0YXR1c1RleHR9Jw0KLSAgICAgICAgc2l6ZSBvZiByZXN1bHQgPSAke210Yy5yZXNwb25zZUJvZHlBc1N0cmluZy5sZW5ndGgoKX0NCi0gICAgICAgIHJlc3BvbnNlIHRpbWUgPSAke210Yy5yZXNwb25zZVRpbWV9DQotDQotICAgICAgICAgICAgPGo6Zm9yRWFjaCBpdGVtcz0iJHttdGMucmVzcG9uc2VIZWFkZXJzfSIgdmFyPSJoZWFkZXIiIGluZGV4VmFyPSJpIj4NCi0gICAgICAgICAgICAgICAgaGVhZGVyWyR7aX1dID0gJHtoZWFkZXJ9DQotICAgICAgICAgICAgPC9qOmZvckVhY2g+DQotICAgIDwvajppZj4NCi0gICAgJHtodHRwU2VydmVyLnN0b3AoKX0NCi0NCi08L2o6amVsbHk+DQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qZXR0eS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvamV0dHkvcmVzb3VyY2VIYW5kbGVyLmplbGx5IGIvamVsbHktdGFncy9qZXR0eS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvamV0dHkvcmVzb3VyY2VIYW5kbGVyLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2M5YzFlLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamV0dHkvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pldHR5L3Jlc291cmNlSGFuZGxlci5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqOmplbGx5Ci0gICAgeG1sbnM6aj0iamVsbHk6Y29yZSIKLSAgICB4bWxucz0iamVsbHk6amV0dHkiCi0gICAgeG1sbnM6aHR0cD0iamVsbHk6aHR0cCIKLSAgICB0cmltPSJmYWxzZSI+Ci0KLSAgICA8ajpzZXQgdmFyPSJjb250ZXh0UGF0aFZhciIgdmFsdWU9Ii9yZXNvdXJjZUhhbmRsZXJUZXN0Ii8+Ci0gICAgPGo6c2V0IHZhcj0idGVzdFBvcnQxIiB2YWx1ZT0iODEwMCIvPgotICAgIDxqOnNldCB2YXI9InRlc3RQb3J0MiIgdmFsdWU9IjgyMDAiLz4KLSAgICA8ajpzZXQgdmFyPSJ0ZXN0VXJpIiB2YWx1ZT0iaHR0cDovL2xvY2FsaG9zdDoke3Rlc3RQb3J0MX0ke2NvbnRleHRQYXRoVmFyfS9yZXNvdXJjZUhhbmRsZXJUZXN0LnR4dCIvPgotICAgIDxqOnNldCB2YXI9ImJvZ3VzVXJpIiB2YWx1ZT0iaHR0cDovL2xvY2FsaG9zdDoke3Rlc3RQb3J0MX0ke2NvbnRleHRQYXRoVmFyfS96enoiLz4KLSAgICA8ajpzZXQgdmFyPSJ0ZXN0VXJpSGVhZE9ubHkiIHZhbHVlPSJodHRwOi8vbG9jYWxob3N0OiR7dGVzdFBvcnQyfSR7Y29udGV4dFBhdGhWYXJ9L3Jlc291cmNlSGFuZGxlclRlc3QudHh0Ii8+Ci0KLSAgICA8amV0dHlIdHRwU2VydmVyIHZhcj0iaHR0cFNlcnZlckRlZmF1bHQiPgotICAgICAgPHNvY2tldExpc3RlbmVyIHBvcnQ9IiR7dGVzdFBvcnQxfSIvPgotICAgICAgPGh0dHBDb250ZXh0IGNvbnRleHRQYXRoPSIke2NvbnRleHRQYXRoVmFyfSIgcmVzb3VyY2VCYXNlPSIuL2RvY1Jvb3QvcmVzb3VyY2VIYW5kbGVyVGVzdCI+Ci0gICAgICAgICAgPHJlc291cmNlSGFuZGxlci8+Ci0gICAgICA8L2h0dHBDb250ZXh0PgotICAgIDwvamV0dHlIdHRwU2VydmVyPgotCi0gICAgPGpldHR5SHR0cFNlcnZlciB2YXI9Imh0dHBTZXJ2ZXJIZWFkT25seSI+Ci0gICAgICA8c29ja2V0TGlzdGVuZXIgcG9ydD0iJHt0ZXN0UG9ydDJ9Ii8+Ci0gICAgICA8aHR0cENvbnRleHQgY29udGV4dFBhdGg9IiR7Y29udGV4dFBhdGhWYXJ9IiByZXNvdXJjZUJhc2U9Ii4vZG9jUm9vdC9yZXNvdXJjZUhhbmRsZXJUZXN0Ij4KLSAgICAgICAgICA8cmVzb3VyY2VIYW5kbGVyIGFsbG93ZWRNZXRob2RzPSJPUFRJT05TLERFTEVURSwgSEVBRCIvPgotICAgICAgPC9odHRwQ29udGV4dD4KLSAgICA8L2pldHR5SHR0cFNlcnZlcj4KLQotICAgIDxodHRwOmdldCB2YXI9Im10YzEiIHVyaT0iJHt0ZXN0VXJpfSIvPgotCi0gICAgPCEtLSBpZiBnZXQgdG8gZGVmYXVsdCB3b3JrcyBhbmQgYm9ndXMgdXJpIHJldHVybnMgNDA0Ci0gICAgICAgICBhbmQgYSBoZWFkIHJlcXVlc3QgdG8gdGhlIGhlYWQgb25seSByZXNvdXJjZSBoYW5kbGVyIHdvcmtzCi0gICAgICAgICB3aGVuIGEgZ2V0IGZhaWxzIHRoZW4gYWxsIGlzIG9rIC0tPgotICAgIDxqOmlmIHRlc3Q9JyR7bXRjMS5zdGF0dXNDb2RlID09IDIwMH0nPgotICAgICAgICA8aHR0cDpnZXQgdmFyPSJtdGMyIiB1cmk9IiR7Ym9ndXNVcml9Ii8+Ci0gICAgICAgIDxqOmlmIHRlc3Q9JyR7bXRjMi5zdGF0dXNDb2RlID09IDQwNH0nPgotICAgICAgICAgICAgPGh0dHA6aGVhZCB2YXI9Im10YzMiIHVyaT0iJHt0ZXN0VXJpSGVhZE9ubHl9Ii8+Ci0gICAgICAgICAgICA8ajppZiB0ZXN0PScke210YzMuc3RhdHVzQ29kZSA9PSAyMDB9Jz4KLSAgICAgICAgICAgICAgICA8aHR0cDpnZXQgdmFyPSJtdGM0IiB1cmk9IiR7dGVzdFVyaUhlYWRPbmx5fSIvPgotICAgICAgICAgICAgICAgIDxqOmlmIHRlc3Q9JyR7bXRjNC5zdGF0dXNDb2RlID09IDQwNX0nPgotICAgICAgICAgICAgICAgICAgICBJdCB3b3JrcyEKLSAgICAgICAgICAgICAgICA8L2o6aWY+Ci0gICAgICAgICAgICA8L2o6aWY+Ci0gICAgICAgIDwvajppZj4KLSAgICAgICAgPGo6aWYgdGVzdD0nJHttdGMyLnN0YXR1c0NvZGUgIT0gNDA0fSc+Ci0gICAgICAgICAgICBSZXN1bHRzIGZvciBtdGMyIHVybCBhcmU6Ci0gICAgICAgICAgICBodHRwIHJldHVybiBjb2RlID0gJHttdGMyLnN0YXR1c0NvZGV9Ci0gICAgICAgICAgICBodHRwIHN0YXR1cyB0ZXh0ID0gJyR7bXRjMi5zdGF0dXNUZXh0fScKLSAgICAgICAgICAgIHNpemUgb2YgcmVzdWx0ID0gJHttdGMyLnJlc3BvbnNlQm9keUFzU3RyaW5nLmxlbmd0aCgpfQotICAgICAgICAgICAgcmVzcG9uc2UgdGltZSA9ICR7bXRjMi5yZXNwb25zZVRpbWV9Ci0KLSAgICAgICAgICAgICAgICA8ajpmb3JFYWNoIGl0ZW1zPSIke210YzIucmVzcG9uc2VIZWFkZXJzfSIgdmFyPSJoZWFkZXIiIGluZGV4VmFyPSJpIj4KLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyWyR7aX1dID0gJHtoZWFkZXJ9Ci0gICAgICAgICAgICAgICAgPC9qOmZvckVhY2g+Ci0gICAgICAgIDwvajppZj4KLSAgICA8L2o6aWY+Ci0gICAgPGo6aWYgdGVzdD0nJHttdGMxLnN0YXR1c0NvZGUgIT0gMjAwfSc+Ci0gICAgICAgIFJlc3VsdHMgZm9yIG10YzEgdXJsIGFyZToKLSAgICAgICAgaHR0cCByZXR1cm4gY29kZSA9ICR7bXRjMS5zdGF0dXNDb2RlfQotICAgICAgICBodHRwIHN0YXR1cyB0ZXh0ID0gJyR7bXRjMS5zdGF0dXNUZXh0fScKLSAgICAgICAgc2l6ZSBvZiByZXN1bHQgPSAke210YzEucmVzcG9uc2VCb2R5QXNTdHJpbmcubGVuZ3RoKCl9Ci0gICAgICAgIHJlc3BvbnNlIHRpbWUgPSAke210YzEucmVzcG9uc2VUaW1lfQotCi0gICAgICAgICAgICA8ajpmb3JFYWNoIGl0ZW1zPSIke210YzEucmVzcG9uc2VIZWFkZXJzfSIgdmFyPSJoZWFkZXIiIGluZGV4VmFyPSJpIj4KLSAgICAgICAgICAgICAgICBoZWFkZXJbJHtpfV0gPSAke2hlYWRlcn0KLSAgICAgICAgICAgIDwvajpmb3JFYWNoPgotICAgIDwvajppZj4KLSAgICAke2h0dHBTZXJ2ZXJIZWFkT25seS5zdG9wKGZhbHNlKX0KLSAgICAke2h0dHBTZXJ2ZXJEZWZhdWx0LnN0b3AoZmFsc2UpfQotCi08L2o6amVsbHk+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9zZWN1cml0eUhhbmRsZXIuamVsbHkgYi9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9zZWN1cml0eUhhbmRsZXIuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlODJkZDYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qZXR0eS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvamV0dHkvc2VjdXJpdHlIYW5kbGVyLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqOmplbGx5Ci0gICAgeG1sbnM6aj0iamVsbHk6Y29yZSIKLSAgICB4bWxucz0iamVsbHk6amV0dHkiCi0gICAgeG1sbnM6aHR0cD0iamVsbHk6aHR0cCIKLSAgICB0cmltPSJmYWxzZSI+Ci0KLSAgICA8ajpzZXQgdmFyPSJjb250ZXh0UGF0aFZhciIgdmFsdWU9Ii9yZXNvdXJjZUhhbmRsZXJUZXN0Ii8+Ci0gICAgPGo6c2V0IHZhcj0idGVzdFBvcnQxIiB2YWx1ZT0iODEwMCIvPgotICAgIDxqOnNldCB2YXI9InRlc3RQb3J0MiIgdmFsdWU9IjgyMDAiLz4KLSAgICA8ajpzZXQgdmFyPSJ0ZXN0VXJpMSIgdmFsdWU9Imh0dHA6Ly9sb2NhbGhvc3Q6JHt0ZXN0UG9ydDF9JHtjb250ZXh0UGF0aFZhcn0vcmVzb3VyY2VIYW5kbGVyVGVzdC50eHQiLz4KLSAgICA8ajpzZXQgdmFyPSJ0ZXN0VXJpMiIgdmFsdWU9Imh0dHA6Ly9sb2NhbGhvc3Q6JHt0ZXN0UG9ydDJ9JHtjb250ZXh0UGF0aFZhcn0vcmVzb3VyY2VIYW5kbGVyVGVzdC50eHQiLz4KLQotICAgIDxqZXR0eUh0dHBTZXJ2ZXIgdmFyPSJodHRwU2VydmVyTm9BY2Nlc3MiPgotICAgICAgPHNvY2tldExpc3RlbmVyIHBvcnQ9IiR7dGVzdFBvcnQxfSIvPgotICAgICAgPHJlYWxtIG5hbWU9IkRlbW8gUmVhbG0iIGNvbmZpZz0ic2V0dXAvZGVtb1JlYWxtLnByb3BlcnRpZXMiLz4KLSAgICAgIDxodHRwQ29udGV4dCBjb250ZXh0UGF0aD0iJHtjb250ZXh0UGF0aFZhcn0iIHJlc291cmNlQmFzZT0iLi9kb2NSb290L3Jlc291cmNlSGFuZGxlclRlc3QiIHJlYWxtTmFtZT0iRGVtbyBSZWFsbSI+Ci0gICAgICAgICAgPHNlY3VyaXR5SGFuZGxlcj4KLSAgICAgICAgICAgIDxjb25zdHJhaW50cz4KLQotICAgICAgICAgICAgICA8c2VjdXJpdHktY29uc3RyYWludD4KLSAgICAgICAgICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT5EZWZhdWx0PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDx1cmwtcGF0dGVybj4vPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgICAgIDxhdXRoLWNvbnN0cmFpbnQ+Ci0gICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPio8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8L2F1dGgtY29uc3RyYWludD4KLSAgICAgICAgICAgICAgPC9zZWN1cml0eS1jb25zdHJhaW50PgotCi0gICAgICAgICAgICAgIDxsb2dpbi1jb25maWc+Ci0gICAgICAgICAgICAgICAgPGF1dGgtbWV0aG9kPkJBU0lDPC9hdXRoLW1ldGhvZD4KLSAgICAgICAgICAgICAgICA8cmVhbG0tbmFtZT5EZW1vIFJlYWxtPC9yZWFsbS1uYW1lPgotICAgICAgICAgICAgICA8L2xvZ2luLWNvbmZpZz4KLQotICAgICAgICAgICAgPC9jb25zdHJhaW50cz4KLSAgICAgICAgICA8L3NlY3VyaXR5SGFuZGxlcj4KLQotICAgICAgICAgIDxyZXNvdXJjZUhhbmRsZXIvPgotICAgICAgPC9odHRwQ29udGV4dD4KLSAgICA8L2pldHR5SHR0cFNlcnZlcj4KLQotICAgIDxqZXR0eUh0dHBTZXJ2ZXIgdmFyPSJodHRwU2VydmVyQWxsb3dBY2Nlc3MiPgotICAgICAgPHNvY2tldExpc3RlbmVyIHBvcnQ9IiR7dGVzdFBvcnQyfSIvPgotICAgICAgPGh0dHBDb250ZXh0IGNvbnRleHRQYXRoPSIke2NvbnRleHRQYXRoVmFyfSIgcmVzb3VyY2VCYXNlPSIuL2RvY1Jvb3QvcmVzb3VyY2VIYW5kbGVyVGVzdCI+Ci0gICAgICAgICAgPHNlY3VyaXR5SGFuZGxlcj4KLSAgICAgICAgICAgIDxjb25zdHJhaW50cz4KLQotICAgICAgICAgICAgICA8c2VjdXJpdHktY29uc3RyYWludD4KLSAgICAgICAgICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT5SZXNvdXJjZSBIYW5kbGVyIFRlc3Q8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgICAgICAgPHVybC1wYXR0ZXJuPi9yZXNvdXJjZUhhbmRsZXJUZXN0Lyo8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgICAgPC9zZWN1cml0eS1jb25zdHJhaW50PgotCi0gICAgICAgICAgICAgIDxzZWN1cml0eS1jb25zdHJhaW50PgotICAgICAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPkRlZmF1bHQ8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgICAgICAgPHVybC1wYXR0ZXJuPi88L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICAgICAgPGF1dGgtY29uc3RyYWludC8+Ci0gICAgICAgICAgICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KLQotICAgICAgICAgICAgPC9jb25zdHJhaW50cz4KLSAgICAgICAgICA8L3NlY3VyaXR5SGFuZGxlcj4KLQotICAgICAgICAgIDxyZXNvdXJjZUhhbmRsZXIvPgotICAgICAgPC9odHRwQ29udGV4dD4KLSAgICA8L2pldHR5SHR0cFNlcnZlcj4KLQotICAgIDwhLS0gZ2V0IHdpdGggbm8gYXV0aGVudGljYXRpb24gc2hvdWxkIGZhaWwtLT4KLSAgICA8aHR0cDpnZXQgdmFyPSJtdGMxIiB1cmk9IiR7dGVzdFVyaTF9Ii8+Ci0KLSAgICA8ajpjaG9vc2U+Ci0gICAgICA8ajp3aGVuIHRlc3Q9IiR7bXRjMS5zdGF0dXNDb2RlID09IDQwM30iPgotICAgICAgICAgIDwhLS0gZ2V0IHdpdGggbm8gYXV0aGVudGljYXRpb24gaW4gYWxsb3dlZCBhcmVhIHNob3VsZCB3b3JrLS0+Ci0gICAgICAgICAgPGh0dHA6Z2V0IHZhcj0ibXRjMiIgdXJpPSIke3Rlc3RVcmkyfSIvPgotICAgICAgICAgIDxqOmNob29zZT4KLSAgICAgICAgICAgICAgPGo6d2hlbiB0ZXN0PSIke210YzIuc3RhdHVzQ29kZSA9PSAyMDB9Ij4KLSAgICAgICAgICAgICAgICAgIDwhLS0gZ2V0IHdpdGggYXV0aGVudGljYXRpb24gaW4gY29udHJvbGxlZCBhcmVhIHNob3VsZCB3b3JrLS0+Ci0gICAgICAgICAgICAgICAgICA8aHR0cDpnZXQgdmFyPSJtdGMzIiB1cmk9IiR7dGVzdFVyaTF9Ij4KLSAgICAgICAgICAgICAgICAgICAgIDxodHRwOmhlYWRlciBuYW1lPSJBdXRob3JpemF0aW9uIiB2YWx1ZT0iQmFzaWMgUVd4aFpHUnBianB2Y0dWdUlITmxjMkZ0WlE9PSIvPgotICAgICAgICAgICAgICAgICAgPC9odHRwOmdldD4KLSAgICAgICAgICAgICAgICAgIDxqOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICA8ajp3aGVuIHRlc3Q9IiR7bXRjMy5zdGF0dXNDb2RlID09IDIwMH0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICBJdCB3b3JrcyEKLSAgICAgICAgICAgICAgICAgICAgICA8L2o6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICA8ajpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRzIGZvciBtdGMzIHVybCBhcmU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwIHJldHVybiBjb2RlID0gJHttdGMzLnN0YXR1c0NvZGV9Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwIHN0YXR1cyB0ZXh0ID0gJyR7bXRjMy5zdGF0dXNUZXh0fScKLSAgICAgICAgICAgICAgICAgICAgICA8L2o6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgPC9qOmNob29zZT4KLSAgICAgICAgICAgICAgPC9qOndoZW4+Ci0KLSAgICAgICAgICAgICAgPGo6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIFJlc3VsdHMgZm9yIG10YzIgdXJsIGFyZToKLSAgICAgICAgICAgICAgICBodHRwIHJldHVybiBjb2RlID0gJHttdGMyLnN0YXR1c0NvZGV9Ci0gICAgICAgICAgICAgICAgaHR0cCBzdGF0dXMgdGV4dCA9ICcke210YzIuc3RhdHVzVGV4dH0nCi0gICAgICAgICAgICAgIDwvajpvdGhlcndpc2U+Ci0gICAgICAgICAgPC9qOmNob29zZT4KLQotICAgICAgPC9qOndoZW4+Ci0KLSAgICAgIDxqOm90aGVyd2lzZT4KLSAgICAgICAgUmVzdWx0cyBmb3IgbXRjMSB1cmwgYXJlOgotICAgICAgICBodHRwIHJldHVybiBjb2RlID0gJHttdGMxLnN0YXR1c0NvZGV9Ci0gICAgICAgIGh0dHAgc3RhdHVzIHRleHQgPSAnJHttdGMxLnN0YXR1c1RleHR9JwotICAgICAgPC9qOm90aGVyd2lzZT4KLSAgICA8L2o6Y2hvb3NlPgotICAgICR7aHR0cFNlcnZlckFsbG93QWNjZXNzLnN0b3AoZmFsc2UpfQotICAgICR7aHR0cFNlcnZlck5vQWNjZXNzLnN0b3AoZmFsc2UpfQotCi08L2o6amVsbHk+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9zZWN1cml0eUhhbmRsZXJGb3JiaWRkZW4uamVsbHkgYi9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9zZWN1cml0eUhhbmRsZXJGb3JiaWRkZW4uamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiODc1NmEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qZXR0eS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvamV0dHkvc2VjdXJpdHlIYW5kbGVyRm9yYmlkZGVuLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGo6amVsbHkKLSAgICB4bWxuczpqPSJqZWxseTpjb3JlIgotICAgIHhtbG5zPSJqZWxseTpqZXR0eSIKLSAgICB4bWxuczpodHRwPSJqZWxseTpodHRwIgotICAgIHRyaW09ImZhbHNlIj4KLQotICAgIDxqOnNldCB2YXI9ImNvbnRleHRQYXRoVmFyIiB2YWx1ZT0iLyIvPgotICAgIDxqOnNldCB2YXI9InRlc3RQb3J0IiB2YWx1ZT0iODEwMCIvPgotICAgIDxqOnNldCB2YXI9ImZvcmJpZGRlblVyaSIgdmFsdWU9Imh0dHA6Ly9sb2NhbGhvc3Q6JHt0ZXN0UG9ydH0vbm9hY2Nlc3MiLz4KLQotICAgIDxqZXR0eUh0dHBTZXJ2ZXIgdmFyPSJodHRwU2VydmVyRm9yYmlkZGVuIj4KLSAgICAgIDxzb2NrZXRMaXN0ZW5lciBwb3J0PSIke3Rlc3RQb3J0fSIvPgotICAgICAgPGh0dHBDb250ZXh0IGNvbnRleHRQYXRoPSIke2NvbnRleHRQYXRoVmFyfSIgcmVzb3VyY2VCYXNlPSIuL2RvY1Jvb3QiPgotICAgICAgICAgIDxzZWN1cml0eUhhbmRsZXI+Ci0gICAgICAgICAgICA8Y29uc3RyYWludHM+Ci0KLSAgICAgICAgICAgICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0gICAgICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPkZvcmJpZGRlbjwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICAgICAgPGF1dGgtY29uc3RyYWludD4KLSAgICAgICAgICAgICAgICA8L2F1dGgtY29uc3RyYWludD4KLSAgICAgICAgICAgICAgPC9zZWN1cml0eS1jb25zdHJhaW50PgotCi0gICAgICAgICAgICA8L2NvbnN0cmFpbnRzPgotICAgICAgICAgIDwvc2VjdXJpdHlIYW5kbGVyPgotCi0gICAgICAgICAgPHJlc291cmNlSGFuZGxlci8+Ci0gICAgICA8L2h0dHBDb250ZXh0PgotICAgIDwvamV0dHlIdHRwU2VydmVyPgotCi0gICAgPCEtLSBnZXQgc2hvdWxkIGFsd2F5cyBiZSBmb3JiaWRkZW4gLS0+Ci0gICAgPGh0dHA6Z2V0IHZhcj0ibXRjIiB1cmk9IiR7Zm9yYmlkZGVuVXJpfSIvPgotCi0gICAgPGo6Y2hvb3NlPgotICAgICAgPGo6d2hlbiB0ZXN0PSIke210Yy5zdGF0dXNDb2RlID09IDQwM30iPgotICAgICAgICAgIEl0IHdvcmtzIQotICAgICAgPC9qOndoZW4+Ci0KLSAgICAgIDxqOm90aGVyd2lzZT4KLSAgICAgICAgUmVzdWx0cyBmb3IgbXRjIHVybCBhcmU6Ci0gICAgICAgIGh0dHAgcmV0dXJuIGNvZGUgPSAke210Yy5zdGF0dXNDb2RlfQotICAgICAgICBodHRwIHN0YXR1cyB0ZXh0ID0gJyR7bXRjLnN0YXR1c1RleHR9JwotICAgICAgPC9qOm90aGVyd2lzZT4KLSAgICA8L2o6Y2hvb3NlPgotICAgICR7aHR0cFNlcnZlckZvcmJpZGRlbi5zdG9wKGZhbHNlKX0KLQotPC9qOmplbGx5PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qZXR0eS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvamV0dHkvc2VjdXJpdHlIYW5kbGVyVW5hdXRob3JpemVkLmplbGx5IGIvamVsbHktdGFncy9qZXR0eS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvamV0dHkvc2VjdXJpdHlIYW5kbGVyVW5hdXRob3JpemVkLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzNlYjgxLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamV0dHkvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pldHR5L3NlY3VyaXR5SGFuZGxlclVuYXV0aG9yaXplZC5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqOmplbGx5Ci0gICAgeG1sbnM6aj0iamVsbHk6Y29yZSIKLSAgICB4bWxucz0iamVsbHk6amV0dHkiCi0gICAgeG1sbnM6aHR0cD0iamVsbHk6aHR0cCIKLSAgICB0cmltPSJmYWxzZSI+Ci0KLSAgICA8ajpzZXQgdmFyPSJjb250ZXh0UGF0aFZhciIgdmFsdWU9Ii9yZXNvdXJjZUhhbmRsZXJUZXN0Ii8+Ci0gICAgPGo6c2V0IHZhcj0idGVzdFBvcnQiIHZhbHVlPSI4MTAwIi8+Ci0gICAgPGo6c2V0IHZhcj0idGVzdFVyaSIgdmFsdWU9Imh0dHA6Ly9sb2NhbGhvc3Q6JHt0ZXN0UG9ydH0ke2NvbnRleHRQYXRoVmFyfS9yZXNvdXJjZUhhbmRsZXJUZXN0LnR4dCIvPgotCi0gICAgPGpldHR5SHR0cFNlcnZlciB2YXI9Imh0dHBTZXJ2ZXJVbmF1dGhvcml6ZWQiPgotICAgICAgPHNvY2tldExpc3RlbmVyIHBvcnQ9IiR7dGVzdFBvcnR9Ii8+Ci0gICAgICA8cmVhbG0gbmFtZT0iRGVtbyBSZWFsbSIgY29uZmlnPSJzZXR1cC9kZW1vUmVhbG0ucHJvcGVydGllcyIvPgotICAgICAgPGh0dHBDb250ZXh0IGNvbnRleHRQYXRoPSIke2NvbnRleHRQYXRoVmFyfSIgcmVzb3VyY2VCYXNlPSIuL2RvY1Jvb3QvcmVzb3VyY2VIYW5kbGVyVGVzdCIgcmVhbG1OYW1lPSJEZW1vIFJlYWxtIj4KLSAgICAgICAgICA8c2VjdXJpdHlIYW5kbGVyPgotICAgICAgICAgICAgPGNvbnN0cmFpbnRzPgotCi0gICAgICAgICAgICAgIDxzZWN1cml0eS1jb25zdHJhaW50PgotICAgICAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPkRlZmF1bHQ8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgICAgICAgPHVybC1wYXR0ZXJuPi88L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICAgICAgPGF1dGgtY29uc3RyYWludD4KLSAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+Kjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgotICAgICAgICAgICAgICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0KLSAgICAgICAgICAgICAgPGxvZ2luLWNvbmZpZz4KLSAgICAgICAgICAgICAgICA8YXV0aC1tZXRob2Q+QkFTSUM8L2F1dGgtbWV0aG9kPgotICAgICAgICAgICAgICAgIDxyZWFsbS1uYW1lPkRlbW8gUmVhbG08L3JlYWxtLW5hbWU+Ci0gICAgICAgICAgICAgIDwvbG9naW4tY29uZmlnPgotCi0gICAgICAgICAgICA8L2NvbnN0cmFpbnRzPgotICAgICAgICAgIDwvc2VjdXJpdHlIYW5kbGVyPgotCi0gICAgICAgICAgPHJlc291cmNlSGFuZGxlci8+Ci0gICAgICA8L2h0dHBDb250ZXh0PgotICAgIDwvamV0dHlIdHRwU2VydmVyPgotCi0gICAgPCEtLSBnZXQgd2l0aCBubyBhdXRoZW50aWNhdGlvbiBzaG91bGQgZmFpbCB3aXRoIFVuYXV0aG9yaXplZCAtLT4KLSAgICA8aHR0cDpnZXQgdmFyPSJtdGMxIiB1cmk9IiR7dGVzdFVyaX0iLz4KLQotICAgIDxqOmNob29zZT4KLSAgICAgIDxqOndoZW4gdGVzdD0iJHttdGMxLnN0YXR1c0NvZGUgPT0gNDAxfSI+Ci0gICAgICAgICAgPCEtLSBnZXQgd2l0aCBhdXRoZW50aWNhdGlvbiBpbiBjb250cm9sbGVkIGFyZWEgc2hvdWxkIHdvcmstLT4KLSAgICAgICAgICA8aHR0cDpnZXQgdmFyPSJtdGMyIiB1cmk9IiR7dGVzdFVyaX0iPgotICAgICAgICAgICAgIDxodHRwOmhlYWRlciBuYW1lPSJBdXRob3JpemF0aW9uIiB2YWx1ZT0iQmFzaWMgUVd4aFpHUnBianB2Y0dWdUlITmxjMkZ0WlE9PSIvPgotICAgICAgICAgIDwvaHR0cDpnZXQ+Ci0gICAgICAgICAgPGo6Y2hvb3NlPgotICAgICAgICAgICAgICA8ajp3aGVuIHRlc3Q9IiR7bXRjMi5zdGF0dXNDb2RlID09IDIwMH0iPgotICAgICAgICAgICAgICAgICAgSXQgd29ya3MhCi0gICAgICAgICAgICAgIDwvajp3aGVuPgotICAgICAgICAgICAgICA8ajpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgUmVzdWx0cyBmb3IgbXRjMiB1cmwgYXJlOgotICAgICAgICAgICAgICAgIGh0dHAgcmV0dXJuIGNvZGUgPSAke210YzIuc3RhdHVzQ29kZX0KLSAgICAgICAgICAgICAgICBodHRwIHN0YXR1cyB0ZXh0ID0gJyR7bXRjMi5zdGF0dXNUZXh0fScKLSAgICAgICAgICAgICAgPC9qOm90aGVyd2lzZT4KLSAgICAgICAgICA8L2o6Y2hvb3NlPgotICAgICAgPC9qOndoZW4+Ci0KLSAgICAgIDxqOm90aGVyd2lzZT4KLSAgICAgICAgUmVzdWx0cyBmb3IgbXRjMSB1cmwgYXJlOgotICAgICAgICBodHRwIHJldHVybiBjb2RlID0gJHttdGMxLnN0YXR1c0NvZGV9Ci0gICAgICAgIGh0dHAgc3RhdHVzIHRleHQgPSAnJHttdGMxLnN0YXR1c1RleHR9JwotICAgICAgPC9qOm90aGVyd2lzZT4KLSAgICA8L2o6Y2hvb3NlPgotICAgICR7aHR0cFNlcnZlclVuYXV0aG9yaXplZC5zdG9wKGZhbHNlKX0KLQotPC9qOmplbGx5PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qZXR0eS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvamV0dHkvc2V0dXAvZGVtb1JlYWxtLnByb3BlcnRpZXMgYi9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9zZXR1cC9kZW1vUmVhbG0ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyMTZjNi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9zZXR1cC9kZW1vUmVhbG0ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jIAotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jCi0jIFRoaXMgZmlsZSBkZWZpbmVzIHVzZXJzIHBhc3N3b3JkcyBhbmQgcm9sZXMgZm9yIGEgSGFzaFVzZXJSZWFsbQotIwotIyBUaGUgZm9ybWF0IGlzCi0jICA8dXNlcm5hbWU+OiA8cGFzc3dvcmQ+Wyw8cm9sZW5hbWU+IC4uLl0KLSMKLSMgUGFzc3dvcmRzIG1heSBiZSBjbGVhciB0ZXh0LCBvYmZ1c2NhdGVkIG9yIGNoZWNrc3VtbWVkLiAgVGhlIGNsYXNzCi0jIGNvbS5tb3J0YmF5LlV0aWwuUGFzc3dvcmQgc2hvdWxkIGJlIHVzZWQgdG8gZ2VuZXJhdGUgb2JmdXNjYXRlZAotIyBwYXNzd29yZHMgb3IgcGFzc3dvcmQgY2hlY2tzdW1zCi0jCi0jIElmIERJR0VTVCBBdXRoZW50aWNhdGlvbiBpcyB1c2VkLCB0aGUgcGFzc3dvcmQgbXVzdCBiZSBpbiBhIHJlY292ZXJhYmxlCi0jIGZvcm1hdCwgZWl0aGVyIHBsYWluIHRleHQgb3IgT0JGOi4KLSMKLQotdGVzdDogdGVzdAotQWxhZGRpbjogb3BlbiBzZXNhbWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZXR0eS9zb2NrZXRMaXN0ZW5lci5qZWxseSBiL2plbGx5LXRhZ3MvamV0dHkvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pldHR5L3NvY2tldExpc3RlbmVyLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmIyMWQ2Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamV0dHkvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pldHR5L3NvY2tldExpc3RlbmVyLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGo6amVsbHkKLSAgICB4bWxuczpqPSJqZWxseTpjb3JlIgotICAgIHhtbG5zOmh0dHA9ImplbGx5Omh0dHAiCi0gICAgeG1sbnM9ImplbGx5OmpldHR5IgotICAgIHRyaW09ImZhbHNlIj4KLQotICAgIDxqOnNldCB2YXI9ImNvbnRleHRQYXRoVmFyIiB2YWx1ZT0iIi8+Ci0gICAgPGo6c2V0IHZhcj0idGVzdFBvcnQxIiB2YWx1ZT0iODEwMCIvPgotICAgIDxqOnNldCB2YXI9InRlc3RQb3J0MiIgdmFsdWU9IjgyMDAiLz4KLSAgICA8ajpzZXQgdmFyPSJ0ZXN0VXJpMSIgdmFsdWU9Imh0dHA6Ly9sb2NhbGhvc3Q6JHt0ZXN0UG9ydDF9JHtjb250ZXh0UGF0aFZhcn0vdGVzdDEudHh0Ii8+Ci0gICAgPGo6c2V0IHZhcj0idGVzdFVyaTIiIHZhbHVlPSJodHRwOi8vbG9jYWxob3N0OiR7dGVzdFBvcnQyfSR7Y29udGV4dFBhdGhWYXJ9L3Rlc3QxLnR4dCIvPgotCi0gICAgPGpldHR5SHR0cFNlcnZlciB2YXI9Imh0dHBTZXJ2ZXIxIj4KLSAgICAgIDxzb2NrZXRMaXN0ZW5lci8+Ci0gICAgPC9qZXR0eUh0dHBTZXJ2ZXI+Ci0KLSAgICA8amV0dHlIdHRwU2VydmVyIHZhcj0iaHR0cFNlcnZlcjIiPgotICAgICAgPHNvY2tldExpc3RlbmVyIHBvcnQ9IiR7dGVzdFBvcnQyfSIvPgotICAgIDwvamV0dHlIdHRwU2VydmVyPgotCi0gICAgPGh0dHA6Z2V0IHZhcj0ibXRjMSIgdXJpPSIke3Rlc3RVcmkxfSIvPgotICAgIDxodHRwOmdldCB2YXI9Im10YzIiIHVyaT0iJHt0ZXN0VXJpMn0iLz4KLQotICAgIDxqOmlmIHRlc3Q9JyR7bXRjMS5zdGF0dXNDb2RlID09IDIwMH0nPgotICAgICAgICA8ajppZiB0ZXN0PScke210YzIuc3RhdHVzQ29kZSA9PSAyMDB9Jz4KLSAgICAgICAgICAgIDxqOmlmIHRlc3Q9JyR7bXRjMi5yZXNwb25zZUJvZHlBc1N0cmluZyA9PSBtdGMxLnJlc3BvbnNlQm9keUFzU3RyaW5nfSc+Ci0gICAgICAgICAgICAgICAgJHttdGMyLnJlc3BvbnNlQm9keUFzU3RyaW5nfQotICAgICAgICAgICAgPC9qOmlmPgotICAgICAgICA8L2o6aWY+Ci0gICAgPC9qOmlmPgotICAgIDxqOmlmIHRlc3Q9JyR7bXRjMS5zdGF0dXNDb2RlICE9IDIwMH0nPgotICAgICAgICBSZXN1bHRzIGZvciBtdGMxIHVybCBhcmU6Ci0gICAgICAgIGh0dHAgcmV0dXJuIGNvZGUgPSAke210YzEuc3RhdHVzQ29kZX0KLSAgICAgICAgaHR0cCBzdGF0dXMgdGV4dCA9ICcke210YzEuc3RhdHVzVGV4dH0nCi0gICAgICAgIHNpemUgb2YgcmVzdWx0ID0gJHttdGMxLnJlc3BvbnNlQm9keUFzU3RyaW5nLmxlbmd0aCgpfQotICAgICAgICByZXNwb25zZSB0aW1lID0gJHttdGMxLnJlc3BvbnNlVGltZX0KLQotICAgICAgICAgICAgPGo6Zm9yRWFjaCBpdGVtcz0iJHttdGMxLnJlc3BvbnNlSGVhZGVyc30iIHZhcj0iaGVhZGVyIiBpbmRleFZhcj0iaSI+Ci0gICAgICAgICAgICAgICAgaGVhZGVyWyR7aX1dID0gJHtoZWFkZXJ9Ci0gICAgICAgICAgICA8L2o6Zm9yRWFjaD4KLSAgICA8L2o6aWY+Ci0gICAgPGo6aWYgdGVzdD0nJHttdGMyLnN0YXR1c0NvZGUgIT0gMjAwfSc+Ci0gICAgICAgIFJlc3VsdHMgZm9yIG10YzIgdXJsIGFyZToKLSAgICAgICAgaHR0cCByZXR1cm4gY29kZSA9ICR7bXRjMi5zdGF0dXNDb2RlfQotICAgICAgICBodHRwIHN0YXR1cyB0ZXh0ID0gJyR7bXRjMi5zdGF0dXNUZXh0fScKLSAgICAgICAgc2l6ZSBvZiByZXN1bHQgPSAke210YzIucmVzcG9uc2VCb2R5QXNTdHJpbmcubGVuZ3RoKCl9Ci0gICAgICAgIHJlc3BvbnNlIHRpbWUgPSAke210YzIucmVzcG9uc2VUaW1lfQotCi0gICAgICAgICAgICA8ajpmb3JFYWNoIGl0ZW1zPSIke210YzIucmVzcG9uc2VIZWFkZXJzfSIgdmFyPSJoZWFkZXIiIGluZGV4VmFyPSJpIj4KLSAgICAgICAgICAgICAgICBoZWFkZXJbJHtpfV0gPSAke2hlYWRlcn0KLSAgICAgICAgICAgIDwvajpmb3JFYWNoPgotICAgIDwvajppZj4KLSAgICAke2h0dHBTZXJ2ZXIyLnN0b3AoKX0KLSAgICAke2h0dHBTZXJ2ZXIxLnN0b3AoKX0KLQotPC9qOmplbGx5PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qZXR0eS94ZG9jcy9jaGFuZ2VzLnhtbCBiL2plbGx5LXRhZ3MvamV0dHkveGRvY3MvY2hhbmdlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZGZhYWEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qZXR0eS94ZG9jcy9jaGFuZ2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0gLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkNoYW5nZXM8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLSAgPGJvZHk+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4wIiBkYXRlPSIyMDA0LTA5LTEzIj48L3JlbGVhc2U+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pldHR5L3hkb2NzL2luZGV4LnhtbCBiL2plbGx5LXRhZ3MvamV0dHkveGRvY3MvaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTE4OWJjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamV0dHkveGRvY3MvaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+SmV0dHkgVGFnIExpYnJhcnk8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLQotICA8Ym9keT4KLSAgICA8c2VjdGlvbiBuYW1lPSJPdmVydmlldyI+Ci0gICAgICA8cD4KLSAgICAgICAgVGFncyBmb3Igc3RhcnRpbmcgSmV0dHkgSFRUUCBzZXJ2ZXJzIGFuZCBwcm9jZXNpbmcgSFRUUCByZXF1ZXN0cyB1c2luZyBKZWxseSBzY3JpcHRzLgotICAgICAgICAgIFNlZSB0aGUgPGEgaHJlZj0idGFncy5odG1sIj50YWdzPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamV0dHkveGRvY3MvbmF2aWdhdGlvbi54bWwgYi9qZWxseS10YWdzL2pldHR5L3hkb2NzL25hdmlnYXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDFlMjQwLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamV0dHkveGRvY3MvbmF2aWdhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IG5hbWU9IkpldHR5IFRhZyBMaWJyYXJ5Ij4KLQotICA8dGl0bGU+SmV0dHkgVGFnIExpYnJhcnk8L3RpdGxlPgotICAKLSAgPGJvZHk+Ci0gICAgPG1lbnUgbmFtZT0iSmV0dHkgVGFnIExpYnJhcnkiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgICAgICAgICAgIGhyZWY9Ii9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJUYWdzIiAgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZ3MuaHRtbCIvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qZmFjZS8uY3ZzaWdub3JlIGIvamVsbHktdGFncy9qZmFjZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjNmMmJmLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamZhY2UvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotdGFyZ2V0Ci1tYXZlbi5sb2cKLXBlcnNvbmFsLXNldHRpbmdzLnByb3BzCi12ZWxvY2l0eS5sb2cKLWpjb3ZlcmFnZS5zZXIKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamZhY2UvbWF2ZW4ueG1sIGIvamVsbHktdGFncy9qZmFjZS9tYXZlbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZGE2ZjUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qZmFjZS9tYXZlbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgZGVmYXVsdD0iamF2YTpqYXIiPgotCi0gIDwhLS0gZGVmaW5lIHRoZSBjbGFzc3BhdGggdXNlZCB0byBydW4gZXhhbXBsZXMgLS0+Ci0gIDxnb2FsIG5hbWU9ImNyZWF0ZS1jbGFzc3BhdGgiIHByZXJlcXM9ImphdmE6Y29tcGlsZSx0ZXN0OmNvbXBpbGUiPgotICAgICAgICA8cGF0aCBpZD0idGVzdC5jbGFzc3BhdGgiPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7bWF2ZW4uYnVpbGQuZGVzdH0iLz4KLSAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSJ0YXJnZXQvY2xhc3NlcyIvPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9InRhcmdldC90ZXN0LWNsYXNzZXMiLz4KLSAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotICAgICAgICA8L3BhdGg+Ci0gIDwvZ29hbD4KLQotICAgIDwhLS0gZGVtb3MgLS0+Ci0gIDxnb2FsIG5hbWU9ImRlbW8iIHByZXJlcXM9ImNyZWF0ZS1jbGFzc3BhdGgiCi0gICAgICAgIGRlc2NyaXB0aW9uPSJSdW5zIGEgSmVsbHlKRmFjZSBkZW1vIj4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpmYWNlLkpGYWNlRGVtbyIgZm9yaz0ieWVzIj4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgPC9qYXZhPgotICA8L2dvYWw+Ci0KLSAgPGdvYWwgbmFtZT0iZGVtbzpwcmVmZXJlbmNlcyIgcHJlcmVxcz0iY3JlYXRlLWNsYXNzcGF0aCIKLSAgICAgICAgZGVzY3JpcHRpb249IlJ1bnMgYSBQcmVmZXJlbmNlcyBkZW1vIj4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURlbW8iIGZvcms9InllcyI+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgotICAgIDwvamF2YT4KLSAgPC9nb2FsPgotCi0gIDxnb2FsIG5hbWU9ImRlbW86d2l6YXJkIiBwcmVyZXFzPSJjcmVhdGUtY2xhc3NwYXRoIgotICAgICAgICBkZXNjcmlwdGlvbj0iUnVucyBhIFdpemFyZCBkZW1vIj4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpmYWNlLndpemFyZC5XaXphcmREZW1vIiBmb3JrPSJ5ZXMiPgotICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KLSAgICA8L2phdmE+Ci0gIDwvZ29hbD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qZmFjZS9wcm9qZWN0LnByb3BlcnRpZXMgYi9qZWxseS10YWdzL2pmYWNlL3Byb2plY3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQxOWNiYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pmYWNlL3Byb2plY3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jIAotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUCBSIE8gSiBFIEMgVCAgUCBSIE8gUCBFIFIgVCBJIEUgUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pmYWNlL3Byb2plY3QueG1sIGIvamVsbHktdGFncy9qZmFjZS9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMzZDhlZC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pmYWNlL3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0PgotICA8ZXh0ZW5kPiR7YmFzZWRpcn0vLi4vdGFnLXByb2plY3QueG1sPC9leHRlbmQ+Ci0gIDxpZD5jb21tb25zLWplbGx5LXRhZ3MtamZhY2U8L2lkPgotICA8bmFtZT5jb21tb25zLWplbGx5LXRhZ3MtamZhY2U8L25hbWU+Ci0gIDxjdXJyZW50VmVyc2lvbj4xLjA8L2N1cnJlbnRWZXJzaW9uPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZTwvcGFja2FnZT4KLSAgPGRlc2NyaXB0aW9uPlRoaXMgaXMgYSBKZWxseSBpbnRlcmZhY2UgZm9yIGpmYWNlLjwvZGVzY3JpcHRpb24+Ci0gIDxzaG9ydERlc2NyaXB0aW9uPkNvbW1vbnMgSmVsbHkgamZhY2UgVGFnIExpYnJhcnk8L3Nob3J0RGVzY3JpcHRpb24+Ci0gIDx2ZXJzaW9ucz4KLSAgICA8dmVyc2lvbj4KLSAgICAgIDxpZD4xLjA8L2lkPgotICAgICAgPG5hbWU+MS4wPC9uYW1lPgotICAgICAgPHRhZz5DT01NT05TLUpFTExZLUpGQUNFLTFfMDwvdGFnPgotICAgIDwvdmVyc2lvbj4KLSAgPC92ZXJzaW9ucz4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8IS0tIFNUQVJUIGZvciBjb21waWxhdGlvbiAtLT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1qZWxseTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtamVsbHktdGFncy1zd3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDwhLS0gc3d0IGxpYnJhcnkgLS0+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5zd3Q8L2lkPgotICAgICAgPCEtLSBkb24ndCBrbm93IGhvdyB0byBzdXBwb3J0IE9TLWRlcGVuZGVudCBqYXJzIGluIE1hdmVuIHlldCAtLT4KLQotICAgICAgPHZlcnNpb24+d2luMzItMi4xLjA8L3ZlcnNpb24+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGd1bXAucHJvamVjdD5lY2xpcHNlPC9ndW1wLnByb2plY3Q+Ci0gICAgICAgIDxndW1wLmlkPnN3dDwvZ3VtcC5pZD4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPCEtLSBqZmFjZSBsaWJyYXJpZXMgLS0+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5lY2xpcHNlK2Jvb3Q8L2lkPgotICAgICAgPHZlcnNpb24+Mi4xLjA8L3ZlcnNpb24+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGd1bXAucHJvamVjdD5lY2xpcHNlPC9ndW1wLnByb2plY3Q+Ci0gICAgICAgIDxndW1wLmlkPmJvb3Q8L2d1bXAuaWQ+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPmVjbGlwc2UramZhY2U8L2lkPgotICAgICAgPHZlcnNpb24+Mi4xLjA8L3ZlcnNpb24+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGd1bXAucHJvamVjdD5lY2xpcHNlPC9ndW1wLnByb2plY3Q+Ci0gICAgICAgIDxndW1wLmlkPmpmYWNlPC9ndW1wLmlkPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5lY2xpcHNlK3J1bnRpbWU8L2lkPgotICAgICAgPHZlcnNpb24+Mi4xLjA8L3ZlcnNpb24+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGd1bXAucHJvamVjdD5lY2xpcHNlPC9ndW1wLnByb2plY3Q+Ci0gICAgICAgIDxndW1wLmlkPnJ1bnRpbWU8L2d1bXAuaWQ+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDwhLS0gRU5EIGZvciBjb21waWxhdGlvbiAtLT4KLSAgICA8IS0tIFNUQVJUIGZvciBydW5uaW5nIGRlbW9zIC0tPgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+Y29tbW9ucy1jbGk8L2lkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtamVsbHk8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWplbGx5LXRhZ3MtbG9nPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtamVsbHk8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWplbGx5LXRhZ3MtZGVmaW5lPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8IS0tIEVORCBmb3IgcnVubmluZyBkZW1vcyAtLT4KLQotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamZhY2Uvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2UvQWN0aW9uVGFnLmphdmEgYi9qZWxseS10YWdzL2pmYWNlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL0FjdGlvblRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGExNjY4Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamZhY2Uvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2UvQWN0aW9uVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpmYWNlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmUuVXNlQmVhblRhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLQotLyoqCi0gKiBUaGlzIHRhZyBjcmVhdGVzIGFuIEpGYWNlIEFjdGlvbgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyPC9hPgotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uVGFnIGV4dGVuZHMgVXNlQmVhblRhZyB7Ci0KLSAgICAvKioKLSAgICAgKiAgSW1wbGVtZW50aW5nIEFjdGlvbiBjbGFzcwotICAgICAqLwotICAgIGNsYXNzIEFjdGlvbkltcGwgZXh0ZW5kcyBBY3Rpb24gewotICAgICAgICBwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIGV2ZW50KTsKLSAgICAgICAgICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcigKLSAgICAgICAgICAgICAgICAgICAgIkNhdWdodCBleGNlcHRpb246ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdoaWxlIHByb2Nlc3NpbmcgZXZlbnQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFjdGlvblRhZy5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBYTUxPdXRwdXQgb3V0cHV0OwotICAgIHByaXZhdGUgU3RyaW5nIHZhciA9ICJldmVudCI7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYXJnMAotICAgICAqLwotICAgIHB1YmxpYyBBY3Rpb25UYWcoQ2xhc3MgYXJnMCkgewotICAgICAgICBzdXBlcihhcmcwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIElDb250cmlidXRpb25NYW5hZ2VyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElDb250cmlidXRpb25NYW5hZ2VyIGdldFBhcmVudENvbnRyaWJ1dGlvbk1hbmFnZXIoKSB7Ci0gICAgICAgIE1lbnVNYW5hZ2VyVGFnIHRhZyA9Ci0gICAgICAgICAgICAoTWVudU1hbmFnZXJUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyhNZW51TWFuYWdlclRhZy5jbGFzcyk7Ci0gICAgICAgIGlmICh0YWcgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRhZy5nZXRNZW51TWFuYWdlcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWcjZG9UYWcob3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dCkKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkKLSAgICAgICAgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLQotICAgICAgICBNYXAgYXR0cmlidXRlcyA9IGdldEF0dHJpYnV0ZXMoKTsKLQotICAgICAgICBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbkltcGwoKTsKLSAgICAgICAgc2V0QmVhblByb3BlcnRpZXMoYWN0aW9uLCBhdHRyaWJ1dGVzKTsKLQotICAgICAgICBJQ29udHJpYnV0aW9uTWFuYWdlciBjbSA9IGdldFBhcmVudENvbnRyaWJ1dGlvbk1hbmFnZXIoKTsKLSAgICAgICAgaWYgKGNtICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNtLmFkZChhY3Rpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5vdXRwdXQgPSBvdXRwdXQ7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qZmFjZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS9Db250cmlidXRpb25JdGVtVGFnLmphdmEgYi9qZWxseS10YWdzL2pmYWNlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL0NvbnRyaWJ1dGlvbkl0ZW1UYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFkMTE4ZC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pmYWNlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL0NvbnRyaWJ1dGlvbkl0ZW1UYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamZhY2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5jb3JlLlVzZUJlYW5UYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyOwotCi0vKioKLSAqIFRoaXMgdGFnIGNyZWF0ZXMgYW4gSkZhY2UgQ29udHJpYnV0aW9uSXRlbQotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyPC9hPgotICovCi1wdWJsaWMgY2xhc3MgQ29udHJpYnV0aW9uSXRlbVRhZyBleHRlbmRzIFVzZUJlYW5UYWcgewotCi0gICAgcHVibGljIENvbnRyaWJ1dGlvbkl0ZW1UYWcoQ2xhc3MgYXJnMCkgewotICAgICAgICBzdXBlcihhcmcwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnI2RvVGFnKG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQpCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpCi0gICAgICAgIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgc3VwZXIuZG9UYWcob3V0cHV0KTsKLQotICAgICAgICBPYmplY3QgYmVhbiA9IGdldEJlYW4oKTsKLSAgICAgICAgaWYgKGJlYW4gIT0gbnVsbCAmJiBiZWFuIGluc3RhbmNlb2YgQ29udHJpYnV0aW9uSXRlbSkgewotICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbk1hbmFnZXIgY20gPSBnZXRQYXJlbnRDb250cmlidXRpb25NYW5hZ2VyKCk7Ci0gICAgICAgICAgICBpZiAoY20gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNtLmFkZCgoQ29udHJpYnV0aW9uSXRlbSkgYmVhbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gSUNvbnRyaWJ1dGlvbk1hbmFnZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSUNvbnRyaWJ1dGlvbk1hbmFnZXIgZ2V0UGFyZW50Q29udHJpYnV0aW9uTWFuYWdlcigpIHsKLSAgICAgICAgTWVudU1hbmFnZXJUYWcgdGFnID0KLSAgICAgICAgICAgIChNZW51TWFuYWdlclRhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKE1lbnVNYW5hZ2VyVGFnLmNsYXNzKTsKLSAgICAgICAgaWYgKHRhZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGFnLmdldE1lbnVNYW5hZ2VyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pmYWNlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL0RvdWJsZUNsaWNrTGlzdGVuZXJUYWcuamF2YSBiL2plbGx5LXRhZ3MvamZhY2Uvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2UvRG91YmxlQ2xpY2tMaXN0ZW5lclRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWQzZGM1Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamZhY2Uvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2UvRG91YmxlQ2xpY2tMaXN0ZW5lclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamZhY2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogVGhpcyB0YWcgYWRkcyBhIGxpc3RlbmVyIGZvciBkb3VibGUtY2xpY2tzIGluIHRoaXMgdmlld2VyLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyPC9hPgotICovCi1wdWJsaWMgY2xhc3MgRG91YmxlQ2xpY2tMaXN0ZW5lclRhZwotICAgIGV4dGVuZHMgVGFnU3VwcG9ydAotICAgIGltcGxlbWVudHMgSURvdWJsZUNsaWNrTGlzdGVuZXIgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERvdWJsZUNsaWNrTGlzdGVuZXJUYWcuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyID0gImV2ZW50IjsKLSAgICBwcml2YXRlIFhNTE91dHB1dCBvdXRwdXQ7Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZyNkb1RhZyhvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpCi0gICAgICAgIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh2YXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oInZhciIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIgPSBnZXRQYXJlbnRWaWV3ZXIoKTsKLSAgICAgICAgaWYgKHZpZXdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIlRoaXMgdGFnIG11c3QgYmUgbmVzdGVkIHdpdGhpbiBhIHZpZXdlciB0YWciKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKHRoaXMpOwotICAgICAgICB0aGlzLm91dHB1dCA9IG91dHB1dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RydWN0dXJlZFZpZXdlciBnZXRQYXJlbnRWaWV3ZXIoKSB7Ci0gICAgICAgIFZpZXdlclRhZyB0YWcgPSAoVmlld2VyVGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoVmlld2VyVGFnLmNsYXNzKTsKLSAgICAgICAgaWYgKHRhZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBWaWV3ZXIgdmlld2VyID0gdGFnLmdldFZpZXdlcigpOwotICAgICAgICAgICAgaWYgKHZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRWaWV3ZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFN0cnVjdHVyZWRWaWV3ZXIpIHZpZXdlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFyKCkgewotICAgICAgICByZXR1cm4gdmFyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhci4KLSAgICAgKiBAcGFyYW0gdmFyIFRoZSB2YXIgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotCi0gICAgLy8gIExpc3RlbmVyIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyI2RvdWJsZUNsaWNrKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhciwgZXZlbnQpOwotICAgICAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKAotICAgICAgICAgICAgICAgICJDYXVnaHQgZXhjZXB0aW9uOiAiICsgZSArICIgd2hpbGUgcHJvY2Vzc2luZyBldmVudDogIiArIGV2ZW50LAotICAgICAgICAgICAgICAgIGUpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pmYWNlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL0pGYWNlSW1hZ2VUYWcuamF2YSBiL2plbGx5LXRhZ3MvamZhY2Uvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2UvSkZhY2VJbWFnZVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzZjMzNiLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamZhY2Uvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2UvSkZhY2VJbWFnZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvd0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93VGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3dC5JbWFnZVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgU1dUIEltYWdlVGFnCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2tsQGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXI8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKRmFjZUltYWdlVGFnIGV4dGVuZHMgSW1hZ2VUYWcgewotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgcGFyZW50IHdpbmRvdwotICAgICAqLwotICAgIHB1YmxpYyBXaW5kb3cgZ2V0UGFyZW50V2luZG93KCkgewotICAgICAgICBBcHBsaWNhdGlvbldpbmRvd1RhZyB0YWcgPQotICAgICAgICAgICAgKEFwcGxpY2F0aW9uV2luZG93VGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoQXBwbGljYXRpb25XaW5kb3dUYWcuY2xhc3MpOwotICAgICAgICBpZiAodGFnICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0YWcuZ2V0V2luZG93KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGRlZmF1bHQgaW1hZ2UgV2luZG93Ci0gICAgICogQHBhcmFtIHdpbmRvdwotICAgICAqIEBwYXJhbSBpbWFnZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRXaW5kb3dJbWFnZShXaW5kb3cgd2luZG93LCBJbWFnZSBpbWFnZSkgewotICAgICAgICB3aW5kb3cuZ2V0U2hlbGwoKS5zZXRJbWFnZShpbWFnZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWcjZG9UYWcob3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotCi0gICAgICAgIC8vIGludm9rZSBieSBib2R5IGp1c3QgaW4gY2FzZSBzb21lIG5lc3RlZCB0YWcgY29uZmlndXJlcyBtZQotICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0KLSAgICAgICAgV2lkZ2V0IHBhcmVudCA9IGdldFBhcmVudFdpZGdldCgpOwotICAgICAgICBXaW5kb3cgd2luZG93ID0gbnVsbDsKLSAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3aW5kb3cgPSBnZXRQYXJlbnRXaW5kb3coKTsKLSAgICAgICAgICAgIGlmICh3aW5kb3cgIT0gbnVsbCAmJiB3aW5kb3cgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbldpbmRvd0ltcGwpIHsKLSAgICAgICAgICAgICAgICBwYXJlbnQgPSAoKEFwcGxpY2F0aW9uV2luZG93SW1wbCkgd2luZG93KS5nZXRDb250ZW50cygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsICYmIHdpbmRvdyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIlRoaXMgdGFnIG11c3QgYmUgbmVzdGVkIHdpdGhpbiBhIFdpZGdldCBvciBhIFdpbmRvdyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgZ2V0U3JjKCkpOwotICAgICAgICBpZiAod2luZG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldFdpbmRvd0ltYWdlKHdpbmRvdywgaW1hZ2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0V2lkZ2V0SW1hZ2UocGFyZW50LCBpbWFnZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qZmFjZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS9KRmFjZUxheW91dERhdGFUYWcuamF2YSBiL2plbGx5LXRhZ3MvamZhY2Uvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2UvSkZhY2VMYXlvdXREYXRhVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNTA3Y2MuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qZmFjZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS9KRmFjZUxheW91dERhdGFUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0qIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0qCi0qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3dJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvd1RhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd3QuTGF5b3V0RGF0YVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIFNXVCBMYXlvdXREYXRhVGFnCi0gKiAgCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlcjwvYT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBKRmFjZUxheW91dERhdGFUYWcgZXh0ZW5kcyBMYXlvdXREYXRhVGFnIHsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBsYXlvdXREYXRhQ2xhc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgSkZhY2VMYXlvdXREYXRhVGFnKENsYXNzIGxheW91dERhdGFDbGFzcykgewotICAgICAgICBzdXBlcihsYXlvdXREYXRhQ2xhc3MpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmUuVXNlQmVhblRhZyNwcm9jZXNzQmVhbihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NCZWFuKFN0cmluZyB2YXIsIE9iamVjdCBiZWFuKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBXaWRnZXQgcGFyZW50ID0gZ2V0UGFyZW50V2lkZ2V0KCk7Ci0gICAgICAgIFdpbmRvdyB3aW5kb3cgPSBudWxsOwotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHdpbmRvdyA9IGdldFBhcmVudFdpbmRvdygpOwotICAgICAgICAgICAgaWYgKHdpbmRvdyAhPSBudWxsICYmIHdpbmRvdyBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uV2luZG93SW1wbCkgewotICAgICAgICAgICAgICAgIHBhcmVudCA9ICgoQXBwbGljYXRpb25XaW5kb3dJbXBsKSB3aW5kb3cpLmdldENvbnRlbnRzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgQ29udHJvbCkgewotICAgICAgICAgICAgQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpIHBhcmVudDsKLSAgICAgICAgICAgIGNvbnRyb2wuc2V0TGF5b3V0RGF0YShnZXRCZWFuKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJUaGlzIHRhZyBtdXN0IGJlIG5lc3RlZCB3aXRoaW4gYSBjb250cm9sIHdpZGdldCB0YWciKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCB3aW5kb3cgCi0gICAgICovCi0gICAgcHVibGljIFdpbmRvdyBnZXRQYXJlbnRXaW5kb3coKSB7Ci0gICAgICAgIEFwcGxpY2F0aW9uV2luZG93VGFnIHRhZyA9Ci0gICAgICAgICAgICAoQXBwbGljYXRpb25XaW5kb3dUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyhBcHBsaWNhdGlvbldpbmRvd1RhZy5jbGFzcyk7Ci0gICAgICAgIGlmICh0YWcgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRhZy5nZXRXaW5kb3coKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamZhY2Uvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2UvSkZhY2VMYXlvdXRUYWcuamF2YSBiL2plbGx5LXRhZ3MvamZhY2Uvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2UvSkZhY2VMYXlvdXRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM5ZWRjOS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pmYWNlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL0pGYWNlTGF5b3V0VGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpmYWNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvd0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93VGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3dC5MYXlvdXRUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIFNXVCBMYXlvdXRUYWcKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlcjwvYT4KLSAqLwotcHVibGljIGNsYXNzIEpGYWNlTGF5b3V0VGFnIGV4dGVuZHMgTGF5b3V0VGFnIHsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBsYXlvdXRDbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBKRmFjZUxheW91dFRhZyhDbGFzcyBsYXlvdXRDbGFzcykgewotICAgICAgICBzdXBlcihsYXlvdXRDbGFzcyk7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmUuVXNlQmVhblRhZyNwcm9jZXNzQmVhbihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NCZWFuKFN0cmluZyB2YXIsIE9iamVjdCBiZWFuKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotCi0gICAgICAgIFdpZGdldCBwYXJlbnQgPSBnZXRQYXJlbnRXaWRnZXQoKTsKLSAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7IC8vIHBlcmhhcHMgcGFyZW50IGlzIGEgV2luZG93Ci0gICAgICAgICAgICBXaW5kb3cgd2luZG93ID0gZ2V0UGFyZW50V2luZG93KCk7Ci0gICAgICAgICAgICBpZiAod2luZG93ICE9IG51bGwgJiYgd2luZG93IGluc3RhbmNlb2YgQXBwbGljYXRpb25XaW5kb3dJbXBsKSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50ID0gKChBcHBsaWNhdGlvbldpbmRvd0ltcGwpIHdpbmRvdykuZ2V0Q29udGVudHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKLSAgICAgICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBwYXJlbnQ7Ci0gICAgICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdldExheW91dCgpKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJUaGlzIHRhZyBtdXN0IGJlIG5lc3RlZCB3aXRoaW4gYSBjb21wb3NpdGUgd2lkZ2V0IHRhZyIpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXJlbnQgd2luZG93Ci0gICAgICovCi0gICAgcHVibGljIFdpbmRvdyBnZXRQYXJlbnRXaW5kb3coKSB7Ci0gICAgICAgIEFwcGxpY2F0aW9uV2luZG93VGFnIHRhZyA9Ci0gICAgICAgICAgICAoQXBwbGljYXRpb25XaW5kb3dUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyhBcHBsaWNhdGlvbldpbmRvd1RhZy5jbGFzcyk7Ci0gICAgICAgIGlmICh0YWcgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRhZy5nZXRXaW5kb3coKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qZmFjZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS9KRmFjZVRhZ0xpYnJhcnkuamF2YSBiL2plbGx5LXRhZ3MvamZhY2Uvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2UvSkZhY2VUYWdMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYzU3YzAuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qZmFjZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS9KRmFjZVRhZ0xpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpmYWNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuVGFnRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZ1RhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvd1RhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpmYWNlLndpemFyZC5XaXphcmRQYWdlVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3dC5Td3RUYWdMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5Cb29sZWFuRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5Db2xvckZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRGlyZWN0b3J5RmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWxlRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5Gb250RmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JbnRlZ2VyRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5TdHJpbmdGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0vKioKLSAqIEEgSmVsbHkgY3VzdG9tIHRhZyBsaWJyYXJ5IHRoYXQgY3JlYXRlcyBKRmFjZSB1c2VyIGludGVyZmFjZXMKLSAqIFRoaXMgdGFnbGliIGV4dGVuZHMgdGhlIFNXVCB0YWcgbGliCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2tsQGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXI8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKRmFjZVRhZ0xpYnJhcnkgZXh0ZW5kcyBTd3RUYWdMaWJyYXJ5IHsKLQotICAgIHB1YmxpYyBKRmFjZVRhZ0xpYnJhcnkoKSB7Ci0KLSAgICAgICAgLy8gVmlld2VyIHRhZ3MKLSAgICAgICAgcmVnaXN0ZXJWaWV3ZXJUYWcoInRhYmxlVmlld2VyIiwgVGFibGVWaWV3ZXIuY2xhc3MpOwotICAgICAgICByZWdpc3RlclZpZXdlclRhZygidGFibGVUcmVlVmlld2VyIiwgVGFibGVUcmVlVmlld2VyLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJWaWV3ZXJUYWcoInRyZWVWaWV3ZXIiLCBUcmVlVmlld2VyLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJWaWV3ZXJUYWcoImNoZWNrYm94VHJlZVZpZXdlciIsIENoZWNrYm94VHJlZVZpZXdlci5jbGFzcyk7Ci0KLSAgICAgICAgLy8gRXZlbnQgdGFncwotICAgICAgICByZWdpc3RlclRhZygiZG91YmxlQ2xpY2tMaXN0ZW5lciIsIERvdWJsZUNsaWNrTGlzdGVuZXJUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygic2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIiwgU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyVGFnLmNsYXNzKTsKLQotICAgICAgICAvLyBXaW5kb3cgdGFncwotICAgICAgICByZWdpc3RlcldpbmRvd1RhZygiYXBwbGljYXRpb25XaW5kb3ciLCBBcHBsaWNhdGlvbldpbmRvdy5jbGFzcyk7Ci0KLSAgICAgICAgLy8gQ29udHJpYnV0aW9uTWFuYWdlciB0YWdzCi0gICAgICAgIHJlZ2lzdGVyTWVudU1hbmFnZXIoIm1lbnVNYW5hZ2VyIiwgTWVudU1hbmFnZXJUYWcuY2xhc3MpOwotCi0gICAgICAgIC8vIEFjdGlvbiB0YWdzCi0gICAgICAgIHJlZ2lzdGVyQWN0aW9uVGFnKCJhY3Rpb24iLCBBY3Rpb25UYWcuY2xhc3MpOwotCi0gICAgICAgIC8vIENvbnRyaWJ1dGlvbkl0ZW0gdGFncwotICAgICAgICByZWdpc3RlckNvbnRyaWJ1dGlvbkl0ZW1UYWcoInNlcGFyYXRvciIsIFNlcGFyYXRvci5jbGFzcyk7Ci0KLSAgICAgICAgLy8gV2l6YXJkIHRhZ3MKLSAgICAgICAgcmVnaXN0ZXJXaXphcmREaWFsb2dUYWcoIndpemFyZERpYWxvZyIsIFdpemFyZERpYWxvZ1RhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyV2l6YXJkUGFnZVRhZygid2l6YXJkUGFnZSIsIFdpemFyZFBhZ2VUYWcuY2xhc3MpOwotCi0gICAgICAgIC8vIFByZWZlcmVuY2UgdGFncwotICAgICAgICByZWdpc3RlclByZWZlcmVuY2VEaWFsb2dUYWcoInByZWZlcmVuY2VEaWFsb2ciLCBQcmVmZXJlbmNlRGlhbG9nVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInByZWZlcmVuY2VQYWdlIiwgUHJlZmVyZW5jZVBhZ2VUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlckZpZWxkRWRpdG9yVGFnKCJib29sZWFuRmllbGRFZGl0b3IiLCBCb29sZWFuRmllbGRFZGl0b3IuY2xhc3MpOwotICAgICAgICByZWdpc3RlckZpZWxkRWRpdG9yVGFnKCJjb2xvckZpZWxkRWRpdG9yIiwgQ29sb3JGaWVsZEVkaXRvci5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyRmllbGRFZGl0b3JUYWcoImRpcmVjdG9yeUZpZWxkRWRpdG9yIiwgRGlyZWN0b3J5RmllbGRFZGl0b3IuY2xhc3MpOwotICAgICAgICByZWdpc3RlckZpZWxkRWRpdG9yVGFnKCJmaWxlRmllbGRFZGl0b3IiLCBGaWxlRmllbGRFZGl0b3IuY2xhc3MpOwotICAgICAgICByZWdpc3RlckZpZWxkRWRpdG9yVGFnKCJmb250RmllbGRFZGl0b3IiLCBGb250RmllbGRFZGl0b3IuY2xhc3MpOwotICAgICAgICByZWdpc3RlckZpZWxkRWRpdG9yVGFnKCJpbnRlZ2VyRmllbGRFZGl0b3IiLCBJbnRlZ2VyRmllbGRFZGl0b3IuY2xhc3MpOwotICAgICAgICAvL3JlZ2lzdGVyRmllbGRFZGl0b3JUYWcoInJhZGlvR3JvdXBGaWVsZEVkaXRvciIsIFJhZGlvR3JvdXBGaWVsZEVkaXRvci5jbGFzcyk7Ci0gICAgICAgIC8vcmVnaXN0ZXJGaWVsZEVkaXRvclRhZygic3RyaW5nQnV0dG9uRmllbGRFZGl0b3IiLCBTdHJpbmdCdXR0b25GaWVsZEVkaXRvci5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyRmllbGRFZGl0b3JUYWcoInN0cmluZ0ZpZWxkRWRpdG9yIiwgU3RyaW5nRmllbGRFZGl0b3IuY2xhc3MpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHN0cmluZwotICAgICAqIEBwYXJhbSBjbGFzczEKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJNZW51TWFuYWdlcihTdHJpbmcgbmFtZSwgZmluYWwgQ2xhc3MgdGhlQ2xhc3MpIHsKLSAgICAgICAgcmVnaXN0ZXJUYWdGYWN0b3J5KG5hbWUsIG5ldyBUYWdGYWN0b3J5KCkgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLlRhZ0ZhY3RvcnkjY3JlYXRlVGFnKGphdmEubGFuZy5TdHJpbmcsIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyBUYWcgY3JlYXRlVGFnKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZW51TWFuYWdlclRhZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGEgd2lkZ2V0IHRhZyBmb3IgdGhlIGdpdmVuIG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHBhcmFtIHdpZGdldENsYXNzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJWaWV3ZXJUYWcoU3RyaW5nIG5hbWUsIENsYXNzIHdpZGdldENsYXNzKSB7Ci0gICAgICAgIHJlZ2lzdGVyVmlld2VyVGFnKG5hbWUsIHdpZGdldENsYXNzLCBTV1QuTlVMTCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXIgYSB3aWRnZXQgdGFnIGZvciB0aGUgZ2l2ZW4gbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcGFyYW0gd2lkZ2V0Q2xhc3MKLSAgICAgKiBAcGFyYW0gc3R5bGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclZpZXdlclRhZyhTdHJpbmcgbmFtZSwgZmluYWwgQ2xhc3MgdGhlQ2xhc3MsIGZpbmFsIGludCBzdHlsZSkgewotICAgICAgICByZWdpc3RlclRhZ0ZhY3RvcnkobmFtZSwgbmV3IFRhZ0ZhY3RvcnkoKSB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuVGFnRmFjdG9yeSNjcmVhdGVUYWcoamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIFRhZyBjcmVhdGVUYWcoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFZpZXdlclRhZyh0aGVDbGFzcywgc3R5bGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBhIHdpZGdldCB0YWcgZm9yIHRoZSBnaXZlbiBuYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEBwYXJhbSB3aWRnZXRDbGFzcwotICAgICAqIEBwYXJhbSBzdHlsZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyV2luZG93VGFnKFN0cmluZyBuYW1lLCBmaW5hbCBDbGFzcyB0aGVDbGFzcykgewotICAgICAgICByZWdpc3RlclRhZ0ZhY3RvcnkobmFtZSwgbmV3IFRhZ0ZhY3RvcnkoKSB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuVGFnRmFjdG9yeSNjcmVhdGVUYWcoamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIFRhZyBjcmVhdGVUYWcoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uV2luZG93VGFnKHRoZUNsYXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXIgYW4gYWN0aW9uIHRhZyBmb3IgdGhlIGdpdmVuIG5hbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckFjdGlvblRhZyhTdHJpbmcgbmFtZSwgZmluYWwgQ2xhc3MgdGhlQ2xhc3MpIHsKLSAgICAgICAgcmVnaXN0ZXJUYWdGYWN0b3J5KG5hbWUsIG5ldyBUYWdGYWN0b3J5KCkgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLlRhZ0ZhY3RvcnkjY3JlYXRlVGFnKGphdmEubGFuZy5TdHJpbmcsIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyBUYWcgY3JlYXRlVGFnKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBY3Rpb25UYWcodGhlQ2xhc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICAqIFJlZ2lzdGVyIGEgY29udHJpYnV0aW9uIGl0ZW0gdGFnIGZvciB0aGUgZ2l2ZW4gbmFtZQotICAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJDb250cmlidXRpb25JdGVtVGFnKFN0cmluZyBuYW1lLCBmaW5hbCBDbGFzcyB0aGVDbGFzcykgewotICAgICAgICByZWdpc3RlclRhZ0ZhY3RvcnkobmFtZSwgbmV3IFRhZ0ZhY3RvcnkoKSB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuVGFnRmFjdG9yeSNjcmVhdGVUYWcoamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIFRhZyBjcmVhdGVUYWcoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbnRyaWJ1dGlvbkl0ZW1UYWcodGhlQ2xhc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEBwYXJhbSB0aGVDbGFzcwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyUHJlZmVyZW5jZURpYWxvZ1RhZyhTdHJpbmcgbmFtZSwgZmluYWwgQ2xhc3MgdGhlQ2xhc3MpIHsKLSAgICAgICAgcmVnaXN0ZXJUYWdGYWN0b3J5KG5hbWUsIG5ldyBUYWdGYWN0b3J5KCkgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLlRhZ0ZhY3RvcnkjY3JlYXRlVGFnKGphdmEubGFuZy5TdHJpbmcsIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyBUYWcgY3JlYXRlVGFnKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcmVmZXJlbmNlRGlhbG9nVGFnKHRoZUNsYXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcGFyYW0gdGhlQ2xhc3MKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckZpZWxkRWRpdG9yVGFnKFN0cmluZyBuYW1lLCBmaW5hbCBDbGFzcyB0aGVDbGFzcykgewotICAgICAgICByZWdpc3RlclRhZ0ZhY3RvcnkobmFtZSwgbmV3IFRhZ0ZhY3RvcnkoKSB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuVGFnRmFjdG9yeSNjcmVhdGVUYWcoamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIFRhZyBjcmVhdGVUYWcoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpZWxkRWRpdG9yVGFnKHRoZUNsYXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcGFyYW0gdGhlQ2xhc3MKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlcldpemFyZERpYWxvZ1RhZyhTdHJpbmcgbmFtZSwgZmluYWwgQ2xhc3MgdGhlQ2xhc3MpIHsKLSAgICAgICAgcmVnaXN0ZXJUYWdGYWN0b3J5KG5hbWUsIG5ldyBUYWdGYWN0b3J5KCkgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLlRhZ0ZhY3RvcnkjY3JlYXRlVGFnKGphdmEubGFuZy5TdHJpbmcsIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyBUYWcgY3JlYXRlVGFnKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXaXphcmREaWFsb2dUYWcodGhlQ2xhc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlcldpemFyZFBhZ2VUYWcoU3RyaW5nIG5hbWUsIGZpbmFsIENsYXNzIHRoZUNsYXNzKSB7Ci0gICAgICAgIHJlZ2lzdGVyVGFnRmFjdG9yeShuYW1lLCBuZXcgVGFnRmFjdG9yeSgpIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5UYWdGYWN0b3J5I2NyZWF0ZVRhZyhqYXZhLmxhbmcuU3RyaW5nLCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzKQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgVGFnIGNyZWF0ZVRhZyhTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV2l6YXJkUGFnZVRhZyh0aGVDbGFzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGEgd2lkZ2V0IHRhZyBmb3IgdGhlIGdpdmVuIG5hbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlcldpZGdldFRhZyhTdHJpbmcgbmFtZSwgQ2xhc3Mgd2lkZ2V0Q2xhc3MpIHsKLSAgICAgICAgcmVnaXN0ZXJXaWRnZXRUYWcobmFtZSwgd2lkZ2V0Q2xhc3MsIFNXVC5OVUxMKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBhIHdpZGdldCB0YWcgZm9yIHRoZSBnaXZlbiBuYW1lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJXaWRnZXRUYWcoU3RyaW5nIG5hbWUsIGZpbmFsIENsYXNzIHdpZGdldENsYXNzLCBmaW5hbCBpbnQgc3R5bGUpIHsKLSAgICAgICAgcmVnaXN0ZXJUYWdGYWN0b3J5KG5hbWUsIG5ldyBUYWdGYWN0b3J5KCkgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLlRhZ0ZhY3RvcnkjY3JlYXRlVGFnKGphdmEubGFuZy5TdHJpbmcsIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyBUYWcgY3JlYXRlVGFnKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKRmFjZVdpZGdldFRhZyh3aWRnZXRDbGFzcywgc3R5bGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBhIGxheW91dCB0YWcgZm9yIHRoZSBnaXZlbiBuYW1lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJMYXlvdXRUYWcoU3RyaW5nIG5hbWUsIGZpbmFsIENsYXNzIGxheW91dENsYXNzKSB7Ci0gICAgICAgIHJlZ2lzdGVyVGFnRmFjdG9yeShuYW1lLCBuZXcgVGFnRmFjdG9yeSgpIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5UYWdGYWN0b3J5I2NyZWF0ZVRhZyhqYXZhLmxhbmcuU3RyaW5nLCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzKQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgVGFnIGNyZWF0ZVRhZyhTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSkZhY2VMYXlvdXRUYWcobGF5b3V0Q2xhc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamZhY2Uvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2UvSkZhY2VXaWRnZXRUYWcuamF2YSBiL2plbGx5LXRhZ3MvamZhY2Uvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2UvSkZhY2VXaWRnZXRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE0MGFlYi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pmYWNlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL0pGYWNlV2lkZ2V0VGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpmYWNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3dUYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamZhY2Uud2l6YXJkLldpemFyZFBhZ2VUYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3d0LldpZGdldFRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgU1dUIFdpZGdldFRhZwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyPC9hPgotICovCi1wdWJsaWMgY2xhc3MgSkZhY2VXaWRnZXRUYWcgZXh0ZW5kcyBXaWRnZXRUYWcgaW1wbGVtZW50cyBUYWcgewotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHdpZGdldENsYXNzCi0gICAgICovCi0gICAgcHVibGljIEpGYWNlV2lkZ2V0VGFnKENsYXNzIHdpZGdldENsYXNzKSB7Ci0gICAgICAgIHN1cGVyKHdpZGdldENsYXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gd2lkZ2V0Q2xhc3MKLSAgICAgKiBAcGFyYW0gc3R5bGUKLSAgICAgKi8KLSAgICBwdWJsaWMgSkZhY2VXaWRnZXRUYWcoQ2xhc3Mgd2lkZ2V0Q2xhc3MsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcih3aWRnZXRDbGFzcywgc3R5bGUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd3QuV2lkZ2V0VGFnI2F0dGFjaFdpZGdldHMoamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0KQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGF0dGFjaFdpZGdldHMoT2JqZWN0IHBhcmVudCwgV2lkZ2V0IHdpZGdldCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuYXR0YWNoV2lkZ2V0cyhwYXJlbnQsIHdpZGdldCk7Ci0KLSAgICAgICAgLy8gc2V0IFBhcmVudCBjb21wb3NpdGUgb2Ygd2l6YXJkIHBhZ2UKLSAgICAgICAgaWYgKGdldFBhcmVudCgpIGluc3RhbmNlb2YgV2l6YXJkUGFnZVRhZykgewotICAgICAgICAgICAgV2l6YXJkUGFnZVRhZyB0YWcgPSAoV2l6YXJkUGFnZVRhZykgZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBpZiAodGFnLmdldFdpemFyZFBhZ2VJbXBsKCkuZ2V0UGFyZW50Q29udHJvbCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhZy5nZXRXaXphcmRQYWdlSW1wbCgpLnNldFBhcmVudENvbXBvc2l0ZSgoQ29tcG9zaXRlKSB3aWRnZXQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiRmlyc3QgY2hpbGQgb2YgYSA8d2l6YXJkUGFnZT4gbXVzdCBiZSBvZiB0eXBlIENvbXBvc2l0ZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd3QuV2lkZ2V0VGFnI2dldFBhcmVudFdpZGdldCgpCi0gICAgICovCi0gICAgcHVibGljIFdpZGdldCBnZXRQYXJlbnRXaWRnZXQoKSB7Ci0gICAgICAgIHBhcmVudCA9IHN1cGVyLmdldFBhcmVudFdpZGdldCgpOwotCi0gICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCAmJiBnZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFdpemFyZFBhZ2VUYWcpIHsKLSAgICAgICAgICAgIFdpemFyZFBhZ2VUYWcgdGFnID0gKFdpemFyZFBhZ2VUYWcpIGdldFBhcmVudCgpOwotICAgICAgICAgICAgaWYgKHRhZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgV2l6YXJkUGFnZVRhZy5XaXphcmRQYWdlSW1wbCBwYWdlID0gdGFnLmdldFdpemFyZFBhZ2VJbXBsKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhZ2UuZ2V0Q29udHJvbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBBcHBsaWNhdGlvbldpbmRvd1RhZyB0YWcgPQotICAgICAgICAgICAgICAgIChBcHBsaWNhdGlvbldpbmRvd1RhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKEFwcGxpY2F0aW9uV2luZG93VGFnLmNsYXNzKTsKLSAgICAgICAgICAgIGlmICh0YWcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFdpbmRvdyB3aW5kb3cgPSB0YWcuZ2V0V2luZG93KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHdpbmRvdyAhPSBudWxsICYmIHdpbmRvdyBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uV2luZG93SW1wbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChBcHBsaWNhdGlvbldpbmRvd0ltcGwpIHdpbmRvdykuZ2V0Q29udGVudHMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qZmFjZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS9NZW51TWFuYWdlclRhZy5qYXZhIGIvamVsbHktdGFncy9qZmFjZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS9NZW51TWFuYWdlclRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDU1YTZiLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamZhY2Uvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2UvTWVudU1hbmFnZXJUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSBwYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpmYWNlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmUuVXNlQmVhblRhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3dUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotCi0vKioKLSAqIFRoaXMgdGFnIGNyZWF0ZXMgYW4gSkZhY2UgTWVudU1hbmFnZXIKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlcjwvYT4KLSAqLwotcHVibGljIGNsYXNzIE1lbnVNYW5hZ2VyVGFnIGV4dGVuZHMgVXNlQmVhblRhZyB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB0ZXh0OwotICAgIHByaXZhdGUgTWVudU1hbmFnZXIgbW07Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXJlbnQgd2luZG93IHdoaWNoIHRoaXMgd2lkZ2V0IHdpbGwgYmUgYWRkZWQgdG8uCi0gICAgICovCi0gICAgcHVibGljIFdpbmRvdyBnZXRQYXJlbnRXaW5kb3coKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25XaW5kb3dUYWcgdGFnID0KLSAgICAgICAgICAgIChBcHBsaWNhdGlvbldpbmRvd1RhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKEFwcGxpY2F0aW9uV2luZG93VGFnCi0gICAgICAgICAgICAgICAgLmNsYXNzKTsKLSAgICAgICAgaWYgKHRhZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGFnLmdldFdpbmRvdygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZyNkb1RhZyhvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpCi0gICAgICAgIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTWFwIGF0dHJpYnV0ZXMgPSBnZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIHRleHQgPSBhdHRyaWJ1dGVzLnJlbW92ZSgidGV4dCIpLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCJ0ZXh0IGF0dHJpYnV0ZSBpcyBtaXNzaW5nIik7Ci0KLSAgICAgICAgbW0gPSBuZXcgTWVudU1hbmFnZXIodGV4dCk7Ci0KLSAgICAgICAgQXBwbGljYXRpb25XaW5kb3cgd2luZG93ID0gKEFwcGxpY2F0aW9uV2luZG93KSBnZXRQYXJlbnRXaW5kb3coKTsKLSAgICAgICAgaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3aW5kb3cuZ2V0TWVudUJhck1hbmFnZXIoKS5hZGQobW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaW52b2tlIGJ5IGJvZHkganVzdCBpbiBjYXNlIHNvbWUgbmVzdGVkIHRhZyBjb25maWd1cmVzIG1lCi0gICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIE1lbnVNYW5hZ2VyCi0gICAgICovCi0gICAgcHVibGljIE1lbnVNYW5hZ2VyIGdldE1lbnVNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gbW07Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pmYWNlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL1NlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lclRhZy5qYXZhIGIvamVsbHktdGFncy9qZmFjZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS9TZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE0NmIwZS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pmYWNlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL1NlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamZhY2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogVGhpcyB0YWcgYWRkcyBhIGxpc3RlbmVyIGZvciBzZWxlY3Rpb24gY2hhbmdlcyBpbiB0aGlzIHZpZXdlci4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlcjwvYT4KLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lclRhZwotICAgIGV4dGVuZHMgVGFnU3VwcG9ydAotICAgIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0KLSAgICAgICAgTG9nRmFjdG9yeS5nZXRMb2coU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyVGFnLmNsYXNzKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHZhciA9ICJldmVudCI7Ci0gICAgcHJpdmF0ZSBYTUxPdXRwdXQgb3V0cHV0OwotCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWcjZG9UYWcob3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KQotICAgICAgICB0aHJvd3MgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiwgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAodmFyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCJ2YXIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFZpZXdlciB2aWV3ZXIgPSBnZXRQYXJlbnRWaWV3ZXIoKTsKLSAgICAgICAgaWYgKHZpZXdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIlRoaXMgdGFnIG11c3QgYmUgbmVzdGVkIHdpdGhpbiBhIHZpZXdlciB0YWciKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0OwotICAgIH0KLQotICAgIHB1YmxpYyBWaWV3ZXIgZ2V0UGFyZW50Vmlld2VyKCkgewotICAgICAgICBWaWV3ZXJUYWcgdGFnID0gKFZpZXdlclRhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKFZpZXdlclRhZy5jbGFzcyk7Ci0gICAgICAgIGlmICh0YWcgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRhZy5nZXRWaWV3ZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFyKCkgewotICAgICAgICByZXR1cm4gdmFyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhci4KLSAgICAgKiBAcGFyYW0gdmFyIFRoZSB2YXIgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotCi0gICAgLy8gIExpc3RlbmVyIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhciwgZXZlbnQpOwotICAgICAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKAotICAgICAgICAgICAgICAgICJDYXVnaHQgZXhjZXB0aW9uOiAiICsgZSArICIgd2hpbGUgcHJvY2Vzc2luZyBldmVudDogIiArIGV2ZW50LAotICAgICAgICAgICAgICAgIGUpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pmYWNlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL1ZpZXdlclRhZy5qYXZhIGIvamVsbHktdGFncy9qZmFjZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS9WaWV3ZXJUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk5NTg1ZS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pmYWNlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL1ZpZXdlclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd3QuV2lkZ2V0VGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotLyoqCi0gKiBUaGlzIHRhZyBjcmVhdGVzIGFuIEpGYWNlIFZpZXdlcgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyPC9hPgotICovCi1wdWJsaWMgY2xhc3MgVmlld2VyVGFnIGV4dGVuZHMgV2lkZ2V0VGFnIHsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLSAgICBwcml2YXRlIGludCBzdHlsZSA9IFNXVC5OVUxMOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHdpZGdldENsYXNzCi0gICAgICovCi0gICAgcHVibGljIFZpZXdlclRhZyhDbGFzcyB0YWdDbGFzcykgewotICAgICAgICBzdXBlcih0YWdDbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHdpZGdldENsYXNzCi0gICAgICogQHBhcmFtIHN0eWxlCi0gICAgICovCi0gICAgcHVibGljIFZpZXdlclRhZyhDbGFzcyB0YWdDbGFzcywgaW50IHN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKHRhZ0NsYXNzKTsKLSAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5jb3JlLlVzZUJlYW5UYWcjbmV3SW5zdGFuY2UoamF2YS5sYW5nLkNsYXNzLCBqYXZhLnV0aWwuTWFwLCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0KQotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgbmV3SW5zdGFuY2UoCi0gICAgICAgIENsYXNzIHRoZUNsYXNzLAotICAgICAgICBNYXAgYXR0cmlidXRlcywKLSAgICAgICAgWE1MT3V0cHV0IG91dHB1dCkKLSAgICAgICAgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLQotICAgICAgICBpbnQgc3R5bGUgPSBnZXRTdHlsZShhdHRyaWJ1dGVzKTsKLQotICAgICAgICAvLyBub3cgbGV0cyBjYWxsIHRoZSBjb25zdHJ1Y3RvciB3aXRoIHRoZSBwYXJlbnQKLSAgICAgICAgV2lkZ2V0IHBhcmVudCA9IGdldFBhcmVudFdpZGdldCgpOwotICAgICAgICBWaWV3ZXIgdmlld2VyID0gKFZpZXdlcikgY3JlYXRlV2lkZ2V0KHRoZUNsYXNzLCBwYXJlbnQsIHN0eWxlKTsKLQotICAgICAgICByZXR1cm4gdmlld2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHZpc2libGUgdmlld2VyLCBpZiB0aGVyZSBpcyBvbmUuCi0gICAgICovCi0gICAgcHVibGljIFZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0gICAgICAgIE9iamVjdCBiZWFuID0gZ2V0QmVhbigpOwotICAgICAgICBpZiAoYmVhbiBpbnN0YW5jZW9mIFZpZXdlcikgewotICAgICAgICAgICAgcmV0dXJuIChWaWV3ZXIpIGJlYW47Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pmYWNlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL2ltcGwvQXBwbGljYXRpb25XaW5kb3dJbXBsLmphdmEgYi9qZWxseS10YWdzL2pmYWNlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL2ltcGwvQXBwbGljYXRpb25XaW5kb3dJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNGMyMGUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qZmFjZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS9pbXBsL0FwcGxpY2F0aW9uV2luZG93SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBhIEFwcGxpY2F0aW9uV2luZG93VGFnCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2tsQGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXI8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbldpbmRvd0ltcGwgZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdyB7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2hlbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwbGljYXRpb25XaW5kb3dJbXBsKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0KLSAgICAgICAgc3VwZXIocGFyZW50U2hlbGwpOwotCi0gICAgICAgIC8vIGRlZmF1bHQgYXQgYWxsCi0gICAgICAgIGFkZE1lbnVCYXIoKTsKLSAgICAgICAgYWRkU3RhdHVzTGluZSgpOwotICAgICAgICBhZGRUb29sQmFyKFNXVC5OVUxMKTsKLQotICAgICAgICBzZXRCbG9ja09uT3Blbih0cnVlKTsKLQotICAgICAgICAvLyBjcmVhdGUgd2luZG93Ci0gICAgICAgIGNyZWF0ZSgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogb3ZlcnJpZGUgdG8gbWFrZSBwdWJsaWMKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjZ2V0Q29udGVudHMoKQotICAgICAqLwotICAgIHB1YmxpYyBDb250cm9sIGdldENvbnRlbnRzKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Q29udGVudHMoKTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qZmFjZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS9wYWNrYWdlLmh0bWwgYi9qZWxseS10YWdzL2pmYWNlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2NjhmYS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pmYWNlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci0KLSAgPHA+Ci0gIAlUaGUgSmVsbHlKRmFjZSBMaWJyYXJ5IGlzIGEgSmVsbHkgTGlicmFyeSBmb3IgY3JlYXRpbmcgUmljaCBVc2VyIEludGVyZmFjZXMgCi0gIAl1c2luZyBTV1QgYW5kIEpGYWNlIHZpYSBYTUwgbWFya3VwIChhIEplbGx5IHNjcmlwdCkuCi0gIAlKZWxseUpGYWNlIGlzIGFuIGVleHRlbnNpb24gb2YgSmVsbHlTV1QgdG8gYWRkIHN1cHBvcnQgZm9yIHRoZSBKRmFjZSBmcmFtZXdvcmsuCi0gIDwvcD4KLSAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pmYWNlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL3ByZWZlcmVuY2UvRmllbGRFZGl0b3JUYWcuamF2YSBiL2plbGx5LXRhZ3MvamZhY2Uvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2UvcHJlZmVyZW5jZS9GaWVsZEVkaXRvclRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDc0N2VkLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamZhY2Uvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2UvcHJlZmVyZW5jZS9GaWVsZEVkaXRvclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamZhY2UucHJlZmVyZW5jZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmUuVXNlQmVhblRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIFRhZyBjcmVhdGVzIGEgSkZhY2UgRmllbGRFZGl0b3IKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlcjwvYT4KLSAqLwotcHVibGljIGNsYXNzIEZpZWxkRWRpdG9yVGFnIGV4dGVuZHMgVXNlQmVhblRhZyB7Ci0KLSAgICBwdWJsaWMgRmllbGRFZGl0b3JUYWcoQ2xhc3MgYXJnMCkgewotICAgICAgICBzdXBlcihhcmcwKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZyNkb1RhZyhvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFByZWZlcmVuY2VQYWdlVGFnIHRhZyA9IChQcmVmZXJlbmNlUGFnZVRhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKFByZWZlcmVuY2VQYWdlVGFnLmNsYXNzKTsKLSAgICAgICAgaWYgKHRhZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIlRoaXMgdGFnIG11c3QgYmUgbmVzdGVkIGluc2lkZSBhIDxwcmVmZXJlbmNlUGFnZT4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCBuZXcgaW5zdGFuY2Ugb2YgRmllbGRFZGl0b3IKLSAgICAgICAgUHJlZmVyZW5jZVBhZ2VUYWcuUHJlZmVyZW5jZVBhZ2VJbXBsIHBhZ2UgPSB0YWcuZ2V0UHJlZmVyZW5jZVBhZ2VJbXBsKCk7Ci0gICAgICAgIGdldEF0dHJpYnV0ZXMoKS5wdXQoInBhcmVudENvbXBvc2l0ZSIsIHBhZ2UuZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0KLSAgICAgICAgLy8gYWRkIGZpZWxkRWRpdG9yIHRvIFByZWZlcmVuY2VQYWdlCi0gICAgICAgIE9iamVjdCBmaWVsZEVkaXRvciA9IG5ld0luc3RhbmNlKGdldERlZmF1bHRDbGFzcygpLCBnZXRBdHRyaWJ1dGVzKCksIG91dHB1dCk7Ci0gICAgICAgIGlmIChmaWVsZEVkaXRvciBpbnN0YW5jZW9mIEZpZWxkRWRpdG9yKSB7Ci0gICAgICAgICAgICBwYWdlLmFkZEZpZWxkKChGaWVsZEVkaXRvcikgZmllbGRFZGl0b3IpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZS5Vc2VCZWFuVGFnI25ld0luc3RhbmNlKGphdmEubGFuZy5DbGFzcywgamF2YS51dGlsLk1hcCwgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IG5ld0luc3RhbmNlKENsYXNzIHRoZUNsYXNzLCBNYXAgYXR0cmlidXRlcywgWE1MT3V0cHV0IG91dHB1dCkKLSAgICAgICAgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAodGhlQ2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJObyBDbGFzcyBhdmFpbGFibGUgdG8gY3JlYXRlIHRoZSBGaWVsZEVkaXRvciIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBhdHRyaWJ1dGVzLmdldCgibmFtZSIpOwotICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbigibmFtZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCA9IChTdHJpbmcpIGF0dHJpYnV0ZXMuZ2V0KCJsYWJlbFRleHQiKTsKLSAgICAgICAgaWYgKGxhYmVsVGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbigibGFiZWxUZXh0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBDb21wb3NpdGUgcGFyZW50Q29tcG9zaXRlID0gKENvbXBvc2l0ZSkgYXR0cmlidXRlcy5nZXQoInBhcmVudENvbXBvc2l0ZSIpOwotICAgICAgICBpZiAocGFyZW50Q29tcG9zaXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCJwYXJlbnRDb21wb3NpdGUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGxldCdzIHRyeSB0byBjYWxsIGEgY29uc3RydWN0b3IKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzW10gdHlwZXMgPSB7IFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBDb21wb3NpdGUuY2xhc3MgfTsKLSAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGhlQ2xhc3MuZ2V0Q29uc3RydWN0b3IodHlwZXMpOwotICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBPYmplY3RbXSBhcmd1bWVudHMgPSB7IG5hbWUsIGxhYmVsVGV4dCwgcGFyZW50Q29tcG9zaXRlIH07Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKGFyZ3VtZW50cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhlQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pmYWNlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL3ByZWZlcmVuY2UvUHJlZmVyZW5jZURpYWxvZ1RhZy5qYXZhIGIvamVsbHktdGFncy9qZmFjZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS9wcmVmZXJlbmNlL1ByZWZlcmVuY2VEaWFsb2dUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk4OTRkMy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pmYWNlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL3ByZWZlcmVuY2UvUHJlZmVyZW5jZURpYWxvZ1RhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZS5wcmVmZXJlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmUuVXNlQmVhblRhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3dUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVGhpcyBUYWcgY3JlYXRlcyBhIEpGYWNlIFByZWZlcmVuY2VEaWFsb2cKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlcjwvYT4KLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VEaWFsb2dUYWcgZXh0ZW5kcyBVc2VCZWFuVGFnIHsKLQotICAgIHB1YmxpYyBQcmVmZXJlbmNlRGlhbG9nVGFnKENsYXNzIGFyZzApIHsKLSAgICAgICAgc3VwZXIoYXJnMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBQcmVmZXJlbmNlRGlhbG9nCi0gICAgICovCi0gICAgcHVibGljIFByZWZlcmVuY2VEaWFsb2cgZ2V0UHJlZmVyZW5jZURpYWxvZygpIHsKLSAgICAgICAgT2JqZWN0IGJlYW4gPSBnZXRCZWFuKCk7Ci0gICAgICAgIGlmIChiZWFuIGluc3RhbmNlb2YgUHJlZmVyZW5jZURpYWxvZykgewotICAgICAgICAgICAgcmV0dXJuIChQcmVmZXJlbmNlRGlhbG9nKSBiZWFuOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gU2hlbGwKLSAgICAgKiBAdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNoZWxsIGdldFNoZWxsKCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgQXBwbGljYXRpb25XaW5kb3dUYWcgdGFnID0KLSAgICAgICAgICAgIChBcHBsaWNhdGlvbldpbmRvd1RhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKEFwcGxpY2F0aW9uV2luZG93VGFnLmNsYXNzKTsKLQotICAgICAgICBpZiAodGFnICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0YWcuZ2V0V2luZG93KCkuZ2V0U2hlbGwoKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTWFwIGF0dHJpYnV0ZXMgPSBnZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICBPYmplY3QgcGFyZW50ID0gYXR0cmlidXRlcy5yZW1vdmUoInBhcmVudCIpOwotICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNoZWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChTaGVsbCkgcGFyZW50OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIlRoaXMgdGFnIG11c3QgYmUgbmVzdGVkIGluc2lkZSBhIDxhcHBsaWNhdGlvbldpbmRvdz4gb3IgaGF2ZSBhIHBhcmVudCBvZiB0eXBlIFNoZWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZS5Vc2VCZWFuVGFnI25ld0luc3RhbmNlKGphdmEubGFuZy5DbGFzcywgamF2YS51dGlsLk1hcCwgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IG5ld0luc3RhbmNlKENsYXNzIGFyZzAsIE1hcCBhcmcxLCBYTUxPdXRwdXQgYXJnMikgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIgcG0gPSBuZXcgUHJlZmVyZW5jZU1hbmFnZXIoKTsKLSAgICAgICAgcmV0dXJuIG5ldyBQcmVmZXJlbmNlRGlhbG9nKGdldFNoZWxsKCksIHBtKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamZhY2Uvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2UvcHJlZmVyZW5jZS9QcmVmZXJlbmNlUGFnZVRhZy5qYXZhIGIvamVsbHktdGFncy9qZmFjZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS9wcmVmZXJlbmNlL1ByZWZlcmVuY2VQYWdlVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYjk1MTYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qZmFjZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS9wcmVmZXJlbmNlL1ByZWZlcmVuY2VQYWdlVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZS5wcmVmZXJlbmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBUYWcgY3JlYXRlcyBhIEpGYWNlIFByZWZlcmVuY2VQYWdlCi0gKgotICogUHJvdmlkZXMgYSBjb25jcmV0ZSBwcmVmZXJlbmNlIHN0b3JlIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGFuIGludGVybmFsIGphdmEudXRpbC5Qcm9wZXJ0aWVzIG9iamVjdAotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyPC9hPgotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZVBhZ2VUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGEgRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZQotICAgICAqIG1ldGhvZCBjcmVhdGVGaWVsZEVkaXRvcnMgaXMgY2FsbGVkIG9uIERpYWxvZy5vcGVuKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgUHJlZmVyZW5jZVBhZ2VJbXBsIGV4dGVuZHMgRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZSB7Ci0gICAgICAgIHByaXZhdGUgUHJlZmVyZW5jZVN0b3JlIHByZWZlcmVuY2VTdG9yZTsKLQotICAgICAgICBwdWJsaWMgUHJlZmVyZW5jZVBhZ2VJbXBsKFN0cmluZyB0aXRsZSkgewotICAgICAgICAgICAgc3VwZXIodGl0bGUsIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UuR1JJRCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHByZWZlcmVuY2VTdG9yZSA9IG5ldyBQcmVmZXJlbmNlU3RvcmUoZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIHByZWZlcmVuY2VTdG9yZS5sb2FkKCk7Ci0gICAgICAgICAgICAgICAgc2V0UHJlZmVyZW5jZVN0b3JlKHByZWZlcmVuY2VTdG9yZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkRmllbGQoRmllbGRFZGl0b3IgZWRpdG9yKSB7Ci0gICAgICAgICAgICBzdXBlci5hZGRGaWVsZChlZGl0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmllbGRFZGl0b3JzKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChKZWxseVRhZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbXBvc2l0ZSBnZXRGaWVsZEVkaXRvclBhcmVudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRGaWVsZEVkaXRvclBhcmVudCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotICAgICAgICAgICAgcmV0dXJuIHByZWZlcmVuY2VTdG9yZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhQcmVmZXJlbmNlUGFnZVRhZy5jbGFzcyk7Ci0KLSAgICAvKiogRmlsZW5hbWUgb2YgdGhlIHN0b3JlICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlsZW5hbWU7Ci0KLSAgICAvKiogSmVsbHkgWE1MT3V0cHV0ICovCi0gICAgcHJpdmF0ZSBYTUxPdXRwdXQgb3V0cHV0OwotCi0gICAgLyoqIEN1cnJlbnQgUHJlZmVyZW5jZVBhZ2VJbXBsICovCi0gICAgcHJpdmF0ZSBQcmVmZXJlbmNlUGFnZUltcGwgcGFnZTsKLQotICAgIC8qKiBUaXRsZSBvZiBib3RoIFByZWZlcmVuY2VOb2RlIGFuZCBQcmVmZXJlbmNlUGFnZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWcjZG9UYWcob3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICAvLyBjaGVjayBsb2NhdGlvbgotICAgICAgICBQcmVmZXJlbmNlRGlhbG9nVGFnIGRpYWxvZ1RhZyA9Ci0gICAgICAgICAgICAoUHJlZmVyZW5jZURpYWxvZ1RhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKFByZWZlcmVuY2VEaWFsb2dUYWcuY2xhc3MpOwotICAgICAgICBpZiAoZGlhbG9nVGFnID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiVGhpcyB0YWcgbXVzdCBiZSBuZXN0ZWQgd2l0aGluIGEgPHByZWZlcmVuY2VEaWFsb2c+Iik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBmb3IgbWlzc2luZyBhdHRyaWJ1dGVzCi0gICAgICAgIGlmIChmaWxlbmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbigiZmlsZW5hbWUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGl0bGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oInRpdGxlIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBidWlsZCBuZXcgUHJlZmVyZW5jZU5vZGUgd2l0aCBzYW1lIHRpdGxlIGFzIHRoZSBQcmVmZXJlbmNlUGFnZQotICAgICAgICBQcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IGRpYWxvZ1RhZy5nZXRQcmVmZXJlbmNlRGlhbG9nKCk7Ci0gICAgICAgIFByZWZlcmVuY2VOb2RlIG5vZGUgPSBuZXcgUHJlZmVyZW5jZU5vZGUodGl0bGUpOwotCi0gICAgICAgIC8vIGJ1aWxkIG5ldyBQcmVmZXJlbmNlUGFnZQotICAgICAgICBwYWdlID0gbmV3IFByZWZlcmVuY2VQYWdlSW1wbCh0aXRsZSk7Ci0KLSAgICAgICAgLy8gYWRkIG5vZGUgdG8gUHJlZmVyZW5jZU1hbmFnZXIKLSAgICAgICAgbm9kZS5zZXRQYWdlKHBhZ2UpOwotICAgICAgICBkaWFsb2cuZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKS5hZGRUb1Jvb3Qobm9kZSk7Ci0KLSAgICAgICAgLy8gdXNlZCBieSBQcmVmZXJlbmNlUGFnZUltcGwKLSAgICAgICAgdGhpcy5vdXRwdXQgPSBvdXRwdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBQcmVmZXJlbmNlUGFnZUltcGwKLSAgICAgKiBAcmV0dXJuIFByZWZlcmVuY2VQYWdlSW1wbAotICAgICAqLwotICAgIHB1YmxpYyBQcmVmZXJlbmNlUGFnZUltcGwgZ2V0UHJlZmVyZW5jZVBhZ2VJbXBsKCkgewotICAgICAgICByZXR1cm4gcGFnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmaWxlbmFtZS4KLSAgICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIGZpbGVuYW1lIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVuYW1lKFN0cmluZyBmaWxlbmFtZSkgewotICAgICAgICB0aGlzLmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGl0bGUuCi0gICAgICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZSB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qZmFjZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS93aW5kb3cvQXBwbGljYXRpb25XaW5kb3dJbXBsLmphdmEgYi9qZWxseS10YWdzL2pmYWNlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL3dpbmRvdy9BcHBsaWNhdGlvbldpbmRvd0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk4ZDY3ZS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pmYWNlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL3dpbmRvdy9BcHBsaWNhdGlvbldpbmRvd0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamZhY2Uud2luZG93OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBhIEFwcGxpY2F0aW9uV2luZG93VGFnCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2tsQGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXI8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbldpbmRvd0ltcGwgZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdyB7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2hlbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwbGljYXRpb25XaW5kb3dJbXBsKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0KLSAgICAgICAgc3VwZXIocGFyZW50U2hlbGwpOwotCi0gICAgICAgIC8vIGRlZmF1bHQgYXQgYWxsCi0gICAgICAgIGFkZE1lbnVCYXIoKTsKLSAgICAgICAgYWRkU3RhdHVzTGluZSgpOwotICAgICAgICBhZGRUb29sQmFyKFNXVC5OVUxMKTsKLQotICAgICAgICBzZXRCbG9ja09uT3Blbih0cnVlKTsKLQotICAgICAgICAvLyBjcmVhdGUgd2luZG93Ci0gICAgICAgIGNyZWF0ZSgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogb3ZlcnJpZGUgdG8gbWFrZSBwdWJsaWMKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjZ2V0Q29udGVudHMoKQotICAgICAqLwotICAgIHB1YmxpYyBDb250cm9sIGdldENvbnRlbnRzKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Q29udGVudHMoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamZhY2Uvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2Uvd2luZG93L0FwcGxpY2F0aW9uV2luZG93VGFnLmphdmEgYi9qZWxseS10YWdzL2pmYWNlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL3dpbmRvdy9BcHBsaWNhdGlvbldpbmRvd1RhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmVjYjc4Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamZhY2Uvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2Uvd2luZG93L0FwcGxpY2F0aW9uV2luZG93VGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZS53aW5kb3c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZS5Vc2VCZWFuVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3dC5jb252ZXJ0ZXJzLlBvaW50Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVGhpcyB0YWcgY3JlYXRlcyBhbiBKRmFjZSBBcHBsaWNhdGlvbldpbmRvdwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyPC9hPgotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25XaW5kb3dUYWcgZXh0ZW5kcyBVc2VCZWFuVGFnIHsKLQotICAgIHByaXZhdGUgU2hlbGwgcGFyZW50OwotICAgIHByaXZhdGUgaW50IHN0eWxlID0gU1dULk5VTEw7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gd2lkZ2V0Q2xhc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwbGljYXRpb25XaW5kb3dUYWcoQ2xhc3MgdGFnQ2xhc3MpIHsKLSAgICAgICAgc3VwZXIodGFnQ2xhc3MpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnI2RvVGFnKG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkKLSAgICAgICAgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgTWFwIGF0dHJpYnV0ZXMgPSBnZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIE9iamVjdCBwYXJlbnQgPSBhdHRyaWJ1dGVzLnJlbW92ZSgicGFyZW50Iik7Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNoZWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSAoU2hlbGwpIHBhcmVudDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVGhlIHBhcmVudCBhdHRyaWJ1dGUgaXMgbm90IGEgU2hlbGwsIGl0IGlzIG9mIHR5cGU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcGFyZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgdmFsdWU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcGFyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLmRvVGFnKG91dHB1dCk7Ci0KLSAgICAgICAgLy8gc2V0IFRpdGxlIG9mIGFhcGxpY2F0aW9uV2luZG93Ci0gICAgICAgIE9iamVjdCB0aXRsZSA9IGF0dHJpYnV0ZXMucmVtb3ZlKCJ0aXRsZSIpOwotICAgICAgICBpZiAodGl0bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0V2luZG93KCkuZ2V0U2hlbGwoKS5zZXRUZXh0KChTdHJpbmcpdGl0bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IHNpemUgb2YgYXBwbGljYXRpb25XaW5kb3cKLSAgICAgICAgT2JqZWN0IHNpemUgPSBhdHRyaWJ1dGVzLnJlbW92ZSgic2l6ZSIpOwotICAgICAgICBpZiAoc2l6ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBQb2ludCBwb2ludCA9IG5ldyBQb2ludENvbnZlcnRlcigpLnBhcnNlKChTdHJpbmcpIHNpemUpOwotICAgICAgICAgICAgZ2V0V2luZG93KCkuZ2V0U2hlbGwoKS5zZXRTaXplKHBvaW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5jb3JlLlVzZUJlYW5UYWcjbmV3SW5zdGFuY2UoamF2YS5sYW5nLkNsYXNzLCBqYXZhLnV0aWwuTWFwLCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0KQotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgbmV3SW5zdGFuY2UoCi0gICAgICAgIENsYXNzIHRoZUNsYXNzLAotICAgICAgICBNYXAgYXR0cmlidXRlcywKLSAgICAgICAgWE1MT3V0cHV0IG91dHB1dCkKLSAgICAgICAgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLQotICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uV2luZG93SW1wbChwYXJlbnQpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgdmlzaWJsZSB3aW5kb3csIGlmIHRoZXJlIGlzIG9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgV2luZG93IGdldFdpbmRvdygpIHsKLSAgICAgICAgT2JqZWN0IGJlYW4gPSBnZXRCZWFuKCk7Ci0gICAgICAgIGlmIChiZWFuIGluc3RhbmNlb2YgV2luZG93KSB7Ci0gICAgICAgICAgICByZXR1cm4gKFdpbmRvdykgYmVhbjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamZhY2Uvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2Uvd2l6YXJkL1dpemFyZERpYWxvZ1RhZy5qYXZhIGIvamVsbHktdGFncy9qZmFjZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS93aXphcmQvV2l6YXJkRGlhbG9nVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkM2M4NjQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qZmFjZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS93aXphcmQvV2l6YXJkRGlhbG9nVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5TY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5jb3JlLlVzZUJlYW5UYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93VGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiAgVGhpcyBUYWcgY3JlYXRlcyBhIEpGYWNlIFdpemFyZERpYWxvZwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyPC9hPgotICovCi1wdWJsaWMgY2xhc3MgV2l6YXJkRGlhbG9nVGFnIGV4dGVuZHMgVXNlQmVhblRhZyB7Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlIGEgcHVibGljIG1ldGhvZCBnZXRXaXphcmQKLSAgICAgKi8KLSAgICBjbGFzcyBXaXphcmREaWFsb2dJbXBsIGV4dGVuZHMgV2l6YXJkRGlhbG9nIHsKLSAgICAgICAgcHVibGljIFdpemFyZERpYWxvZ0ltcGwoU2hlbGwgcGFyZW50U2hlbGwsIElXaXphcmQgbmV3V2l6YXJkKSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnRTaGVsbCwgbmV3V2l6YXJkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJV2l6YXJkIGdldFdpemFyZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRXaXphcmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBQcm92aWRlIGEgV2l6YXJkIGltcGxlbWVudGF0aW9uCi0gICAgICAqLwotICAgIGNsYXNzIFdpemFyZEltcGwgZXh0ZW5kcyBXaXphcmQgewotICAgICAgICBwdWJsaWMgV2l6YXJkSW1wbCgpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICBzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1DYW5jZWwoKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChwZXJmb3JtQ2FuY2VsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcGVyZm9ybUNhbmNlbC5ydW4oY29udGV4dCwgb3V0cHV0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSmVsbHlUYWdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChwZXJmb3JtRmluaXNoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcGVyZm9ybUZpbmlzaC5ydW4oY29udGV4dCwgb3V0cHV0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSmVsbHlUYWdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhXaXphcmREaWFsb2dUYWcuY2xhc3MpOwotCi0gICAgLyoqIEplbGx5IFhNTE91dHB1dCAqLwotICAgIHByaXZhdGUgWE1MT3V0cHV0IG91dHB1dDsKLQotICAgIC8qKiBTY3JpcHQgdG8gYmUgZXhlY3V0ZWQgb24gcGVyZm9ybUNhbmNlbCAqLwotICAgIHByaXZhdGUgU2NyaXB0IHBlcmZvcm1DYW5jZWw7Ci0KLSAgICAvKiogU2NyaXB0IHRvIGJlIGV4ZWN1dGVkIG9uIHBlcmZvcm1GaW5pc2ggKi8KLSAgICBwcml2YXRlIFNjcmlwdCBwZXJmb3JtRmluaXNoOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHRoZUNsYXNzCi0gICAgICovCi0gICAgcHVibGljIFdpemFyZERpYWxvZ1RhZyhDbGFzcyB0aGVDbGFzcykgewotICAgICAgICBzdXBlcih0aGVDbGFzcyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWcjZG9UYWcob3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb1RhZyhvdXRwdXQpOwotCi0gICAgICAgIGlmIChnZXRBdHRyaWJ1dGVzKCkuZ2V0KCJwZXJmb3JtQ2FuY2VsIikgIT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0IHNjcmlwdCA9IGdldEF0dHJpYnV0ZXMoKS5nZXQoInBlcmZvcm1DYW5jZWwiKTsKLSAgICAgICAgICAgIGlmIChzY3JpcHQgaW5zdGFuY2VvZiBTY3JpcHQpIHsKLSAgICAgICAgICAgICAgICBwZXJmb3JtQ2FuY2VsID0gKFNjcmlwdCkgZ2V0QXR0cmlidXRlcygpLmdldCgicGVyZm9ybUNhbmNlbCIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIkF0dHJpYnV0ZXZhbHVlICIgKyBzY3JpcHQgKyAiIG11c3QgYmUgYSBTY3JpcHQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRBdHRyaWJ1dGVzKCkuZ2V0KCJwZXJmb3JtRmluaXNoIikgIT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0IHNjcmlwdCA9IGdldEF0dHJpYnV0ZXMoKS5nZXQoInBlcmZvcm1GaW5pc2giKTsKLSAgICAgICAgICAgIGlmIChzY3JpcHQgaW5zdGFuY2VvZiBTY3JpcHQpIHsKLSAgICAgICAgICAgICAgICBwZXJmb3JtRmluaXNoID0gKFNjcmlwdCkgZ2V0QXR0cmlidXRlcygpLmdldCgicGVyZm9ybUZpbmlzaCIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIkF0dHJpYnV0ZXZhbHVlICIgKyBzY3JpcHQgKyAiIG11c3QgYmUgYSBTY3JpcHQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gU2hlbGwKLSAgICAgKiBAdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNoZWxsIGdldFNoZWxsKCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgQXBwbGljYXRpb25XaW5kb3dUYWcgdGFnID0KLSAgICAgICAgICAgIChBcHBsaWNhdGlvbldpbmRvd1RhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKEFwcGxpY2F0aW9uV2luZG93VGFnLmNsYXNzKTsKLSAgICAgICAgaWYgKHRhZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIlRoaXMgdGFnIG11c3QgYmUgbmVzdGVkIGluc2lkZSBhIDxhcHBsaWNhdGlvbldpbmRvdz4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB0YWcuZ2V0V2luZG93KCkuZ2V0U2hlbGwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gV2l6YXJkRGlhbG9nCi0gICAgICovCi0gICAgcHVibGljIFdpemFyZERpYWxvZ0ltcGwgZ2V0V2l6YXJkRGlhbG9nSW1wbCgpIHsKLSAgICAgICAgT2JqZWN0IGJlYW4gPSBnZXRCZWFuKCk7Ci0gICAgICAgIGlmIChiZWFuIGluc3RhbmNlb2YgV2l6YXJkRGlhbG9nKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFdpemFyZERpYWxvZ0ltcGwpIGJlYW47Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmUuVXNlQmVhblRhZyNuZXdJbnN0YW5jZShqYXZhLmxhbmcuQ2xhc3MsIGphdmEudXRpbC5NYXAsIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBuZXdJbnN0YW5jZShDbGFzcyB0aGVDbGFzcywgTWFwIGF0dHJpYnV0ZXMsIFhNTE91dHB1dCBvdXRwdXQpCi0gICAgICAgIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFdpemFyZCB3aXphcmQgPSBuZXcgV2l6YXJkSW1wbCgpOwotICAgICAgICByZXR1cm4gbmV3IFdpemFyZERpYWxvZ0ltcGwoZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBTY3JpcHQgdG8gYmUgZXhlY3V0ZWQgb24gcGVyZm9ybUNhbmNlbC4KLSAgICAgKiBAcGFyYW0gcGVyZm9ybUNhbmNlbCBUaGUgcGVyZm9ybUNhbmNlbCB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJmb3JtQ2FuY2VsKFNjcmlwdCBwZXJmb3JtQ2FuY2VsKSB7Ci0gICAgICAgIHRoaXMucGVyZm9ybUNhbmNlbCA9IHBlcmZvcm1DYW5jZWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgU2NyaXB0IHRvIGJlIGV4ZWN1dGVkIG9uIHBlcmZvcm1GaW5pc2guCi0gICAgICogQHBhcmFtIHBlcmZvcm1GaW5pc2ggVGhlIHBlcmZvcm1GaW5pc2ggdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGVyZm9ybUZpbmlzaChTY3JpcHQgcGVyZm9ybUZpbmlzaCkgewotICAgICAgICB0aGlzLnBlcmZvcm1GaW5pc2ggPSBwZXJmb3JtRmluaXNoOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qZmFjZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS93aXphcmQvV2l6YXJkUGFnZVRhZy5qYXZhIGIvamVsbHktdGFncy9qZmFjZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS93aXphcmQvV2l6YXJkUGFnZVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDExMzdmLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamZhY2Uvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2Uvd2l6YXJkL1dpemFyZFBhZ2VUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpmYWNlLndpemFyZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmUuVXNlQmVhblRhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogIFRoaXMgVGFnIGNyZWF0ZXMgYSBKRmFjZSBXaXphcmRQYWdlCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2tsQGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXI8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBXaXphcmRQYWdlVGFnIGV4dGVuZHMgVXNlQmVhblRhZyB7Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhIFdpemFyZFBhZ2UKLSAgICAgKiBtZXRob2QgY3JlYXRlQ29udHJvbCBpcyBjYWxsZWQgb24gRGlhbG9nLm9wZW4oKQotICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBXaXphcmRQYWdlSW1wbCBleHRlbmRzIFdpemFyZFBhZ2UgewotICAgICAgICBwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnRDb21wb3NpdGU7Ci0KLSAgICAgICAgcHVibGljIFdpemFyZFBhZ2VJbXBsKFN0cmluZyB0aXRsZSkgewotICAgICAgICAgICAgc3VwZXIodGl0bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgICAgICAvLyBzZXQgaW5pdGlhbCBwYXJlbnQgQ29udHJvbCB0byBhdm9pZCBhIE5QRSBkdXJpbmcgaW52b2tlQm9keQotICAgICAgICAgICAgc2V0Q29udHJvbChwYXJlbnQpOwotCi0gICAgICAgICAgICAvLyBjcmVhdGUgcGFnZSBjb250ZW50cwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChKZWxseVRhZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBwYXJlbnRDb21wb3NpdGUgc2hvdWxkIGJlIGZpcnN0IENvbXBvc2l0ZSBjaGlsZAotICAgICAgICAgICAgaWYgKHBhcmVudENvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2V0Q29udHJvbChwYXJlbnRDb21wb3NpdGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbnRyb2wgZ2V0UGFyZW50Q29udHJvbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnRDb21wb3NpdGU7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGFyZW50Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnRDb21wb3NpdGUpIHsKLSAgICAgICAgICAgIHRoaXMucGFyZW50Q29tcG9zaXRlID0gcGFyZW50Q29tcG9zaXRlOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUHJlZmVyZW5jZVBhZ2VUYWcuY2xhc3MpOwotCi0gICAgLyoqIEplbGx5IFhNTE91dHB1dCAqLwotICAgIHByaXZhdGUgWE1MT3V0cHV0IG91dHB1dDsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0aGVDbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBXaXphcmRQYWdlVGFnKENsYXNzIHRoZUNsYXNzKSB7Ci0gICAgICAgIHN1cGVyKHRoZUNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZyNkb1RhZyhvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGNoZWNrIGxvY2F0aW9uCi0gICAgICAgIFdpemFyZERpYWxvZ1RhZyB3aXphcmRUYWcgPSAoV2l6YXJkRGlhbG9nVGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoV2l6YXJkRGlhbG9nVGFnLmNsYXNzKTsKLSAgICAgICAgaWYgKHdpemFyZFRhZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIlRoaXMgdGFnIG11c3QgYmUgbmVzdGVkIHdpdGhpbiBhIDx3aXphcmREaWFsb2c+Iik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBmb3IgbWlzc2luZyBhdHRyaWJ1dGVzCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IChTdHJpbmcpIGdldEF0dHJpYnV0ZXMoKS5nZXQoInRpdGxlIik7Ci0gICAgICAgIGlmICh0aXRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbigidGl0bGUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCBXaXphcmRQYWdlSW1wbAotICAgICAgICBXaXphcmRQYWdlSW1wbCBwYWdlID0gbmV3IFdpemFyZFBhZ2VJbXBsKHRpdGxlKTsKLSAgICAgICAgc2V0QmVhbihwYWdlKTsKLSAgICAgICAgc2V0QmVhblByb3BlcnRpZXMocGFnZSwgZ2V0QXR0cmlidXRlcygpKTsKLQotICAgICAgICBTdHJpbmcgdmFyID0gKFN0cmluZykgZ2V0QXR0cmlidXRlcygpLmdldCgidmFyIik7Ci0gICAgICAgIHByb2Nlc3NCZWFuKHZhciwgcGFnZSk7Ci0KLSAgICAgICAgLy8gZ2V0IFdpemFyZAotICAgICAgICBXaXphcmREaWFsb2dUYWcuV2l6YXJkRGlhbG9nSW1wbCBkaWFsb2cgPSB3aXphcmRUYWcuZ2V0V2l6YXJkRGlhbG9nSW1wbCgpOwotICAgICAgICBXaXphcmQgd2l6YXJkID0gKFdpemFyZCkgZGlhbG9nLmdldFdpemFyZCgpOwotCi0gICAgICAgIC8vIGFkZCBXaXphcmRQYWdlIHRvIHRoZSBXaXphcmQKLSAgICAgICAgd2l6YXJkLmFkZFBhZ2UocGFnZSk7Ci0KLSAgICAgICAgLy8gdXNlZCBieSBpbXBsZW1lbnRpbmcgcGFnZQotICAgICAgICB0aGlzLm91dHB1dCA9IG91dHB1dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFdpemFyZFBhZ2VJbXBsCi0gICAgICogQHJldHVybiBXaXphcmRQYWdlSW1wbAotICAgICAqLwotICAgIHB1YmxpYyBXaXphcmRQYWdlSW1wbCBnZXRXaXphcmRQYWdlSW1wbCgpIHsKLSAgICAgICAgT2JqZWN0IGJlYW4gPSBnZXRCZWFuKCk7Ci0gICAgICAgIGlmIChiZWFuIGluc3RhbmNlb2YgV2l6YXJkUGFnZUltcGwpIHsKLSAgICAgICAgICAgIHJldHVybiAoV2l6YXJkUGFnZUltcGwpIGJlYW47Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pmYWNlL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL0pGYWNlRGVtby5qYXZhIGIvamVsbHktdGFncy9qZmFjZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS9KRmFjZURlbW8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEzMzUyZS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pmYWNlL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL0pGYWNlRGVtby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZS5KRmFjZVRhZ0xpYnJhcnk7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2tsQGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXI8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKRmFjZURlbW8gewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBKZWxseUNvbnRleHQgY29udGV4dCA9IG5ldyBKZWxseUNvbnRleHQoKTsKLQotICAgICAgICAgICAgLyoqIEB0b2RvIHphcCB0aGUgZm9sbG93aW5nIGxpbmUgb25jZSB0aGUgSmVsbHkgY29yZSBoYXMgdGhpcyBkZWZhdWx0ICovCi0gICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyVGFnTGlicmFyeSgiamVsbHk6amZhY2UiLCBuZXcgSkZhY2VUYWdMaWJyYXJ5KCkpOwotCi0gICAgICAgICAgICBVUkwgdXJsID0gSkZhY2VEZW1vLmNsYXNzLmdldFJlc291cmNlKCJKRmFjZURlbW8uamVsbHkiKTsKLQotICAgICAgICAgICAgWE1MT3V0cHV0IG91dHB1dCA9IFhNTE91dHB1dC5jcmVhdGVYTUxPdXRwdXQoU3lzdGVtLm91dCwgdHJ1ZSk7Ci0gICAgICAgICAgICBjb250ZXh0LnJ1blNjcmlwdCggdXJsLCBvdXRwdXQgKTsKLSAgICAgICAgICAgIG91dHB1dC5mbHVzaCgpOwotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamZhY2Uvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2UvSkZhY2VEZW1vLmplbGx5IGIvamVsbHktdGFncy9qZmFjZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS9KRmFjZURlbW8uamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZDAwMTguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qZmFjZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS9KRmFjZURlbW8uamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4NCi0gIA0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIA0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIA0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM9ImplbGx5OmpmYWNlIiB4bWxuczpsb2c9ImplbGx5OmxvZyI+DQotDQotICA8YXBwbGljYXRpb25XaW5kb3cgdmFyPSJtYWluYXBwIiB0aXRsZT0iV2VsY29tZSB0byB0aGUgSkZhY2UgRGVtbyI+DQotDQotICAgICAgICA8bWVudU1hbmFnZXIgdGV4dD0iRmlsZSI+DQotICAgICAgICAgICAgPGFjdGlvbiB0ZXh0PSJUZXN0Ij4NCi0gICAgICAgICAgICAgICAgPGxvZzppbmZvPiBWZXJ5IE5pY2UgISEhPC9sb2c6aW5mbz4NCi0gICAgICAgICAgICA8L2FjdGlvbj4NCi0gICAgICAgICAgICA8c2VwYXJhdG9yIC8+DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgPGFjdGlvbiB0ZXh0PSJDaGVjayBtZSIgY2hlY2tlZD0idHJ1ZSI+DQotICAgICAgICAgICAgICAgIDxsb2c6aW5mbz5JJ3ZlIGJlZW4gY2hlY2tlZDwvbG9nOmluZm8+DQotICAgICAgICAgICAgPC9hY3Rpb24+DQotICAgICAgICA8L21lbnVNYW5hZ2VyPg0KLSAgICAgICAgDQotICAgICAgICA8bWVudU1hbmFnZXIgdGV4dD0iRWRpdCI+DQotICAgICAgICAgICAgPGFjdGlvbiB0ZXh0PSJTYXkgSGkgU3RhdHVzYmFyIj4NCi0gICAgICAgICAgICAgICAgICAke21haW5hcHAuc2V0U3RhdHVzKCdIZWxsbyAuLi4nKX0gDQotICAgICAgICAgICAgPC9hY3Rpb24+DQotICAgICAgICA8L21lbnVNYW5hZ2VyPg0KLSAgICANCi0gICAgICAgIDxmaWxsTGF5b3V0IHR5cGU9InZlcnRpY2FsIi8+ICAgIA0KLSAgICANCi0gICAgICAgIDxsYWJlbCB0ZXh0PSJBIGJpZyByZWQgbGFiZWwgMSIgYmFja2dyb3VuZD0iMjA0LCAwLCAwIi8+DQotICAgICAgICA8bGFiZWwgdGV4dD0iSSBjYW4gYmFyZWxseSByZWFkIHRoaXMgOy0oIiBmb3JlZ3JvdW5kPSIjZjJmMmYyIiAvPg0KLSAgICAgICAgPGxhYmVsIHRleHQ9Ikl0IHN1cmUgbG9va3MgbGlrZSB0aGUgZHV0Y2ggZmxhZyA7LSkiIGZvcmVncm91bmQ9IiNmZmZmZmYiIGJhY2tncm91bmQ9IjAsIDAsIDE1MyIgLz4gICAgICAgIA0KLSAgICANCi0gIDwvYXBwbGljYXRpb25XaW5kb3c+DQotICANCi0gICR7bWFpbmFwcC5NZW51QmFyTWFuYWdlci51cGRhdGVBbGwodHJ1ZSl9IA0KLSAgJHttYWluYXBwLmdldFNoZWxsKCkucGFjaygpfQ0KLSAgJHttYWluYXBwLm9wZW4oKX0NCi0NCi0NCi08L2o6amVsbHk+DQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qZmFjZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS9wcmVmZXJlbmNlL1ByZWZlcmVuY2VEZW1vLmphdmEgYi9qZWxseS10YWdzL2pmYWNlL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL3ByZWZlcmVuY2UvUHJlZmVyZW5jZURlbW8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxMDNlOC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pmYWNlL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL3ByZWZlcmVuY2UvUHJlZmVyZW5jZURlbW8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamZhY2UucHJlZmVyZW5jZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZS5KRmFjZVRhZ0xpYnJhcnk7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2tsQGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXI8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlRGVtbyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIEplbGx5Q29udGV4dCBjb250ZXh0ID0gbmV3IEplbGx5Q29udGV4dCgpOwotCi0gICAgICAgICAgICAvKiogQHRvZG8gemFwIHRoZSBmb2xsb3dpbmcgbGluZSBvbmNlIHRoZSBKZWxseSBjb3JlIGhhcyB0aGlzIGRlZmF1bHQgKi8KLSAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJUYWdMaWJyYXJ5KCJqZWxseTpqZmFjZSIsIG5ldyBKRmFjZVRhZ0xpYnJhcnkoKSk7Ci0KLSAgICAgICAgICAgIFVSTCB1cmwgPSBQcmVmZXJlbmNlRGVtby5jbGFzcy5nZXRSZXNvdXJjZSgiUHJlZmVyZW5jZURlbW8uamVsbHkiKTsKLQotICAgICAgICAgICAgWE1MT3V0cHV0IG91dHB1dCA9IFhNTE91dHB1dC5jcmVhdGVYTUxPdXRwdXQoU3lzdGVtLm91dCwgdHJ1ZSk7Ci0gICAgICAgICAgICBjb250ZXh0LnJ1blNjcmlwdCggdXJsLCBvdXRwdXQgKTsKLSAgICAgICAgICAgIG91dHB1dC5mbHVzaCgpOwotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamZhY2Uvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2UvcHJlZmVyZW5jZS9QcmVmZXJlbmNlRGVtby5qZWxseSBiL2plbGx5LXRhZ3MvamZhY2Uvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvamZhY2UvcHJlZmVyZW5jZS9QcmVmZXJlbmNlRGVtby5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzZWY0ZC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pmYWNlL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL3ByZWZlcmVuY2UvUHJlZmVyZW5jZURlbW8uamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxucz0iamVsbHk6amZhY2UiIHhtbG5zOmxvZz0iamVsbHk6bG9nIj4KLQotICA8YXBwbGljYXRpb25XaW5kb3cgdmFyPSJtYWluYXBwIj4KLSAgICAgIAotICAgICAgPHByZWZlcmVuY2VEaWFsb2cgdmFyPSJwZCI+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8cHJlZmVyZW5jZVBhZ2UgdGl0bGU9IkdlbmVyYWwgc2V0dGluZ3MiIGZpbGVuYW1lPSJzZXR0aW5ncy5wcm9wcyI+Ci0gICAgICAgICAgICAgICAgPGJvb2xlYW5GaWVsZEVkaXRvciBuYW1lPSJ2YXIxIiBsYWJlbFRleHQ9Ikl0J3MgYm9vbGVhbiIgLz4KLSAgICAgICAgICAgICAgICA8Y29sb3JGaWVsZEVkaXRvciBuYW1lPSJ2YXIyIiBsYWJlbFRleHQ9Ik1haW5Db2xvciIgLz4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5RmllbGRFZGl0b3IgbmFtZT0idmFyMyIgbGFiZWxUZXh0PSJEaXJlY3RvcnkiIC8+Ci0gICAgICAgICAgICAgICAgPGZpbGVGaWVsZEVkaXRvciBuYW1lPSJ2YXI0IiBsYWJlbFRleHQ9IkZpbGUiIC8+Ci0gICAgICAgICAgICAgICAgPGZvbnRGaWVsZEVkaXRvciBuYW1lPSJ2YXI1IiBsYWJlbFRleHQ9IkZvbnQiIC8+ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8aW50ZWdlckZpZWxkRWRpdG9yIG5hbWU9InZhcjYiIGxhYmVsVGV4dD0iSW50ZWdlciIgLz4gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDxzdHJpbmdGaWVsZEVkaXRvciBuYW1lPSJ2YXI3IiBsYWJlbFRleHQ9IlN0cmluZyIgLz4gICAgCi0gICAgICAgICAgICA8L3ByZWZlcmVuY2VQYWdlPiAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDxwcmVmZXJlbmNlUGFnZSB0aXRsZT0iUGVyc29uYWwgc2V0dGluZ3MiIGZpbGVuYW1lPSJwZXJzb25hbC1zZXR0aW5ncy5wcm9wcyIgPgotICAgICAgICAgICAgICAgIDxzdHJpbmdGaWVsZEVkaXRvciBuYW1lPSJ2YXI4IiBsYWJlbFRleHQ9IlN0cmluZzEiIC8+ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPHN0cmluZ0ZpZWxkRWRpdG9yIG5hbWU9InZhcjkiIGxhYmVsVGV4dD0iU3RyaW5nMiIgLz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC9wcmVmZXJlbmNlUGFnZT4KLQotICAgIDwvcHJlZmVyZW5jZURpYWxvZz4gICAgICAgIAotCi0gICAgICAgIAotICA8L2FwcGxpY2F0aW9uV2luZG93PgotCi0gCi0gICR7cGQub3BlbigpfSAgICAKLQotIAotCi08L2o6amVsbHk+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pmYWNlL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL3dpemFyZC9XaXphcmREZW1vLmphdmEgYi9qZWxseS10YWdzL2pmYWNlL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL3dpemFyZC9XaXphcmREZW1vLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNjFmNGYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qZmFjZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS93aXphcmQvV2l6YXJkRGVtby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamZhY2UuSkZhY2VUYWdMaWJyYXJ5OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyPC9hPgotICovCi1wdWJsaWMgY2xhc3MgV2l6YXJkRGVtbyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIEplbGx5Q29udGV4dCBjb250ZXh0ID0gbmV3IEplbGx5Q29udGV4dCgpOwotCi0gICAgICAgICAgICAvKiogQHRvZG8gemFwIHRoZSBmb2xsb3dpbmcgbGluZSBvbmNlIHRoZSBKZWxseSBjb3JlIGhhcyB0aGlzIGRlZmF1bHQgKi8KLSAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJUYWdMaWJyYXJ5KCJqZWxseTpqZmFjZSIsIG5ldyBKRmFjZVRhZ0xpYnJhcnkoKSk7Ci0KLSAgICAgICAgICAgIFVSTCB1cmwgPSBXaXphcmREZW1vLmNsYXNzLmdldFJlc291cmNlKCJXaXphcmREZW1vLmplbGx5Iik7Ci0KLSAgICAgICAgICAgIFhNTE91dHB1dCBvdXRwdXQgPSBYTUxPdXRwdXQuY3JlYXRlWE1MT3V0cHV0KFN5c3RlbS5vdXQsIHRydWUpOwotICAgICAgICAgICAgY29udGV4dC5ydW5TY3JpcHQoIHVybCwgb3V0cHV0ICk7Ci0gICAgICAgICAgICBvdXRwdXQuZmx1c2goKTsKLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pmYWNlL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL3dpemFyZC9XaXphcmREZW1vLmplbGx5IGIvamVsbHktdGFncy9qZmFjZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qZmFjZS93aXphcmQvV2l6YXJkRGVtby5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFjYTk1Zi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pmYWNlL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pmYWNlL3dpemFyZC9XaXphcmREZW1vLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM9ImplbGx5OmpmYWNlIiB4bWxuczpsb2c9ImplbGx5OmxvZyIgeG1sbnM6ZGVmaW5lPSJqZWxseTpkZWZpbmUiPgotCi0gIDxkZWZpbmU6c2NyaXB0IHZhcj0ib25QZXJmb3JtRmluaXNoIj4KLSAgICAgICAgPGxvZzplcnJvcj5vblBlcmZvcm1GaW5pc2ggY2FsbGVkIC4uLjwvbG9nOmVycm9yPgotICA8L2RlZmluZTpzY3JpcHQ+Ci0gIAotICA8ZGVmaW5lOnNjcmlwdCB2YXI9Im9uUGVyZm9ybUNhbmNlbCI+Ci0gICAgICAgIDxsb2c6ZXJyb3I+b25QZXJmb3JtQ2FuY2VsIGNhbGxlZCAuLi48L2xvZzplcnJvcj4KLSAgPC9kZWZpbmU6c2NyaXB0PiAgCi0gIAotICA8YXBwbGljYXRpb25XaW5kb3cgdmFyPSJtYWluYXBwIj4KLSAgICAgIAotICAgICAgICA8d2l6YXJkRGlhbG9nIHZhcj0id2l6YXJkRGlhbG9nIiBwZXJmb3JtRmluaXNoPSIke29uUGVyZm9ybUZpbmlzaH0iIHBlcmZvcm1DYW5jZWw9IiR7b25QZXJmb3JtQ2FuY2VsfSI+Ci0KLSAgICAgICAgICAgIDx3aXphcmRQYWdlIHZhcj0id3BhZ2UxIiB0aXRsZT0iU3RlcCAxIiBkZXNjcmlwdGlvbj0iU3RlcCAxIGluIHRoaXMgd2l6YXJkLCBzaG93aW5nIHBhZ2UgMSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBvc2l0ZT4KLSAgICAgICAgICAgICAgICAgICAgPGdyaWRMYXlvdXQgbnVtQ29sdW1ucz0iMiIgLz4KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDxsYWJlbCB0ZXh0PSJTb21lIGlucHV0IiAvPgotICAgICAgICAgICAgICAgICAgICA8dGV4dCAvPgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHRleHQ9IkxhYmVsIDEiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdGV4dD0iU2V0IE1lc3NhZ2UiPiAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIDxvbkV2ZW50IHR5cGU9IlNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt3cGFnZTEuc2V0TWVzc2FnZSgnTWVzc2FnZTogZ2l2ZSBtZSBzb21lIG1vcmUgLi4uJyl9Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L29uRXZlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgotICAgICAgICAgICAgICAgICAgICA8bGFiZWwgdGV4dD0iTGFiZWwgMiIgLz4KLSAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0ZXh0PSJTZXQgRXJyb3IgTWVzc2FnZSI+ICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgPG9uRXZlbnQgdHlwZT0iU2VsZWN0aW9uIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3dwYWdlMS5zZXRFcnJvck1lc3NhZ2UoJ0Vycm9yTWVzc2FnZTogVGhpcyBzdGVwIGlzIG5vdCBjb21wbGV0ZScpfQotICAgICAgICAgICAgICAgICAgICAgICAgPC9vbkV2ZW50PiAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4gICAgCi0gICAgICAgICAgICAgICAgICAgIDxsYWJlbCB0ZXh0PSJMYWJlbCAzIiAvPgotICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHRleHQ9IlNldCBQYWdlIENvbXBsZXRlIj4gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICA8b25FdmVudCB0eXBlPSJTZWxlY3Rpb24iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7d3BhZ2UxLnNldFBhZ2VDb21wbGV0ZSh0cnVlKX0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvb25FdmVudD4gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDwvY29tcG9zaXRlPgotICAgICAgICAgICAgPC93aXphcmRQYWdlPiAgICAKLQotICAgICAgICAgICAgCi0gICAgICAgICAgICA8d2l6YXJkUGFnZSB2YXI9IndwYWdlMiIgdGl0bGU9IlN0ZXAgMiIgZGVzY3JpcHRpb249IlN0ZXAgMiBpbiB0aGlzIHdpemFyZCI+Ci0gICAgICAgICAgICAgICAgPGNvbXBvc2l0ZT4KLSAgICAgICAgICAgICAgICAgICAgPGdyaWRMYXlvdXQgbnVtQ29sdW1ucz0iMiIgLz4KLSAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHRleHQ9IkxhYmVsIDMiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdGV4dD0iRG8gbm90aGluZyIgLz4KLSAgICAgICAgICAgICAgICA8L2NvbXBvc2l0ZT4KLSAgICAgICAgICAgIDwvd2l6YXJkUGFnZT4gICAgCi0gICAgICAgICAgICAKLSAgICAgICAgPC93aXphcmREaWFsb2c+Ci0gICAgCi0gIDwvYXBwbGljYXRpb25XaW5kb3c+Ci0KLSAgJHt3cGFnZTEuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKX0gIAotICAke3dpemFyZERpYWxvZy5vcGVuKCl9ICAKLQotCi08L2o6amVsbHk+Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamZhY2UveGRvY3MvY2hhbmdlcy54bWwgYi9qZWxseS10YWdzL2pmYWNlL3hkb2NzL2NoYW5nZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzI1ODdiLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvamZhY2UveGRvY3MvY2hhbmdlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tIAotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotIC0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5DaGFuZ2VzPC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0gIDxib2R5PgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMCIgZGF0ZT0iMjAwNC0wOS0xMyI+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0iZml4IiBpc3N1ZT0iSkVMTFktNDEiIGR1ZS10bz0iQ2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXIiPnNldCBzaXplIGZvciBhcHBsaWNhdGlvbldpbmRvdzwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvamZhY2UveGRvY3MvaW5kZXgueG1sIGIvamVsbHktdGFncy9qZmFjZS94ZG9jcy9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYTAwZDcuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qZmFjZS94ZG9jcy9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5KZXR0eSBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotICAgIDxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KLSAgICAgIDxwPgotICAgICAgICBUaGUgSmVsbHlKRmFjZSBMaWJyYXJ5IGlzIGEgSmVsbHkgTGlicmFyeSBmb3IgY3JlYXRpbmcgUmljaCBVc2VyIEludGVyZmFjZXMgCi0gICAgICAgIHVzaW5nIFNXVCBhbmQgSkZhY2UgdmlhIFhNTCBtYXJrdXAgKGEgSmVsbHkgc2NyaXB0KS4KLSAgICAgICAgICBKZWxseUpGYWNlIGlzIGFuIGVleHRlbnNpb24gb2YgSmVsbHlTV1QgdG8gYWRkIHN1cHBvcnQgZm9yIHRoZSBKRmFjZSBmcmFtZXdvcmsuCi0gICAgICA8L3A+Ci0gICAgICA8cD4KLSAgICAgICAgICBTZWUgdGhlIDxhIGhyZWY9InRhZ3MuaHRtbCI+dGFnczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICA8L3A+Ci0gICAgPC9zZWN0aW9uPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pmYWNlL3hkb2NzL25hdmlnYXRpb24ueG1sIGIvamVsbHktdGFncy9qZmFjZS94ZG9jcy9uYXZpZ2F0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0NDgxOC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pmYWNlL3hkb2NzL25hdmlnYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBuYW1lPSJKRmFjZSBUYWcgTGlicmFyeSI+Ci0KLSAgPHRpdGxlPkpGYWNlIFRhZyBMaWJyYXJ5PC90aXRsZT4KLSAgCi0gIDxib2R5PgotICAgIDxtZW51IG5hbWU9IkpGYWNlIFRhZyBMaWJyYXJ5Ij4KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICAgICAgICAgICBocmVmPSIvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iVGFncyIgICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWdzLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvam1zLy5jdnNpZ25vcmUgYi9qZWxseS10YWdzL2ptcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmNlYjc2Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvam1zLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLW1hdmVuLmxvZwotdGFyZ2V0Ci12ZWxvY2l0eS5sb2cKLWpjb3ZlcmFnZS5zZXIKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvam1zL2J1aWxkLnhtbCBiL2plbGx5LXRhZ3Mvam1zL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhN2Y1OS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ptcy9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLWJ1aWxkLnhtbCBnZW5lcmF0ZWQgYnkgbWF2ZW4gZnJvbSBwcm9qZWN0LnhtbCB2ZXJzaW9uIDEuMC1TTkFQU0hPVAotICBvbiBkYXRlIE1heSAyNCAyMDA0LCB0aW1lIDIzMDEtLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImphciIgbmFtZT0iY29tbW9ucy1qZWxseS10YWdzLWptcyIgYmFzZWRpcj0iLiI+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkZWZhdWx0dGFyZ2V0ZGlyIiB2YWx1ZT0idGFyZ2V0Ij4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYmRpciIgdmFsdWU9InRhcmdldC9saWIiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC9jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cmVwb3J0ZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtcmVwb3J0cyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0ZGlyIiB2YWx1ZT0iZGlzdCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jZGlyIiB2YWx1ZT0iZGlzdC9kb2NzL2FwaSI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJmaW5hbC5uYW1lIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLWptcy0xLjAtU05BUFNIT1QiPgotICA8L3Byb3BlcnR5PgotICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlc2NyaXB0aW9uPSJvIEluaXRpYWxpemVzIHNvbWUgcHJvcGVydGllcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im5vZ2V0Ij4KLSAgICAgIDxlcXVhbHMgYXJnMj0ib25seSIgYXJnMT0iJHtidWlsZC5zeXNjbGFzc3BhdGh9Ij4KLSAgICAgIDwvZXF1YWxzPgotICAgIDwvY29uZGl0aW9uPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXNjcmlwdGlvbj0ibyBDb21waWxlIHRoZSBjb2RlIiBkZXBlbmRzPSJnZXQtZGVwcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHtjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvamF2YSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICAgIDxjb3B5IHRvZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL2phdmEiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICAgIDxjb3B5IHRvZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qZWxseSI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueHNsIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnJuZyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5kdGQiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5odG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamFyIiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgdGhlIGphciIgZGVwZW5kcz0iY29tcGlsZSx0ZXN0Ij4KLSAgICA8amFyIGphcmZpbGU9InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCIgYmFzZWRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0ibyBDbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIGRpcmVjdG9yaWVzIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGlzdGRpcn0iPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgYSBkaXN0cmlidXRpb24iIGRlcGVuZHM9ImphciwgamF2YWRvYyI+Ci0gICAgPG1rZGlyIGRpcj0iZGlzdCI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29weSB0b2Rpcj0iZGlzdCI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iIGluY2x1ZGVzPSIqLmphciI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iIGluY2x1ZGVzPSJMSUNFTlNFKiwgUkVBRE1FKiI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0ibyBSdW4gdGhlIHRlc3QgY2FzZXMiIGlmPSJ0ZXN0LmZhaWx1cmUiIGRlcGVuZHM9ImludGVybmFsLXRlc3QiPgotICAgIDxmYWlsIG1lc3NhZ2U9IlRoZXJlIHdlcmUgdGVzdCBmYWlsdXJlcy4iPgotICAgIDwvZmFpbD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iaW50ZXJuYWwtdGVzdCIgZGVwZW5kcz0iY29tcGlsZS10ZXN0cyI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8anVuaXQgZGlyPSIuLyIgZmFpbHVyZXByb3BlcnR5PSJ0ZXN0LmZhaWx1cmUiIHByaW50U3VtbWFyeT0ieWVzIiBmb3JrPSJ0cnVlIiBoYWx0b25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJiYXNlZGlyIiB2YWx1ZT0iLiI+Ci0gICAgICA8L3N5c3Byb3BlcnR5PgotICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Zm9ybWF0dGVyIHVzZWZpbGU9ImZhbHNlIiB0eXBlPSJwbGFpbiI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL1Rlc3QqLmphdmEiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgPC9qdW5pdD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZS10ZXN0cyIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy90ZXN0Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamF2YWRvYyIgZGVzY3JpcHRpb249Im8gR2VuZXJhdGUgamF2YWRvYyIgZGVwZW5kcz0iamFyIj4KLSAgICA8bWtkaXIgZGlyPSIke2phdmFkb2NkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDx0c3RhbXA+Ci0gICAgICA8Zm9ybWF0IHBhdHRlcm49IjIwMDIteXl5eSIgcHJvcGVydHk9InllYXIiPgotICAgICAgPC9mb3JtYXQ+Ci0gICAgPC90c3RhbXA+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvcHlyaWdodCIgdmFsdWU9IkNvcHlyaWdodCAmYW1wO2NvcHk7ICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLWptcyAxLjAtU05BUFNIT1QgQVBJIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxqYXZhZG9jIHVzZT0idHJ1ZSIgcHJpdmF0ZT0idHJ1ZSIgZGVzdGRpcj0iJHtqYXZhZG9jZGlyfSIgYXV0aG9yPSJ0cnVlIiB2ZXJzaW9uPSJ0cnVlIiBzb3VyY2VwYXRoPSJzcmMvamF2YSIgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qbXMuKiI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFkb2M+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImdldC1kZXBzIiB1bmxlc3M9Im5vZ2V0IiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtbWVzc2VuZ2VyLTEuMC1kZXYtOC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1tZXNzZW5nZXIvamFycy9jb21tb25zLW1lc3Nlbmdlci0xLjAtZGV2LTguamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qbXMtMS4wLjJiLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qbXMvamFycy9qbXMtMS4wLjJiLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZXhsLVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWpleGwvamFycy9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS94bWwtYXBpcy0xLjAuYjIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3htbC1hcGlzL2phcnMveG1sLWFwaXMtMS4wLmIyLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1iZWFudXRpbHMtMS42LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWJlYW51dGlscy9qYXJzL2NvbW1vbnMtYmVhbnV0aWxzLTEuNi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtY29sbGVjdGlvbnMtMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWNvbGxlY3Rpb25zL2phcnMvY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWxvZ2dpbmctMS4wLjMuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtbG9nZ2luZy9qYXJzL2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2RvbTRqLTEuNS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2RvbTRqL2phcnMvZG9tNGotMS41LWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2pheGVuLTEuMS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2pheGVuL2phcnMvamF4ZW4tMS4xLWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3hlcmNlcy0yLjIuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veGVyY2VzL2phcnMveGVyY2VzLTIuMi4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vanVuaXQtMy44LjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2p1bml0L2phcnMvanVuaXQtMy44LjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vYW50LW9wdGlvbmFsLTEuNS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vYW50L2phcnMvYW50LW9wdGlvbmFsLTEuNS5qYXIiPgotICAgIDwvZ2V0PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJpbnN0YWxsLW1hdmVuIj4KLSAgICA8Z2V0IGRlc3Q9IiR7dXNlci5ob21lfS9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgc3JjPSIke3JlcG99L21hdmVuL21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPHVuamFyIGRlc3Q9IiR7bWF2ZW4uaG9tZX0iIHNyYz0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC91bmphcj4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXMvbWF2ZW4ueG1sIGIvamVsbHktdGFncy9qbXMvbWF2ZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTdhZGIzLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvam1zL21hdmVuLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXZhOmphciI+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvam1zL3Byb2plY3QucHJvcGVydGllcyBiL2plbGx5LXRhZ3Mvam1zL3Byb2plY3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQxOWNiYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ptcy9wcm9qZWN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIyAKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFAgUiBPIEogRSBDIFQgIFAgUiBPIFAgRSBSIFQgSSBFIFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXMvcHJvamVjdC54bWwgYi9qZWxseS10YWdzL2ptcy9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3NjlhZS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ptcy9wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3Q+Ci0gIDxleHRlbmQ+JHtiYXNlZGlyfS8uLi90YWctcHJvamVjdC54bWw8L2V4dGVuZD4KLSAgPGlkPmNvbW1vbnMtamVsbHktdGFncy1qbXM8L2lkPgotICA8bmFtZT5jb21tb25zLWplbGx5LXRhZ3Mtam1zPC9uYW1lPgotICA8Y3VycmVudFZlcnNpb24+MS4wPC9jdXJyZW50VmVyc2lvbj4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muam1zPC9wYWNrYWdlPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgICAgIFRoaXMgaXMgYSBKZWxseSBpbnRlcmZhY2UgZm9yIHRoZSBKYXZhIE1lc3NhZ2UgU2VydmljZS4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPHNob3J0RGVzY3JpcHRpb24+Q29tbW9ucyBKZWxseSBKTVMgVGFnIExpYnJhcnk8L3Nob3J0RGVzY3JpcHRpb24+Ci0gIAotICA8dmVyc2lvbnM+Ci0gICAgPHZlcnNpb24+Ci0gICAgICA8aWQ+MS4wPC9pZD4KLSAgICAgIDxuYW1lPjEuMDwvbmFtZT4KLSAgICAgIDx0YWc+Q09NTU9OUy1KRUxMWS1KTVMtMV8wPC90YWc+Ci0gICAgPC92ZXJzaW9uPgotICA8L3ZlcnNpb25zPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gIAotICAgIDwhLS0gU1RBUlQgZm9yIGNvbXBpbGF0aW9uIC0tPgotICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5jb21tb25zLW1lc3NlbmdlcjwvaWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtZGV2LTg8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPmptczwvaWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAuMmI8L3ZlcnNpb24+Ci0gICAgICA8dXJsPmh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvam1zLzwvdXJsPgotICAgIDwvZGVwZW5kZW5jeT4KLSAKLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL0Nvbm5lY3Rpb25Db250ZXh0LmphdmEgYi9qZWxseS10YWdzL2ptcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvQ29ubmVjdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU3MTIzMC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ptcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvQ29ubmVjdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muam1zOwotCi1pbXBvcnQgamF2YXguam1zLkpNU0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tZXNzZW5nZXIuTWVzc2VuZ2VyOwotCi0vKiogUmVwcmVzZW50cyBhIGNvbnRleHQgY2FwYWJsZSBvZiBwcm92aWRpbmcgYSBNZXNzZW5nZXIgY29ubmVjdGlvbiB0byB1c2UKLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rpb25Db250ZXh0IHsKLQotICAgIHB1YmxpYyBNZXNzZW5nZXIgZ2V0Q29ubmVjdGlvbigpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiwgSk1TRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL0Nvbm5lY3Rpb25UYWcuamF2YSBiL2plbGx5LXRhZ3Mvam1zL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9Db25uZWN0aW9uVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZGM0ZDQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL0Nvbm5lY3Rpb25UYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muam1zOwotCi1pbXBvcnQgamF2YXguam1zLkpNU0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tZXNzZW5nZXIuTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tZXNzZW5nZXIuTWVzc2VuZ2VyTWFuYWdlcjsKLQotLyoqIERlZmluZXMgYSBKTVMgY29ubmVjdGlvbiBmb3IgdXNlIGJ5IG90aGVyIEpNUyB0YWdzLgotICAqCi0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0aW9uVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCBpbXBsZW1lbnRzIENvbm5lY3Rpb25Db250ZXh0IHsKLQotICAgIC8qKiBUaGUgdmFyaWFibGUgbmFtZSB0byBjcmVhdGUgKi8KLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0KLSAgICAvKiogU3RvcmVzIHRoZSBuYW1lIG9mIHRoZSBtYXAgZW50cnkgKi8KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgLyoqIFRoZSBNZXNzZW5nZXIgKi8KLSAgICBwcml2YXRlIE1lc3NlbmdlciBjb25uZWN0aW9uOwotCi0gICAgLy8gQ29ubmVjdGlvbkNvbnRleHQgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE1lc3NlbmdlciBnZXRDb25uZWN0aW9uKCkgewotICAgICAgICByZXR1cm4gY29ubmVjdGlvbjsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29ubmVjdGlvbiA9IE1lc3Nlbmdlck1hbmFnZXIuZ2V0KCBuYW1lICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEpNU0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29ubmVjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICJDb3VsZCBub3QgZmluZCBhIEpNUyBjb25uZWN0aW9uIGNhbGxlZDogIiArIG5hbWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggdmFyICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKCB2YXIsIGNvbm5lY3Rpb24gKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKiogU2V0cyB0aGUgbmFtZSBvZiB0aGUgTWVzc2VuZ2VyIChKTVMgY29ubmVjdGlvbiBwb29sKSB0byB1c2UKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSB2YXJpYWJsZSBuYW1lIHRvIHVzZSBmb3IgdGhlIGV4cG9ydGVkIE1lc3NlbmdlciAoSk1TIGNvbm5lY3Rpb24gcG9vbCkKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL0NvbnN1bWVyVGFnLmphdmEgYi9qZWxseS10YWdzL2ptcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvQ29uc3VtZXJUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIyYjAwZC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ptcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvQ29uc3VtZXJUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muam1zOwotCi1pbXBvcnQgamF2YXguam1zLk1lc3NhZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIGludGVyZmFjZSBmb3IgYSBUYWcgd2hpY2ggY29uc3VtZXMgSk1TIG1lc3NhZ2VzLgotICogQnkgZGVmYXVsdCB0aGlzIGlzIHRoZSAmbHQ7c3Vic2NyaWJlJmd0OyB0YWcgYnV0IG90aGVyIHRhZ3MgY291bGQKLSAqIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSB0byBlbmFibGVkIHRoaW5ncyBsaWtlIE1lc3NhZ2UgcGlwZWxpbmluZywKLSAqIHRyYW5zYWN0aW9uYWwgbWVzc2FnZSBjb25zdW1lciB0YWdzLCBzdG9wd2F0Y2ggd3JhcHBlcnMgZXRjLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25zdW1lclRhZyB7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBKTVMgbWVzc2FnZUxpc3RlbmVyIHVzZWQgdG8gY29uc3VtZSBKTVMgbWVzc2FnZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlTGlzdGVuZXIoTWVzc2FnZUxpc3RlbmVyIG1lc3NhZ2VMaXN0ZW5lcik7Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvam1zL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9EZXN0aW5hdGlvblRhZy5qYXZhIGIvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL0Rlc3RpbmF0aW9uVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MmUyMzIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL0Rlc3RpbmF0aW9uVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmptczsKLQotaW1wb3J0IGphdmF4Lmptcy5EZXN0aW5hdGlvbjsKLWltcG9ydCBqYXZheC5qbXMuSk1TRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1lc3Nlbmdlci5NZXNzZW5nZXI7Ci0KLS8qKiBDcmVhdGVzIGEgRGVzdGluYXRpb24gb2JqZWN0IGZyb20gYSBTdHJpbmcgbmFtZS4KLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gICovCi1wdWJsaWMgY2xhc3MgRGVzdGluYXRpb25UYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgdmFyaWFibGUgbmFtZSB0byBjcmVhdGUgKi8KLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0KLSAgICAvKiogU3RvcmVzIHRoZSBuYW1lIG9mIHRoZSBtYXAgZW50cnkgKi8KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIENvbm5lY3Rpb25Db250ZXh0IG1lc3NlbmdlclRhZyA9IChDb25uZWN0aW9uQ29udGV4dCkgZmluZEFuY2VzdG9yV2l0aENsYXNzKCBDb25uZWN0aW9uQ29udGV4dC5jbGFzcyApOwotICAgICAgICBpZiAoIG1lc3NlbmdlclRhZyA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCI8am1zOmRlc3RpbmF0aW9uPiB0YWcgbXVzdCBiZSB3aXRoaW4gYSA8am1zOmNvbm5lY3Rpb24+IG9yIDxqbXM6c2VuZD4gb3IgPGptczpyZWNlaXZlPiB0YWciKTsKLSAgICAgICAgfQotCi0gICAgICAgIERlc3RpbmF0aW9uIGRlc3RpbmF0aW9uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NlbmdlciBtZXNzZW5nZXIgPSBtZXNzZW5nZXJUYWcuZ2V0Q29ubmVjdGlvbigpOwotICAgICAgICAgICAgaWYgKG1lc3NlbmdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJObyBKTVMgQ29ubmVjdGlvbiBjb3VsZCBiZSBmb3VuZCEiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgc3ViamVjdCA9IChuYW1lICE9IG51bGwpID8gbmFtZSA6IGdldEJvZHlUZXh0KCk7Ci0gICAgICAgICAgICBkZXN0aW5hdGlvbiA9IG1lc3Nlbmdlci5nZXREZXN0aW5hdGlvbiggc3ViamVjdCApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChKTVNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCB2YXIgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoIHZhciwgZGVzdGluYXRpb24gKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIE1lc3NhZ2VPcGVyYXRpb25UYWcgdGFnID0gKE1lc3NhZ2VPcGVyYXRpb25UYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyggTWVzc2FnZU9wZXJhdGlvblRhZy5jbGFzcyApOwotICAgICAgICAgICAgaWYgKCB0YWcgPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIjxqbXM6ZGVzdGluYXRpb24+IHRhZyBtdXN0IGJlIHdpdGhpbiBhIDxqbXM6c2VuZD4gb3IgPGptczpyZWNlaXZlPiB0YWcgb3IgdGhlICd2YXInIGF0dHJpYnV0ZSBzaG91bGQgYmUgc3BlY2lmaWVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0YWcuc2V0RGVzdGluYXRpb24oIGRlc3RpbmF0aW9uICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBEZXN0aW5hdGlvbgotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIHZhcmlhYmxlIG5hbWUgdG8gdXNlIGZvciB0aGUgRGVzdGluYXRpb24KLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL0pNU1RhZ0xpYnJhcnkuamF2YSBiL2plbGx5LXRhZ3Mvam1zL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9KTVNUYWdMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlOWNhOTAuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL0pNU1RhZ0xpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muam1zOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ0xpYnJhcnk7Ci0KLS8qKiBEZXNjcmliZXMgdGhlIFRhZ2xpYi4gVGhpcyBjbGFzcyBjb3VsZCBiZSBnZW5lcmF0ZWQgYnkgWERvY2xldAotICAqCi0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBKTVNUYWdMaWJyYXJ5IGV4dGVuZHMgVGFnTGlicmFyeSB7Ci0KLSAgICBwdWJsaWMgSk1TVGFnTGlicmFyeSgpIHsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImNvbm5lY3Rpb24iLCBDb25uZWN0aW9uVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImRlc3RpbmF0aW9uIiwgRGVzdGluYXRpb25UYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygibWFwRW50cnkiLCBNYXBFbnRyeVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJtYXBNZXNzYWdlIiwgTWFwTWVzc2FnZVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJtZXNzYWdlIiwgTWVzc2FnZVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJvbk1lc3NhZ2UiLCBPbk1lc3NhZ2VUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygib2JqZWN0TWVzc2FnZSIsIE9iamVjdE1lc3NhZ2VUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygicHJvcGVydHkiLCBQcm9wZXJ0eVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJyZWNlaXZlIiwgUmVjZWl2ZVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJzZW5kIiwgU2VuZFRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJzdG9wd2F0Y2giLCBTdG9wd2F0Y2hUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygic3Vic2NyaWJlIiwgU3Vic2NyaWJlVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInRleHRNZXNzYWdlIiwgVGV4dE1lc3NhZ2VUYWcuY2xhc3MpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvam1zL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9NYXBFbnRyeVRhZy5qYXZhIGIvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL01hcEVudHJ5VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOTdiZWIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL01hcEVudHJ5VGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmptczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKiogQWRkcyBhIG1hcCBlbnRyeSB0byB0aGUgb3V0ZXIgTWFwIE1lc3NhZ2UgdGFnCi0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICAqLwotcHVibGljIGNsYXNzIE1hcEVudHJ5VGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogU3RvcmVzIHRoZSBuYW1lIG9mIHRoZSBtYXAgZW50cnkgKi8KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgLyoqIFN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIG1hcCBlbnRyeSAqLwotICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOwotCi0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCBuYW1lID09IG51bGwgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbigibmFtZSIpOwotICAgICAgICB9Ci0gICAgICAgIE1hcE1lc3NhZ2VUYWcgdGFnID0gKE1hcE1lc3NhZ2VUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyggTWFwTWVzc2FnZVRhZy5jbGFzcyApOwotICAgICAgICBpZiAoIHRhZyA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCI8am1zOm1hcEVudHJ5PiB0YWcgbXVzdCBiZSB3aXRoaW4gYSA8am1zOm1hcE1lc3NhZ2U+IHRhZyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRhZy5hZGRFbnRyeSggbmFtZSwgdmFsdWUgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRhZy5hZGRFbnRyeSggbmFtZSwgZ2V0Qm9keVRleHQoKSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBlbnRyeSBpbiB0aGUgbWFwIG1lc3NhZ2UKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZW50cnkgaW4gdGhlIG1hcCBtZXNzYWdlLgotICAgICAgKiBJZiBubyB2YWx1ZSBpcyBzZXQgdGhlbiB0aGUgYm9keSBvZiB0aGUgdGFnIGlzIHVzZWQKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2ptcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvTWFwTWVzc2FnZVRhZy5qYXZhIGIvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL01hcE1lc3NhZ2VUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFmNzk2Yi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ptcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvTWFwTWVzc2FnZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qbXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4Lmptcy5NZXNzYWdlOwotaW1wb3J0IGphdmF4Lmptcy5NYXBNZXNzYWdlOwotaW1wb3J0IGphdmF4Lmptcy5KTVNFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci0KLS8qKiBDcmVhdGVzIGEgSk1TIE1hcE1lc3NhZ2UKLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gICovCi1wdWJsaWMgY2xhc3MgTWFwTWVzc2FnZVRhZyBleHRlbmRzIE1lc3NhZ2VUYWcgewotCi0gICAgcHVibGljIE1hcE1lc3NhZ2VUYWcoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRW50cnkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgTWFwTWVzc2FnZSBtZXNzYWdlID0gKE1hcE1lc3NhZ2UpIGdldE1lc3NhZ2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1lc3NhZ2Uuc2V0T2JqZWN0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSk1TRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIE1hcCBvZiBlbnRyaWVzIHRvIGJlIHVzZWQgZm9yIHRoaXMgTWFwIE1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXAoTWFwIG1hcCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgTWFwTWVzc2FnZSBtZXNzYWdlID0gKE1hcE1lc3NhZ2UpIGdldE1lc3NhZ2UoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVudHJ5LmdldEtleSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0T2JqZWN0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChKTVNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwcm90ZWN0ZWQgTWVzc2FnZSBjcmVhdGVNZXNzYWdlKCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDb25uZWN0aW9uKCkuY3JlYXRlTWFwTWVzc2FnZSgpOwotICAgICAgICB9IGNhdGNoIChKTVNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL01lc3NhZ2VPcGVyYXRpb25UYWcuamF2YSBiL2plbGx5LXRhZ3Mvam1zL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9NZXNzYWdlT3BlcmF0aW9uVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ODI3YjguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL01lc3NhZ2VPcGVyYXRpb25UYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmptczsKLQotaW1wb3J0IGphdmF4Lmptcy5EZXN0aW5hdGlvbjsKLWltcG9ydCBqYXZheC5qbXMuSk1TRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tZXNzZW5nZXIuTWVzc2VuZ2VyOwotCi0vKiogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgSk1TIE1lc3NhZ2Ugb3BlcmF0aW9uIHRhZ3Mgc3VjaCBhcyBzZW5kLCByZWNlaXZlIG9yIGNhbGwuCi0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1lc3NhZ2VPcGVyYXRpb25UYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IGltcGxlbWVudHMgQ29ubmVjdGlvbkNvbnRleHQgewotCi0gICAgLyoqIFRoZSBNZXNzZW5nZXIgdXNlZCB0byBhY2Nlc3MgdGhlIEpNUyBjb25uZWN0aW9uICovCi0gICAgcHJpdmF0ZSBNZXNzZW5nZXIgY29ubmVjdGlvbjsKLQotICAgIC8qKiBUaGUgRGVzdGluYXRpb24gKi8KLSAgICBwcml2YXRlIERlc3RpbmF0aW9uIGRlc3RpbmF0aW9uOwotCi0gICAgLyoqIFRoZSBTdHJpbmcgc3ViamVjdCB1c2VkIHRvIGZpbmQgYSBkZXN0aW5hdGlvbiAqLwotICAgIHByaXZhdGUgU3RyaW5nIHN1YmplY3Q7Ci0KLSAgICBwdWJsaWMgTWVzc2FnZU9wZXJhdGlvblRhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE1lc3NlbmdlciBnZXRDb25uZWN0aW9uKCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uLCBKTVNFeGNlcHRpb24gewotICAgICAgICBpZiAoIGNvbm5lY3Rpb24gPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHJldHVybiBmaW5kQ29ubmVjdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb25uZWN0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIE1lc3NlbmdlciAodGhlIEpNUyBjb25uZWN0aW9uIHBvb2wpIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHNlbmQgdGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uKE1lc3NlbmdlciBjb25uZWN0aW9uKSB7Ci0gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247Ci0gICAgfQotCi0gICAgcHVibGljIERlc3RpbmF0aW9uIGdldERlc3RpbmF0aW9uKCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uLCBKTVNFeGNlcHRpb24gewotICAgICAgICBpZiAoZGVzdGluYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIHN1YmplY3QgZGVmaW5lZCwgbGV0cyB1c2UgaXQgdG8gZmluZCB0aGUgZGVzdGluYXRpb24KLSAgICAgICAgICAgIGlmIChzdWJqZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiA9IGZpbmREZXN0aW5hdGlvbihzdWJqZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVzdGluYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgSk1TIERlc3RpbmF0aW9uIHRvIGJlIHVzZWQgYnkgdGhpcyB0YWcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXN0aW5hdGlvbihEZXN0aW5hdGlvbiBkZXN0aW5hdGlvbikgewotICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc3ViamVjdCBhcyBhIFN0cmluZyB3aGljaCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUKLSAgICAgKiBKTVMgRGVzdGluYXRpb24gdG8gYmUgdXNlZCBieSB0aGlzIHRhZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN1YmplY3QoU3RyaW5nIHN1YmplY3QpIHsKLSAgICAgICAgdGhpcy5zdWJqZWN0ID0gc3ViamVjdDsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBTdHJhdGVneSBNZXRob2QgYWxsb3dpbmcgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGlzIGJlaGF2aW91cgotICAgICAqLwotICAgIHByb3RlY3RlZCBNZXNzZW5nZXIgZmluZENvbm5lY3Rpb24oKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24sIEpNU0V4Y2VwdGlvbiB7Ci0gICAgICAgIENvbm5lY3Rpb25Db250ZXh0IG1lc3NlbmdlclRhZyA9IChDb25uZWN0aW9uQ29udGV4dCkgZmluZEFuY2VzdG9yV2l0aENsYXNzKCBDb25uZWN0aW9uQ29udGV4dC5jbGFzcyApOwotICAgICAgICBpZiAoIG1lc3NlbmdlclRhZyA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJUaGlzIHRhZyBtdXN0IGJlIHdpdGhpbiBhIDxqbXM6Y29ubmVjdGlvbj4gdGFnIG9yIHRoZSAnY29ubmVjdGlvbicgYXR0cmlidXRlIHNob3VsZCBiZSBzcGVjaWZpZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVzc2VuZ2VyVGFnLmdldENvbm5lY3Rpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdHJhdGVneSBNZXRob2QgYWxsb3dpbmcgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGlzIGJlaGF2aW91cgotICAgICAqLwotICAgIHByb3RlY3RlZCBEZXN0aW5hdGlvbiBmaW5kRGVzdGluYXRpb24oU3RyaW5nIHN1YmplY3QpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiwgSk1TRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldENvbm5lY3Rpb24oKS5nZXREZXN0aW5hdGlvbihzdWJqZWN0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2ptcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvTWVzc2FnZVRhZy5qYXZhIGIvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL01lc3NhZ2VUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzYmEzMi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ptcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvTWVzc2FnZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muam1zOwotCi1pbXBvcnQgamF2YXguam1zLkRlc3RpbmF0aW9uOwotaW1wb3J0IGphdmF4Lmptcy5NZXNzYWdlOwotaW1wb3J0IGphdmF4Lmptcy5KTVNFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tZXNzZW5nZXIuTWVzc2VuZ2VyOwotCi0vKiogQSB0YWcgd2hpY2ggY3JlYXRlcyBhIEpNUyBtZXNzYWdlCi0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgTWVzc2FnZSB2YXJpYWJsZSB0aGF0IGlzIGNyZWF0ZWQgKi8KLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0KLSAgICAvKiogVGhlIEpNUyBNZXNzYWdlIGNyZWF0ZWQgKi8KLSAgICBwcml2YXRlIE1lc3NhZ2UgbWVzc2FnZTsKLQotICAgIC8qKiBUaGUgTWVzc2VuZ2VyIHVzZWQgdG8gYWNjZXNzIHRoZSBKTVMgY29ubmVjdGlvbiAqLwotICAgIHByaXZhdGUgTWVzc2VuZ2VyIGNvbm5lY3Rpb247Ci0KLSAgICBwdWJsaWMgTWVzc2FnZVRhZygpIHsKLSAgICB9Ci0KLSAgICAvKiogQWRkcyBhIEpNUyBwcm9wZXJ0eSB0byB0aGUgbWVzc2FnZSAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGdldE1lc3NhZ2UoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWVzc2FnZS5zZXRPYmplY3RQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEpNU0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCB2YXIgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIC8vIGV4cG9zZSBtZXNzYWdlIHRvIHBhcmVudCBtZXNzYWdlIGNvbnN1bWVyCi0gICAgICAgICAgICBTZW5kVGFnIHRhZyA9IChTZW5kVGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoIFNlbmRUYWcuY2xhc3MgKTsKLSAgICAgICAgICAgIGlmICggdGFnID09IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCI8am1zOm1lc3NhZ2U+IHRhZ3MgbXVzdCBlaXRoZXIgaGF2ZSB0aGUgJ3ZhcicgYXR0cmlidXRlIHNwZWNpZmllZCBvciBiZSB1c2VkIGluc2lkZSBhIDxqbXM6c2VuZD4gdGFnIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRhZy5zZXRNZXNzYWdlKCBnZXRNZXNzYWdlKCkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLQotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSggdmFyLCBnZXRNZXNzYWdlKCkgKTsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRoYXQgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBleHBvcnRlZCB0byAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0gICAgICAgIHRoaXMudmFyID0gdmFyOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzZW5nZXIgZ2V0Q29ubmVjdGlvbigpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICggY29ubmVjdGlvbiA9PSBudWxsICkgewotICAgICAgICAgICAgcmV0dXJuIGZpbmRDb25uZWN0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgTWVzc2VuZ2VyICh0aGUgSk1TIGNvbm5lY3Rpb24gcG9vbCkgdGhhdCB3aWxsIGJlIHVzZWQgdG8gc2VuZCB0aGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb24oTWVzc2VuZ2VyIGNvbm5lY3Rpb24pIHsKLSAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZSBnZXRNZXNzYWdlKCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCBtZXNzYWdlID09IG51bGwgKSB7Ci0gICAgICAgICAgICBtZXNzYWdlID0gY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0KLQotCi0gICAgLy8gSk1TIHJlbGF0ZWQgcHJvcGVydGllcwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgSk1TIENvcnJlbGF0aW9uIElEIHRvIGJlIHVzZWQgb24gdGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb3JyZWxhdGlvbklEKFN0cmluZyBjb3JyZWxhdGlvbklEKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0TWVzc2FnZSgpLnNldEpNU0NvcnJlbGF0aW9uSUQoY29ycmVsYXRpb25JRCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEpNU0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSByZXBseS10byBkZXN0aW5hdGlvbiB0byBhZGQgdG8gdGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBseVRvKERlc3RpbmF0aW9uIGRlc3RpbmF0aW9uKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0TWVzc2FnZSgpLnNldEpNU1JlcGx5VG8oZGVzdGluYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChKTVNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdHlwZSBuYW1lIG9mIHRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldE1lc3NhZ2UoKS5zZXRKTVNUeXBlKHR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChKTVNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHByb3RlY3RlZCBNZXNzZW5nZXIgZmluZENvbm5lY3Rpb24oKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBDb25uZWN0aW9uQ29udGV4dCBtZXNzZW5nZXJUYWcgPSAoQ29ubmVjdGlvbkNvbnRleHQpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyggQ29ubmVjdGlvbkNvbnRleHQuY2xhc3MgKTsKLSAgICAgICAgaWYgKCBtZXNzZW5nZXJUYWcgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiVGhpcyB0YWcgbXVzdCBiZSB3aXRoaW4gYSA8am1zOmNvbm5lY3Rpb24+IHRhZyBvciB0aGUgJ2Nvbm5lY3Rpb24nIGF0dHJpYnV0ZSBzaG91bGQgYmUgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1lc3NlbmdlclRhZy5nZXRDb25uZWN0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEpNU0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWVzc2FnZSBjcmVhdGVNZXNzYWdlKCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDb25uZWN0aW9uKCkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICB9IGNhdGNoIChKTVNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL09iamVjdE1lc3NhZ2VUYWcuamF2YSBiL2plbGx5LXRhZ3Mvam1zL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9PYmplY3RNZXNzYWdlVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YzkyY2UuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL09iamVjdE1lc3NhZ2VUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muam1zOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBqYXZheC5qbXMuSk1TRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lmptcy5NZXNzYWdlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotCi0vKiogQ3JlYXRlcyBhIEpNUyBPYmplY3RNZXNzYWdlCi0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICAqLwotcHVibGljIGNsYXNzIE9iamVjdE1lc3NhZ2VUYWcgZXh0ZW5kcyBNZXNzYWdlVGFnIHsKLQotICAgIHByaXZhdGUgU2VyaWFsaXphYmxlIG9iamVjdDsKLQotICAgIHB1YmxpYyBPYmplY3RNZXNzYWdlVGFnKCkgewotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UsIGEgc2VyaWFsaXphYmxlIGphdmEgb2JqZWN0LgotICAgICAqIElmIHRoaXMgdmFsdWUgaXMgbm90IHNldCBvciB0aGUgdmFsdWUgaXMgbnVsbCB0aGVuIHRoZSBjb250ZW50Ci0gICAgICogb2YgdGhlIHRhZyB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3QoU2VyaWFsaXphYmxlIG9iamVjdCkgewotICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHJvdGVjdGVkIE1lc3NhZ2UgY3JlYXRlTWVzc2FnZSgpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNlcmlhbGl6YWJsZSB2YWx1ZSA9IChvYmplY3QgIT0gbnVsbCkgPyBvYmplY3QgOiBnZXRCb2R5VGV4dCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldENvbm5lY3Rpb24oKS5jcmVhdGVPYmplY3RNZXNzYWdlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSk1TRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvam1zL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9Pbk1lc3NhZ2VUYWcuamF2YSBiL2plbGx5LXRhZ3Mvam1zL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9Pbk1lc3NhZ2VUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhlOGI4MC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ptcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvT25NZXNzYWdlVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmptczsKLQotaW1wb3J0IGphdmF4Lmptcy5NZXNzYWdlOwotaW1wb3J0IGphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuU2NyaXB0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIHRhZyBjcmVhdGVzIGEgSk1TIE1lc3NhZ2VMaXN0ZW5lciB3aGljaCB3aWxsIGludm9rZSB0aGlzCi0gKiB0YWcncyBib2R5IHdoZW5ldmVyIGEgSk1TIE1lc3NhZ2UgaXMgcmVjZWl2ZWQuIFRoZSBKTVMgTWVzc2FnZQotICogd2lsbCBiZSBhdmFpbGFibGUgdmlhIGEgdmFyaWFibGUsIHdoaWNoIGRlZmF1bHRzIHRvIHRoZSAnbWVzc2FnZScKLSAqIHZhcmlhYmxlIG5hbWUsIGJ1dCBjYW4gYmUgb3ZlcmxvYWRlZCBieSB0aGUgdmFyIGF0dHJpYnV0ZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNiAkCi0gKi8KLXB1YmxpYyBjbGFzcyBPbk1lc3NhZ2VUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhPbk1lc3NhZ2VUYWcuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyID0gIm1lc3NhZ2UiOwotCi0gICAgcHVibGljIE9uTWVzc2FnZVRhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgQ29uc3VtZXJUYWcgdGFnID0gKENvbnN1bWVyVGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoQ29uc3VtZXJUYWcuY2xhc3MpOwotICAgICAgICBpZiAodGFnID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiVGhpcyB0YWcgbXVzdCBiZSBuZXN0ZWQgd2l0aGluIGEgQ29uc3VtZXJUYWcgbGlrZSB0aGUgc3Vic2NyaWJlIHRhZyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgSmVsbHlDb250ZXh0IGNoaWxkQ29udGV4dCA9IGNvbnRleHQubmV3SmVsbHlDb250ZXh0KCk7Ci0gICAgICAgIGZpbmFsIFNjcmlwdCBzY3JpcHQgPSBnZXRCb2R5KCk7Ci0gICAgICAgIGZpbmFsIFhNTE91dHB1dCBjaGlsZE91dHB1dCA9IG91dHB1dDsKLQotICAgICAgICBNZXNzYWdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTWVzc2FnZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb25NZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgICAgIGNoaWxkQ29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjcmlwdC5ydW4oY2hpbGRDb250ZXh0LCBjaGlsZE91dHB1dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNhdWdodCBleGNlcHRpb24gcHJvY2Vzc2luZyBtZXNzYWdlOiAiICsgbWVzc2FnZSArICIuIEV4Y2VwdGlvbjogIiArIGUsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICAvLyBwZXJmb3JtIHRoZSBjb25zdW1wdGlvbgotICAgICAgICB0YWcuc2V0TWVzc2FnZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHVzZWQgdG8gbWFrZSB0aGUgSk1TIG1lc3NhZ2UgYXZhaWxhYmxlIHRvIHRoaXMgdGFncwotICAgICAqIGJvZHkgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL1Byb3BlcnR5VGFnLmphdmEgYi9qZWxseS10YWdzL2ptcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvUHJvcGVydHlUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRiOWE3ZC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ptcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvUHJvcGVydHlUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qbXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqIERlZmluZXMgYSBwcm9wZXJ0eSBvbiBhbiBvdXRlciBKTVMgTWVzc2FnZSB0YWcKLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBTdG9yZXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIC8qKiBTdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSAqLwotICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOwotCi0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCBuYW1lID09IG51bGwgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbigibmFtZSIpOwotICAgICAgICB9Ci0gICAgICAgIE1lc3NhZ2VUYWcgdGFnID0gKE1lc3NhZ2VUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyggTWVzc2FnZVRhZy5jbGFzcyApOwotICAgICAgICBpZiAoIHRhZyA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCI8am1zOnByb3BlcnR5PiB0YWcgbXVzdCBiZSB3aXRoaW4gYSA8am1zOm1lc3NhZ2U+IHRhZyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCB2YWx1ZSAhPSBudWxsICkgewotICAgICAgICAgICAgdGFnLmFkZFByb3BlcnR5KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRhZy5hZGRQcm9wZXJ0eShuYW1lLCBnZXRCb2R5VGV4dCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBKTVMgcHJvcGVydHkKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgSk1TIHByb3BlcnR5LgotICAgICAgKiBJZiBubyB2YWx1ZSBpcyBzZXQgdGhlbiB0aGUgYm9keSBvZiB0aGUgdGFnIGlzIHVzZWQKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2ptcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvUmVjZWl2ZVRhZy5qYXZhIGIvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL1JlY2VpdmVUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkYTkxMS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ptcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvUmVjZWl2ZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muam1zOwotCi1pbXBvcnQgamF2YXguam1zLkRlc3RpbmF0aW9uOwotaW1wb3J0IGphdmF4Lmptcy5NZXNzYWdlOwotaW1wb3J0IGphdmF4Lmptcy5KTVNFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKiogUmVjZWl2ZXMgYSBKTVMgbWVzc2FnZS4KLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gICovCi1wdWJsaWMgY2xhc3MgUmVjZWl2ZVRhZyBleHRlbmRzIE1lc3NhZ2VPcGVyYXRpb25UYWcgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFJlY2VpdmVUYWcuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyOwotICAgIHByaXZhdGUgbG9uZyB0aW1lb3V0ID0gLTFMOwotCi0gICAgcHVibGljIFJlY2VpdmVUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGV2YWx1YXRlIGJvZHkgYXMgaXQgbWF5IGNvbnRhaW4gYSA8ZGVzdGluYXRpb24+IHRhZwotICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0KLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERlc3RpbmF0aW9uIGRlc3RpbmF0aW9uID0gZ2V0RGVzdGluYXRpb24oKTsKLSAgICAgICAgICAgIGlmICggZGVzdGluYXRpb24gPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICJObyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQuIEVpdGhlciBzcGVjaWZ5IGEgJ2Rlc3RpbmF0aW9uJyBhdHRyaWJ1dGUgb3IgdXNlIGEgbmVzdGVkIDxqbXM6ZGVzdGluYXRpb24+IHRhZyIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICggdGltZW91dCA+IDAgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCAiUmVjZWl2aW5nIG1lc3NhZ2Ugb24gZGVzdGluYXRpb246ICIgKyBkZXN0aW5hdGlvbiArICIgd2l0aCB0aW1lb3V0OiAiICsgdGltZW91dCApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBnZXRDb25uZWN0aW9uKCkucmVjZWl2ZSggZGVzdGluYXRpb24sIHRpbWVvdXQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCB0aW1lb3V0ID09IDAgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCAiUmVjZWl2aW5nIG1lc3NhZ2Ugb24gZGVzdGluYXRpb246ICIgKyBkZXN0aW5hdGlvbiArICIgd2l0aCBObyBXYWl0IiApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBnZXRDb25uZWN0aW9uKCkucmVjZWl2ZU5vV2FpdCggZGVzdGluYXRpb24gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmICggbG9nLmlzRGVidWdFbmFibGVkKCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyggIlJlY2VpdmluZyBtZXNzYWdlIG9uIGRlc3RpbmF0aW9uOiAiICsgZGVzdGluYXRpb24gKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGdldENvbm5lY3Rpb24oKS5yZWNlaXZlKCBkZXN0aW5hdGlvbiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChKTVNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgb25NZXNzYWdlKCBtZXNzYWdlICk7Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFyKCkgewotICAgICAgICByZXR1cm4gdmFyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhcmlhYmxlIG5hbWUgdG8gY3JlYXRlIGZvciB0aGUgcmVjZWl2ZWQgbWVzc2FnZSwgd2hpY2ggd2lsbCBiZSBudWxsIGlmIG5vCi0gICAgICogbWVzc2FnZSBjb3VsZCBiZSByZXR1cm5lZCBpbiB0aGUgZ2l2ZW4gdGltZSBwZXJpb2QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0VGltZW91dCgpIHsKLSAgICAgICAgcmV0dXJuIHRpbWVvdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGltZW91dCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIGEgbWVzc2FnZS4gQSB2YWx1ZQotICAgICAqIG9mIC0xIHdpbGwgd2FpdCBmb3JldmVyIGZvciBhIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGltZW91dChsb25nIHRpbWVvdXQpIHsKLSAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBBIHN0cmF0ZWd5IG1ldGhvZCB3aGljaCBwcm9jZXNzZXMgdGhlIGluY29taW5nIG1lc3NhZ2UsIGFsbG93aW5nIGRlcml2ZWQgY2xhc3NlcwotICAgICAqIHRvIGltcGxlbWVudCBkaWZmZXJlbnQgcHJvY2Vzc2luZyBtZXRob2RzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgb25NZXNzYWdlKCBNZXNzYWdlIG1lc3NhZ2UgKSB7Ci0gICAgICAgIGlmICggbWVzc2FnZSAhPSBudWxsICkgewotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSggdmFyLCBtZXNzYWdlICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjb250ZXh0LnJlbW92ZVZhcmlhYmxlKCB2YXIgKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvam1zL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9TZW5kVGFnLmphdmEgYi9qZWxseS10YWdzL2ptcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvU2VuZFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTU2OTFkLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvam1zL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9TZW5kVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmptczsKLQotaW1wb3J0IGphdmF4Lmptcy5EZXN0aW5hdGlvbjsKLWltcG9ydCBqYXZheC5qbXMuSk1TRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lmptcy5NZXNzYWdlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLS8qKiBTZW5kcyBhIEpNUyBtZXNzYWdlIHRvIHNvbWUgZGVzdGluYXRpb24uCi0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICAqLwotcHVibGljIGNsYXNzIFNlbmRUYWcgZXh0ZW5kcyBNZXNzYWdlT3BlcmF0aW9uVGFnIHsKLQotICAgIC8qKiBUaGUgSk1TIE1lc3NhZ2UgdG8gYmUgc2VudCAqLwotICAgIHByaXZhdGUgTWVzc2FnZSBtZXNzYWdlOwotCi0gICAgcHVibGljIFNlbmRUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGV2YWx1YXRlIGJvZHkgYXMgaXQgbWF5IGNvbnRhaW4gYSA8ZGVzdGluYXRpb24+IG9yIG1lc3NhZ2UgdGFnCi0gICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLQotICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBnZXRNZXNzYWdlKCk7Ci0gICAgICAgIGlmICggbWVzc2FnZSA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCAiTm8gbWVzc2FnZSBzcGVjaWZpZWQuIEVpdGhlciBzcGVjaWZ5IGEgJ21lc3NhZ2UnIGF0dHJpYnV0ZSBvciB1c2UgYSBuZXN0ZWQgPGptczptZXNzYWdlPiB0YWciICk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgRGVzdGluYXRpb24gZGVzdGluYXRpb24gPSBnZXREZXN0aW5hdGlvbigpOwotICAgICAgICAgICAgaWYgKCBkZXN0aW5hdGlvbiA9PSBudWxsICkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIk5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZC4gRWl0aGVyIHNwZWNpZnkgYSAnZGVzdGluYXRpb24nIGF0dHJpYnV0ZSBvciB1c2UgYSBuZXN0ZWQgPGptczpkZXN0aW5hdGlvbj4gdGFnIiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0Q29ubmVjdGlvbigpLnNlbmQoIGRlc3RpbmF0aW9uLCBtZXNzYWdlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEpNU0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE1lc3NhZ2UgZ2V0TWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgSk1TIG1lc3NhZ2UgdG8gYmUgc2VudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL1N0b3B3YXRjaFRhZy5qYXZhIGIvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL1N0b3B3YXRjaFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjI1OTFiLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvam1zL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9TdG9wd2F0Y2hUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmptczsKLQotaW1wb3J0IGphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1lc3Nlbmdlci50b29sLlN0b3BXYXRjaE1lc3NhZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBtZWFzdXJlIHRoZSBhbW91bnQgb2YgdGltZSBpdCB0YWtlcyB0byBwcm9jZXNzIEpNUyBtZXNzYWdlcy4KLSAqIFRoaXMgdGFnIGNhbiBiZSB3cmFwcGVkIGFyb3VuZCBhbnkgY3VzdG9tIEpNUyB0YWcgd2hpY2ggY29uc3VtZXMgSk1TIG1lc3NhZ2VzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIFN0b3B3YXRjaFRhZyBleHRlbmRzIE1lc3NhZ2VPcGVyYXRpb25UYWcgaW1wbGVtZW50cyBDb25zdW1lclRhZyB7Ci0KLSAgICAvKiogdGhlIHVuZGVybHlpbmcgTWVzc2FnZUxpc3RlbmVyICovCi0gICAgcHJpdmF0ZSBNZXNzYWdlTGlzdGVuZXIgbWVzc2FnZUxpc3RlbmVyOwotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coIFN0b3B3YXRjaFRhZy5jbGFzcyApOwotCi0gICAgLyoqIHRoZSBtZXNzYWdlIGdyb3VwIHNpemUgKi8KLSAgICBwcml2YXRlIGludCBncm91cFNpemUgPSAxMDAwOwotCi0gICAgcHVibGljIFN0b3B3YXRjaFRhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBldmFsdWF0ZSBib2R5IGFzIGl0IG1heSBjb250YWluIGNoaWxkIHRhZ3MgdG8gcmVnaXN0ZXIgYSBNZXNzYWdlTGlzdGVuZXIKLSAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotCi0gICAgICAgIE1lc3NhZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IGdldE1lc3NhZ2VMaXN0ZW5lcigpOwotCi0gICAgICAgIENvbnN1bWVyVGFnIHRhZyA9IChDb25zdW1lclRhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKENvbnN1bWVyVGFnLmNsYXNzKTsKLSAgICAgICAgaWYgKHRhZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIlRoaXMgdGFnIG11c3QgYmUgbmVzdGVkIHdpdGhpbiBhIENvbnN1bWVyVGFnIGxpa2UgdGhlIHN1YnNjcmliZSB0YWciKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNsZWFyIHRoZSBsaXN0ZW5lciBmb3IgdGhlIG5leHQgdGFnIGludm9jYXRpb24sIGlmIGNhY2hpbmcgaXMgZW1wbG95ZWQKLSAgICAgICAgc2V0TWVzc2FnZUxpc3RlbmVyKG51bGwpOwotCi0gICAgICAgIFN0b3BXYXRjaE1lc3NhZ2VMaXN0ZW5lciBzdG9wV2F0Y2ggPSBuZXcgU3RvcFdhdGNoTWVzc2FnZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgc3RvcFdhdGNoLnNldEdyb3VwU2l6ZShncm91cFNpemUpOwotICAgICAgICBzdG9wV2F0Y2guc2V0TG9nKGxvZyk7Ci0KLSAgICAgICAgLy8gcGVyZm9ybSB0aGUgY29uc3VtcHRpb24KLSAgICAgICAgdGFnLnNldE1lc3NhZ2VMaXN0ZW5lcihzdG9wV2F0Y2gpOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtZXNzYWdlcyBpbiB0aGUgZ3JvdXAgYmVmb3JlIHRoZSBwZXJmb3JtYW5jZSBzdGF0aXN0aWNzIGFyZSBsb2dnZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEdyb3VwU2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdyb3VwU2l6ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgaW4gdGhlIGdyb3VwIGJlZm9yZSB0aGUgcGVyZm9ybWFuY2Ugc3RhdGlzdGljcyBhcmUgbG9nZ2VkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R3JvdXBTaXplKGludCBncm91cFNpemUpIHsKLSAgICAgICAgdGhpcy5ncm91cFNpemUgPSBncm91cFNpemU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBsb2dnZXIgdG8gd2hpY2ggc3RhdGlzdGljIG1lc3NhZ2VzIHdpbGwgYmUgc2VudAotICAgICAqLwotICAgIHB1YmxpYyBMb2cgZ2V0TG9nKCkgewotICAgICAgICByZXR1cm4gbG9nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxvZ2dlciB0byB3aGljaCBzdGF0aXN0aWMgbWVzc2FnZXMgd2lsbCBiZSBzZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9nKExvZyBsb2cpIHsKLSAgICAgICAgdGhpcy5sb2cgPSBsb2c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgTWVzc2FnZUxpc3RlbmVyIHdoaWNoIHRoaXMgbGlzdGVuZXIgZGVsZWdhdGVzIHRvCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2VMaXN0ZW5lciBnZXRNZXNzYWdlTGlzdGVuZXIoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlTGlzdGVuZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgSk1TIG1lc3NhZ2VMaXN0ZW5lciB1c2VkIHRvIGNvbnN1bWUgSk1TIG1lc3NhZ2VzIG9uIHRoZSBnaXZlbiBkZXN0aW5hdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VMaXN0ZW5lcihNZXNzYWdlTGlzdGVuZXIgbWVzc2FnZUxpc3RlbmVyKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZUxpc3RlbmVyID0gbWVzc2FnZUxpc3RlbmVyOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL1N1YnNjcmliZVRhZy5qYXZhIGIvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL1N1YnNjcmliZVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2E0MzBkLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvam1zL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9TdWJzY3JpYmVUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmptczsKLQotaW1wb3J0IGphdmF4Lmptcy5EZXN0aW5hdGlvbjsKLWltcG9ydCBqYXZheC5qbXMuSk1TRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBQZXJmb3JtcyBhIHN1YnNjcmlwdGlvbiB0byBzb21lIEpNUyBjb25uZWN0aW9uIHRvIGEgZGVzdGluYXRpb24gbWF5YmUgd2l0aCBhIHNlbGVjdG9yLgotICogQSBKTVMgTWVzc2FnZUxpc3RlbmVyIGNhbiBiZSBzcGVjaWZpZWQsIG9yIGEgc3BlY2lhbCBjaGlsZCB0YWcgY2FuIGV4cGxpY2l0bHkgc2V0IGl0IG9uCi0gKiBpdHMgcGFyZW50IChzbyBhIHNwZWNpYWwgdGFnIGNvdWxkIGNvbnN0cnVjdCBhIE1lc3NhZ2VMaXN0ZW5lciBvYmplY3QgYW5kIHJlZ2lzdGVyIGl0IHdpdGggdGhpcyB0YWcpLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIFN1YnNjcmliZVRhZyBleHRlbmRzIE1lc3NhZ2VPcGVyYXRpb25UYWcgaW1wbGVtZW50cyBDb25zdW1lclRhZyB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU3Vic2NyaWJlVGFnLmNsYXNzKTsKLQotICAgIC8qKiB0aGUgSk1TIFNlbGVjdG9yIGZvciB0aGUgc3Vic2NyaXB0aW9uICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2VsZWN0b3I7Ci0KLSAgICAvKiogVGhlIEpNUyBNZXNzYWdlTGlzdGVuZXIgdXNlZCB0byBjcmVhdGUgdGhlIHN1YnNjcmlwdGlvbiAqLwotICAgIHByaXZhdGUgTWVzc2FnZUxpc3RlbmVyIG1lc3NhZ2VMaXN0ZW5lcjsKLQotICAgIHB1YmxpYyBTdWJzY3JpYmVUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gZXZhbHVhdGUgYm9keSBhcyBpdCBtYXkgY29udGFpbiBjaGlsZCB0YWdzIHRvIHJlZ2lzdGVyIGEgTWVzc2FnZUxpc3RlbmVyCi0gICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLQotICAgICAgICBNZXNzYWdlTGlzdGVuZXIgbGlzdGVuZXIgPSBnZXRNZXNzYWdlTGlzdGVuZXIoKTsKLSAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIk5vIG1lc3NhZ2VMaXN0ZW5lciBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkIHNvIGNvdWxkIG5vdCBzdWJzY3JpYmUiICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjbGVhciB0aGUgbGlzdGVuZXIgZm9yIHRoZSBuZXh0IHRhZyBpbnZvY2F0aW9uLCBpZiBjYWNoaW5nIGlzIGVtcGxveWVkCi0gICAgICAgIHNldE1lc3NhZ2VMaXN0ZW5lcihudWxsKTsKLQotCi0gICAgICAgIERlc3RpbmF0aW9uIGRlc3RpbmF0aW9uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRlc3RpbmF0aW9uID0gZ2V0RGVzdGluYXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSk1TRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZGVzdGluYXRpb24gPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIk5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZC4gRWl0aGVyIHNwZWNpZnkgYSAnZGVzdGluYXRpb24nIGF0dHJpYnV0ZSBvciB1c2UgYSBuZXN0ZWQgPGptczpkZXN0aW5hdGlvbj4gdGFnIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyggIkFib3V0IHRvIGNvbnN1bWUgdG86ICIgKyBkZXN0aW5hdGlvbiArICIgd2l0aCBsaXN0ZW5lcjogIiArIGxpc3RlbmVyICk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2cuaW5mbyggIkFib3V0IHRvIGNvbnN1bWUgdG86ICIgKyBkZXN0aW5hdGlvbiArICIgd2l0aCBsaXN0ZW5lcjogIiArIGxpc3RlbmVyICk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsICkgewotICAgICAgICAgICAgICAgIGdldENvbm5lY3Rpb24oKS5hZGRMaXN0ZW5lciggZGVzdGluYXRpb24sIGxpc3RlbmVyICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBnZXRDb25uZWN0aW9uKCkuYWRkTGlzdGVuZXIoIGRlc3RpbmF0aW9uLCBzZWxlY3RvciwgbGlzdGVuZXIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSk1TRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG9wdGlvbmFsIEpNUyBNZXNzYWdlIHNlbGVjdG9yIGZvciB0aGUgc3Vic2NyaXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0b3IoU3RyaW5nIHNlbGVjdG9yKSB7Ci0gICAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1lc3NhZ2VMaXN0ZW5lci4KLSAgICAgKiBAcmV0dXJuIE1lc3NhZ2VMaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlTGlzdGVuZXIgZ2V0TWVzc2FnZUxpc3RlbmVyKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZUxpc3RlbmVyOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgSk1TIG1lc3NhZ2VMaXN0ZW5lciB1c2VkIG90IGNvbnN1bWUgSk1TIG1lc3NhZ2VzIG9uIHRoZSBnaXZlbiBkZXN0aW5hdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VMaXN0ZW5lcihNZXNzYWdlTGlzdGVuZXIgbWVzc2FnZUxpc3RlbmVyKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZUxpc3RlbmVyID0gbWVzc2FnZUxpc3RlbmVyOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL1RleHRNZXNzYWdlVGFnLmphdmEgYi9qZWxseS10YWdzL2ptcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvVGV4dE1lc3NhZ2VUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNiMWM0MS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ptcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvVGV4dE1lc3NhZ2VUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muam1zOwotCi1pbXBvcnQgamF2YXguam1zLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXguam1zLkpNU0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLQotLyoqIENyZWF0ZXMgYSBKTVMgVGV4dE1lc3NhZ2UKLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gICovCi1wdWJsaWMgY2xhc3MgVGV4dE1lc3NhZ2VUYWcgZXh0ZW5kcyBNZXNzYWdlVGFnIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHRleHQ7Ci0KLSAgICBwdWJsaWMgVGV4dE1lc3NhZ2VUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZSwgYSBTdHJpbmcuIElmIHRoaXMgdmFsdWUgaXMgbm90IHNldCBvcgotICAgICAqIHRoZSB2YWx1ZSBpcyBudWxsIHRoZW4gdGhlIGNvbnRlbnQgb2YgdGhlIHRhZyB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7Ci0gICAgfQotCi0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHJvdGVjdGVkIE1lc3NhZ2UgY3JlYXRlTWVzc2FnZSgpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9ICh0ZXh0ICE9IG51bGwpID8gdGV4dCA6IGdldEJvZHlUZXh0KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29ubmVjdGlvbigpLmNyZWF0ZVRleHRNZXNzYWdlKHZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoSk1TRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvam1zL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9wYWNrYWdlLmh0bWwgYi9qZWxseS10YWdzL2ptcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODUwNTExLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvam1zL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGh0bWw+Ci08aGVhZD4KLTwvaGVhZD4KLTxib2R5PgotCi0gIDxwPkEgdGFnIGxpYnJhcnkgZm9yIHdvcmtpbmcgd2l0aCBKTVMgdXNpbmcgdGhlIAotICA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvc2FuZGJveC9tZXNzZW5nZXIvIj5NZXNzZW5nZXI8L2E+IHByb2plY3QKLSAgPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL2ZsdXNoUXVldWUuamVsbHkgYi9qZWxseS10YWdzL2ptcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvZmx1c2hRdWV1ZS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlZDI1Yy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2ptcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvZmx1c2hRdWV1ZS5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqZWxseSB4bWxucz0iamVsbHk6Y29yZSIgeG1sbnM6am1zPSJqZWxseTpqbXMiPgotCi1GbHVzaGluZyB0aGUgaW5wdXQgcXVldWUKLQotPGptczpjb25uZWN0aW9uIG5hbWU9InF1ZXVlIiB2YXI9ImNvbm4iPgotICA8Zm9yRWFjaCBiZWdpbj0iMSIgZW5kPSIxMDAwIj4KLSAgICA8am1zOnJlY2VpdmUgdmFyPSJtZXNzYWdlIiB0aW1lb3V0PSIxIj4KLSAgICAgIDxqbXM6ZGVzdGluYXRpb24gbmFtZT0ibXlRdWV1ZSIvPgotICAgIDwvam1zOnJlY2VpdmU+Ci0gICAgPGlmIHRlc3Q9IiR7bWVzc2FnZSAhPSBudWxsfSI+Ci1Gb3VuZCBtZXNzYWdlOiAke21lc3NhZ2V9LgotICAgIDwvaWY+Ci0gIDwvZm9yRWFjaD4KLSAgICAgIAotPC9qbXM6Y29ubmVjdGlvbj4KLSAgICAKLTwvamVsbHk+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2ptcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvcmVjZWl2ZS5qZWxseSBiL2plbGx5LXRhZ3Mvam1zL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9yZWNlaXZlLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmIyNzcyLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvam1zL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9yZWNlaXZlLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGplbGx5IHhtbG5zPSJqZWxseTpjb3JlIiB4bWxuczpqbXM9ImplbGx5OmptcyI+Ci0KLVdhaXRpbmcgdW50aWwgSSByZWNlaXZlIGEgSk1TIG1lc3NhZ2UKLQotPGptczpjb25uZWN0aW9uIG5hbWU9InF1ZXVlIiB2YXI9ImNvbm4iPgotICA8am1zOnJlY2VpdmUgdmFyPSJtZXNzYWdlIj4KLSAgICA8am1zOmRlc3RpbmF0aW9uIG5hbWU9Im15UXVldWUiLz4KLSAgPC9qbXM6cmVjZWl2ZT4KLTwvam1zOmNvbm5lY3Rpb24+Ci0KLUZvdW5kIG1lc3NhZ2U6ICR7bWVzc2FnZX0KLQotUHJvcGVydGllcyBhcmU6Ci08Zm9yRWFjaCBpdGVtcz0iJHttZXNzYWdlLnByb3BlcnR5TmFtZXN9IiB2YXI9ImtleSI+Ci0gICR7a2V5fSA9ICR7bWVzc2FnZS5nZXRPYmplY3RQcm9wZXJ0eShrZXkpfQotPC9mb3JFYWNoPgotCi1UaGUgdGV4dCBib2R5IGlzOiAke21lc3NhZ2UudGV4dH0KLSAgICAKLTwvamVsbHk+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2ptcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvcmVjZWl2ZU1hcC5qZWxseSBiL2plbGx5LXRhZ3Mvam1zL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9yZWNlaXZlTWFwLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2QzODAzLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvam1zL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9yZWNlaXZlTWFwLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGplbGx5IHhtbG5zPSJqZWxseTpjb3JlIiB4bWxuczpqbXM9ImplbGx5OmptcyI+Ci0KLVdhaXRpbmcgdW50aWwgSSByZWNlaXZlIGEgSk1TIG1lc3NhZ2UKLQotPGptczpjb25uZWN0aW9uIG5hbWU9InF1ZXVlIiB2YXI9ImNvbm4iPgotICA8am1zOnJlY2VpdmUgdmFyPSJtZXNzYWdlIj4KLSAgICA8am1zOmRlc3RpbmF0aW9uIG5hbWU9Im15UXVldWUiLz4KLSAgPC9qbXM6cmVjZWl2ZT4KLTwvam1zOmNvbm5lY3Rpb24+Ci0KLUZvdW5kIG1lc3NhZ2U6ICR7bWVzc2FnZS5KTVNNZXNzYWdlSUR9LgotCi1NYXAgdmFsdWVzIGFyZToKLTxmb3JFYWNoIGl0ZW1zPSIke21lc3NhZ2UubWFwTmFtZXN9IiB2YXI9ImtleSI+Ci0gICR7a2V5fSA9ICR7bWVzc2FnZS5nZXRPYmplY3Qoa2V5KX0KLTwvZm9yRWFjaD4KLSAgICAKLTwvamVsbHk+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2ptcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvcmVjZWl2ZU9iamVjdC5qZWxseSBiL2plbGx5LXRhZ3Mvam1zL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9yZWNlaXZlT2JqZWN0LmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmVjZGExLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvam1zL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9yZWNlaXZlT2JqZWN0LmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGplbGx5IHhtbG5zPSJqZWxseTpjb3JlIiB4bWxuczpqbXM9ImplbGx5OmptcyI+Ci0KLVdhaXRpbmcgdW50aWwgSSByZWNlaXZlIGEgSk1TIG1lc3NhZ2UKLQotPGptczpjb25uZWN0aW9uIG5hbWU9InF1ZXVlIiB2YXI9ImNvbm4iPgotICA8am1zOnJlY2VpdmUgdmFyPSJtZXNzYWdlIj4KLSAgICA8am1zOmRlc3RpbmF0aW9uIG5hbWU9Im15UXVldWUiLz4KLSAgPC9qbXM6cmVjZWl2ZT4KLTwvam1zOmNvbm5lY3Rpb24+Ci0KLUZvdW5kIG1lc3NhZ2U6ICR7bWVzc2FnZX0KLVRoZSBvYmplY3QgYm9keSBpczogJHttZXNzYWdlLmdldE9iamVjdCgpfQotICAgIAotPC9qZWxseT4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvam1zL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9zZW5kTWFwLmplbGx5IGIvamVsbHktdGFncy9qbXMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL3NlbmRNYXAuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNDgwNGUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qbXMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL3NlbmRNYXAuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08amVsbHkgeG1sbnM9ImplbGx5OmNvcmUiIHhtbG5zOmptcz0iamVsbHk6am1zIj4KLQotQWJvdXQgdG8gc2VuZCBhIEpNUyBtYXAgbWVzc2FnZQotCi08am1zOmNvbm5lY3Rpb24gbmFtZT0icXVldWUiPgotICA8am1zOnNlbmQ+Ci0gICAgPGptczpkZXN0aW5hdGlvbiBuYW1lPSJteVF1ZXVlIi8+Ci0gICAgPGptczptYXBNZXNzYWdlIHR5cGU9Ik9yZGVyIiBjb3JyZWxhdGlvbklEPSIxMjM0Ij4KLSAgICAgIDxqbXM6bWFwRW50cnkgbmFtZT0iYSIgdmFsdWU9InBpenphIi8+Ci0gICAgICA8am1zOm1hcEVudHJ5IG5hbWU9ImIiPmNoZWVzZTwvam1zOm1hcEVudHJ5PgotICAgICAgPGptczptYXBFbnRyeSBuYW1lPSJjIiB2YWx1ZT0iJHsxMiAqIDIwfSIvPgotICAgIDwvam1zOm1hcE1lc3NhZ2U+Ci0gIDwvam1zOnNlbmQ+Ci0KLSAgPG5ldyBjbGFzc05hbWU9ImphdmEudXRpbC5IYXNoTWFwIiB2YXI9Im0iLz4KLSAgPHNldCB0YXJnZXQ9IiR7bX0iIHByb3BlcnR5PSJhIiB2YWx1ZT0icGl6emEiLz4gIAotICA8c2V0IHRhcmdldD0iJHttfSIgcHJvcGVydHk9ImIiIHZhbHVlPSIxMjM0Ii8+ICAKLSAgPHNldCB0YXJnZXQ9IiR7bX0iIHByb3BlcnR5PSJjIiB2YWx1ZT0iJHsxMis1N30iLz4gIAotCi1TZW5kaW5nIG1hcCBtZXNzYWdlIHdpdGggbWFwOiAke219Ci0gIAotICA8am1zOnNlbmQ+Ci0gICAgPGptczpkZXN0aW5hdGlvbiBuYW1lPSJteVF1ZXVlIi8+Ci0gICAgPGptczptYXBNZXNzYWdlIHR5cGU9Ik9yZGVyMiIgY29ycmVsYXRpb25JRD0iMjM0NTYiIG1hcD0iJHttfSIvPgotICA8L2ptczpzZW5kPgotICAKLTwvam1zOmNvbm5lY3Rpb24+Ci0KLTwvamVsbHk+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2ptcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvc2VuZE1lc3NhZ2UuamVsbHkgYi9qZWxseS10YWdzL2ptcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvc2VuZE1lc3NhZ2UuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMjMxZTUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qbXMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL3NlbmRNZXNzYWdlLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGplbGx5IHhtbG5zPSJqZWxseTpjb3JlIiB4bWxuczpqbXM9ImplbGx5OmptcyI+Ci0KLUFib3V0IHRvIHNlbmQgYSBKTVMgbWVzc2FnZQotCi08am1zOmNvbm5lY3Rpb24gbmFtZT0icXVldWUiPgotICA8am1zOnNlbmQ+Ci0gICAgPGptczpkZXN0aW5hdGlvbiBuYW1lPSJteVF1ZXVlIi8+Ci0gICAgPGptczptZXNzYWdlIHR5cGU9IlBpenphIiBjb3JyZWxhdGlvbklEPSI5OTk5Ij4KLSAgICAgIDxqbXM6cHJvcGVydHkgbmFtZT0iYSIgdmFsdWU9InRvcHBpbmciLz4KLSAgICAgIDxqbXM6cHJvcGVydHkgbmFtZT0iYiIgdmFsdWU9IiR7MTIzKzQ1Nn0iLz4KLSAgICAgIDxqbXM6cHJvcGVydHkgbmFtZT0iYyI+Y2hlZXNlIHggJHsyKzJ9PC9qbXM6cHJvcGVydHk+Ci0gICAgPC9qbXM6bWVzc2FnZT4KLSAgPC9qbXM6c2VuZD4KLTwvam1zOmNvbm5lY3Rpb24+Ci0KLU1lc3NhZ2Ugc2VudCEKLQotPC9qZWxseT4KLQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2ptcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvc2VuZE9iamVjdC5qZWxseSBiL2plbGx5LXRhZ3Mvam1zL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9zZW5kT2JqZWN0LmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODliYTliLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvam1zL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2ptcy9zZW5kT2JqZWN0LmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGplbGx5IHhtbG5zPSJqZWxseTpjb3JlIiB4bWxuczpqbXM9ImplbGx5OmptcyI+Ci0KLUFib3V0IHRvIHNlbmQgYSBKTVMgT2JqZWN0IG1lc3NhZ2UKLQotPG5ldyBjbGFzc05hbWU9ImphdmEudXRpbC5EYXRlIiB2YXI9ImQiLz4KLQotPGptczpjb25uZWN0aW9uIG5hbWU9InF1ZXVlIj4KLSAgPGptczpzZW5kPgotICAgIDxqbXM6ZGVzdGluYXRpb24gbmFtZT0ibXlRdWV1ZSIvPgotICAgIDxqbXM6b2JqZWN0TWVzc2FnZSBvYmplY3Q9IiR7ZH0iIHR5cGU9IkRhdGUiIGNvcnJlbGF0aW9uSUQ9IjQzMjEiLz4KLSAgPC9qbXM6c2VuZD4KLTwvam1zOmNvbm5lY3Rpb24+Ci0KLU1lc3NhZ2Ugc2VudCEKLQotPC9qZWxseT4KLQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2ptcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvc2VuZFRleHQuamVsbHkgYi9qZWxseS10YWdzL2ptcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXMvc2VuZFRleHQuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjN2RmMDYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qbXMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam1zL3NlbmRUZXh0LmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGplbGx5IHhtbG5zPSJqZWxseTpjb3JlIiB4bWxuczpqbXM9ImplbGx5OmptcyI+Ci0KLUFib3V0IHRvIHNlbmQgYSBKTVMgdGV4dCBtZXNzYWdlCi0KLTxqbXM6Y29ubmVjdGlvbiBuYW1lPSJxdWV1ZSI+Ci0gIDxqbXM6c2VuZD4KLSAgICA8am1zOmRlc3RpbmF0aW9uPm15UXVldWU8L2ptczpkZXN0aW5hdGlvbj4KLSAgICA8am1zOnRleHRNZXNzYWdlIHR5cGU9IkNoYXQiPlRoaXMgaXMgc29tZSB0ZXh0IHZpYSB0aGUgdGFnIGJvZHk8L2ptczp0ZXh0TWVzc2FnZT4KLSAgPC9qbXM6c2VuZD4KLQotICA8am1zOnNlbmQ+Ci0gICAgPGptczpkZXN0aW5hdGlvbiBuYW1lPSJteVF1ZXVlIi8+Ci0gICAgPGptczp0ZXh0TWVzc2FnZSB0ZXh0PSJUaGlzIGlzIHNvbWUgdGV4dCB2aWEgdGhlIGF0dHJpYnV0ZSIgdHlwZT0iQ2hhdCIvPgotICA8L2ptczpzZW5kPgotPC9qbXM6Y29ubmVjdGlvbj4KLQotTWVzc2FnZXMgc2VudCEKLQotPC9qZWxseT4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvam1zL3hkb2NzL2NoYW5nZXMueG1sIGIvamVsbHktdGFncy9qbXMveGRvY3MvY2hhbmdlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNDQwODEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qbXMveGRvY3MvY2hhbmdlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tIAotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotIC0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5DaGFuZ2VzPC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0gIDxib2R5PgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMCIgZGF0ZT0iMjAwNC0wOS0xMiI+Ci0gICAgPC9yZWxlYXNlPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXMveGRvY3MvaW5kZXgueG1sIGIvamVsbHktdGFncy9qbXMveGRvY3MvaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTNhZDVjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvam1zL3hkb2NzL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkpNUyBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotICAgIDxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KLSAgICAgIDxwPgotICAgICAgICBBIHRhZyBsaWJyYXJ5IGZvciB3b3JraW5nIHdpdGggSk1TIHVzaW5nIHRoZSAKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL3NhbmRib3gvbWVzc2VuZ2VyLyI+TWVzc2VuZ2VyPC9hPiBwcm9qZWN0LgotICAgICAgICAgIFNlZSB0aGUgPGEgaHJlZj0idGFncy5odG1sIj50YWdzPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvam1zL3hkb2NzL25hdmlnYXRpb24ueG1sIGIvamVsbHktdGFncy9qbXMveGRvY3MvbmF2aWdhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzOWQ0MTAuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qbXMveGRvY3MvbmF2aWdhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IG5hbWU9IkpNUyBUYWcgTGlicmFyeSI+Ci0KLSAgPHRpdGxlPkpNUyBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gIAotICA8Ym9keT4KLSAgICA8bWVudSBuYW1lPSJKTVMgVGFnIExpYnJhcnkiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgICAgICAgICAgIGhyZWY9Ii9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJUYWdzIiAgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZ3MuaHRtbCIvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXgvLmN2c2lnbm9yZSBiL2plbGx5LXRhZ3Mvam14Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYjE3NjYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qbXgvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotdGFyZ2V0Ci1tYXZlbi5sb2cKLXZlbG9jaXR5LmxvZwotamNvdmVyYWdlLnNlcgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXgvbWF2ZW4ueG1sIGIvamVsbHktdGFncy9qbXgvbWF2ZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTYyMDNjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvam14L21hdmVuLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXZhOmphciI+Ci0KLSAgPCEtLSBkZWZpbmUgdGhlIGNsYXNzcGF0aCB1c2VkIHRvIHJ1biBleGFtcGxlcyAtLT4KLSAgPGdvYWwgbmFtZT0iY3JlYXRlLWNsYXNzcGF0aCIgcHJlcmVxcz0iamF2YTpjb21waWxlLCB0ZXN0OmNvbXBpbGUiPgotICAgICAgICA8cGF0aCBpZD0idGVzdC5jbGFzc3BhdGgiPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7bWF2ZW4uYnVpbGQuZGVzdH0iLz4KLSAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSJ0YXJnZXQvY2xhc3NlcyIvPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9InRhcmdldC90ZXN0LWNsYXNzZXMiLz4KLSAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotICAgICAgICA8L3BhdGg+Ci0gIDwvZ29hbD4KLQotCi0gIDxnb2FsIG5hbWU9ImRlbW8iIHByZXJlcXM9ImNyZWF0ZS1jbGFzc3BhdGgiCi0gICAgZGVzY3JpcHRpb249IlJ1bnMgYSBkZW1vIGNyZWF0aW5nIHZhcmlvdXMgTUJlYW5zIj4KLSAgICAKLSAgICA8ZWNobz5SdW5uaW5nIHRoZSBKZWxseU1CZWFuIGRlbW8uLi48L2VjaG8+Ci0gICAgCi0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHkiIGZvcms9InllcyI+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgPGFyZyB2YWx1ZT0ic3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam14L2V4YW1wbGUuamVsbHkiLz4KLSAgICA8L2phdmE+Ci0gIDwvZ29hbD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXgvcHJvamVjdC5wcm9wZXJ0aWVzIGIvamVsbHktdGFncy9qbXgvcHJvamVjdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDE5Y2JjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvam14L3Byb2plY3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jIAotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUCBSIE8gSiBFIEMgVCAgUCBSIE8gUCBFIFIgVCBJIEUgUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pteC9wcm9qZWN0LnhtbCBiL2plbGx5LXRhZ3Mvam14L3Byb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjZmMWQ3Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvam14L3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdD4KLSAgPGV4dGVuZD4ke2Jhc2VkaXJ9Ly4uL3RhZy1wcm9qZWN0LnhtbDwvZXh0ZW5kPgotICA8aWQ+Y29tbW9ucy1qZWxseS10YWdzLWpteDwvaWQ+Ci0gIDxuYW1lPmNvbW1vbnMtamVsbHktdGFncy1qbXg8L25hbWU+Ci0gIDxjdXJyZW50VmVyc2lvbj4xLjA8L2N1cnJlbnRWZXJzaW9uPgotCi0gIDxwYWNrYWdlPm9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpteDwvcGFja2FnZT4KLQotICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgVGhlIEplbGx5IEpNWCBUYWcgTGlicmFyeSBpcyBhIEplbGx5IGxpYnJhcnkgZm9yIGluc3RhbnRpYXRpbmcgYW5kCi0gICAgICAgY29uZmlndXJpbmcgSmF2YSBCZWFucyBhbmQgTUJlYW5zIGFuZCByZWdpc3RlcmluZyB0aGVtIHdpdGggYSAKLSAgICAgICBKTVggU2VydmVyIGluIGEgc2ltaWxhciB3YXkgdG8gdGhlIEFudCB0YXNrcyBpbiBKYWthcnRhIENvbW1vbnMgTW9kZWxlci4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgCi0gIDxzaG9ydERlc2NyaXB0aW9uPkNvbW1vbnMgSmVsbHkgSk1YIFRhZyBMaWJyYXJ5PC9zaG9ydERlc2NyaXB0aW9uPgotICAKLSAgPHZlcnNpb25zPgotICAgIDx2ZXJzaW9uPgotICAgICAgPGlkPjEuMDwvaWQ+Ci0gICAgICA8bmFtZT4xLjA8L25hbWU+Ci0gICAgICA8dGFnPkNPTU1PTlMtSkVMTFktSk1YLTFfMDwvdGFnPgotICAgIDwvdmVyc2lvbj4KLSAgPC92ZXJzaW9ucz4KLQotPGRlcGVuZGVuY2llcz4KLQotICAgIDwhLS0gU1RBUlQgZm9yIGNvbXBpbGF0aW9uIC0tPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1qZWxseTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtamVsbHktdGFncy1iZWFuPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgPHVybD5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvamVsbHkvdGFncy9iZWFuLzwvdXJsPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPm14NGoram14PC9pZD4KLSAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgotICAgICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxndW1wLnByb2plY3Q+bXg0ajwvZ3VtcC5wcm9qZWN0PgotICAgICAgICA8Z3VtcC5pZD5teDRqLWpteDwvZ3VtcC5pZD4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAKLSAgICA8IS0tIEVORCBmb3IgY29tcGlsYXRpb24gLS0+Ci0gICAgCi0gICAgPCEtLSBTVEFSVCBmb3IgdGVzdC0tPgotICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtamVsbHk8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWplbGx5LXRhZ3MtbG9nPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgPHVybD5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvamVsbHkvdGFncy9sb2cvPC91cmw+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWplbGx5PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1qZWxseS10YWdzLWp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgPHVybD5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC88L3VybD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5teDRqK3Rvb2xzPC9pZD4KLSAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5jb21tb25zLWNsaTwvaWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgICAgCi0gICAgPCEtLSBFTkQgZm9yIHRlc3QgLS0+Ci0KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXgvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam14L0pNWFRhZ0xpYnJhcnkuamF2YSBiL2plbGx5LXRhZ3Mvam14L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pteC9KTVhUYWdMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZDkzZjguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qbXgvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam14L0pNWFRhZ0xpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muam14OwotCi1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5Db252ZXJ0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYmVhbi5CZWFuVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmJlYW4uQmVhblRhZ0xpYnJhcnk7Ci0KLQotLyoqCi0gKiBBIFRhZyBsaWJyYXJ5IGZvciBjcmVhdGluZyBhbiBpbnN0YW50aWF0aW5nIEphdmEgQmVhbnMgYW5kIE1CZWFucwotICogYW5kIHJlZ2lzdGVyaW5nIHRoZW0gd2l0aCBKTVguIFN1cHBvcnQgZm9yIHNldHRpbmcgSk1YIGF0dHJpYnV0ZXMKLSAqIGFuZCBpbnZva2luZyBKTVggb3BlcmF0aW9ucyBpcyBhbHNvIHN1cHBvcnRlZC4KLSAqCi0gKiBAYXV0aG9yCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBKTVhUYWdMaWJyYXJ5IGV4dGVuZHMgQmVhblRhZ0xpYnJhcnkgewotCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIHZhcmlvdXMgYmVhbnV0aWxzIENvbnZlcnRlcnMgZnJvbSBTdHJpbmdzIHRvIHZhcmlvdXMgSk1YIHR5cGVzCi0gICAgICAgIENvbnZlcnRVdGlscy5yZWdpc3RlciggbmV3IE9iamVjdE5hbWVDb252ZXJ0ZXIoKSwgT2JqZWN0TmFtZS5jbGFzcyApOwotICAgIH0KLQotICAgIHB1YmxpYyBKTVhUYWdMaWJyYXJ5KCkgewotICAgICAgICByZWdpc3RlclRhZygibWJlYW4iLCBCZWFuVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoIm9wZXJhdGlvbiIsIE9wZXJhdGlvblRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJyZWdpc3RlciIsIFJlZ2lzdGVyVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInNlcnZlciIsIFNlcnZlclRhZy5jbGFzcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXgvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam14L09iamVjdE5hbWVDb252ZXJ0ZXIuamF2YSBiL2plbGx5LXRhZ3Mvam14L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pteC9PYmplY3ROYW1lQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOTQwYWQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qbXgvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam14L09iamVjdE5hbWVDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muam14OwotCi1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuQ29udmVyc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkNvbnZlcnRlcjsKLQotLyoqCi0gKiBBIENvbnZlcnRlciB0aGF0IHR1cm5zIFN0cmluZ3MgaW50byBKTVggT2JqZWN0TmFtZSBvYmplY3RzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjQgJAotICovCi1wdWJsaWMgY2xhc3MgT2JqZWN0TmFtZUNvbnZlcnRlciBpbXBsZW1lbnRzIENvbnZlcnRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3ROYW1lQ29udmVydGVyIGluc3RhbmNlID0KLSAgICAgICAgbmV3IE9iamVjdE5hbWVDb252ZXJ0ZXIoKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0TmFtZUNvbnZlcnRlciBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBPYmplY3QgY29udmVydChDbGFzcyB0eXBlLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3ROYW1lKCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0TmFtZSh2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29udmVyc2lvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNvbnZlcnQ6ICIKLSAgICAgICAgICAgICAgICAgICAgKyB2YWx1ZQotICAgICAgICAgICAgICAgICAgICArICIgaW50byBPYmplY3ROYW1lLiBSZWFzb246ICIKLSAgICAgICAgICAgICAgICAgICAgKyBlLAotICAgICAgICAgICAgICAgIGUpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvam14L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pteC9PcGVyYXRpb25UYWcuamF2YSBiL2plbGx5LXRhZ3Mvam14L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pteC9PcGVyYXRpb25UYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkMWUzNS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pteC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXgvT3BlcmF0aW9uVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpteDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5Db2xsZWN0aW9uVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIFJlZ2lzdGVycyBhIEphdmFCZWFuIG9yIEpNWCBNQmVhbiB3aXRoIGEgc2VydmVyLi4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25UYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IGltcGxlbWVudHMgQ29sbGVjdGlvblRhZyB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coT3BlcmF0aW9uVGFnLmNsYXNzKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBPYmplY3QgYXJndW1lbnRzOwotICAgIHByaXZhdGUgTGlzdCBhcmdMaXN0ID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZ1tdIHBhcmFtZXRlcnM7Ci0KLSAgICBwdWJsaWMgT3BlcmF0aW9uVGFnKCkgewotICAgIH0KLQotCi0gICAgLy8gQ29sbGVjdGlvblRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBhZGRJdGVtKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAoYXJnTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhcmdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB9Ci0gICAgICAgIGFyZ0xpc3QuYWRkKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oIm5hbWUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFJlZ2lzdGVyVGFnIHJlZ2lzdGVyVGFnID0gKFJlZ2lzdGVyVGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoUmVnaXN0ZXJUYWcuY2xhc3MpOwotICAgICAgICBpZiAocmVnaXN0ZXJUYWcgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJUaGlzIGNsYXNzIG11c3QgYmUgbmVzdGVkIGluc2lkZSBhIDxyZWdpc3Rlcj4gdGFnIik7Ci0gICAgICAgIH0KLSAgICAgICAgT2JqZWN0IGJlYW4gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotCi0gICAgICAgICAgICBPYmplY3ROYW1lIG9iamVjdE5hbWUgPSByZWdpc3RlclRhZy5nZXROYW1lKCk7Ci0gICAgICAgICAgICByZWdpc3RlclRhZy5nZXRTZXJ2ZXIoKS5pbnZva2Uob2JqZWN0TmFtZSwgZ2V0TmFtZSgpLCBnZXRBcmd1bWVudEFycmF5KCksIGdldFBhcmFtZXRlcnMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEplbGx5VGFnRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIkZhaWxlZCB0byByZWdpc3RlciBiZWFuOiAiICsgYmVhbiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBhcmdMaXN0ID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gT2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRBcmd1bWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBhcmd1bWVudHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gU3RyaW5nW10KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVycygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYXJndW1lbnRzLgotICAgICAqIEBwYXJhbSBhcmd1bWVudHMgVGhlIGFyZ3VtZW50cyB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudHMoT2JqZWN0IGFyZ3VtZW50cykgewotICAgICAgICB0aGlzLmFyZ3VtZW50cyA9IGFyZ3VtZW50czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwYXJhbWV0ZXJzLgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoU3RyaW5nW10gcGFyYW1ldGVycykgewotICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOwotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBhcmd1bWVudCBwcm9wZXJ0eSBpbnRvIGFuIE9iamVjdFtdIG9yIGNvbnZlcnRzIHRoZSBsaXN0IG9mCi0gICAgICogYWRkZWQgYXJndW1lbnQgb2JqZWN0cyAoYWRkZWQgdmlhIGNoaWxkIHRhZ3MpIHRvIGFuIE9iamVjdFtdIG9yCi0gICAgICogcmV0dXJuIGFuIGVtcHR5IGFyZ3VtZW50IGFycmF5LgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3RbXSBnZXRBcmd1bWVudEFycmF5KCkgewotICAgICAgICBPYmplY3QgYXJnID0gZ2V0QXJndW1lbnRzKCk7Ci0gICAgICAgIGlmIChhcmcgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIE9iamVjdFtdKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChPYmplY3RbXSkgYXJnOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7IGFyZyB9OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGFyZ0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFyZ0xpc3QudG9BcnJheSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXgvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam14L1JlZ2lzdGVyVGFnLmphdmEgYi9qZWxseS10YWdzL2pteC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXgvUmVnaXN0ZXJUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU3MjlmMi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pteC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXgvUmVnaXN0ZXJUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muam14OwotCi1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5JbnN0YW5jZUFscmVhZHlFeGlzdHNFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblJlZ2lzdHJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTm90Q29tcGxpYW50TUJlYW5FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuQ29sbGVjdGlvblRhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBSZWdpc3RlcnMgYSBKYXZhQmVhbiBvciBKTVggTUJlYW4gd2l0aCBhIHNlcnZlci4uCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjQgJAotICovCi1wdWJsaWMgY2xhc3MgUmVnaXN0ZXJUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IGltcGxlbWVudHMgQ29sbGVjdGlvblRhZyB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUmVnaXN0ZXJUYWcuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBPYmplY3ROYW1lIG5hbWU7Ci0gICAgcHJpdmF0ZSBNQmVhblNlcnZlciBzZXJ2ZXI7Ci0KLSAgICBwdWJsaWMgUmVnaXN0ZXJUYWcoKSB7Ci0gICAgfQotCi0KLSAgICAvLyBDb2xsZWN0aW9uVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGFkZEl0ZW0oT2JqZWN0IGJlYW4pIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWdpc3RlcihzZXJ2ZXIsIGJlYW4pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmVnaXN0ZXIgYmVhbjogIiArIGJlYW4sIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCJuYW1lIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlcnZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTZXJ2ZXJUYWcgc2VydmVyVGFnID0gKFNlcnZlclRhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKFNlcnZlclRhZy5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAoc2VydmVyVGFnID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIlRoaXMgY2xhc3MgbXVzdCBiZSBuZXN0ZWQgaW5zaWRlIGEgPHNlcnZlcj4gdGFnIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXJ2ZXIgPSBzZXJ2ZXJUYWcuZ2V0U2VydmVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotICAgIH0KLQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIE9iamVjdE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0TmFtZSBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoT2JqZWN0TmFtZSBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBNQmVhblNlcnZlcgotICAgICAqLwotICAgIHB1YmxpYyBNQmVhblNlcnZlciBnZXRTZXJ2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgTUJlYW5TZXJ2ZXIuIElmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBzdXBwbGllZCB0aGVuIHRoZSBwYXJlbnQgJmx0O3NlcnZlciZndDsgdGFnCi0gICAgICogaXMgdXNlZCB0byBnZXQgdGhlIE1CZWFuU2VydmVyIGluc3RhbmNlIHRvIHVzZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2ZXIgVGhlIE1CZWFuU2VydmVyIHRvIHJlZ2lzdGVyIHRoZSBtYmVhbnMgd2l0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXIoTUJlYW5TZXJ2ZXIgc2VydmVyKSB7Ci0gICAgICAgIHRoaXMuc2VydmVyID0gc2VydmVyOwotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyB0aGUgZ2l2ZW4gYmVhbiB3aXRoIHRoZSBNQmVhblNlcnZlcgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyKE1CZWFuU2VydmVyIHNlcnZlciwgT2JqZWN0IGJlYW4pIHRocm93cyBJbnN0YW5jZUFscmVhZHlFeGlzdHNFeGNlcHRpb24sIE1CZWFuUmVnaXN0cmF0aW9uRXhjZXB0aW9uLCBOb3RDb21wbGlhbnRNQmVhbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHNlcnZlci5yZWdpc3Rlck1CZWFuKGJlYW4sIGdldE5hbWUoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pteC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXgvU2VydmVyVGFnLmphdmEgYi9qZWxseS10YWdzL2pteC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXgvU2VydmVyVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ODIxODQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qbXgvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam14L1NlcnZlclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpteDsKLQotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBCaW5kcyBhIEphdmEgYmVhbiB0byB0aGUgZ2l2ZW4gbmFtZWQgSmVsbHkgdGFnIHNvIHRoYXQgdGhlIGF0dHJpYnV0ZXMgb2YKLSAqIHRoZSB0YWcgc2V0IHRoZSBiZWFuIHByb3BlcnRpZXMuLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNlcnZlclRhZy5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIE1CZWFuU2VydmVyIHNlcnZlcjsKLQotICAgIHB1YmxpYyBTZXJ2ZXJUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gZm9yY2UgdGhlIGNyZWF0aW9uIG9mIGEgU2VydmVyCi0gICAgICAgIE1CZWFuU2VydmVyIHNlcnZlciA9IGdldFNlcnZlcigpOwotCi0gICAgICAgIC8vIGFsbG93IGNoaWxkcmVuIHRvIHJlZ2lzdGVyIGJlYW5zCi0gICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLSAgICB9Ci0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIE1CZWFuU2VydmVyCi0gICAgICovCi0gICAgcHVibGljIE1CZWFuU2VydmVyIGdldFNlcnZlcigpIHsKLSAgICAgICAgaWYgKHNlcnZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VydmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNlcnZlci4KLSAgICAgKiBAcGFyYW0gc2VydmVyIFRoZSBzZXJ2ZXIgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmVyKE1CZWFuU2VydmVyIHNlcnZlcikgewotICAgICAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjsKLSAgICB9Ci0KLQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGxhemlseSBjcmVhdGUgYW4gTUJlYW5TZXJ2ZXIgaWYgbm9uZSBpcyBzdXBwbGllZAotICAgICAqCi0gICAgICogQHJldHVybiBNQmVhblNlcnZlcgotICAgICAqLwotICAgIHByb3RlY3RlZCBNQmVhblNlcnZlciBjcmVhdGVTZXJ2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBNQmVhblNlcnZlckZhY3RvcnkubmV3TUJlYW5TZXJ2ZXIoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvam14L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pteC9wYWNrYWdlLmh0bWwgYi9qZWxseS10YWdzL2pteC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXgvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmNjZThkLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvam14L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pteC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGh0bWw+Ci08aGVhZD4KLTwvaGVhZD4KLTxib2R5PgotCi0gIDxwPgotICAJQSB0YWcgbGlicmFyeSBmb3IgY3JlYXRpbmcgYmVhbnMgYW5kIE1CZWFucyBhbmQgcmVnaXN0ZXJpbmcgdGhlbSB3aXRoIGEgSk1YIFNlcnZlciBpbiBhIHNpbWlsYXIgd2F5Ci0gIAl0byB0aGUgQW50IHRhc2tzIGluIEpha2FydGEgQ29tbW9ucyBNb2RlbGVyCi0gIDwvcD4KLSAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pteC9zcmMvdGVzdC9qbmRpLnByb3BlcnRpZXMgYi9qZWxseS10YWdzL2pteC9zcmMvdGVzdC9qbmRpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMDkxYWIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qbXgvc3JjL3Rlc3Qvam5kaS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMgCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1qYXZhLm5hbWluZy5mYWN0b3J5LmluaXRpYWwgPSBjb20uc3VuLmpuZGkucm1pLnJlZ2lzdHJ5LlJlZ2lzdHJ5Q29udGV4dEZhY3RvcnkKLWphdmEubmFtaW5nLnByb3ZpZGVyLnVybCA9IHJtaTovL2xvY2FsaG9zdDoxMDk5CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pteC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXgvRHVtbXkuamF2YSBiL2plbGx5LXRhZ3Mvam14L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pteC9EdW1teS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzAzMTU3Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvam14L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pteC9EdW1teS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qbXg7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBBIGR1bW15IE1CZWFuIHVzZWQgZm9yIHRoZSBkZW1vCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjQgJAotICovCi1wdWJsaWMgY2xhc3MgRHVtbXkgaW1wbGVtZW50cyBEdW1teU1CZWFuIHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhEdW1teS5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gIkphbWVzIjsKLSAgICBwcml2YXRlIGludCBjb3VudDsKLQotICAgIHB1YmxpYyB2b2lkIGRvU29tZXRoaW5nKCkgewotICAgICAgICArK2NvdW50OwotICAgICAgICBsb2cuaW5mbygiRG8gc29tZXRoaW5nISBvbjogIiArIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIltuYW1lPSIgKyBuYW1lICsgIl0iOwotICAgIH0KLQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBpbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewotICAgICAgICByZXR1cm4gY291bnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvdW50LgotICAgICAqIEBwYXJhbSBjb3VudCBUaGUgY291bnQgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q291bnQoaW50IGNvdW50KSB7Ci0gICAgICAgIHRoaXMuY291bnQgPSBjb3VudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXgvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam14L0R1bW15TUJlYW4uamF2YSBiL2plbGx5LXRhZ3Mvam14L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pteC9EdW1teU1CZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZGI3NjYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qbXgvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam14L0R1bW15TUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muam14OwotCi0vKioKLSAqIEEgZHVtbXkgTUJlYW4gaW50ZXJmYWNlCi0gKiBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRHVtbXlNQmVhbiB7Ci0gICAgaW50IGdldENvdW50KCk7Ci0gICAgU3RyaW5nIGdldE5hbWUoKTsKLSAgICB2b2lkIHNldENvdW50KGludCBjb3VudCk7Ci0gICAgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQotICAgIHZvaWQgZG9Tb21ldGhpbmcoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvam14L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pteC9UZXN0SmVsbHkuamF2YSBiL2plbGx5LXRhZ3Mvam14L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pteC9UZXN0SmVsbHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNkZTE3Zi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pteC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXgvVGVzdEplbGx5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpteDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qdW5pdC5KZWxseVRlc3RTdWl0ZTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyB0byBydW4gamVsbHkgdGVzdCBjYXNlcyBhcyBwYXJ0IG9mIEFudCdzIEpVbml0IHRlc3RzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjQgJAotICovCi1wdWJsaWMgY2xhc3MgVGVzdEplbGx5IGV4dGVuZHMgSmVsbHlUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oIHN1aXRlKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3JlYXRlVGVzdFN1aXRlKFRlc3RKZWxseS5jbGFzcywgInN1aXRlLmplbGx5Iik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXgvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvam14L2V4YW1wbGUuamVsbHkgYi9qZWxseS10YWdzL2pteC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXgvZXhhbXBsZS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ1ZTgyMi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pteC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXgvZXhhbXBsZS5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlcnZlciB4bWxucz0iamVsbHk6am14Ij4KLSAgICA8IS0tCi0gICAgICAgIHx8IGRlZmluZSBzb21lIGNvbW1vbiBNQmVhbiB0eXBlcwotICAgICAgICAtLT4KLSAgICA8YmVhbmRlZiBuYW1lPSJkdW1teU1CZWFuIiBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpteC5EdW1teSIvPgotICAgIAotICAgIDwhLS0gCi0gICAgICAgIHx8IFJlZ2lzdGVyIHRoZSBNQmVhbnMgCi0gICAgICAgIHx8IEF0dHJpYnV0ZXMgY2FuIGJlIHNldCBvbiBNQmVhbnMgdXNpbmcgCi0gICAgICAgIHx8IFhNTCBhdHRyaWJ1dGVzIG9yIG5lc3RlZCBlbGVtZW50cwotICAgICAgICAtLT4KLSAgICA8cmVnaXN0ZXIgbmFtZT0iRXhhbXBsZXM6dHlwZT1zaG9ydCI+Ci0gICAgICAgIDxkdW1teU1CZWFuIG5hbWU9IlNob3J0IHZlcnNpb24iLz4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJkb1NvbWV0aGluZyIvPgotICAgIDwvcmVnaXN0ZXI+ICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICA8cmVnaXN0ZXIgbmFtZT0iRXhhbXBsZXM6dHlwZT1sb25nIj4KLSAgICAgICAgPG1iZWFuIGNsYXNzPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qbXguRHVtbXkiIG5hbWU9IkxvbmdlciB2ZXJzaW9uIi8+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZG9Tb21ldGhpbmciLz4KLSAgICA8L3JlZ2lzdGVyPiAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgPHJlZ2lzdGVyIG5hbWU9Ik5hbWluZzp0eXBlPXJtaXJlZ2lzdHJ5Ij4KLSAgICAgICAgPG1iZWFuIGNsYXNzPSJteDRqLnRvb2xzLm5hbWluZy5OYW1pbmdTZXJ2aWNlIi8+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0ic3RhcnQiLz4KLSAgICA8L3JlZ2lzdGVyPgotICAgICAgICAKLSAgICA8cmVnaXN0ZXIgbmFtZT0iQWRhcHRvcjpwcm90b2NvbD1KUk1QIj4KLSAgICAgICAgPG1iZWFuIGNsYXNzPSJteDRqLmFkYXB0b3Iucm1pLmpybXAuSlJNUEFkYXB0b3IiIEpORElOYW1lPSJqcm1wIi8+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0ic3RhcnQiLz4KLSAgICA8L3JlZ2lzdGVyPgotICAgICAgICAKLTwvc2VydmVyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvam14L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pteC9zdWl0ZS5qZWxseSBiL2plbGx5LXRhZ3Mvam14L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pteC9zdWl0ZS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI5Mzk3Zi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pteC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qbXgvc3VpdGUuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTx0ZXN0OnN1aXRlIAotICAgIHhtbG5zOmo9ImplbGx5OmNvcmUiCi0gICAgeG1sbnM9ImplbGx5OmpteCIKLSAgICB4bWxuczp0ZXN0PSJqZWxseTpqdW5pdCIKLSAgICB4bWxuczpsb2c9ImplbGx5OmxvZyI+Ci0KLSAgICA8dGVzdDpjYXNlIG5hbWU9ImZvbyI+Ci0gICAgPC90ZXN0OmNhc2U+Ci0gICAgCi08L3Rlc3Q6c3VpdGU+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pteC94ZG9jcy9jaGFuZ2VzLnhtbCBiL2plbGx5LXRhZ3Mvam14L3hkb2NzL2NoYW5nZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTQ0MDgxLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvam14L3hkb2NzL2NoYW5nZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLSAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSAtLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+Q2hhbmdlczwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotICA8Ym9keT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjAiIGRhdGU9IjIwMDQtMDktMTIiPgotICAgIDwvcmVsZWFzZT4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvam14L3hkb2NzL2luZGV4LnhtbCBiL2plbGx5LXRhZ3Mvam14L3hkb2NzL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ0YWUxYS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pteC94ZG9jcy9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxkb2N1bWVudD4KLQotIDxwcm9wZXJ0aWVzPgotICA8dGl0bGU+SmVsbHlNQmVhbjwvdGl0bGU+Ci0gIDxhdXRob3IgZW1haWw9ImpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYXV0aG9yPgotIDwvcHJvcGVydGllcz4KLQotPGJvZHk+Ci0KLTxzZWN0aW9uIG5hbWU9IkplbGx5TUJlYW4iPgotCi08cD4KLSAgICBKZWxseU1CZWFuIGlzIGEgSmVsbHkgbGlicmFyeSBmb3IgY3JlYXRpbmcsIGNvbmZpZ3VyaW5nIGFuZCByZWdpc3RlcmluZyBiZWFucyBhbmQgCi0gICAgTUJlYW5zIHdpdGggYSBKTVggc2VydmVyLgotICAgIEplbGx5TUJlYW4gdXNlcyB0aGUgCi0gICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5L2xpYnMvYmVhbi8iPkplbGx5QmVhbjwvYT4gbGlicmFyeSAKLSAgICB0byBjcmVhdGUgYW5kIGNvbmZpZ3VyZSBiZWFucyBhbmQgZXh0ZW5kcyBpdCB0byBzdXBwb3J0IEpNWCBvcGVyYXRpb25zLgotPC9wPgotCi08cD4KLSAgICBKZWxseU1CZWFuIGlzIHNpbWlsYXIgdG8gdGhlIE1MRVQgcGFyc2VyIGluIAotICAgIDxhIGhyZWY9Imh0dHA6Ly9teDRqLnNvdXJjZWZvcmdlLm5ldC8iPm14NGo8L2E+IGFuZCAKLSAgICA8YSBocmVmPSJodHRwOi8vamJvc3Mub3JnLyI+SkJvc3M8L2E+IGFuZCB0aGUgCi0gICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnLyI+QW50PC9hPiB0YXNrcyBpbiAKLSAgICA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvbW9kZWxlci5odG1sIj5jb21tb25zLW1vZGVsZXI8L2E+Ci08L3A+Ci0KLTxwPgotICAgIFRoZXJlIGlzIGFuIGV4YW1wbGUgSmVsbHlCZWFuIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlIAotICAgIDxhIGhyZWY9IiI+aGVyZTwvYT4uCi08L3A+Ci08L3NlY3Rpb24+Ci0KLQotPC9ib2R5PgotPC9kb2N1bWVudD4KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qbXgveGRvY3MvbmF2aWdhdGlvbi54bWwgYi9qZWxseS10YWdzL2pteC94ZG9jcy9uYXZpZ2F0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA1ZjYwNy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pteC94ZG9jcy9uYXZpZ2F0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBuYW1lPSJKZWxseU1CZWFuIj4KLQotICA8dGl0bGU+SmVsbHlNQmVhbjwvdGl0bGU+Ci0KLSAgPGJvZHk+Ci0gICAgPGxpbmtzPgotICAgICAgPGl0ZW0gbmFtZT0iSmVsbHkiICAgICAgICAgICAgICAgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5LyIvPgotICAgICAgPGl0ZW0gbmFtZT0iQ29tbW9ucyBNb2RlbGVyIiAgICAgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL21vZGVsZXIvIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJKQm9zcyIgICAgICAgICAgICAgICBocmVmPSJodHRwOi8vamJvc3Mub3JnLyIvPgotICAgICAgPGl0ZW0gbmFtZT0ibXg0aiIgICAgICAgICAgICAgICAgaHJlZj0iaHR0cDovL214NGouc291cmNlZm9yZ2UubmV0LyIvPgotICAgIDwvbGlua3M+Ci0gICAgCi0gICAgPG1lbnUgbmFtZT0iSmVsbHlNQmVhbiI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgICAgICBocmVmPSJpbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJUYWdzIiAgICAgICAgICAgICAgICBocmVmPSJ0YWdzLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvanNsLy5jdnNpZ25vcmUgYi9qZWxseS10YWdzL2pzbC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2EyY2RhLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvanNsLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXRhcmdldAotbWF2ZW4ubG9nCi12ZWxvY2l0eS5sb2cKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvanNsL2J1aWxkLnhtbCBiL2plbGx5LXRhZ3MvanNsL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg3MWI3NC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pzbC9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLWJ1aWxkLnhtbCBnZW5lcmF0ZWQgYnkgbWF2ZW4gZnJvbSBwcm9qZWN0LnhtbCB2ZXJzaW9uIDEuMS1TTkFQU0hPVAotICBvbiBkYXRlIERlY2VtYmVyIDIxIDIwMDQsIHRpbWUgMjE1Ny0tPgotCi08cHJvamVjdCBkZWZhdWx0PSJqYXIiIG5hbWU9ImNvbW1vbnMtamVsbHktdGFncy1qc2wiIGJhc2VkaXI9Ii4iPgotICA8cHJvcGVydHkgbmFtZT0iZGVmYXVsdHRhcmdldGRpciIgdmFsdWU9InRhcmdldCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJkaXIiIHZhbHVlPSJ0YXJnZXQvbGliIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXNkaXIiIHZhbHVlPSJ0YXJnZXQvY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Y2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0idGVzdGNsYXNzZXNkaXIiIHZhbHVlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RyZXBvcnRkaXIiIHZhbHVlPSJ0YXJnZXQvdGVzdC1yZXBvcnRzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImRpc3RkaXIiIHZhbHVlPSJkaXN0Ij4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImphdmFkb2NkaXIiIHZhbHVlPSJkaXN0L2RvY3MvYXBpIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImZpbmFsLm5hbWUiIHZhbHVlPSJjb21tb25zLWplbGx5LXRhZ3MtanNsLTEuMS1TTkFQU0hPVCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwYXRoIGlkPSJidWlsZC5jbGFzc3BhdGgiPgotICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamFyIj4KLSAgICAgIDwvaW5jbHVkZT4KLSAgICA8L2ZpbGVzZXQ+Ci0gIDwvcGF0aD4KLSAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0ibyBJbml0aWFsaXplcyBzb21lIHByb3BlcnRpZXMiPgotICAgIDxta2RpciBkaXI9IiR7bGliZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJub2dldCI+Ci0gICAgICA8ZXF1YWxzIGFyZzI9Im9ubHkiIGFyZzE9IiR7YnVpbGQuc3lzY2xhc3NwYXRofSI+Ci0gICAgICA8L2VxdWFscz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgICA8IS0tVGVzdCBpZiBKVU5JVCBpcyBwcmVzZW50IGluIEFOVCBjbGFzc3BhdGgtLT4KLQotICAgIDxhdmFpbGFibGUgcHJvcGVydHk9Ikp1bml0LnByZXNlbnQiIGNsYXNzbmFtZT0ianVuaXQuZnJhbWV3b3JrLlRlc3QiPgotICAgIDwvYXZhaWxhYmxlPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXNjcmlwdGlvbj0ibyBDb21waWxlIHRoZSBjb2RlIiBkZXBlbmRzPSJnZXQtZGVwcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHtjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvamF2YSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImJ1aWxkLmNsYXNzcGF0aCI+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICAgIDxjb3B5IHRvZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL2phdmEiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJqYXIiIGRlc2NyaXB0aW9uPSJvIENyZWF0ZSB0aGUgamFyIiBkZXBlbmRzPSJjb21waWxlLHRlc3QiPgotICAgIDxqYXIgamFyZmlsZT0iJHtkZWZhdWx0dGFyZ2V0ZGlyfS8ke2ZpbmFsLm5hbWV9LmphciIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCIgYmFzZWRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0ibyBDbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIGRpcmVjdG9yaWVzIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGlzdGRpcn0iPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgYSBkaXN0cmlidXRpb24iIGRlcGVuZHM9ImphciwgamF2YWRvYyI+Ci0gICAgPG1rZGlyIGRpcj0iZGlzdCI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29weSB0b2Rpcj0iZGlzdCI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iIGluY2x1ZGVzPSIqLmphciI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iIGluY2x1ZGVzPSJMSUNFTlNFKiwgUkVBRE1FKiI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0ibyBSdW4gdGhlIHRlc3QgY2FzZXMiIGlmPSJ0ZXN0LmZhaWx1cmUiIGRlcGVuZHM9ImludGVybmFsLXRlc3QiPgotICAgIDxmYWlsIG1lc3NhZ2U9IlRoZXJlIHdlcmUgdGVzdCBmYWlsdXJlcy4iPgotICAgIDwvZmFpbD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iaW50ZXJuYWwtdGVzdCIgaWY9Ikp1bml0LnByZXNlbnQiIGRlcGVuZHM9Imp1bml0LXByZXNlbnQsY29tcGlsZS10ZXN0cyI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8anVuaXQgZGlyPSIuLyIgZmFpbHVyZXByb3BlcnR5PSJ0ZXN0LmZhaWx1cmUiIHByaW50U3VtbWFyeT0ieWVzIiBmb3JrPSJ0cnVlIiBoYWx0b25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJiYXNlZGlyIiB2YWx1ZT0iLiI+Ci0gICAgICA8L3N5c3Byb3BlcnR5PgotICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Zm9ybWF0dGVyIHVzZWZpbGU9ImZhbHNlIiB0eXBlPSJwbGFpbiI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxwYXRoIHJlZmlkPSJidWlsZC5jbGFzc3BhdGgiPgotICAgICAgICA8L3BhdGg+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL1Rlc3QqLmphdmEiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgPC9qdW5pdD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0ianVuaXQtcHJlc2VudCIgdW5sZXNzPSJKdW5pdC5wcmVzZW50IiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8ZWNobz49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gV0FSTklORyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTwvZWNobz4KLSAgICA8ZWNobz5KdW5pdCBpc24ndCBwcmVzZW50IGluIHlvdXIgJHtBTlRfSE9NRX0vbGliIGRpcmVjdG9yeS4gVGVzdHMgbm90IGV4ZWN1dGVkLjwvZWNobz4KLSAgICA8ZWNobz49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTwvZWNobz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZS10ZXN0cyIgaWY9Ikp1bml0LnByZXNlbnQiIGRlcGVuZHM9Imp1bml0LXByZXNlbnQsY29tcGlsZSI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy90ZXN0Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPHBhdGggcmVmaWQ9ImJ1aWxkLmNsYXNzcGF0aCI+Ci0gICAgICAgIDwvcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgICA8Y29weSB0b2Rpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamVsbHkiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhzbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5ybmciPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouZHRkIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouaHRtbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MiIGRlc2NyaXB0aW9uPSJvIEdlbmVyYXRlIGphdmFkb2MiIGRlcGVuZHM9ImdldC1kZXBzIj4KLSAgICA8bWtkaXIgZGlyPSIke2phdmFkb2NkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDx0c3RhbXA+Ci0gICAgICA8Zm9ybWF0IHBhdHRlcm49IjIwMDIteXl5eSIgcHJvcGVydHk9InllYXIiPgotICAgICAgPC9mb3JtYXQ+Ci0gICAgPC90c3RhbXA+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvcHlyaWdodCIgdmFsdWU9IkNvcHlyaWdodCAmYW1wO2NvcHk7ICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLWpzbCAxLjEtU05BUFNIT1QgQVBJIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxqYXZhZG9jIHVzZT0idHJ1ZSIgcHJpdmF0ZT0idHJ1ZSIgZGVzdGRpcj0iJHtqYXZhZG9jZGlyfSIgYXV0aG9yPSJ0cnVlIiB2ZXJzaW9uPSJ0cnVlIiBzb3VyY2VwYXRoPSJzcmMvamF2YSIgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qc2wuKiI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aCByZWZpZD0iYnVpbGQuY2xhc3NwYXRoIj4KLSAgICAgICAgPC9wYXRoPgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhZG9jPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJnZXQtZGVwcyIgdW5sZXNzPSJub2dldCIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPCEtLVByb3h5IHNldHRpbmdzIHdvcmtzIG9ubHkgd2l0aCBhIEpESyAxLjIgYW5kIGhpZ2hlci4tLT4KLQotICAgIDxzZXRwcm94eT4KLSAgICA8L3NldHByb3h5PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktMS4wLWJldGEtNC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktMS4wLWJldGEtNC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktdGFncy14bWwtMS4wLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS10YWdzLXhtbC0xLjAuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LXRhZ3MtYW50LTEuMC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktdGFncy1hbnQtMS4wLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS10YWdzLWp1bml0LTEuMC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktdGFncy1qdW5pdC0xLjAuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LXRhZ3MtbG9nLTEuMC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktdGFncy1sb2ctMS4wLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vYW50LTEuNS4zLTEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC0xLjUuMy0xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vYW50LW9wdGlvbmFsLTEuNS4zLTEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC1vcHRpb25hbC0xLjUuMy0xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1ncmFudC0xLjAtYmV0YS00LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWdyYW50L2phcnMvY29tbW9ucy1ncmFudC0xLjAtYmV0YS00LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1jbGktMS4wLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWNsaS9qYXJzL2NvbW1vbnMtY2xpLTEuMC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamV4bC0xLjAuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamV4bC9qYXJzL2NvbW1vbnMtamV4bC0xLjAuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS94bWwtYXBpcy0xLjAuYjIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3htbC1hcGlzL2phcnMveG1sLWFwaXMtMS4wLmIyLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1iZWFudXRpbHMtMS42LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWJlYW51dGlscy9qYXJzL2NvbW1vbnMtYmVhbnV0aWxzLTEuNi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtY29sbGVjdGlvbnMtMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWNvbGxlY3Rpb25zL2phcnMvY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWxvZ2dpbmctMS4wLjMuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtbG9nZ2luZy9qYXJzL2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2RvbTRqLTEuNS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vZG9tNGovamFycy9kb200ai0xLjUuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qYXhlbi0xLjEtYmV0YS0yLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qYXhlbi9qYXJzL2pheGVuLTEuMS1iZXRhLTIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS94ZXJjZXMtMi4yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3hlcmNlcy9qYXJzL3hlcmNlcy0yLjIuMS5qYXIiPgotICAgIDwvZ2V0PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJpbnN0YWxsLW1hdmVuIj4KLSAgICA8Z2V0IGRlc3Q9IiR7dXNlci5ob21lfS9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgc3JjPSIke3JlcG99L21hdmVuL21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPHVuamFyIGRlc3Q9IiR7bWF2ZW4uaG9tZX0iIHNyYz0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC91bmphcj4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qc2wvbWF2ZW4ueG1sIGIvamVsbHktdGFncy9qc2wvbWF2ZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjM2ODI3Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvanNsL21hdmVuLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXZhOmphciI+Ci0KLSAgPCEtLSBkZWZpbmUgdGhlIGNsYXNzcGF0aCB1c2VkIHRvIHJ1biBleGFtcGxlcyAtLT4KLSAgPGdvYWwgbmFtZT0iY3JlYXRlLWNsYXNzcGF0aCIgcHJlcmVxcz0iamF2YTpjb21waWxlLHRlc3Q6Y29tcGlsZSI+Ci0gICAgICAgIDxwYXRoIGlkPSJ0ZXN0LmNsYXNzcGF0aCI+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHttYXZlbi5idWlsZC5kZXN0fSIvPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9InRhcmdldC9jbGFzc2VzIi8+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0idGFyZ2V0L3Rlc3QtY2xhc3NlcyIvPgotICAgICAgICAgICAgPHBhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0gICAgICAgIDwvcGF0aD4KLSAgPC9nb2FsPgotCi0gICAgPCEtLSBkZW1vcyAtLT4KLSAgICA8Z29hbCBuYW1lPSJkZW1vOmpzbCIgcHJlcmVxcz0iY3JlYXRlLWNsYXNzcGF0aCIKLSAgICAgIGRlc2NyaXB0aW9uPSJSdW5zIGEgc2ltcGxlIGRlbW8gb2YgdGhlIEpTTCB0YWdzIj4KLQotICAgICAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseSIgZm9yaz0ieWVzIj4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgICA8YXJnIHZhbHVlPSJzcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvanNsL2V4YW1wbGUuamVsbHkiLz4KLSAgICA8L2phdmE+Ci0KLSAgICA8L2dvYWw+Ci0KLSAgICA8Z29hbCBuYW1lPSJkZW1vOmpzbDIiIHByZXJlcXM9ImNyZWF0ZS1jbGFzc3BhdGgiCi0gICAgICAgIGRlc2NyaXB0aW9uPSJSdW5zIGRlbW8gIzIgb2YgdGhlIEpTTCB0YWdzIj4KLQotICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5IiBmb3JrPSJ5ZXMiPgotICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KLSAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qc2wvZXhhbXBsZTIuamVsbHkiLz4KLSAgICA8L2phdmE+Ci0gICAgPC9nb2FsPgotCi0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvanNsL3Byb2plY3QucHJvcGVydGllcyBiL2plbGx5LXRhZ3MvanNsL3Byb2plY3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQxOWNiYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pzbC9wcm9qZWN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIyAKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFAgUiBPIEogRSBDIFQgIFAgUiBPIFAgRSBSIFQgSSBFIFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qc2wvcHJvamVjdC54bWwgYi9qZWxseS10YWdzL2pzbC9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTliOWNjZC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pzbC9wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0PgotICA8ZXh0ZW5kPiR7YmFzZWRpcn0vLi4vdGFnLXByb2plY3QueG1sPC9leHRlbmQ+Ci0gIDxpZD5jb21tb25zLWplbGx5LXRhZ3MtanNsPC9pZD4KLSAgPG5hbWU+Y29tbW9ucy1qZWxseS10YWdzLWpzbDwvbmFtZT4KLSAgPGN1cnJlbnRWZXJzaW9uPjEuMS1TTkFQU0hPVDwvY3VycmVudFZlcnNpb24+Ci0KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuanNsPC9wYWNrYWdlPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgICAgICBUaGUgSmVsbHkgU3R5bGVzaGVldCBMaWJyYXJ5IChKU0wpIAotICA8L2Rlc2NyaXB0aW9uPgotICA8c2hvcnREZXNjcmlwdGlvbj5Db21tb25zIEplbGx5IEpTTCBUYWcgTGlicmFyeTwvc2hvcnREZXNjcmlwdGlvbj4KLSAgCi0gIDx2ZXJzaW9ucz4KLSAgICA8dmVyc2lvbj4KLSAgICAgIDxpZD4xLjA8L2lkPgotICAgICAgPG5hbWU+MS4wPC9uYW1lPgotICAgICAgPHRhZz5DT01NT05TX0pFTExZX0pTTC0xXzA8L3RhZz4KLSAgICA8L3ZlcnNpb24+Ci0gIDwvdmVyc2lvbnM+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLQotICAgIDwhLS0gU1RBUlQgZm9yIGNvbXBpbGF0aW9uIC0tPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1qZWxseTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtamVsbHktdGFncy14bWw8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGNsYXNzbG9hZGVyPnJvb3QubWF2ZW48L2NsYXNzbG9hZGVyPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHVybD5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvamVsbHkvdGFncy94bWwvPC91cmw+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgICAgCi0gICAgPCEtLSBFTkQgZm9yIGNvbXBpbGF0aW9uIC0tPgotICAgIAotICAgIDwhLS0gYmVsb3cgZm9yIHRlc3RpbmcsIHB1bGxlZCBpbiBieSBhbnQgdGFnbGliIC0tPgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWplbGx5PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1qZWxseS10YWdzLWFudDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8Y2xhc3Nsb2FkZXI+cm9vdC5tYXZlbjwvY2xhc3Nsb2FkZXI+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8dXJsPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9qZWxseS90YWdzL2FudC88L3VybD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtamVsbHk8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWplbGx5LXRhZ3MtanVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICA8dXJsPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9qZWxseS90YWdzL2p1bml0LzwvdXJsPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1qZWxseTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtamVsbHktdGFncy1sb2c8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGNsYXNzbG9hZGVyPnJvb3QubWF2ZW48L2NsYXNzbG9hZGVyPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHVybD5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvamVsbHkvdGFncy9sb2cvPC91cmw+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+YW50PC9pZD4KLSAgICAgIDx2ZXJzaW9uPjEuNS4zLTE8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPmFudCtvcHRpb25hbDwvaWQ+Ci0gICAgICA8dmVyc2lvbj4xLjUuMy0xPC92ZXJzaW9uPgotICAgICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxndW1wLnByb2plY3Q+YW50PC9ndW1wLnByb2plY3Q+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPmNvbW1vbnMtZ3JhbnQ8L2lkPgotICAgICAgPHZlcnNpb24+MS4wLWJldGEtNDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAKLSAgICA8IS0tIFNUQVJUIGZvciBydW5uaW5nIGRlbW9zIC0tPgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+Y29tbW9ucy1jbGk8L2lkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgPCEtLSBFTkQgZm9yIHJ1bm5pbmcgZGVtb3MgLS0+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICAKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvanNsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pzbC9BcHBseVRlbXBsYXRlc1RhZy5qYXZhIGIvamVsbHktdGFncy9qc2wvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanNsL0FwcGx5VGVtcGxhdGVzVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNTZjZGEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qc2wvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanNsL0FwcGx5VGVtcGxhdGVzVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpzbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5kb200ai5ydWxlLlN0eWxlc2hlZXQ7Ci1pbXBvcnQgb3JnLmpheGVuLlhQYXRoOwotCi0vKioKLSAqIEltcGxlbWVudHMgdGhlIGFwcGx5IHRlbXBsYXRlcyBmdW5jdGlvbiBpbiB0aGUgc3R5bGVzaGVldCwgc2ltaWxhciB0byB0aGUgWFNMVCBlcXVpdmFsZW50LgotICogYSBKU1AgaW5jbHVkZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBseVRlbXBsYXRlc1RhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXBwbHlUZW1wbGF0ZXNUYWcuY2xhc3MpOwotCi0gICAgLyoqIEhvbGRzIHZhbHVlIG9mIHByb3BlcnR5IG1vZGUuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbW9kZTsKLQotICAgIC8qKiBIb2xkcyB0aGUgWFBhdGggb2JqZWN0ICovCi0gICAgcHJpdmF0ZSBYUGF0aCBzZWxlY3Q7Ci0KLQotICAgIHB1YmxpYyBBcHBseVRlbXBsYXRlc1RhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqIEJ5IGRlZmF1bHQganVzdCBldmFsdWF0ZSB0aGUgYm9keSAqLwotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0eWxlc2hlZXRUYWcgdGFnID0gKFN0eWxlc2hlZXRUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyggU3R5bGVzaGVldFRhZy5jbGFzcyApOwotICAgICAgICBpZiAodGFnID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiPGFwcGx5VGVtcGxhdGVzPiB0YWcgbXVzdCBiZSBpbnNpZGUgYSA8c3R5bGVzaGVldD4gdGFnIgotICAgICAgICAgICAgKTsKLSAgICAgICAgfQotICAgICAgICBTdHlsZXNoZWV0IHN0eWxlc2hlZXQgPSB0YWcuZ2V0U3R5bGVzaGVldCgpOwotCi0gICAgICAgIFhNTE91dHB1dCBvbGRPdXRwdXQgPSB0YWcuZ2V0U3R5bGVzaGVldE91dHB1dCgpOwotICAgICAgICB0YWcuc2V0U3R5bGVzaGVldE91dHB1dChvdXRwdXQpOwotCi0gICAgICAgIE9iamVjdCBzb3VyY2UgPSB0YWcuZ2V0WFBhdGhTb3VyY2UoKTsKLSAgICAgICAgLy8gZm9yIHNvbWUgcmVhc29uLCB0aGVzZSBET000SiBtZXRob2RzIG9ubHkgdGhyb3cgRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoIHNlbGVjdCAhPSBudWxsICkgewotICAgICAgICAgICAgICAgIHN0eWxlc2hlZXQuYXBwbHlUZW1wbGF0ZXMoIHNvdXJjZSwgc2VsZWN0LCBtb2RlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHlsZXNoZWV0LmFwcGx5VGVtcGxhdGVzKCBzb3VyY2UsIG1vZGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRhZy5zZXRTdHlsZXNoZWV0T3V0cHV0KG9sZE91dHB1dCk7Ci0KLSAgICAgICAgLy8gIyMjIyBzaG91bGQgc3VwcG9ydCBNT0RFISEhCi0KLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3QoIFhQYXRoIHNlbGVjdCApIHsKLSAgICAgICAgdGhpcy5zZWxlY3QgPSBzZWxlY3Q7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIG1vZGUuCi0gICAgICogQHBhcmFtIG1vZGUgTmV3IHZhbHVlIG9mIHByb3BlcnR5IG1vZGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TW9kZShTdHJpbmcgbW9kZSkgewotICAgICAgICB0aGlzLm1vZGUgPSBtb2RlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvanNsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pzbC9KU0xUYWdMaWJyYXJ5LmphdmEgYi9qZWxseS10YWdzL2pzbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qc2wvSlNMVGFnTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTc0MjhhLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvanNsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pzbC9KU0xUYWdMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpzbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkV4cHJlc3Npb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLlRhZ1NjcmlwdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy54bWwuRXhwclRhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy54bWwuWE1MVGFnTGlicmFyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi54cGF0aC5YUGF0aEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmRvbTRqLkRvY3VtZW50SGVscGVyOwotaW1wb3J0IG9yZy5kb200ai5ydWxlLlBhdHRlcm47Ci0KLS8qKiBEZXNjcmliZXMgdGhlIFRhZ2xpYi4gVGhpcyBjbGFzcyBjb3VsZCBiZSBnZW5lcmF0ZWQgYnkgWERvY2xldAotICAqCi0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS42ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBKU0xUYWdMaWJyYXJ5IGV4dGVuZHMgWE1MVGFnTGlicmFyeSB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKU0xUYWdMaWJyYXJ5LmNsYXNzKTsKLQotICAgIHB1YmxpYyBKU0xUYWdMaWJyYXJ5KCkgewotICAgICAgICByZWdpc3RlclRhZygic3R5bGVzaGVldCIsIFN0eWxlc2hlZXRUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygic3R5bGUiLCBTdHlsZVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJ0ZW1wbGF0ZSIsIFRlbXBsYXRlVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImFwcGx5VGVtcGxhdGVzIiwgQXBwbHlUZW1wbGF0ZXNUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygidmFsdWVPZiIsIEV4cHJUYWcuY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBFeHByZXNzaW9uIGNyZWF0ZUV4cHJlc3Npb24oCi0gICAgICAgIEV4cHJlc3Npb25GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgIFRhZ1NjcmlwdCB0YWdTY3JpcHQsCi0gICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lLAotICAgICAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWUpIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gIyMjIyBtYXkgbmVlZCB0byBpbmNsdWRlIHNvbWUgbmFtZXNwYWNlIFVSSSBpbmZvcm1hdGlvbiBpbiB0aGUgWFBhdGggaW5zdGFuY2U/Ci0KLSAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKCJzZWxlY3QiKSkgewotICAgICAgICAgICAgaWYgKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoICJQYXJzaW5nIFhQYXRoIGV4cHJlc3Npb246ICIgKyBhdHRyaWJ1dGVWYWx1ZSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBFeHByZXNzaW9uIHhwYXRoRXhwciA9IGNyZWF0ZVhQYXRoVGV4dEV4cHJlc3Npb24oIGF0dHJpYnV0ZVZhbHVlICk7Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgWFBhdGhFeHByZXNzaW9uKGF0dHJpYnV0ZVZhbHVlLCB4cGF0aEV4cHIsIHRhZ1NjcmlwdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoIm1hdGNoIikpIHsKLSAgICAgICAgICAgIGlmICggbG9nLmlzRGVidWdFbmFibGVkKCkgKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCAiUGFyc2luZyBYUGF0aCBwYXR0ZXJuOiAiICsgYXR0cmlidXRlVmFsdWUgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBQYXR0ZXJuIHBhdHRlcm4gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVQYXR0ZXJuKCBhdHRyaWJ1dGVWYWx1ZSApOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWFBhdGhQYXR0ZXJuRXhwcmVzc2lvbihhdHRyaWJ1dGVWYWx1ZSwgcGF0dGVybik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlFeGNlcHRpb24oICJDb3VsZCBub3QgcGFyc2UgWFBhdGggZXhwcmVzc2lvbjogXCIiICsgYXR0cmlidXRlVmFsdWUgKyAiXCIgcmVhc29uOiAiICsgZSwgZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd2lsbCB1c2UgdGhlIGRlZmF1bHQgZXhwcmVzc2lvbiBpbnN0ZWFkCi0gICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVFeHByZXNzaW9uKGZhY3RvcnksIHRhZ1NjcmlwdCwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pzbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qc2wvSmVsbHlTdHlsZXNoZWV0LmphdmEgYi9qZWxseS10YWdzL2pzbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qc2wvSmVsbHlTdHlsZXNoZWV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MGZhNTUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qc2wvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanNsL0plbGx5U3R5bGVzaGVldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qc2w7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZG9tNGouTm9kZTsKLWltcG9ydCBvcmcuZG9tNGoucnVsZS5BY3Rpb247Ci1pbXBvcnQgb3JnLmRvbTRqLnJ1bGUuU3R5bGVzaGVldDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc3BlY2lhbGl6YXRpb24gb2YgdGhlIFN0eWxlc2hlZXQgZnJvbSBkb200aidzIHJ1bGUgZW5naW5lCi0gKiB0aGF0IGFkZHMgc29tZSBKZWxseSBzcGVjaWZpYyBmZWF0dXJlcy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBKZWxseVN0eWxlc2hlZXQgZXh0ZW5kcyBTdHlsZXNoZWV0IHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEplbGx5U3R5bGVzaGVldC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIFhNTE91dHB1dCBvdXRwdXQ7Ci0KLSAgICBwdWJsaWMgSmVsbHlTdHlsZXNoZWV0KCkgewotICAgICAgICBzZXRWYWx1ZU9mQWN0aW9uKAotICAgICAgICAgICAgbmV3IEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oTm9kZSBub2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBub2RlLmdldFN0cmluZ1ZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggdGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwICkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0KCkud3JpdGUoIHRleHQgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvdXRwdXQuCi0gICAgICogQHJldHVybiBYTUxPdXRwdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MT3V0cHV0IGdldE91dHB1dCgpIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBvdXRwdXQuCi0gICAgICogQHBhcmFtIG91dHB1dCBUaGUgb3V0cHV0IHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChYTUxPdXRwdXQgb3V0cHV0KSB7Ci0gICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qc2wvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanNsL1N0eWxlVGFnLmphdmEgYi9qZWxseS10YWdzL2pzbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qc2wvU3R5bGVUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYyNWUzNS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pzbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qc2wvU3R5bGVUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpzbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS54cGF0aC5YUGF0aFRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmRvbTRqLnJ1bGUuU3R5bGVzaGVldDsKLWltcG9ydCBvcmcuamF4ZW4uSmF4ZW5FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmpheGVuLlhQYXRoOwotCi0vKioKLSAqIFRoaXMgdGFnIHBlcmZvcm1zIGEgSlNMIHN0eWxlc2hlZXQgd2hpY2ggd2FzIHByZXZpb3VzbHkKLSAqIGNyZWF0ZWQgdmlhIGFuICZsdDtzdHlsZXNoZWV0Jmd0OyB0YWcuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjggJAotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVUYWcgZXh0ZW5kcyBYUGF0aFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU3R5bGVUYWcuY2xhc3MpOwotCi0KLSAgICAvKiogSG9sZHMgdGhlIHN0eWxlc2hlZXQgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBzb3VyY2UgY29udGV4dC4gKi8KLSAgICBwcml2YXRlIFN0eWxlc2hlZXQgc3R5bGVzaGVldDsKLQotICAgIC8qKiBUaGUgWFBhdGggZXhwcmVzc2lvbiB0byBldmFsdWF0ZS4gKi8KLSAgICBwcml2YXRlIFhQYXRoIHNlbGVjdDsKLQotICAgIHB1YmxpYyBTdHlsZVRhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgU3R5bGVzaGVldCBzdHlsZXNoZWV0ID0gZ2V0U3R5bGVzaGVldCgpOwotICAgICAgICBpZiAoc3R5bGVzaGVldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbigic3R5bGVzaGVldCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN0eWxlc2hlZXQgaW5zdGFuY2VvZiBKZWxseVN0eWxlc2hlZXQpIHsKLSAgICAgICAgICAgIEplbGx5U3R5bGVzaGVldCBqZWxseVN0eWxlID0gKEplbGx5U3R5bGVzaGVldCkgc3R5bGVzaGVldDsKLSAgICAgICAgICAgIGplbGx5U3R5bGUuc2V0T3V0cHV0KG91dHB1dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkb200aiBvbmx5IHNlZW1zIHRvIHRocm93IEV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgT2JqZWN0IHNvdXJjZSA9IGdldFNvdXJjZSgpOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBYm91dCB0byBldmFsdWF0ZSBzdHlsZXNoZWV0IG9uIHNvdXJjZTogIiArIHNvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0eWxlc2hlZXQucnVuKHNvdXJjZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHB1YmxpYyBTdHlsZXNoZWV0IGdldFN0eWxlc2hlZXQoKSB7Ci0gICAgICAgIHJldHVybiBzdHlsZXNoZWV0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHN0eWxlc2hlZXQgdG8gdXNlIHRvIHN0eWxlIHRoaXMgdGFncyBib2R5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3R5bGVzaGVldChTdHlsZXNoZWV0IHN0eWxlc2hlZXQpIHsKLSAgICAgICAgdGhpcy5zdHlsZXNoZWV0ID0gc3R5bGVzaGVldDsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyB0aGUgWFBhdGggZXhwcmVzc2lvbiB0byBldmFsdWF0ZS4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3QoWFBhdGggc2VsZWN0KSB7Ci0gICAgICAgIHRoaXMuc2VsZWN0ID0gc2VsZWN0OwotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKiBAcmV0dXJuIHRoZSBzb3VyY2Ugb24gd2hpY2ggdGhlIHN0eWxlc2hlZXQgc2hvdWxkIHJ1bgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0U291cmNlKCkgdGhyb3dzIEpheGVuRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IHNvdXJjZSA9IGdldFhQYXRoQ29udGV4dCgpOwotICAgICAgICBpZiAoIHNlbGVjdCAhPSBudWxsICkgewotICAgICAgICAgICAgcmV0dXJuIHNlbGVjdC5ldmFsdWF0ZShzb3VyY2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzb3VyY2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qc2wvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanNsL1N0eWxlc2hlZXRUYWcuamF2YSBiL2plbGx5LXRhZ3MvanNsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pzbC9TdHlsZXNoZWV0VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMTA0ZjAuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qc2wvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanNsL1N0eWxlc2hlZXRUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpzbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS54cGF0aC5YUGF0aFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkueHBhdGguWFBhdGhUYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5kb200ai5ydWxlLlJ1bGU7Ci1pbXBvcnQgb3JnLmRvbTRqLnJ1bGUuU3R5bGVzaGVldDsKLWltcG9ydCBvcmcuamF4ZW4uSmF4ZW5FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmpheGVuLlhQYXRoOwotCi0KLS8qKgotICogVGhpcyB0YWcgaW1wbGVtZW50cyBhIEpTTCBzdHlsZXNoZWV0IHdoaWNoIGlzIHNpbWlsYXIgdG8gYW4KLSAqIFhTTFQgc3R5bGVzaGVldCBidXQgY2FuIHVzZSBKZWxseSB0YWdzIGluc2lkZSBpdAotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS44ICQKLSAqLwotcHVibGljIGNsYXNzIFN0eWxlc2hlZXRUYWcgZXh0ZW5kcyBYUGF0aFRhZ1N1cHBvcnQgaW1wbGVtZW50cyBYUGF0aFNvdXJjZSB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTdHlsZXNoZWV0VGFnLmNsYXNzKTsKLQotCi0gICAgLyoqIEhvbGRzIHRoZSBzdHlsZXNoZWV0IHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgc291cmNlIGNvbnRleHQuICovCi0gICAgcHJpdmF0ZSBTdHlsZXNoZWV0IHN0eWxlc2hlZXQ7Ci0KLSAgICAvKiogSG9sZHMgdmFsdWUgb2YgcHJvcGVydHkgbW9kZS4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBtb2RlOwotCi0gICAgLyoqIFRoZSB2YXJpYWJsZSB3aGljaCB0aGUgc3R5bGVzaGVldCB3aWxsIGJlIG91dHB1dCBhcyAqLwotICAgIHByaXZhdGUgU3RyaW5nIHZhcjsKLQotICAgIC8qKiBUaGUgWFBhdGggZXhwcmVzc2lvbiB0byBldmFsdWF0ZS4gKi8KLSAgICBwcml2YXRlIFhQYXRoIHNlbGVjdDsKLQotICAgIC8qKiBUaGUgWFBhdGggc291cmNlIHVzZWQgYnkgVGVtcGxhdGVUYWcgYW5kIEFwcGx5VGVtcGxhdGVzVGFnIHRvIHBhc3MgWFBhdGggY29udGV4dHMgKi8KLSAgICBwcml2YXRlIE9iamVjdCB4cGF0aFNvdXJjZTsKLQotICAgIHB1YmxpYyBTdHlsZXNoZWV0VGFnKCkgewotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgWE1MT3V0cHV0IGZyb20gdGhlIHN0eWxlc2hlZXQgaWYgYXZhaWxhYmxlCi0gICAgICovCi0gICAgcHVibGljIFhNTE91dHB1dCBnZXRTdHlsZXNoZWV0T3V0cHV0KCkgewotICAgICAgICBpZiAoc3R5bGVzaGVldCBpbnN0YW5jZW9mIEplbGx5U3R5bGVzaGVldCkgewotICAgICAgICAgICAgSmVsbHlTdHlsZXNoZWV0IGplbGx5U3R5bGUgPSAoSmVsbHlTdHlsZXNoZWV0KSBzdHlsZXNoZWV0OwotICAgICAgICAgICAgcmV0dXJuIGplbGx5U3R5bGUuZ2V0T3V0cHV0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgWE1MT3V0cHV0IHRvIHVzZSBieSB0aGUgY3VycmVudCBzdHlsZXNoZWV0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3R5bGVzaGVldE91dHB1dChYTUxPdXRwdXQgb3V0cHV0KSB7Ci0gICAgICAgIGlmIChzdHlsZXNoZWV0IGluc3RhbmNlb2YgSmVsbHlTdHlsZXNoZWV0KSB7Ci0gICAgICAgICAgICBKZWxseVN0eWxlc2hlZXQgamVsbHlTdHlsZSA9IChKZWxseVN0eWxlc2hlZXQpIHN0eWxlc2hlZXQ7Ci0gICAgICAgICAgICBqZWxseVN0eWxlLnNldE91dHB1dChvdXRwdXQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5ldyB0ZW1wbGF0ZSBydWxlIHRvIHRoaXMgc3R5bGVzaGVldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFRlbXBsYXRlKCBSdWxlIHJ1bGUgKSB7Ci0gICAgICAgIGdldFN0eWxlc2hlZXQoKS5hZGRSdWxlKCBydWxlICk7Ci0gICAgfQotCi0gICAgLy8gWFBhdGhTb3VyY2UgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IFhQYXRoIGl0ZXJhdGlvbiB2YWx1ZQotICAgICAqICBzbyB0aGF0IGFueSBvdGhlciBYUGF0aCBhd2FyZSBjaGlsZCB0YWdzIHRvIHVzZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0WFBhdGhTb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiB4cGF0aFNvdXJjZTsKLSAgICB9Ci0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBzdHlsZXNoZWV0ID0gY3JlYXRlU3R5bGVzaGVldChvdXRwdXQpOwotCi0gICAgICAgIC8vIHJ1biB0aGUgYm9keSB0byBhZGQgdGhlIHJ1bGVzCi0gICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLSAgICAgICAgc3R5bGVzaGVldC5zZXRNb2RlTmFtZShnZXRNb2RlKCkpOwotCi0gICAgICAgIGlmICh2YXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIHN0eWxlc2hlZXQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCi0gICAgICAgICAgICAvL2RvbTRqIHNlZW1zIHRvIG9ubHkgdGhyb3cgZ2VuZXJpYyBFeGNlcHRpb25zCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIE9iamVjdCBzb3VyY2UgPSBnZXRTb3VyY2UoKTsKLQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFib3V0IHRvIGV2YWx1YXRlIHN0eWxlc2hlZXQgb24gc291cmNlOiAiICsgc291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzdHlsZXNoZWV0LnJ1bihzb3VyY2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEdldHRlciBmb3IgcHJvcGVydHkgbW9kZS4KLSAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHByb3BlcnR5IG1vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNb2RlKCkgewotICAgICAgICByZXR1cm4gbW9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtb2RlLgotICAgICAqIEBwYXJhbSBtb2RlIE5ldyB2YWx1ZSBvZiBwcm9wZXJ0eSBtb2RlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1vZGUoU3RyaW5nIG1vZGUpIHsKLSAgICAgICAgdGhpcy5tb2RlID0gbW9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3R5bGVzaGVldCBnZXRTdHlsZXNoZWV0KCkgewotICAgICAgICByZXR1cm4gc3R5bGVzaGVldDsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyB0aGUgdmFyaWFibGUgbmFtZSB0byBkZWZpbmUgZm9yIHRoaXMgZXhwcmVzc2lvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0gICAgICAgIHRoaXMudmFyID0gdmFyOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSBYUGF0aCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdChYUGF0aCBzZWxlY3QpIHsKLSAgICAgICAgdGhpcy5zZWxlY3QgPSBzZWxlY3Q7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqIEByZXR1cm4gdGhlIHNvdXJjZSBvbiB3aGljaCB0aGUgc3R5bGVzaGVldCBzaG91bGQgcnVuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRTb3VyY2UoKSB0aHJvd3MgSmF4ZW5FeGNlcHRpb24gewotICAgICAgICBPYmplY3Qgc291cmNlID0gZ2V0WFBhdGhDb250ZXh0KCk7Ci0gICAgICAgIGlmICggc2VsZWN0ICE9IG51bGwgKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2VsZWN0LmV2YWx1YXRlKHNvdXJjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvdXJjZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBzdHlsZXNoZWV0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0eWxlc2hlZXQgY3JlYXRlU3R5bGVzaGVldChmaW5hbCBYTUxPdXRwdXQgb3V0cHV0KSB7Ci0gICAgICAgIEplbGx5U3R5bGVzaGVldCBhbnN3ZXIgPSBuZXcgSmVsbHlTdHlsZXNoZWV0KCk7Ci0gICAgICAgIGFuc3dlci5zZXRPdXRwdXQob3V0cHV0KTsKLSAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB4cGF0aFNvdXJjZS4KLSAgICAgKiBAcGFyYW0geHBhdGhTb3VyY2UgVGhlIHhwYXRoU291cmNlIHRvIHNldAotICAgICAqLwotICAgIHZvaWQgc2V0WFBhdGhTb3VyY2UoT2JqZWN0IHhwYXRoU291cmNlKSB7Ci0gICAgICAgIHRoaXMueHBhdGhTb3VyY2UgPSB4cGF0aFNvdXJjZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvanNsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pzbC9UZW1wbGF0ZVRhZy5qYXZhIGIvamVsbHktdGFncy9qc2wvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanNsL1RlbXBsYXRlVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNDc3NzAuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qc2wvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanNsL1RlbXBsYXRlVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpzbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS54cGF0aC5YUGF0aFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuZG9tNGouTm9kZTsKLWltcG9ydCBvcmcuZG9tNGoucnVsZS5BY3Rpb247Ci1pbXBvcnQgb3JnLmRvbTRqLnJ1bGUuUGF0dGVybjsKLWltcG9ydCBvcmcuZG9tNGoucnVsZS5SdWxlOwotCi0vKioKLSAqIFRoaXMgdGFnIHJlcHJlc2VudHMgYSBkZWNsYXJhdGl2ZSBtYXRjaGluZyBydWxlLCBzaW1pbGFyIHRvIHRoZSB0ZW1wbGF0ZSB0YWcgaW4gWFNMVC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgaW1wbGVtZW50cyBYUGF0aFNvdXJjZSB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUZW1wbGF0ZVRhZy5jbGFzcyk7Ci0KLQotICAgIC8qKiBIb2xkcyB2YWx1ZSBvZiBwcm9wZXJ0eSBuYW1lLiAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKiogSG9sZHMgdmFsdWUgb2YgcHJvcGVydHkgbW9kZS4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBtb2RlOwotCi0gICAgLyoqIEhvbGRzIHZhbHVlIG9mIHByb3BlcnR5IHByaW9yaXR5LiAqLwotICAgIHByaXZhdGUgZG91YmxlIHByaW9yaXR5OwotCi0gICAgLyoqIFRoZSBwYXR0ZXJuIHRvIG1hdGNoICovCi0gICAgcHJpdmF0ZSBQYXR0ZXJuIG1hdGNoOwotCi0gICAgLyoqIFRoZSBzb3VyY2UgWFBhdGggY29udGV4dCBmb3IgYW55IGNoaWxkIHRhZ3MgKi8KLSAgICBwcml2YXRlIE9iamVjdCB4cGF0aFNvdXJjZTsKLQotCi0gICAgcHVibGljIFRlbXBsYXRlVGFnKCkgewotICAgIH0KLQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0eWxlc2hlZXRUYWcgdGFnID0gKFN0eWxlc2hlZXRUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyggU3R5bGVzaGVldFRhZy5jbGFzcyApOwotICAgICAgICBpZiAodGFnID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIlRoaXMgPHRlbXBsYXRlPiB0YWcgbXVzdCBiZSB1c2VkIGluc2lkZSBhIDxzdHlsZXNoZWV0PiB0YWciICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCAiYWRkaW5nIHRlbXBsYXRlIHJ1bGUgZm9yIG1hdGNoOiAiICsgbWF0Y2ggKTsKLSAgICAgICAgfQotCi0gICAgICAgIFJ1bGUgcnVsZSA9IGNyZWF0ZVJ1bGUodGFnLCBvdXRwdXQpOwotICAgICAgICBpZiAoIHJ1bGUgIT0gbnVsbCAmJiB0YWcgIT0gbnVsbCkgewotICAgICAgICAgICAgcnVsZS5zZXRNb2RlKCBtb2RlICk7Ci0gICAgICAgICAgICB0YWcuYWRkVGVtcGxhdGUoIHJ1bGUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFhQYXRoU291cmNlIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCBYUGF0aCB2YWx1ZSBvbiB3aGljaCByZWxhdGl2ZSBwYXRocyBhcmUgZXZhbHVhdGVkCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRYUGF0aFNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIHhwYXRoU291cmNlOwotICAgIH0KLQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIHZvaWQgc2V0TWF0Y2goUGF0dGVybiBtYXRjaCkgewotICAgICAgICB0aGlzLm1hdGNoID0gbWF0Y2g7Ci0gICAgfQotCi0gICAgLyoqIEdldHRlciBmb3IgcHJvcGVydHkgcHJpb3JpdHkuCi0gICAgICogQHJldHVybiBWYWx1ZSBvZiBwcm9wZXJ0eSBwcmlvcml0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZG91YmxlIGdldFByaW9yaXR5KCkgewotICAgICAgICByZXR1cm4gcHJpb3JpdHk7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIHByaW9yaXR5LgotICAgICAqIEBwYXJhbSBwcmlvcml0eSBOZXcgdmFsdWUgb2YgcHJvcGVydHkgcHJpb3JpdHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJpb3JpdHkoZG91YmxlIHByaW9yaXR5KSB7Ci0gICAgICAgIHRoaXMucHJpb3JpdHkgPSBwcmlvcml0eTsKLSAgICB9Ci0KLSAgICAvKiogR2V0dGVyIGZvciBwcm9wZXJ0eSBuYW1lLgotICAgICAqIEByZXR1cm4gVmFsdWUgb2YgcHJvcGVydHkgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSBuYW1lLgotICAgICAqIEBwYXJhbSBuYW1lIE5ldyB2YWx1ZSBvZiBwcm9wZXJ0eSBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLQotICAgIC8qKiBTZXRzIHRoZSBtb2RlLgotICAgICAqIEBwYXJhbSBtb2RlIE5ldyB2YWx1ZSBvZiBwcm9wZXJ0eSBtb2RlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1vZGUoU3RyaW5nIG1vZGUpIHsKLSAgICAgICAgdGhpcy5tb2RlID0gbW9kZTsKLSAgICB9Ci0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwcm90ZWN0ZWQgUnVsZSBjcmVhdGVSdWxlKFN0eWxlc2hlZXRUYWcgdGFnLCBYTUxPdXRwdXQgb3V0cHV0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgUnVsZSggbWF0Y2gsIGNyZWF0ZUFjdGlvbih0YWcsIG91dHB1dCkgKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFjdGlvbihmaW5hbCBTdHlsZXNoZWV0VGFnIHRhZywgZmluYWwgWE1MT3V0cHV0IG91dHB1dCkgewotICAgICAgICByZXR1cm4gbmV3IEFjdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihOb2RlIG5vZGUpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgLy8gc3RvcmUgdGhlIGNvbnRleHQgZm9yIHVzZSBieSBhcHBseVRlbXBsYXRlcyB0YWcKLSAgICAgICAgICAgICAgICB0YWcuc2V0WFBhdGhTb3VyY2UoIG5vZGUgKTsKLQotICAgICAgICAgICAgICAgIHhwYXRoU291cmNlID0gbm9kZTsKLQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoICJGaXJpbmcgdGVtcGxhdGUgYm9keSBmb3IgbWF0Y2g6ICIgKyBtYXRjaCArICIgYW5kIG5vZGU6ICIgKyBub2RlICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgWE1MT3V0cHV0IGFjdHVhbE91dHB1dCA9IHRhZy5nZXRTdHlsZXNoZWV0T3V0cHV0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdHVhbE91dHB1dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjdHVhbE91dHB1dCA9IG91dHB1dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnZva2VCb2R5KGFjdHVhbE91dHB1dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qc2wvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanNsL1hQYXRoUGF0dGVybkV4cHJlc3Npb24uamF2YSBiL2plbGx5LXRhZ3MvanNsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pzbC9YUGF0aFBhdHRlcm5FeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4OWMzNGIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qc2wvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanNsL1hQYXRoUGF0dGVybkV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuanNsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5FeHByZXNzaW9uU3VwcG9ydDsKLWltcG9ydCBvcmcuZG9tNGoucnVsZS5QYXR0ZXJuOwotaW1wb3J0IG9yZy5qYXhlbi5WYXJpYWJsZUNvbnRleHQ7Ci0KLS8qKiBBbiBleHByZXNzaW9uIHdoaWNoIHJldHVybnMgYW4gWFBhdGggYmFzZWQgUGF0dGVybiAobGlrZSBhbiBYU0xUIHBhdHRlcm4pLgotICAqCi0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBYUGF0aFBhdHRlcm5FeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvblN1cHBvcnQgaW1wbGVtZW50cyBWYXJpYWJsZUNvbnRleHQgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLSAgICBwcml2YXRlIFBhdHRlcm4gcGF0dGVybjsKLSAgICBwcml2YXRlIEplbGx5Q29udGV4dCBjb250ZXh0OwotCi0gICAgcHVibGljIFhQYXRoUGF0dGVybkV4cHJlc3Npb24oU3RyaW5nIHRleHQsIFBhdHRlcm4gcGF0dGVybikgewotICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OwotICAgICAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOwotICAgIH0KLQotICAgIC8vIEV4cHJlc3Npb24gaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIFN0cmluZyBnZXRFeHByZXNzaW9uVGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShKZWxseUNvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICAvL3BhdHRlcm4uc2V0VmFyaWFibGVDb250ZXh0KHRoaXMpOwotICAgICAgICByZXR1cm4gcGF0dGVybjsKLSAgICB9Ci0KLSAgICAvLyBWYXJpYWJsZUNvbnRleHQgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE9iamVjdCBnZXRWYXJpYWJsZVZhbHVlKAotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJLAotICAgICAgICBTdHJpbmcgcHJlZml4LAotICAgICAgICBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gY29udGV4dC5nZXRWYXJpYWJsZShsb2NhbE5hbWUpOwotCi0gICAgICAgIC8vbG9nLmluZm8oICJMb29raW5nIHVwIFhQYXRoIHZhcmlhYmxlIG9mIG5hbWU6ICIgKyBsb2NhbE5hbWUgKyAiIHZhbHVlIGlzOiAiICsgdmFsdWUgKTsKLQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qc2wvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanNsL3BhY2thZ2UuaHRtbCBiL2plbGx5LXRhZ3MvanNsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pzbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YjViN2MuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qc2wvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanNsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci0KLSAgPHA+VGhlIEplbGx5IFN0eWxlc2hlZXQgTGlicmFyeSAoSlNMKTwvcD4KLSAgCi0gIDxwPlRoZSBKU0wgdGFnIGxpYnJhcnkgaW1wbGVtZW50cyBhbiBYU0xULWxpa2UgZGVjbGFyYXRpdmUgWE1MIGJhc2VkIHByb2Nlc3NpbmcgZW5naW5lIHdoaWNoIGFsbG93cyAKLSAgCWR5bmFtaWMgc3R5bGVzaGVldHMgYW5kIGEgZnJlZSBtaXggYW5kIG1hdGNoIG9mIGFsbCBKZWxseSB0YWdzIHdpdGhpbiB0aGUgc2NyaXB0LgotICA8L3A+Ci0gIDxwPgotICAJVGhlIEpTTCB0YWcgbGlicmFyeSByZWxpZXMgb24gdGhlIFhNTCB0YWdzIGluIEpTVEwgdG8gZG8gbW9zdCBvZiBpdHMgd29yaywgc28gSlNMIGp1c3QgcHJvdmlkZXMKLSAgCXRoZSBkZWNsYXJhdGl2ZSBYTUwgcHJvY2Vzc2luZyB2aWEgJmx0O2pzbDpzdHlsZXNoZWV0Jmd0OyAgJmx0O2pzbDp0ZW1wbGF0ZSZndDsgYW5kICAmbHQ7anNsOmFwcGx5VGVtcGxhdGVzJmd0OwotICA8L3A+Ci0gIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qc2wvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pzbC9UZXN0SlNMLmphdmEgYi9qZWxseS10YWdzL2pzbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvanNsL1Rlc3RKU0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY4YzQwMi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pzbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvanNsL1Rlc3RKU0wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmpzbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlNjcmlwdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5wYXJzZXIuWE1MUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5kb200ai5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZG9tNGouRWxlbWVudDsKLWltcG9ydCBvcmcuZG9tNGouaW8uU0FYQ29udGVudEhhbmRsZXI7Ci0KLS8qKgotICogVGVzdHMgdGhlIEpTTCB0YWdzLgotICogTm90ZSB0aGlzIHRlc3QgaGFybmVzcyBjb3VsZCBiZSB3cml0dGVuIGluIEplbGx5IHNjcmlwdAotICogaWYgd2UgaGFkIHRoZSBqdW5pdCB0YWcgbGlicmFyeSEKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0SlNMIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFRlc3RKU0wuY2xhc3MpOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3RKU0wuY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0SlNMKFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4YW1wbGUxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gcnVuU2NyaXB0KCAic3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pzbC9leGFtcGxlLmplbGx5IiApOwotICAgICAgICBFbGVtZW50IHNtYWxsID0gKEVsZW1lbnQpIGRvY3VtZW50LnNlbGVjdFNpbmdsZU5vZGUoIi9odG1sL2JvZHkvc21hbGwiKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiPHNtYWxsPiBzdGFydHMgd2l0aCAnSmFtZXMgRWxzb24nIiwgc21hbGwuZ2V0VGV4dCgpLnN0YXJ0c1dpdGgoIkphbWVzIEVsc29uIikgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiSSBhbSBhIHRpdGxlISIsIHNtYWxsLnZhbHVlT2YoICJoMiIgKS50cmltKCkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiVHdhcyBhIGRhcmssIHJhaW55IG5pZ2h0Li4uIiwgc21hbGwudmFsdWVPZiggInNtYWxsIiApLnRyaW0oKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoICJkZmpzZGZqc2RmIiwgc21hbGwudmFsdWVPZiggInAiICkudHJpbSgpICk7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgcnVuU2NyaXB0KFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7Ci0gICAgICAgIFhNTFBhcnNlciBwYXJzZXIgPSBuZXcgWE1MUGFyc2VyKCk7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBwYXJzZXIucGFyc2UoaW4pOwotICAgICAgICBzY3JpcHQgPSBzY3JpcHQuY29tcGlsZSgpOwotICAgICAgICBKZWxseUNvbnRleHQgY29udGV4dCA9IHBhcnNlci5nZXRDb250ZXh0KCk7Ci0KLSAgICAgICAgU0FYQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIgPSBuZXcgU0FYQ29udGVudEhhbmRsZXIoKTsKLSAgICAgICAgWE1MT3V0cHV0IG91dHB1dCA9IG5ldyBYTUxPdXRwdXQoIGNvbnRlbnRIYW5kbGVyICk7Ci0KLSAgICAgICAgY29udGVudEhhbmRsZXIuc3RhcnREb2N1bWVudCgpOwotICAgICAgICBzY3JpcHQucnVuKGNvbnRleHQsIG91dHB1dCk7Ci0gICAgICAgIGNvbnRlbnRIYW5kbGVyLmVuZERvY3VtZW50KCk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbnRlbnRIYW5kbGVyLmdldERvY3VtZW50KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qc2wvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pzbC9UZXN0SlNMU3VpdGUuamF2YSBiL2plbGx5LXRhZ3MvanNsL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qc2wvVGVzdEpTTFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MTliODcuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qc2wvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pzbC9UZXN0SlNMU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmpzbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qdW5pdC5KZWxseVRlc3RTdWl0ZTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyB0byBydW4gamVsbHkgdGVzdCBjYXNlcyBhcyBwYXJ0IG9mIEFudCdzIEpVbml0IHRlc3RzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0SlNMU3VpdGUgZXh0ZW5kcyBKZWxseVRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUZXN0UnVubmVyLnJ1biggc3VpdGUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVUZXN0U3VpdGUoVGVzdEpTTFN1aXRlLmNsYXNzLCAic3VpdGUuamVsbHkiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pzbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvanNsL2V4YW1wbGUuamVsbHkgYi9qZWxseS10YWdzL2pzbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvanNsL2V4YW1wbGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NDZiZDUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qc2wvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pzbC9leGFtcGxlLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM6eD0iamVsbHk6eG1sIiB4bWxuczpqc2w9ImplbGx5OmpzbCI+Ci0KLTxodG1sPgotPGJvZHk+Ci0gICAgCi0gIDx4OnBhcnNlIHZhcj0iZG9jIj4KLSAgPHNpbXBsZURvY3VtZW50IGF1dGhvcj0iSmFtZXMgRWxzb24iPgotCi0gICAgPHRpdGxlPkkgYW0gYSB0aXRsZSE8L3RpdGxlPgotCi0gICAgPHN5bm9wc2lzPlR3YXMgYSBkYXJrLCByYWlueSBuaWdodC4uLjwvc3lub3BzaXM+Ci0KLSAgICA8cGFyYT5kZmpzZGZqc2RmPC9wYXJhPgotICAgIDxwYXJhPmZkc2ZzZGZoZHNmZiBneXVmIHV5c2dmIGRzPC9wYXJhPgotCi0gIDwvc2ltcGxlRG9jdW1lbnQ+Ci0gIDwveDpwYXJzZT4KLQotCi08aDE+T3V0cHV0PC9oMT4KLQotCi08anNsOnN0eWxlc2hlZXQgc2VsZWN0PSIkZG9jIj4KLQotICA8anNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICA8anNsOmFwcGx5VGVtcGxhdGVzLz4KLSAgPC9qc2w6dGVtcGxhdGU+Ci0KLSAgPGpzbDp0ZW1wbGF0ZSBtYXRjaD0iKiI+Ci0gICAgPHNtYWxsPjxqc2w6YXBwbHlUZW1wbGF0ZXMvPjwvc21hbGw+Ci0gIDwvanNsOnRlbXBsYXRlPgotCi0gIDxqc2w6dGVtcGxhdGUgbWF0Y2g9InRpdGxlIj4KLSAgICA8aDI+PGpzbDphcHBseVRlbXBsYXRlcy8+PC9oMj4KLSAgPC9qc2w6dGVtcGxhdGU+Ci0KLQotICA8anNsOnRlbXBsYXRlIG1hdGNoPSJwYXJhIj4KLSAgICA8cD48anNsOmFwcGx5VGVtcGxhdGVzLz48L3A+Ci0gIDwvanNsOnRlbXBsYXRlPgotCi08L2pzbDpzdHlsZXNoZWV0PgotCi08L2JvZHk+Ci08L2h0bWw+Ci0KLTwvajpqZWxseT4KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qc2wvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pzbC9leGFtcGxlMi5qZWxseSBiL2plbGx5LXRhZ3MvanNsL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qc2wvZXhhbXBsZTIuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ODZiM2UuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qc2wvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pzbC9leGFtcGxlMi5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseSB0cmltPSJmYWxzZSIgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM6eD0iamVsbHk6eG1sIiB4bWxuczpqc2w9ImplbGx5OmpzbCI+Ci0KLTxodG1sPgotPGJvZHk+Ci0gICAgCi0gIDx4OnBhcnNlIHZhcj0iZG9jIj4KLSAgPHNpbXBsZURvY3VtZW50IGF1dGhvcj0iSmFtZXMgRWxzb24iPgotCi0gICAgPHRpdGxlPkkgYW0gYSB0aXRsZSE8L3RpdGxlPgotCi0gICAgPHN5bm9wc2lzPlR3YXMgYSBkYXJrLCByYWlueSBuaWdodC4uLjwvc3lub3BzaXM+Ci0KLSAgICA8cGFyYT5kZmpzZGZqc2RmPC9wYXJhPgotICAgIDxwYXJhPmZkc2ZzZGZoZHNmZiBneXVmIHV5c2dmIGRzPC9wYXJhPgotCi0gIDwvc2ltcGxlRG9jdW1lbnQ+Ci0gIDwveDpwYXJzZT4KLQotCi08aDE+T3V0cHV0IG9mIGZpcnN0IHN0eWxlc2hlZXQxPC9oMT4KLQotPGpzbDpzdHlsZXNoZWV0IHNlbGVjdD0iJGRvYyI+Ci0KLSAgPGpzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgPGpzbDphcHBseVRlbXBsYXRlcy8+Ci0gIDwvanNsOnRlbXBsYXRlPgotCi0gIDxqc2w6dGVtcGxhdGUgbWF0Y2g9InRpdGxlIj4KLSAgICA8aDI+PGpzbDphcHBseVRlbXBsYXRlcy8+PC9oMj4KLSAgPC9qc2w6dGVtcGxhdGU+Ci0KLQotICA8anNsOnRlbXBsYXRlIG1hdGNoPSJwYXJhIj4KLSAgICA8cD48anNsOmFwcGx5VGVtcGxhdGVzLz48L3A+Ci0gIDwvanNsOnRlbXBsYXRlPgotCi0gIDxqc2w6dGVtcGxhdGUgbWF0Y2g9IioiPgotICAgIDxzbWFsbD48anNsOmFwcGx5VGVtcGxhdGVzLz48L3NtYWxsPgotICA8L2pzbDp0ZW1wbGF0ZT4KLQotPC9qc2w6c3R5bGVzaGVldD4KLQotPGhyIC8+Ci0KLTxoMT5PdXRwdXQgb2Ygc3R5bGVzaGVldDI8L2gxPgotCi08anNsOnN0eWxlc2hlZXQgc2VsZWN0PSIkZG9jIj4KLQotICA8anNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICA8anNsOmFwcGx5VGVtcGxhdGVzLz4KLSAgPC9qc2w6dGVtcGxhdGU+Ci0KLSAgPGpzbDp0ZW1wbGF0ZSBtYXRjaD0iKiI+Ci0gICAgPHNtYWxsPjxqc2w6YXBwbHlUZW1wbGF0ZXMvPjwvc21hbGw+Ci0gIDwvanNsOnRlbXBsYXRlPgotCi0gIDxqc2w6dGVtcGxhdGUgbWF0Y2g9InRpdGxlIj4KLSAgICA8aDI+PGpzbDphcHBseVRlbXBsYXRlcy8+PC9oMj4KLSAgPC9qc2w6dGVtcGxhdGU+Ci0KLQotICA8anNsOnRlbXBsYXRlIG1hdGNoPSJwYXJhIj4KLSAgICA8cD48anNsOmFwcGx5VGVtcGxhdGVzLz48L3A+Ci0gIDwvanNsOnRlbXBsYXRlPgotCi08L2pzbDpzdHlsZXNoZWV0PgotCi08aHIgLz4KLQotPGgxPk91dHB1dCBvZiBzdHlsZXNoZWV0MzwvaDE+Ci0KLQotPGpzbDpzdHlsZXNoZWV0IHNlbGVjdD0iJGRvYyI+Ci0KLSAgPGpzbDp0ZW1wbGF0ZSBtYXRjaD0iL3NpbXBsZURvY3VtZW50Ij4KLSAgIDxoMj5Cb29rIHJldmlldzwvaDI+Ci0gICA8Yj5UaXRsZTo8L2I+IDxqc2w6YXBwbHlUZW1wbGF0ZXMgc2VsZWN0PSJ0aXRsZSIvPjxiciAvPgotICAgPGI+QXV0aG9yOjwvYj4gPGpzbDphcHBseVRlbXBsYXRlcyBzZWxlY3Q9IkBhdXRob3IiLz48YnIgLz4KLSAgIDxiPlN1bW1hcnk6PC9iPiA8ZW0+PGpzbDphcHBseVRlbXBsYXRlcyBzZWxlY3Q9InN5bm9wc2lzIi8+PC9lbT48YnIgLz4KLSAgPC9qc2w6dGVtcGxhdGU+Ci0KLSAgPGpzbDp0ZW1wbGF0ZSBtYXRjaD0idGl0bGUiPgotICAgIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj48anNsOmFwcGx5VGVtcGxhdGVzLz48L3NwYW4+Ci0gIDwvanNsOnRlbXBsYXRlPgotCi0KLSAgPGpzbDp0ZW1wbGF0ZSBtYXRjaD0icGFyYSI+Ci0gICAgPHA+PGpzbDphcHBseVRlbXBsYXRlcy8+PC9wPgotICA8L2pzbDp0ZW1wbGF0ZT4KLQotPC9qc2w6c3R5bGVzaGVldD4KLQotPGgxPk91dHB1dCBvZiBzdHlsZXNoZWV0NDwvaDE+Ci0KLQotPGpzbDpzdHlsZXNoZWV0IHNlbGVjdD0iJGRvYyI+Ci0KLSAgPGpzbDp0ZW1wbGF0ZSBtYXRjaD0iL3NpbXBsZURvY3VtZW50Ij4KLSAgIDxoMj5Cb29rIHJldmlldzwvaDI+Ci0gICA8anNsOmFwcGx5VGVtcGxhdGVzLz4KLSAgPC9qc2w6dGVtcGxhdGU+Ci0KLSAgPGpzbDp0ZW1wbGF0ZSBtYXRjaD0iKiI+Ci0gICAgPGpzbDpjb3B5PgotICAgICAgPGpzbDphcHBseVRlbXBsYXRlcy8+Ci0gICAgPC9qc2w6Y29weT4KLSAgPC9qc2w6dGVtcGxhdGU+Ci08L2pzbDpzdHlsZXNoZWV0PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KLQotPC9qOmplbGx5PgotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pzbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvanNsL3N1aXRlLmplbGx5IGIvamVsbHktdGFncy9qc2wvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pzbC9zdWl0ZS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZjNmJjNy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pzbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvanNsL3N1aXRlLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx0ZXN0OnN1aXRlIHhtbG5zOmo9ImplbGx5OmNvcmUiIAotICAgICAgICAgICAgeG1sbnM6anNsPSJqZWxseTpqc2wiCi0gICAgICAgICAgICB4bWxuczptPSJqZWxseTphbnQiCi0gICAgICAgICAgICB4bWxuczp0ZXN0PSJqZWxseTpqdW5pdCIgCi0gICAgICAgICAgICB4bWxuczp1PSJqZWxseTp1dGlsIiAKLSAgICAgICAgICAgIHhtbG5zOng9ImplbGx5OnhtbCIKLSAgICAgICAgICAgIHhtbG5zOmxvZz0iamVsbHk6bG9nIj4KLQotICAgIDx0ZXN0OmNhc2UgbmFtZT0idGVzdERpb25zQnVnIiB4bWxucz0iZHVtbXkiPgotCi0gICAgICAgIDxsb2c6aW5mbz4KLSAgICAgICAgICAgIDwhLS0gc2VlIGlmIHdlIGNhbiBicmVhayB0ZW1wbGF0ZSAtLT4KLSAgICAgICAgICAgIDxtOmZpbGVTY2FubmVyIHZhcj0iZmlsZXMiPgotICAgICAgICAgICAgICAgIDxtOmZpbGVzZXQgZGlyPSJzcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvanNsIj4KLSAgICAgICAgICAgICAgICAgICAgPG06cGF0dGVybnNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtOmluY2x1ZGUgbmFtZT0iKiovKi54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9tOnBhdHRlcm5zZXQ+Ci0gICAgICAgICAgICAgICAgPC9tOmZpbGVzZXQ+Ci0gICAgICAgICAgICA8L206ZmlsZVNjYW5uZXI+Ci0gICAgCi0gICAgICAgICAgICA8ajpmb3JFYWNoIHZhcj0iZmlsZSIgaXRlbXM9IiR7ZmlsZXMuaXRlcmF0b3IoKX0iPgotICAgICAgICAgICAgICAgIDx4OnBhcnNlIHZhcj0iZG9jIiB4bWw9IiR7ZmlsZS50b1VSTCgpfSIgLz4KLSAgICAgICAgICAgICAgICA8anNsOnN0eWxlc2hlZXQgc2VsZWN0PSIkZG9jIj4KLSAgICAgICAgICAgICAgICAgICAgPGpzbDp0ZW1wbGF0ZSBtYXRjaD0iZG9jdW1lbnQiIHRyaW09Im5vIj4KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIDxoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqOnNldCB2YXI9ImZ1bGwiPjx4OmV4cHIgc2VsZWN0PSIkZG9jL2RvY3VtZW50L3Byb3BlcnRpZXMvdGl0bGUiLz48L2o6c2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqOnNldCB2YXI9InNob3J0Ij48eDpleHByIHNlbGVjdD0iLi9wcm9wZXJ0aWVzL3RpdGxlIiAvPjwvajpzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG06ZWNobz5mdWxsPSR7ZnVsbH0sc2hvcnQ9JHtzaG9ydH08L206ZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtmdWxsID09IHNob3J0fSI+QWxsIGl0ZXJhdGlvbnMgc2hvdWxkIHN1Y2NlZWQ8L3Rlc3Q6YXNzZXJ0PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9oPgotICAgICAgICAgICAgICAgICAgICA8L2pzbDp0ZW1wbGF0ZT4KLSAgICAgICAgICAgICAgICA8L2pzbDpzdHlsZXNoZWV0PgotICAgIAotICAgICAgICAgICAgPC9qOmZvckVhY2g+Ci0gICAgCi0gICAgICAgICAgICA8IS0tIHRlc3Qgc3R5bGVzaGVldCBleHRlcm5hbCB0byBsb29wIC0tPgotICAgICAgICAgICAgPGpzbDpzdHlsZXNoZWV0IHZhcj0ic3MxIj4KLSAgICAgICAgICAgICAgICA8anNsOnRlbXBsYXRlIG1hdGNoPSJkb2N1bWVudCIgdHJpbT0ibm8iPgotICAgICAgICAgICAgICAgICAgICA8aD4KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIDxqOnNldCB2YXI9ImZ1bGwiPjx4OmV4cHIgc2VsZWN0PSIkZG9jL2RvY3VtZW50L3Byb3BlcnRpZXMvdGl0bGUiLz48L2o6c2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgPGo6c2V0IHZhcj0ic2hvcnQiPjx4OmV4cHIgc2VsZWN0PSIuL3Byb3BlcnRpZXMvdGl0bGUiIC8+PC9qOnNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtOmVjaG8+ZnVsbD0ke2Z1bGx9LHNob3J0PSR7c2hvcnR9PC9tOmVjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtmdWxsID09IHNob3J0fSI+QWxsIGl0ZXJhdGlvbnMgc2hvdWxkIHN1Y2NlZWQ8L3Rlc3Q6YXNzZXJ0PgotICAgICAgICAgICAgICAgICAgICA8L2g+Ci0gICAgICAgICAgICAgICAgPC9qc2w6dGVtcGxhdGU+Ci0gICAgICAgICAgICA8L2pzbDpzdHlsZXNoZWV0PgotICAgIAotICAgICAgICAgICAgPGo6Zm9yRWFjaCB2YXI9ImZpbGUiIGl0ZW1zPSIke2ZpbGVzLml0ZXJhdG9yKCl9Ij4KLSAgICAgICAgICAgICAgICA8eDpwYXJzZSB2YXI9ImRvYyIgeG1sPSIke2ZpbGUudG9VUkwoKX0iIC8+Ci0gICAgICAgICAgICAgICAgPGpzbDpzdHlsZSBzdHlsZXNoZWV0PSIke3NzMX0iIHNlbGVjdD0iJGRvYyIgLz4KLSAgICAgICAgICAgIDwvajpmb3JFYWNoPgotICAgICAgICA8L2xvZzppbmZvPiAgICAgICAgICAgIAotICA8L3Rlc3Q6Y2FzZT4gIAotCi0KLSAgICA8dGVzdDpjYXNlIG5hbWU9InRlc3RTdHlsZXNoZWV0UmV1c2UiIHhtbG5zPSJkdW1teSI+Ci0gICAgICAgIAotICAgIDwhLS0gc2VlIGlmIHdlIGNhbiBicmVhayB0ZW1wbGF0ZSAtLT4KLSAgICA8bTpmaWxlU2Nhbm5lciB2YXI9ImZpbGVzIj4KLSAgICAgIDxtOmZpbGVzZXQgZGlyPSJzcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvanNsIj4KLSAgICAgICAgPG06cGF0dGVybnNldD4KLSAgICAgICAgICA8bTppbmNsdWRlIG5hbWU9IioqLyoueG1sIi8+Ci0gICAgICAgIDwvbTpwYXR0ZXJuc2V0PgotICAgICAgPC9tOmZpbGVzZXQ+Ci0gICAgPC9tOmZpbGVTY2FubmVyPgotCi0gICAgPGpzbDpzdHlsZXNoZWV0IHZhcj0ibXlTdHlsZXNoZWV0Ij4KLSAgICAgICAgPGpzbDp0ZW1wbGF0ZSBtYXRjaD0iZG9jdW1lbnQiIHRyaW09Im5vIj4KLSAgICAgICAgICAgIDxoPgotICAgICAgICA8ajpzZXQgdmFyPSJmdWxsIj48eDpleHByIHNlbGVjdD0iJGRvYy9kb2N1bWVudC9wcm9wZXJ0aWVzL3RpdGxlIi8+PC9qOnNldD4KLSAgICAgICAgPGo6c2V0IHZhcj0ic2hvcnQiPjx4OmV4cHIgc2VsZWN0PSIuL3Byb3BlcnRpZXMvdGl0bGUiIC8+PC9qOnNldD4KLSAgICAgICAgPG06ZWNobz5mdWxsPSR7ZnVsbH0sc2hvcnQ9JHtzaG9ydH08L206ZWNobz4KLSAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7ZnVsbCA9PSBzaG9ydH0iPkFsbCBpdGVyYXRpb25zIHNob3VsZCBzdWNjZWVkPC90ZXN0OmFzc2VydD4KLSAgICAgICAgICAgIDwvaD4KLSAgICAgICAgPC9qc2w6dGVtcGxhdGU+Ci0gICAgPC9qc2w6c3R5bGVzaGVldD4KLQotCi0gICAgPGo6Zm9yRWFjaCB2YXI9ImZpbGUiIGl0ZW1zPSIke2ZpbGVzLml0ZXJhdG9yKCl9Ij4KLSAgICAgIDx4OnBhcnNlIHZhcj0iZG9jIiB4bWw9IiR7ZmlsZS50b1VSTCgpfSIgLz4KLSAgICAgIDxqc2w6c3R5bGUgc3R5bGVzaGVldD0iJHtteVN0eWxlc2hlZXR9Ii8+Ci0gICAgPC9qOmZvckVhY2g+Ci0gIDwvdGVzdDpjYXNlPiAgCi0KLQotICAgIDx0ZXN0OmNhc2UgbmFtZT0idGVzdFJlbGF0aXZlWFBhdGhzIj4KLQotICAgICAgICA8ajpmb3JFYWNoIHZhcj0iaSIgYmVnaW49IjEiIGVuZD0iNSI+Ci0gICAgICAgICAgICA8eDpwYXJzZSB2YXI9ImRvYyI+Ci0gICAgICAgICAgICAgICAgPGRvY3VtZW50IGlkPSIke2l9Ij4KLSAgICAgICAgICAgICAgICAgICAgPGEgeD0iMSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YiB5PSIxMjMiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9hPgotICAgICAgICAgICAgICAgICAgICA8cHJvcGVydGllcz48dGl0bGU+dmFsdWUgJHtpfTwvdGl0bGU+PC9wcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgIDwvZG9jdW1lbnQ+Ci0gICAgICAgICAgICA8L3g6cGFyc2U+Ci0gICAgICAgIAotICAgICAgICAgICAgPGpzbDpzdHlsZXNoZWV0IHNlbGVjdD0iJGRvYyI+Ci0gICAgICAgICAgICAgICAgPGpzbDp0ZW1wbGF0ZSBtYXRjaD0iZG9jdW1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8bG9nOmluZm8+Rm91bmQgZG9jdW1lbnQgd2l0aCBJRCA8eDpleHByIHNlbGVjdD0iLi9AaWQiLz4gdGl0bGUgPHg6ZXhwciBzZWxlY3Q9Ii4vcHJvcGVydGllcy90aXRsZSIvPjwvbG9nOmluZm8+Ci0KLSAgICAgICAgICAgICAgICAgICAgPGo6c2V0IHZhcj0idGl0bGUiPjx4OmV4cHIgc2VsZWN0PSIuL3Byb3BlcnRpZXMvdGl0bGUiLz48L2o6c2V0PgotICAgICAgICAgICAgICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9InZhbHVlICR7aX0iIGFjdHVhbD0iJHt0aXRsZX0iLz4KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDxqOnNldCB2YXI9InRpdGxlIj48eDpleHByIHNlbGVjdD0iJGRvYy9kb2N1bWVudC9wcm9wZXJ0aWVzL3RpdGxlIi8+PC9qOnNldD4KLSAgICAgICAgICAgICAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJ2YWx1ZSAke2l9IiBhY3R1YWw9IiR7dGl0bGV9Ii8+Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPGo6c2V0IHZhcj0iaWQiPjx4OmV4cHIgc2VsZWN0PSIuL0BpZCIvPjwvajpzZXQ+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2lkID09IGl9Ii8+Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8dGVzdDphc3NlcnQgeHBhdGg9ImFbQHggPSAnMSddIi8+Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8dGVzdDphc3NlcnQgeHBhdGg9IkBpZCA9ICRpIi8+Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8anNsOmFwcGx5VGVtcGxhdGVzLz4KLSAgICAgICAgICAgICAgICA8L2pzbDp0ZW1wbGF0ZT4KLSAgICAKLSAgICAgICAgICAgICAgICA8anNsOnRlbXBsYXRlIG1hdGNoPSJhIj4KLSAgICAgICAgICAgICAgICAgICAgPHRlc3Q6YXNzZXJ0IHhwYXRoPSJAeD0nMSciLz4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDxqc2w6YXBwbHlUZW1wbGF0ZXMvPgotICAgICAgICAgICAgICAgIDwvanNsOnRlbXBsYXRlPgotICAgIAotICAgICAgICAgICAgICAgIDxqc2w6dGVtcGxhdGUgbWF0Y2g9ImIiPgotICAgICAgICAgICAgICAgICAgICA8dGVzdDphc3NlcnQgeHBhdGg9IkB5PScxMjMnIi8+ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8anNsOmFwcGx5VGVtcGxhdGVzLz4KLSAgICAgICAgICAgICAgICA8L2pzbDp0ZW1wbGF0ZT4KLQotCi0gICAgICAgICAgICAgICAgPGpzbDp0ZW1wbGF0ZSBtYXRjaD0iQCoiLz4KLSAgICAgICAgICAgIDwvanNsOnN0eWxlc2hlZXQ+Ci0gICAgICAgIDwvajpmb3JFYWNoPiAgICAgIAotICAgICAgICAKLSAgPC90ZXN0OmNhc2U+ICAKLSAgCi0gIDwhLS0gCi0gICAgdGVzdCBjYXNlIHRvIHRlc3QgdGhhdCB0aGUgeG1sIG91dHB1dCBmb3IgYSBzdHlsZXNoZWV0IHRlbXBsYXRlIGlzCi0gICAgJ3JlbWVtYmVyZWQnIHdoZW4gdXNpbmcgYXBwbHlUZW1wbGF0ZXMKLSAgIC0tPgotICA8dGVzdDpjYXNlIG5hbWU9InRlc3RYTUxDb250ZXh0S2VwdCIgeG1sbnM9ImR1bW15Ij4KLSAgICA8eDpwYXJzZSB2YXI9InRlc3REb2MiPgotICAgICAgPGVsZW1lbnQxPgotICAgICAgICAgPGVsZW1lbnQyPlNvbWVUZXh0PC9lbGVtZW50Mj4KLSAgICAgIDwvZWxlbWVudDE+Ci0gICAgPC94OnBhcnNlPgotCi0gICAgPCEtLSBzdHlsZXNoZWV0IHdpdGggZW1iZWRkZWQgc2V0IC0tPiAgICAKLSAgICA8anNsOnN0eWxlc2hlZXQgdmFyPSJjb250ZXh0U3R5bGVTaGVldCI+Ci0gICAgICA8anNsOnRlbXBsYXRlIG1hdGNoPSJlbGVtZW50MSI+Ci0gICAgICAgIDxqOnNldCB2YXI9ImNvbnRleHRUZXh0Ij5FbDE8anNsOmFwcGx5VGVtcGxhdGVzIC8+PC9qOnNldD4KLSAgICAgIDwvanNsOnRlbXBsYXRlPgotICAgICAgPGpzbDp0ZW1wbGF0ZSBtYXRjaD0iZWxlbWVudDIiPjx4OmV4cHIgc2VsZWN0PSIuIi8+PC9qc2w6dGVtcGxhdGU+Ci0gICAgPC9qc2w6c3R5bGVzaGVldD4KLQotICAgIDxsb2c6aW5mbz4KLSAgICAgICAgLi4uCi0gICAgICAgIDxqc2w6c3R5bGUgc3R5bGVzaGVldD0iJHtjb250ZXh0U3R5bGVTaGVldH0iIHNlbGVjdD0iJHRlc3REb2MiLz4KLSAgICAgICAgLi4uCi0gICAgPC9sb2c6aW5mbz4KLQotICAgIDxtOmVjaG8+dGV4dCBpcyAnJHtjb250ZXh0VGV4dH0nPC9tOmVjaG8+Ci0gICAgCi0gICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJFbDFTb21lVGV4dCIgYWN0dWFsPSIke2NvbnRleHRUZXh0fSIgLz4KLSAgPC90ZXN0OmNhc2U+Ci0gIAotICA8dGVzdDpjYXNlIG5hbWU9InRlc3RYTUxDb250ZXh0S2VwdDIiIHhtbG5zPSJkdW1teSI+Ci0gICAgPHg6cGFyc2UgdmFyPSJ0ZXN0RG9jIj4KLSAgICAgIDxlbGVtZW50MT4KLSAgICAgICAgIDxlbGVtZW50Mj5Tb21lVGV4dDwvZWxlbWVudDI+Ci0gICAgICA8L2VsZW1lbnQxPgotICAgIDwveDpwYXJzZT4KLQotICAgIDwhLS0gc3R5bGVzaGVldCB3aXRoIGVtYmVkZGVkIHNldCBhbmQgdGV4dCgpIHJ1bGUgLS0+ICAgIAotICAgIDxqc2w6c3R5bGVzaGVldCB2YXI9ImNvbnRleHRTdHlsZVNoZWV0Ij4KLSAgICAgIDxqc2w6dGVtcGxhdGUgbWF0Y2g9ImVsZW1lbnQxIj4KLSAgICAgICAgPGo6c2V0IHZhcj0iY29udGV4dFRleHQiPkVsMTxqc2w6YXBwbHlUZW1wbGF0ZXMgLz48L2o6c2V0PgotICAgICAgPC9qc2w6dGVtcGxhdGU+Ci0gICAgICA8anNsOnRlbXBsYXRlIG1hdGNoPSJlbGVtZW50MiI+PHg6ZXhwciBzZWxlY3Q9Ii4iLz48L2pzbDp0ZW1wbGF0ZT4KLSAgICAgIDxqc2w6dGVtcGxhdGUgbWF0Y2g9InRleHQoKSI+PHg6ZXhwciBzZWxlY3Q9Ii4iLz48L2pzbDp0ZW1wbGF0ZT4KLSAgICA8L2pzbDpzdHlsZXNoZWV0PgotCi0gICAgPGxvZzppbmZvPgotICAgICAgICAuLi4KLSAgICAgICAgPGpzbDpzdHlsZSBzdHlsZXNoZWV0PSIke2NvbnRleHRTdHlsZVNoZWV0fSIgc2VsZWN0PSIkdGVzdERvYyIvPgotICAgICAgICAuLi4KLSAgICA8L2xvZzppbmZvPgotCi0gICAgPG06ZWNobz50ZXh0IGlzICcke2NvbnRleHRUZXh0fSc8L206ZWNobz4KLSAgICAKLSAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IkVsMVNvbWVUZXh0IiBhY3R1YWw9IiR7Y29udGV4dFRleHR9IiAvPgotICA8L3Rlc3Q6Y2FzZT4KLSAgCi0gIDx0ZXN0OmNhc2UgbmFtZT0idGVzdFhNTENvbnRleHRLZXB0MyIgeG1sbnM9ImR1bW15Ij4KLSAgICA8eDpwYXJzZSB2YXI9InRlc3REb2MiPgotICAgICAgPGVsZW1lbnQxPgotICAgICAgICAgPGVsZW1lbnQyPlNvbWVUZXh0PC9lbGVtZW50Mj4KLSAgICAgIDwvZWxlbWVudDE+Ci0gICAgPC94OnBhcnNlPgotCi0gICAgPGpzbDpzdHlsZXNoZWV0IHZhcj0iY29udGV4dFN0eWxlU2hlZXQiPgotICAgICAgPGpzbDp0ZW1wbGF0ZSBtYXRjaD0iZWxlbWVudDEiPkVsMTxqc2w6YXBwbHlUZW1wbGF0ZXMgLz48L2pzbDp0ZW1wbGF0ZT4KLSAgICAgIDxqc2w6dGVtcGxhdGUgbWF0Y2g9ImVsZW1lbnQyIj48eDpleHByIHNlbGVjdD0iLiIvPjwvanNsOnRlbXBsYXRlPgotICAgIDwvanNsOnN0eWxlc2hlZXQ+Ci0KLSAgICA8ajpzZXQgdmFyPSJjb250ZXh0VGV4dCI+PGpzbDpzdHlsZSBzdHlsZXNoZWV0PSIke2NvbnRleHRTdHlsZVNoZWV0fSIgc2VsZWN0PSIkdGVzdERvYyIvPjwvajpzZXQ+Ci0KLSAgICA8bTplY2hvPnRleHQgaXMgJyR7Y29udGV4dFRleHR9JzwvbTplY2hvPgotICAgIAotICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iRWwxU29tZVRleHQiIGFjdHVhbD0iJHtjb250ZXh0VGV4dH0iIC8+Ci0gIDwvdGVzdDpjYXNlPiAgCi0gIAotICA8dGVzdDpjYXNlIG5hbWU9InRlc3RNb2RlQnVnIiB4bWxucz0iZHVtbXkiPgotICAgIDx4OnBhcnNlIHZhcj0idGVzdERvYyI+Ci0gICAgICA8bWVudT4KLSAgICAgICAgPGl0ZW0gLz4KLSAgICAgICAgPGl0ZW0gLz4KLSAgICAgIDwvbWVudT4KLSAgICA8L3g6cGFyc2U+Ci0gICAgCi0gICAgPGpzbDpzdHlsZXNoZWV0IHZhcj0ibW9kZVN0eWxlU2hlZXQiPgotICAgICAgPGpzbDp0ZW1wbGF0ZSBtYXRjaD0ibWVudSI+PGpzbDphcHBseVRlbXBsYXRlcyBtb2RlPSJiYmIiLz48L2pzbDp0ZW1wbGF0ZT4KLQkgIDxqc2w6dGVtcGxhdGUgbWF0Y2g9Iml0ZW0iPk5vIG1vZGU8L2pzbDp0ZW1wbGF0ZT4KLQkgIDxqc2w6dGVtcGxhdGUgbWF0Y2g9Iml0ZW0iIHRyaW09ImZhbHNlIiBtb2RlPSJiYmIiPkJCQjwvanNsOnRlbXBsYXRlPgotICAgIDwvanNsOnN0eWxlc2hlZXQ+Ci0gICAgCi0gICAgPGo6c2V0IHZhcj0ibW9kZVRleHQiPjxqc2w6c3R5bGUgc3R5bGVzaGVldD0iJHttb2RlU3R5bGVTaGVldH0iIHNlbGVjdD0iJHRlc3REb2MiLz48L2o6c2V0PgotCi0gICAgPG06ZWNobz50ZXh0IGlzICcke21vZGVUZXh0fSc8L206ZWNobz4KLSAgICAKLSAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IkJCQkJCQiIgYWN0dWFsPSIke21vZGVUZXh0fSIgLz4KLSAgPC90ZXN0OmNhc2U+Ci08L3Rlc3Q6c3VpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qc2wvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pzbC90ZXN0MS54bWwgYi9qZWxseS10YWdzL2pzbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvanNsL3Rlc3QxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwODA4OC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2pzbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvanNsL3Rlc3QxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+VGVzdDE8L3RpdGxlPgotICA8L3Byb3BlcnRpZXM+Ci08L2RvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvanNsL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qc2wvdGVzdDIueG1sIGIvamVsbHktdGFncy9qc2wvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pzbC90ZXN0Mi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNjAxNWYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qc2wvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2pzbC90ZXN0Mi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPlRlc3QyPC90aXRsZT4KLSAgPC9wcm9wZXJ0aWVzPgotPC9kb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pzbC94ZG9jcy9jaGFuZ2VzLnhtbCBiL2plbGx5LXRhZ3MvanNsL3hkb2NzL2NoYW5nZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzEwNmFlLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvanNsL3hkb2NzL2NoYW5nZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLSAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSAtLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+Q2hhbmdlczwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotICA8Ym9keT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjEtU05BUFNIT1QiIGRhdGU9ImluIENWUyI+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0iZml4IiBpc3N1ZT0iSkVMTFktMTA5IiBkdWUtdG89Ik1hYXJ0ZW4gQ29lbmUiPmpzbDphcHBseVRlbXBsYXRlcyBtb2RlIGF0dHJpYnV0ZSBub3QgZnVuY3Rpb25pbmcuPC9hY3Rpb24+Ci0gICAgPC9yZWxlYXNlPgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMCIgZGF0ZT0iMjAwNC0wOS0xMSI+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0iYWRkIj5Jbml0aWFsIFJlbGVhc2U8L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2pzbC94ZG9jcy9pbmRleC54bWwgYi9qZWxseS10YWdzL2pzbC94ZG9jcy9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZDIwNjguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qc2wveGRvY3MvaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+SlNMIFRhZyBMaWJyYXJ5PC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0KLSAgPGJvZHk+Ci0gICAgPHNlY3Rpb24gbmFtZT0iT3ZlcnZpZXciPgotICAgICAgPHA+Ci0gICAgICAgIFRoZSBKU0wgdGFnIGxpYnJhcnkgaW1wbGVtZW50cyBhbiBYU0xULWxpa2UgZGVjbGFyYXRpdmUgWE1MIGJhc2VkIHByb2Nlc3NpbmcgZW5naW5lIHdoaWNoIGFsbG93cyAKLSAgICAgICAgZHluYW1pYyBzdHlsZXNoZWV0cyBhbmQgYSBmcmVlIG1peCBhbmQgbWF0Y2ggb2YgYWxsIEplbGx5IHRhZ3Mgd2l0aGluIHRoZSBzY3JpcHQuCi0gICAgICAgIDwvcD4KLSAgICAgICAgPHA+Ci0gICAgICAgICAgVGhlIEpTTCB0YWcgbGlicmFyeSByZWxpZXMgb24gdGhlIFhNTCB0YWdzIGluIEpTVEwgdG8gZG8gbW9zdCBvZiBpdHMgd29yaywgc28gSlNMIGp1c3QgcHJvdmlkZXMKLSAgICAgICAgICB0aGUgZGVjbGFyYXRpdmUgWE1MIHByb2Nlc3NpbmcgdmlhICZsdDtqc2w6c3R5bGVzaGVldCZndDssICZsdDtqc2w6dGVtcGxhdGUmZ3Q7IGFuZCAgJmx0O2pzbDphcHBseVRlbXBsYXRlcyZndDsKLSAgICAgIDwvcD4KLSAgICAgICAgPHA+Ci0gICAgICAgIFNlZSB0aGUgPGEgaHJlZj0idGFncy5odG1sIj50YWdzPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvanNsL3hkb2NzL25hdmlnYXRpb24ueG1sIGIvamVsbHktdGFncy9qc2wveGRvY3MvbmF2aWdhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNWU3YjIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qc2wveGRvY3MvbmF2aWdhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IG5hbWU9IkpTTCBUYWcgTGlicmFyeSI+Ci0KLSAgPHRpdGxlPkpTTCBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gIAotICA8Ym9keT4KLSAgICA8bWVudSBuYW1lPSJKU0wgVGFnIExpYnJhcnkiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgICAgICAgICAgIGhyZWY9Ii9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJUYWdzIiAgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZ3MuaHRtbCIvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qdW5pdC8uY3ZzaWdub3JlIGIvamVsbHktdGFncy9qdW5pdC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGI0OGIzLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvanVuaXQvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotdGFyZ2V0Ci1tYXZlbi5sb2cKLWxpYgotdmVsb2NpdHkubG9nCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2p1bml0L2J1aWxkLnhtbCBiL2plbGx5LXRhZ3MvanVuaXQvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmZlODMwLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvanVuaXQvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS1idWlsZC54bWwgZ2VuZXJhdGVkIGJ5IG1hdmVuIGZyb20gcHJvamVjdC54bWwgdmVyc2lvbiAxLjAtU05BUFNIT1QKLSAgb24gZGF0ZSBNYXkgMjQgMjAwNCwgdGltZSAyMzAwLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXIiIG5hbWU9ImNvbW1vbnMtamVsbHktdGFncy1qdW5pdCIgYmFzZWRpcj0iLiI+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkZWZhdWx0dGFyZ2V0ZGlyIiB2YWx1ZT0idGFyZ2V0Ij4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYmRpciIgdmFsdWU9InRhcmdldC9saWIiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC9jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cmVwb3J0ZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtcmVwb3J0cyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0ZGlyIiB2YWx1ZT0iZGlzdCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jZGlyIiB2YWx1ZT0iZGlzdC9kb2NzL2FwaSI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJmaW5hbC5uYW1lIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLWp1bml0LTEuMC1TTkFQU0hPVCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVzY3JpcHRpb249Im8gSW5pdGlhbGl6ZXMgc29tZSBwcm9wZXJ0aWVzIj4KLSAgICA8bWtkaXIgZGlyPSIke2xpYmRpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibm9nZXQiPgotICAgICAgPGVxdWFscyBhcmcyPSJvbmx5IiBhcmcxPSIke2J1aWxkLnN5c2NsYXNzcGF0aH0iPgotICAgICAgPC9lcXVhbHM+Ci0gICAgPC9jb25kaXRpb24+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJvIENvbXBpbGUgdGhlIGNvZGUiIGRlcGVuZHM9ImdldC1kZXBzIj4KLSAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqYXZhYyBkZXN0ZGlyPSIke2NsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy9qYXZhIj4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0gICAgPGNvcHkgdG9kaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvamF2YSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gICAgPGNvcHkgdG9kaXI9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmplbGx5Ij4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54c2wiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucm5nIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmR0ZCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmh0bWwiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJqYXIiIGRlc2NyaXB0aW9uPSJvIENyZWF0ZSB0aGUgamFyIiBkZXBlbmRzPSJjb21waWxlLHRlc3QiPgotICAgIDxqYXIgamFyZmlsZT0idGFyZ2V0LyR7ZmluYWwubmFtZX0uamFyIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIiBiYXNlZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICA8L2phcj4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJvIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZGlyZWN0b3JpZXMiPgotICAgIDxkZWxldGUgZGlyPSIke2RlZmF1bHR0YXJnZXRkaXJ9Ij4KLSAgICA8L2RlbGV0ZT4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlc2NyaXB0aW9uPSJvIENyZWF0ZSBhIGRpc3RyaWJ1dGlvbiIgZGVwZW5kcz0iamFyLCBqYXZhZG9jIj4KLSAgICA8bWtkaXIgZGlyPSJkaXN0Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb3B5IHRvZGlyPSJkaXN0Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSIgaW5jbHVkZXM9IiouamFyIj4KLSAgICAgIDwvZmlsZXNldD4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZXM9IkxJQ0VOU0UqLCBSRUFETUUqIj4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlc2NyaXB0aW9uPSJvIFJ1biB0aGUgdGVzdCBjYXNlcyIgaWY9InRlc3QuZmFpbHVyZSIgZGVwZW5kcz0iaW50ZXJuYWwtdGVzdCI+Ci0gICAgPGZhaWwgbWVzc2FnZT0iVGhlcmUgd2VyZSB0ZXN0IGZhaWx1cmVzLiI+Ci0gICAgPC9mYWlsPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJpbnRlcm5hbC10ZXN0IiBkZXBlbmRzPSJjb21waWxlLXRlc3RzIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3RyZXBvcnRkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqdW5pdCBkaXI9Ii4vIiBmYWlsdXJlcHJvcGVydHk9InRlc3QuZmFpbHVyZSIgcHJpbnRTdW1tYXJ5PSJ5ZXMiIGZvcms9InRydWUiIGhhbHRvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImJhc2VkaXIiIHZhbHVlPSIuIj4KLSAgICAgIDwvc3lzcHJvcGVydHk+Ci0gICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxmb3JtYXR0ZXIgdXNlZmlsZT0iZmFsc2UiIHR5cGU9InBsYWluIj4KLSAgICAgIDwvZm9ybWF0dGVyPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICA8YmF0Y2h0ZXN0IHRvZGlyPSIke3Rlc3RyZXBvcnRkaXJ9Ij4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovVGVzdCouamF2YSI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2JhdGNodGVzdD4KLSAgICA8L2p1bml0PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlLXRlc3RzIiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iIGRlcHJlY2F0aW9uPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSIgb3B0aW1pemU9ImZhbHNlIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIj4KLSAgICAgIDxzcmM+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL3Rlc3QiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9zcmM+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJqYXZhZG9jIiBkZXNjcmlwdGlvbj0ibyBHZW5lcmF0ZSBqYXZhZG9jIiBkZXBlbmRzPSJqYXIiPgotICAgIDxta2RpciBkaXI9IiR7amF2YWRvY2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPHRzdGFtcD4KLSAgICAgIDxmb3JtYXQgcGF0dGVybj0iMjAwMi15eXl5IiBwcm9wZXJ0eT0ieWVhciI+Ci0gICAgICA8L2Zvcm1hdD4KLSAgICA8L3RzdGFtcD4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29weXJpZ2h0IiB2YWx1ZT0iQ29weXJpZ2h0ICZhbXA7Y29weTsgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLiI+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgICA8cHJvcGVydHkgbmFtZT0idGl0bGUiIHZhbHVlPSJjb21tb25zLWplbGx5LXRhZ3MtanVuaXQgMS4wLVNOQVBTSE9UIEFQSSI+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgICA8amF2YWRvYyB1c2U9InRydWUiIHByaXZhdGU9InRydWUiIGRlc3RkaXI9IiR7amF2YWRvY2Rpcn0iIGF1dGhvcj0idHJ1ZSIgdmVyc2lvbj0idHJ1ZSIgc291cmNlcGF0aD0ic3JjL2phdmEiIHBhY2thZ2VuYW1lcz0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuanVuaXQuKiI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFkb2M+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImdldC1kZXBzIiB1bmxlc3M9Im5vZ2V0IiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2p1bml0LTMuOC4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qdW5pdC9qYXJzL2p1bml0LTMuOC4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1jbGktU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtY2xpL2phcnMvY29tbW9ucy1jbGktU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamV4bC9qYXJzL2NvbW1vbnMtamV4bC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3htbC1hcGlzLTEuMC5iMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veG1sLWFwaXMvamFycy94bWwtYXBpcy0xLjAuYjIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWJlYW51dGlscy0xLjYuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtYmVhbnV0aWxzL2phcnMvY29tbW9ucy1iZWFudXRpbHMtMS42LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtY29sbGVjdGlvbnMvamFycy9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1sb2dnaW5nL2phcnMvY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vZG9tNGotMS41LWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vZG9tNGovamFycy9kb200ai0xLjUtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vamF4ZW4tMS4xLWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vamF4ZW4vamFycy9qYXhlbi0xLjEtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veGVyY2VzLTIuMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94ZXJjZXMvamFycy94ZXJjZXMtMi4yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qdW5pdC0zLjguMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vanVuaXQvamFycy9qdW5pdC0zLjguMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FudC0xLjUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC0xLjUuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtb3B0aW9uYWwtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtb3B0aW9uYWwtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtbWF2ZW4iPgotICAgIDxnZXQgZGVzdD0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBzcmM9IiR7cmVwb30vbWF2ZW4vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8dW5qYXIgZGVzdD0iJHttYXZlbi5ob21lfSIgc3JjPSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L3VuamFyPgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2p1bml0L21hdmVuLnhtbCBiL2plbGx5LXRhZ3MvanVuaXQvbWF2ZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWFmODYxLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvanVuaXQvbWF2ZW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImphdmE6amFyIj4KLQotICA8IS0tIGRlZmluZSB0aGUgY2xhc3NwYXRoIHVzZWQgdG8gcnVuIGV4YW1wbGVzIC0tPgotICA8Z29hbCBuYW1lPSJjcmVhdGUtY2xhc3NwYXRoIiBwcmVyZXFzPSJqYXZhOmNvbXBpbGUsdGVzdDpjb21waWxlIj4KLSAgICAgICAgPHBhdGggaWQ9InRlc3QuY2xhc3NwYXRoIj4KLSAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke21hdmVuLmJ1aWxkLmRlc3R9Ii8+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0idGFyZ2V0L2NsYXNzZXMiLz4KLSAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIi8+Ci0gICAgICAgICAgICA8cGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiLz4KLSAgICAgICAgPC9wYXRoPgotICA8L2dvYWw+Ci0KLSAgICA8IS0tIGRlbW8gLS0+Ci0gIDxnb2FsIG5hbWU9ImRlbW8iIHByZXJlcXM9ImNyZWF0ZS1jbGFzc3BhdGgiCi0gICAgICAgIGRlc2NyaXB0aW9uPSJSdW5zIGEgc2FtcGxlIEpVbml0IHRlc3Qgc3VpdGUgdmlhIEplbGx5Ij4KLQotICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5IiBmb3JrPSJ5ZXMiPgotICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KLSAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L3J1blN1aXRlLmplbGx5Ii8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJodHRwLnByb3h5SG9zdCIgdmFsdWU9IiR7bWF2ZW4ucHJveHkuaG9zdH0iLz4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9Imh0dHAucHJveHlQb3J0IiB2YWx1ZT0iJHttYXZlbi5wcm94eS5wb3J0fSIvPgotICAgIDwvamF2YT4KLSAgPC9nb2FsPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2p1bml0L3Byb2plY3QucHJvcGVydGllcyBiL2plbGx5LXRhZ3MvanVuaXQvcHJvamVjdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2M2YThhLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvanVuaXQvcHJvamVjdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMgCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qdW5pdC9wcm9qZWN0LnhtbCBiL2plbGx5LXRhZ3MvanVuaXQvcHJvamVjdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczODlmYjguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qdW5pdC9wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3Q+Ci0gIDxleHRlbmQ+JHtiYXNlZGlyfS8uLi90YWctcHJvamVjdC54bWw8L2V4dGVuZD4KLSAgPGlkPmNvbW1vbnMtamVsbHktdGFncy1qdW5pdDwvaWQ+Ci0gIDxuYW1lPmNvbW1vbnMtamVsbHktdGFncy1qdW5pdDwvbmFtZT4KLSAgPGN1cnJlbnRWZXJzaW9uPjEuMDwvY3VycmVudFZlcnNpb24+Ci0KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuanVuaXQ8L3BhY2thZ2U+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICAgICAgIFRoZSBKZWxseSBKVW5pdCBUYWcgTGlicmFyeQotICA8L2Rlc2NyaXB0aW9uPgotICA8c2hvcnREZXNjcmlwdGlvbj5Db21tb25zIEplbGx5IEpVbml0IFRhZyBMaWJyYXJ5PC9zaG9ydERlc2NyaXB0aW9uPgotICAKLSAgPHZlcnNpb25zPgotICAgIDx2ZXJzaW9uPgotICAgICAgPGlkPjEuMDwvaWQ+Ci0gICAgICA8bmFtZT4xLjA8L25hbWU+Ci0gICAgICA8dGFnPkNPTU1PTlNfSkVMTFlfSlVOSVQtMV8wPC90YWc+Ci0gICAgPC92ZXJzaW9uPgotICA8L3ZlcnNpb25zPgotICAgIAotICA8ZGVwZW5kZW5jaWVzPgotICAKLSAgICA8IS0tIFNUQVJUIGZvciBjb21waWxhdGlvbiAtLT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5qdW5pdDwvaWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDx1cmw+aHR0cDovL3d3dy5qdW5pdC5vcmcvPC91cmw+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgICAgCi0gICAgPCEtLSBFTkQgZm9yIGNvbXBpbGF0aW9uIC0tPgotICAgIAotICAgIDwhLS0gU1RBUlQgZm9yIHJ1bm5pbmcgZGVtb3MgLS0+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5jb21tb25zLWNsaTwvaWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICA8IS0tIEVORCBmb3IgcnVubmluZyBkZW1vcyAtLT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qdW5pdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9Bc3NlcnRFcXVhbHNUYWcuamF2YSBiL2plbGx5LXRhZ3MvanVuaXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvQXNzZXJ0RXF1YWxzVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZWM0ZmEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qdW5pdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9Bc3NlcnRFcXVhbHNUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuanVuaXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5FeHByZXNzaW9uOwotCi0vKioKLSAqIENvbXBhcmVzIGFuIGFjdHVhbCBvYmplY3QgYWdhaW5zdCBhbiBleHBlY3RlZCBvYmplY3QgYW5kIGlmIHRoZXkgYXJlIGRpZmZlcmVudAotICogdGhlbiB0aGUgdGVzdCB3aWxsIGZhaWwuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICovCi1wdWJsaWMgY2xhc3MgQXNzZXJ0RXF1YWxzVGFnIGV4dGVuZHMgQXNzZXJ0VGFnU3VwcG9ydCB7Ci0KLSAgICBwcml2YXRlIEV4cHJlc3Npb24gYWN0dWFsOwotICAgIHByaXZhdGUgRXhwcmVzc2lvbiBleHBlY3RlZDsKLQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gZ2V0Qm9keVRleHQoKTsKLQotICAgICAgICBPYmplY3QgZXhwZWN0ZWRWYWx1ZSA9IGV4cGVjdGVkLmV2YWx1YXRlKGNvbnRleHQpOwotICAgICAgICBPYmplY3QgYWN0dWFsVmFsdWUgPSBhY3R1YWwuZXZhbHVhdGUoY29udGV4dCk7Ci0KLSAgICAgICAgaWYgKGV4cGVjdGVkVmFsdWUgPT0gbnVsbCAmJiBhY3R1YWxWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFjdHVhbFZhbHVlICE9IG51bGwgJiYgZXhwZWN0ZWRWYWx1ZS5lcXVhbHMoYWN0dWFsVmFsdWUpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbnMgPSAiXG5FeHBlY3RlZCBleHByZXNzaW9uOiAiCi0gICAgICAgICAgICArIGV4cGVjdGVkLmdldEV4cHJlc3Npb25UZXh0KCkKLSAgICAgICAgICAgICsgIlxuQWN0dWFsIGV4cHJlc3Npb246ICIKLSAgICAgICAgICAgICsgYWN0dWFsLmdldEV4cHJlc3Npb25UZXh0KCk7Ci0KLSAgICAgICAgZmFpbE5vdEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZFZhbHVlLCBhY3R1YWxWYWx1ZSwgZXhwcmVzc2lvbnMpOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFjdHVhbCB2YWx1ZSB3aGljaCB3aWxsIGJlIGNvbXBhcmVkIGFnYWluc3QgdGhlCi0gICAgICogZXhwZWN0ZWQgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWN0dWFsKEV4cHJlc3Npb24gYWN0dWFsKSB7Ci0gICAgICAgIHRoaXMuYWN0dWFsID0gYWN0dWFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGV4cGVjdGVkIHZhbHVlIHRvIGJlIHRlc3RlZCBhZ2FpbnN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWQoRXhwcmVzc2lvbiBleHBlY3RlZCkgewotICAgICAgICB0aGlzLmV4cGVjdGVkID0gZXhwZWN0ZWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qdW5pdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9Bc3NlcnRUYWcuamF2YSBiL2plbGx5LXRhZ3MvanVuaXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvQXNzZXJ0VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZGVmYzcuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qdW5pdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9Bc3NlcnRUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuanVuaXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5FeHByZXNzaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuamF4ZW4uSmF4ZW5FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmpheGVuLlhQYXRoOwotCi0vKioKLSAqIFBlcmZvcm1zIGFuIGFzc2VydGlvbiB0aGF0IGEgZ2l2ZW4gYm9vbGVhbiBleHByZXNzaW9uLCBvciBYUGF0aCBleHByZXNzaW9uIGlzCi0gKiB0cnVlLiBJZiB0aGUgZXhwcmVzc2lvbiByZXR1cm5zIGZhbHNlIHRoZW4gdGhpcyB0ZXN0IGZhaWxzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIEFzc2VydFRhZyBleHRlbmRzIEFzc2VydFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFzc2VydFRhZy5jbGFzcyk7Ci0KLSAgICAvKiogVGhlIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuICovCi0gICAgcHJpdmF0ZSBFeHByZXNzaW9uIHRlc3Q7Ci0KLSAgICAvKiogVGhlIFhQYXRoIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUgKi8KLSAgICBwcml2YXRlIFhQYXRoIHhwYXRoOwotCi0gICAgcHVibGljIEFzc2VydFRhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRlc3QgPT0gbnVsbCAmJiB4cGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiggInRlc3QiICk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCEgdGVzdC5ldmFsdWF0ZUFzQm9vbGVhbihjb250ZXh0KSkgewotICAgICAgICAgICAgICAgIGZhaWwoIGdldEJvZHlUZXh0KCksICJldmFsdWF0aW5nIHRlc3Q6ICIrIHRlc3QuZ2V0RXhwcmVzc2lvblRleHQoKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgT2JqZWN0IHhwYXRoQ29udGV4dCA9IGdldFhQYXRoQ29udGV4dCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoISB4cGF0aC5ib29sZWFuVmFsdWVPZih4cGF0aENvbnRleHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIGdldEJvZHlUZXh0KCksICJldmFsdWF0aW5nIHhwYXRoOiAiKyB4cGF0aCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChKYXhlbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBib29sZWFuIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuIElmIHRoaXMgZXhwcmVzc2lvbiByZXR1cm5zIHRydWUKLSAgICAgKiB0aGVuIHRoZSB0ZXN0IHN1Y2NlZWRzIG90aGVyd2lzZSBpZiBpdCByZXR1cm5zIGZhbHNlIHRoZW4gdGhlIHRleHQgd2lsbAotICAgICAqIGZhaWwgd2l0aCB0aGUgY29udGVudCBvZiB0aGUgdGFnIGJlaW5nIHRoZSBlcnJvciBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRlc3QoRXhwcmVzc2lvbiB0ZXN0KSB7Ci0gICAgICAgIHRoaXMudGVzdCA9IHRlc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYm9vbGVhbiBYUGF0aCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLiBJZiB0aGlzIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlCi0gICAgICogdGhlbiB0aGUgdGVzdCBzdWNjZWVkcyBvdGhlcndpc2UgaWYgaXQgcmV0dXJucyBmYWxzZSB0aGVuIHRoZSB0ZXh0IHdpbGwKLSAgICAgKiBmYWlsIHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIHRhZyBiZWluZyB0aGUgZXJyb3IgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRYcGF0aChYUGF0aCB4cGF0aCkgewotICAgICAgICB0aGlzLnhwYXRoID0geHBhdGg7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qdW5pdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9Bc3NlcnRUYWdTdXBwb3J0LmphdmEgYi9qZWxseS10YWdzL2p1bml0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0Fzc2VydFRhZ1N1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE5MDc1Mi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2p1bml0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0Fzc2VydFRhZ1N1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuanVuaXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkueHBhdGguWFBhdGhUYWdTdXBwb3J0OwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIG9mIGFueSBhc3NlcnRpb24gdGFnIHdoaWNoIGlzCi0gKiB1c2VmdWwgZm9yIGltcGxlbWVudGF0aW9uIGluaGVyaXRlbmNlLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFzc2VydFRhZ1N1cHBvcnQgZXh0ZW5kcyBYUGF0aFRhZ1N1cHBvcnQgewotCi0gICAgcHVibGljIEFzc2VydFRhZ1N1cHBvcnQoKSB7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogUHJvZHVjZXMgYSBmYWlsdXJlIGFzc2VydGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmFpbChTdHJpbmcgbWVzc2FnZSkgdGhyb3dzIEplbGx5QXNzZXJ0aW9uRmFpbGVkRXJyb3IgewotICAgICAgICB0aHJvdyBuZXcgSmVsbHlBc3NlcnRpb25GYWlsZWRFcnJvcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9kdWNlcyBhIGZhaWx1cmUgYXNzZXJ0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGFkZGVkIGRldGFpbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmYWlsKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZGV0YWlsKSB0aHJvd3MgSmVsbHlBc3NlcnRpb25GYWlsZWRFcnJvciB7Ci0gICAgICAgIGlmIChtZXNzYWdlID09IG51bGwgfHwgbWVzc2FnZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBmYWlsKGRldGFpbCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmYWlsKG1lc3NhZ2UgKyAiLiBBc3NlcnRpb24gZmFpbGVkIHdoaWxlICIgKyBkZXRhaWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvZHVjZXMgYSBmYWlsdXJlIGlmIHRoZSBhY3R1YWwgdmFsdWUgd2FzIG5vdCBlcXVhbCB0byB0aGUgZXhwZWN0ZWQgdmFsdWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmYWlsTm90RXF1YWxzKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZXhwZWN0ZWQsIE9iamVjdCBhY3R1YWwsIFN0cmluZyBleHByZXNzaW9ucykgdGhyb3dzIEplbGx5QXNzZXJ0aW9uRmFpbGVkRXJyb3IgewotICAgICAgICBTdHJpbmcgZm9ybWF0dGVkPSAiIjsKLSAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9ybWF0dGVkID0gbWVzc2FnZSArIiAiOwotICAgICAgICB9Ci0gICAgICAgIGZhaWwoZm9ybWF0dGVkICsgImV4cGVjdGVkOlsiICsgZXhwZWN0ZWQgKyAiXSBidXQgd2FzOlsiICsgYWN0dWFsICsgIl0iICsgZXhwcmVzc2lvbnMpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qdW5pdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9Bc3NlcnRUaHJvd3NUYWcuamF2YSBiL2plbGx5LXRhZ3MvanVuaXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvQXNzZXJ0VGhyb3dzVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMjVhM2QuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qdW5pdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9Bc3NlcnRUaHJvd3NUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmp1bml0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS51dGlsLkNsYXNzTG9hZGVyVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogUnVucyBpdHMgYm9keSBhbmQgYXNzZXJ0cyB0aGF0IGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgaXQuICBJZiBubwotICogZXhjZXB0aW9uIGlzIHRocm93biB0aGUgdGFnIGZhaWxzLiAgQnkgZGVmYXVsdCBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0LgotICogSWYgaG93ZXZlciA8Y29kZT5leHBlY3RlZDwvY29kZT4gd2FzIHNwZWNpZmllZCB0aGUgYm9keSBtdXN0IHRocm93Ci0gKiBhbiBleGNlcHRpb24gb2YgdGhlIGdpdmVuIGNsYXNzLCBvdGhlcndpc2UgdGhlIGFzc2VydGlvbiBmYWlscy4gIFRoZQotICogZXhjZXB0aW9uIHRocm93biBieSB0aGUgYm9keSBjYW4gYWxzbyBiZSBvZiBhbnkgc3VidHlwZSBvZiB0aGUgc3BlY2lmaWVkCi0gKiBleGNlcHRpb24gY2xhc3MuICBUaGUgb3B0aW9uYWwgPGNvZGU+dmFyPC9jb2RlPiBhdHRyaWJ1dGUgY2FuIGJlIHNwZWNpZmllZCBpZgotICogdGhlIGNhdWdodCBleGNlcHRpb24gaXMgdG8gYmUgZXhwb3J0ZWQgdG8gYSB2YXJpYWJsZS4KLSAqLwotcHVibGljIGNsYXNzIEFzc2VydFRocm93c1RhZyBleHRlbmRzIEFzc2VydFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFzc2VydFRocm93c1RhZy5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdmFyaWFibGUgbmFtZSB0byBleHBvcnQgdGhlIGNhdWdodCBleGNlcHRpb24gdG8uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNsYXNzIG5hbWUgKGZ1bGx5IHF1YWxpZmllZCkgb2YgdGhlIGV4Y2VwdGlvbiBleHBlY3RlZCB0byBiZSB0aHJvd24KLSAgICAgKiBieSB0aGUgYm9keS4gIEFsc28gYSBzdXBlcmNsYXNzIG9mIHRoZSBleHBlY3RlZCBleGNlcHRpb24gY2FuIGJlIGdpdmVuLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGV4cGVjdGVkOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgQ2xhc3NMb2FkZXIgdG8gYmUgdXNlZCB3aGVuIGxvYWRpbmcgYW4gZXhjZXB0aW9uIGNsYXNzCi0gICAgICovCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBDbGFzcyB0aHJvd2FibGVDbGFzcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgdGhyb3dhYmxlQ2xhc3MgPSBnZXRUaHJvd2FibGVDbGFzcygpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEplbGx5RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgLy8gdW53cmFwIEplbGx5IGV4Y2VwdGlvbnMgd2hpY2ggd3JhcCBvdGhlciBleGNlcHRpb25zCi0gICAgICAgICAgICAgICAgSmVsbHlFeGNlcHRpb24gamUgPSAoSmVsbHlFeGNlcHRpb24pIHQ7Ci0gICAgICAgICAgICAgICAgaWYgKGplLmdldENhdXNlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0ID0gamUuZ2V0Q2F1c2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmFyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhciwgdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhyb3dhYmxlQ2xhc3MgIT0gbnVsbCAmJiAhdGhyb3dhYmxlQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0LmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb246ICIgKyB0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmYWlsKCJObyBleGNlcHRpb24gd2FzIHRocm93bi4iKTsKLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2xhc3MgbmFtZSBvZiBleGNlcHRpb24gZXhwZWN0ZWQgdG8gYmUgdGhyb3duIGJ5IHRoZSBib2R5LiAgVGhlCi0gICAgICogY2xhc3MgbmFtZSBtdXN0IGJlIGZ1bGx5IHF1YWxpZmllZCBhbmQgY2FuIGVpdGhlciBiZSB0aGUgZXhwZWN0ZWQKLSAgICAgKiBleGNlcHRpb24gY2xhc3MgaXRzZWxmIG9yIGFueSBzdXBlcnR5cGUgb2YgaXQsIGJ1dCBtdXN0IGJlIGEgc3VidHlwZSBvZgotICAgICAqIDxjb2RlPmphdmEubGFuZy5UaHJvd2FibGU8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4cGVjdGVkKFN0cmluZyBleHBlY3RlZCkgewotICAgICAgICB0aGlzLmV4cGVjdGVkID0gZXhwZWN0ZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFyaWFibGUgbmFtZSB0byBkZWZpbmUgZm9yIHRoaXMgZXhwcmVzc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjbGFzcyBsb2FkZXIgdG8gYmUgdXNlZCB0byBsb2FkIHRoZSBleGNlcHRpb24gdHlwZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7Ci0gICAgICAgIHJldHVybiBDbGFzc0xvYWRlclV0aWxzLmdldENsYXNzTG9hZGVyKGNsYXNzTG9hZGVyLCBnZXRDb250ZXh0KCkuZ2V0VXNlQ29udGV4dENsYXNzTG9hZGVyKCksIGdldENsYXNzKCkpOwotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIDxjb2RlPkNsYXNzPC9jb2RlPiBjb3JyZXNwb25kaW5nIHRvIHRoZSBjbGFzcwotICAgICAqIHNwZWNpZmllZCBieSA8Y29kZT5leHBlY3RlZDwvY29kZT4uIElmCi0gICAgICogPGNvZGU+ZXhwZWN0ZWQ8L2NvZGU+IHdhcyBlaXRoZXIgbm90IHNwZWNpZmllZCB0aGVuIDxjb2RlPmphdmEuIGxhbmcuCi0gICAgICogVGhyb3dhYmxlPC9jb2RlPiBpcyByZXR1cm5lZC4KLSAgICAgKiBPdGhlcndpc2UgaWYgdGhlIGNsYXNzIGNvdWxkbid0IGJlCi0gICAgICogZm91bmQgb3IgZG9lc24ndCBkZW5vdGUgYW4gZXhjZXB0aW9uIGNsYXNzIHRoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQ2xhc3MgVGhlIGNsYXNzIG9mIHRoZSBleGNlcHRpb24gdG8gZXhwZWN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIENsYXNzIGdldFRocm93YWJsZUNsYXNzKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpZiAoZXhwZWN0ZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIFRocm93YWJsZS5jbGFzczsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzIHRocm93YWJsZUNsYXNzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRocm93YWJsZUNsYXNzID0gZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoZXhwZWN0ZWQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGhyb3dhYmxlQ2xhc3MgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhleHBlY3RlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgIGxvZy53YXJuKCAiQ291bGQgbm90IGZpbmQgZXhjZXB0aW9uIGNsYXNzOiAiICsgZXhwZWN0ZWQgKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFUaHJvd2FibGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0aHJvd2FibGVDbGFzcykpIHsKLSAgICAgICAgICAgIGxvZy53YXJuKCAiVGhlIGNsYXNzOiAiICsgZXhwZWN0ZWQgKyAiIGlzIG5vdCBhbiBFeGNlcHRpb24gY2xhc3MuIik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhyb3dhYmxlQ2xhc3M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qdW5pdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9DYXNlVGFnLmphdmEgYi9qZWxseS10YWdzL2p1bml0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0Nhc2VUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhmODVhYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2p1bml0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0Nhc2VUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBzaW5nbGUgdGVzdCBjYXNlIGluIGEgdGVzdCBzdWl0ZTsgdGhpcyB0YWcgaXMgYW5hbGFnb3VzIHRvCi0gKiBKVW5pdCdzIFRlc3RDYXNlIGNsYXNzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIENhc2VUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhmaW5hbCBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLSAgICAgICAgaWYgKCBuYW1lID09IG51bGwgKSB7Ci0gICAgICAgICAgICBuYW1lID0gdG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vICMjIyMgd2UgbmVlZCB0byByZWRpcmVjdCB0aGUgb3V0cHV0IHRvIGEgVGVzdExpc3RlbmVyCi0gICAgICAgIC8vIG9yIHNvbWV0aGluZz8KLSAgICAgICAgVGVzdENhc2UgdGVzdENhc2UgPSBuZXcgVGVzdENhc2UobmFtZSkgewotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBjaGlsZCBjb250ZXh0IHNvIHRoYXQgZWFjaCB0ZXN0IGNhc2UKLSAgICAgICAgICAgICAgICAvLyB3aWxsIGhhdmUgaXRzIG93biB2YXJpYWJsZSBzY29wZXMKLSAgICAgICAgICAgICAgICBKZWxseUNvbnRleHQgbmV3Q29udGV4dCA9IG5ldyBKZWxseUNvbnRleHQoIGNvbnRleHQgKTsKLQotICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgaW5oZXJpdGVuY2Ugb2YgdmFyaWFibGVzIGFuZCB0YWcgbGlicmFyaWVzCi0gICAgICAgICAgICAgICAgbmV3Q29udGV4dC5zZXRFeHBvcnRMaWJyYXJpZXMoZmFsc2UpOwotICAgICAgICAgICAgICAgIG5ld0NvbnRleHQuc2V0RXhwb3J0KGZhbHNlKTsKLQotICAgICAgICAgICAgICAgIC8vIGludm9rZSB0aGUgdGVzdCBjYXNlCi0gICAgICAgICAgICAgICAgZ2V0Qm9keSgpLnJ1bihuZXdDb250ZXh0LCBvdXRwdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIC8vIGxldHMgZmluZCB0aGUgdGVzdCBzdWl0ZQotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBnZXRTdWl0ZSgpOwotICAgICAgICBpZiAoIHN1aXRlID09IG51bGwgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICJDb3VsZCBub3QgZmluZCBhIFRlc3RTdWl0ZSB0byBhZGQgdGhpcyB0ZXN0IHRvLiBUaGlzIHRhZyBzaG91bGQgYmUgaW5zaWRlIGEgPHRlc3Q6c3VpdGU+IHRhZyIgKTsKLSAgICAgICAgfQotICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RDYXNlKTsKLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFN0cmF0ZWd5IG1ldGhvZCB0byBmaW5kIHRoZSBjb3JyZW50IFRlc3RTdWl0ZSB0byBhZGQgYSBuZXcgVGVzdCBjYXNlIHRvCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRlc3RTdWl0ZSBnZXRTdWl0ZSgpIHsKLSAgICAgICAgU3VpdGVUYWcgdGFnID0gKFN1aXRlVGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoIFN1aXRlVGFnLmNsYXNzICk7Ci0gICAgICAgIGlmICggdGFnICE9IG51bGwgKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGFnLmdldFN1aXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChUZXN0U3VpdGUpIGNvbnRleHQuZ2V0VmFyaWFibGUoICJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuanVuaXQuc3VpdGUiICk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2p1bml0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0ZhaWxUYWcuamF2YSBiL2plbGx5LXRhZ3MvanVuaXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvRmFpbFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTU1ZDJhLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvanVuaXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvRmFpbFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qdW5pdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKioKLSAqIFRoaXMgdGFnIGNhdXNlcyBhIGZhaWx1cmUgbWVzc2FnZS4gVGhlIG1lc3NhZ2UgY2FuIGVpdGhlcgotICogYmUgc3BlY2lmaWVkIGluIHRoZSB0YWdzIGJvZHkgb3IgdmlhIHRoZSBtZXNzYWdlIGF0dHJpYnV0ZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBGYWlsVGFnIGV4dGVuZHMgQXNzZXJ0VGFnU3VwcG9ydCB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotCi0gICAgcHVibGljIEZhaWxUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gZ2V0TWVzc2FnZSgpOwotICAgICAgICBpZiAoIG1lc3NhZ2UgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIG1lc3NhZ2UgPSBnZXRCb2R5VGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIGZhaWwoIG1lc3NhZ2UgKTsKLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBmYWlsdXJlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmFpbHVyZSBtZXNzYWdlLiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkIHRoZW4gdGhlCi0gICAgICogYm9keSBvZiB0aGlzIHRhZyB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qdW5pdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9KVW5pdFRhZ0xpYnJhcnkuamF2YSBiL2plbGx5LXRhZ3MvanVuaXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvSlVuaXRUYWdMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NzkyNWIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qdW5pdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9KVW5pdFRhZ0xpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuanVuaXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnTGlicmFyeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnTGlicmFyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkV4cHJlc3Npb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLlRhZ1NjcmlwdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi54cGF0aC5YUGF0aEV4cHJlc3Npb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5qYXhlbi5KYXhlbkV4Y2VwdGlvbjsKLQotLyoqIERlc2NyaWJlcyB0aGUgVGFnbGliLiBUaGlzIGNsYXNzIGNvdWxkIGJlIGdlbmVyYXRlZCBieSBYRG9jbGV0Ci0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICAqLwotcHVibGljIGNsYXNzIEpVbml0VGFnTGlicmFyeSBleHRlbmRzIFRhZ0xpYnJhcnkgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSlVuaXRUYWdMaWJyYXJ5LmNsYXNzKTsKLQotICAgIHB1YmxpYyBKVW5pdFRhZ0xpYnJhcnkoKSB7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJhc3NlcnQiLCBBc3NlcnRUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygiYXNzZXJ0RXF1YWxzIiwgQXNzZXJ0RXF1YWxzVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImFzc2VydFRocm93cyIsIEFzc2VydFRocm93c1RhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJmYWlsIiwgRmFpbFRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJydW4iLCBSdW5UYWcuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImNhc2UiLCBDYXNlVGFnLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJzdWl0ZSIsIFN1aXRlVGFnLmNsYXNzICk7Ci0gICAgfQotCi0gICAgcHVibGljIEV4cHJlc3Npb24gY3JlYXRlRXhwcmVzc2lvbigKLSAgICAgICAgRXhwcmVzc2lvbkZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgVGFnU2NyaXB0IHRhZ1NjcmlwdCwKLSAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsCi0gICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLQotICAgICAgICAvLyAjIyMjIG1heSBuZWVkIHRvIGluY2x1ZGUgc29tZSBuYW1lc3BhY2UgVVJJIGluZm9ybWF0aW9uIGluIHRoZSBYUGF0aCBpbnN0YW5jZT8KLQotICAgICAgICBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoInhwYXRoIikpIHsKLSAgICAgICAgICAgIGlmICggbG9nLmlzRGVidWdFbmFibGVkKCkgKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCAiUGFyc2luZyBYUGF0aCBleHByZXNzaW9uOiAiICsgYXR0cmlidXRlVmFsdWUgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gWFBhdGggeHBhdGggPSBuZXcgRG9tNGpYUGF0aChhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICBFeHByZXNzaW9uIHhwYXRoRXhwciA9IHN1cGVyLmNyZWF0ZUV4cHJlc3Npb24oIGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdTY3JpcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgKTsKLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBYUGF0aEV4cHJlc3Npb24oYXR0cmlidXRlVmFsdWUsIHhwYXRoRXhwciwgdGFnU2NyaXB0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdpbGwgdXNlIHRoZSBkZWZhdWx0IGV4cHJlc3Npb24gaW5zdGVhZAotICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlRXhwcmVzc2lvbihmYWN0b3J5LCB0YWdTY3JpcHQsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2p1bml0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0plbGx5QXNzZXJ0aW9uRmFpbGVkRXJyb3IuamF2YSBiL2plbGx5LXRhZ3MvanVuaXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvSmVsbHlBc3NlcnRpb25GYWlsZWRFcnJvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTc5YWFlLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvanVuaXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvSmVsbHlBc3NlcnRpb25GYWlsZWRFcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qdW5pdDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5Mb2NhdGlvbkF3YXJlOwotCi0vKioKLSAqIDxwPjxjb2RlPkplbGx5QXNzZXJ0aW9uRmFpbGVkRXJyb3I8L2NvZGU+IGlzCi0gKiBhIEpVbml0IEFzc2VydGlvbkZhaWxlZEVycm9yIHdoaWNoIGlzIExvY2F0aW9uQXdhcmUgc28gdGhhdCBpdCBjYW4gaW5jbHVkZQotICogZGV0YWlscyBvZiB3aGVyZSBpbiB0aGUgSmVsbHlVbml0IHRlc3QgY2FzZSB0aGF0IHRoZSBmYWlsdXJlIG9jY3VycmVkLjwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gKi8KLQotcHVibGljIGNsYXNzIEplbGx5QXNzZXJ0aW9uRmFpbGVkRXJyb3IgZXh0ZW5kcyBBc3NlcnRpb25GYWlsZWRFcnJvciBpbXBsZW1lbnRzIExvY2F0aW9uQXdhcmUgewotCi0gICAgLyoqIHRoZSB1bmRlcmx5aW5nIGNhdXNlIG9mIHRoZSBleGNlcHRpb24gKi8KLSAgICBwcml2YXRlIFRocm93YWJsZSBjYXVzZTsKLQotICAgIC8qKiB0aGUgSmVsbHkgZmlsZSB3aGljaCBjYXVzZWQgdGhlIHByb2JsZW0gKi8KLSAgICBwcml2YXRlIFN0cmluZyBmaWxlTmFtZTsKLQotICAgIC8qKiB0aGUgdGFnIG5hbWUgd2hpY2ggY2F1c2VkIHRoZSBwcm9ibGVtICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZWxlbWVudE5hbWU7Ci0KLSAgICAvKiogdGhlIGxpbmUgbnVtYmVyIGluIHRoZSBzY3JpcHQgb2YgdGhlIGVycm9yICovCi0gICAgcHJpdmF0ZSBpbnQgbGluZU51bWJlciA9IC0xOwotCi0gICAgLyoqIHRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBzY3JpcHQgb2YgdGhlIGVycm9yICovCi0gICAgcHJpdmF0ZSBpbnQgY29sdW1uTnVtYmVyID0gLTE7Ci0KLSAgICBwdWJsaWMgSmVsbHlBc3NlcnRpb25GYWlsZWRFcnJvcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmVsbHlBc3NlcnRpb25GYWlsZWRFcnJvcihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmVsbHlBc3NlcnRpb25GYWlsZWRFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgICAgICB0aGlzLmNhdXNlID0gY2F1c2U7Ci0gICAgfQotCi0gICAgcHVibGljIEplbGx5QXNzZXJ0aW9uRmFpbGVkRXJyb3IoVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIHRoaXMuY2F1c2UgPSBjYXVzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkgewotICAgICAgICByZXR1cm4gY2F1c2U7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgdGFnCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gbGluZU51bWJlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgdGFnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGluZU51bWJlcihpbnQgbGluZU51bWJlcikgewotICAgICAgICB0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIHRhZwotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gY29sdW1uTnVtYmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIHRhZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbk51bWJlcihpbnQgY29sdW1uTnVtYmVyKSB7Ci0gICAgICAgIHRoaXMuY29sdW1uTnVtYmVyID0gY29sdW1uTnVtYmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIEplbGx5IGZpbGUgd2hpY2ggY2F1c2VkIHRoZSBwcm9ibGVtCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEplbGx5IGZpbGUgd2hpY2ggY2F1c2VkIHRoZSBwcm9ibGVtCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0gICAgICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgbmFtZSB3aGljaCBjYXVzZWQgdGhlIHByb2JsZW0KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZWxlbWVudCBuYW1lIHdoaWNoIGNhdXNlZCB0aGUgcHJvYmxlbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnROYW1lKFN0cmluZyBlbGVtZW50TmFtZSkgewotICAgICAgICB0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlTmFtZSArICI6IiArIGxpbmVOdW1iZXIgKyAiOiIgKyBjb2x1bW5OdW1iZXIgKyAiOiA8IiArIGVsZW1lbnROYW1lICsgIj4gIiArIHN1cGVyLmdldE1lc3NhZ2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlYXNvbigpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKTsKLSAgICB9Ci0KLSAgICAvLyAjIyMjIG92ZXJsb2FkIHRoZSBwcmludFN0YWNrVHJhY2UgbWV0aG9kcy4uLgotICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFdyaXRlciBzKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAocykgewotICAgICAgICAgICAgc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotICAgICAgICAgICAgaWYgIChjYXVzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcy5wcmludGxuKCJSb290IGNhdXNlIik7Ci0gICAgICAgICAgICAgICAgY2F1c2UucHJpbnRTdGFja1RyYWNlKHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIHMpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChzKSB7Ci0gICAgICAgICAgICBzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7Ci0gICAgICAgICAgICBpZiAgKGNhdXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzLnByaW50bG4oIlJvb3QgY2F1c2UiKTsKLSAgICAgICAgICAgICAgICBjYXVzZS5wcmludFN0YWNrVHJhY2Uocyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7Ci0gICAgICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSb290IGNhdXNlIik7Ci0gICAgICAgICAgICBjYXVzZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvanVuaXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvSmVsbHlUZXN0U3VpdGUuamF2YSBiL2plbGx5LXRhZ3MvanVuaXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvSmVsbHlUZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM4Y2E2My4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2p1bml0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0plbGx5VGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmp1bml0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBjcmVhdGluZyBhIFRlc3RTdWl0ZSB2aWEgYSBKZWxseSBzY3JpcHQuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjQgJAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmVsbHlUZXN0U3VpdGUgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEplbGx5VGVzdFN1aXRlLmNsYXNzKTsKLQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZCB0byBjcmVhdGUgYSB0ZXN0IHN1aXRlIGZyb20gYSBmaWxlIG5hbWUgb24gdGhlIGNsYXNzIHBhdGgKLSAgICAgKiBpbiB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gY2xhc3MuCi0gICAgICogRm9yIGV4YW1wbGUgYSB0ZXN0IGNvdWxkIGNhbGwKLSAgICAgKiA8Y29kZT4KLSAgICAgKiBjcmVhdGVUZXN0U3VpdGUoIEZvby5jbGFzcywgInN1aXRlLmplbGx5IiApOwotICAgICAqIDwvY29kZT4KLSAgICAgKiB3aGljaCB3b3VsZCBsb2FhZCB0aGUgJ3N1aXRlLmplbGx5IHNjcmlwdCBmcm9tIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlIEZvbwotICAgICAqIGNsYXNzIG9uIHRoZSBjbGFzc3BhdGguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdENsYXNzIGlzIHRoZSB0ZXN0IGNsYXNzIHVzZWQgdG8gbG9hZCB0aGUgc2NyaXB0IHZpYSB0aGUgY2xhc3NwYXRoCi0gICAgICogQHBhcmFtIHNjcmlwdCBpcyB0aGUgbmFtZSBvZiB0aGUgc2NyaXB0LCB3aGljaCBpcyB0eXBpY2FsbHkganVzdCBhIG5hbWUsIG5vIGRpcmVjdG9yeS4KLSAgICAgKiBAcmV0dXJuIGEgbmV3bHkgY3JlYXRlZCBUZXN0U3VpdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBjcmVhdGVUZXN0U3VpdGUoQ2xhc3MgdGVzdENsYXNzLCBTdHJpbmcgc2NyaXB0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVVJMIHVybCA9IHRlc3RDbGFzcy5nZXRSZXNvdXJjZShzY3JpcHQpOwotICAgICAgICBpZiAoIHVybCA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgSmVsbHkgc2NyaXB0OiAiICsgc2NyaXB0Ci0gICAgICAgICAgICAgICAgKyAiIGluIHBhY2thZ2Ugb2YgY2xhc3M6ICIgKyB0ZXN0Q2xhc3MuZ2V0TmFtZSgpCi0gICAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjcmVhdGVUZXN0U3VpdGUoIHVybCApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdG8gY3JlYXRlIGEgdGVzdCBzdWl0ZSBmcm9tIHRoZSBnaXZlbiBKZWxseSBzY3JpcHQKLSAgICAgKgotICAgICAqIEBwYXJhbSBzY3JpcHQgaXMgdGhlIFVSTCB0byB0aGUgc2NyaXB0IHdoaWNoIHNob3VsZCBjcmVhdGUgYSBUZXN0U3VpdGUKLSAgICAgKiBAcmV0dXJuIGEgbmV3bHkgY3JlYXRlZCBUZXN0U3VpdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBjcmVhdGVUZXN0U3VpdGUoVVJMIHNjcmlwdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEplbGx5Q29udGV4dCBjb250ZXh0ID0gbmV3IEplbGx5Q29udGV4dChzY3JpcHQpOwotICAgICAgICBYTUxPdXRwdXQgb3V0cHV0ID0gWE1MT3V0cHV0LmNyZWF0ZVhNTE91dHB1dChTeXN0ZW0ub3V0KTsKLSAgICAgICAgY29udGV4dCA9IGNvbnRleHQucnVuU2NyaXB0KHNjcmlwdCwgb3V0cHV0KTsKLSAgICAgICAgVGVzdFN1aXRlIGFuc3dlciA9IChUZXN0U3VpdGUpIGNvbnRleHQuZ2V0VmFyaWFibGUoIm9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5qdW5pdC5zdWl0ZSIpOwotICAgICAgICBpZiAoIGFuc3dlciA9PSBudWxsICkgewotICAgICAgICAgICAgbG9nLndhcm4oICJDb3VsZCBub3QgZmluZCBhIFRlc3RTdWl0ZSBjcmVhdGVkIGJ5IEplbGx5IGZvciB0aGUgc2NyaXB0OiIgKyBzY3JpcHQgKTsKLSAgICAgICAgICAgIC8vIHJldHVybiBhbiBlbXB0eSB0ZXN0IHN1aXRlCi0gICAgICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbnN3ZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qdW5pdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9SdW5UYWcuamF2YSBiL2plbGx5LXRhZ3MvanVuaXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvUnVuVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NGFkZDUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qdW5pdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9SdW5UYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmp1bml0OwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdExpc3RlbmVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGw7Ci0KLS8qKgotICogVGhpcyB0YWcgd2lsbCBydW4gdGhlIGdpdmVuIFRlc3Qgd2hpY2ggY291bGQgYmUgYW4gaW5kaXZpZHVhbCBUZXN0Q2FzZSBvciBhIFRlc3RTdWl0ZS4KLSAqIFRoZSBUZXN0UmVzdWx0IGNhbiBiZSBzcGVjaWZpZWQgdG8gY2FwdHVyZSB0aGUgb3V0cHV0LCBvdGhlcndpc2UgdGhlIHJlc3VsdHMgYXJlIG91dHB1dAotICogYXMgWE1MIHNvIHRoYXQgdGhleSBjYW4gYmUgZm9ybWF0dGVkIGluIHNvbWUgY3VzdG9tIG1hbm5lci4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5UYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhSdW5UYWcuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBUZXN0IHRlc3Q7Ci0gICAgcHJpdmF0ZSBUZXN0UmVzdWx0IHJlc3VsdDsKLSAgICBwcml2YXRlIFRlc3RMaXN0ZW5lciBsaXN0ZW5lcjsKLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiwgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBUZXN0IHRlc3QgPSBnZXRUZXN0KCk7Ci0gICAgICAgIGlmICggdGVzdCA9PSBudWxsICkgewotICAgICAgICAgICAgdGVzdCA9IChUZXN0KSBjb250ZXh0LmdldFZhcmlhYmxlKCJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuanVuaXQuc3VpdGUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIHRlc3QgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCAidGVzdCIgKTsKLSAgICAgICAgfQotICAgICAgICBUZXN0UmVzdWx0IHJlc3VsdCA9IGdldFJlc3VsdCgpOwotICAgICAgICBpZiAoIHJlc3VsdCA9PSBudWxsICkgewotICAgICAgICAgICAgcmVzdWx0ID0gY3JlYXRlUmVzdWx0KG91dHB1dCk7Ci0gICAgICAgIH0KLSAgICAgICAgVGVzdExpc3RlbmVyIGxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoKTsKLSAgICAgICAgaWYgKCBsaXN0ZW5lciA9PSBudWxsICkgewotICAgICAgICAgICAgbGlzdGVuZXIgPSBjcmVhdGVUZXN0TGlzdGVuZXIob3V0cHV0KTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICB0ZXN0LnJ1bihyZXN1bHQpOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFRlc3RSZXN1bHQgdXNlZCB0byBjYXB0dXJlIHRoZSBvdXRwdXQgb2YgdGhlIHRlc3QuCi0gICAgICogQHJldHVybiBUZXN0UmVzdWx0Ci0gICAgICovCi0gICAgcHVibGljIFRlc3RSZXN1bHQgZ2V0UmVzdWx0KCkgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFRlc3QgdG8gYmUgcmFuLgotICAgICAqIEByZXR1cm4gVGVzdAotICAgICAqLwotICAgIHB1YmxpYyBUZXN0IGdldFRlc3QoKSB7Ci0gICAgICAgIHJldHVybiB0ZXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEpVbml0IFRlc3RSZXN1bHQgdXNlZCB0byBjYXB0dXJlIHRoZSByZXN1bHRzIG9mIHRoZSB0c3QKLSAgICAgKiBAcGFyYW0gcmVzdWx0IFRoZSBUZXN0UmVzdWx0IHRvIHVzZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlc3VsdChUZXN0UmVzdWx0IHJlc3VsdCkgewotICAgICAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBKVW5pdCBUZXN0IHRvIHJ1biB3aGljaCBjb3VsZCBiZSBhbiBpbmRpdmlkdWFsIHRlc3Qgb3IgYSBUZXN0U3VpdGUKLSAgICAgKiBAcGFyYW0gdGVzdCBUaGUgdGVzdCB0byBydW4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXN0KFRlc3QgdGVzdCkgewotICAgICAgICB0aGlzLnRlc3QgPSB0ZXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3RlbmVyLgotICAgICAqIEByZXR1cm4gVGVzdExpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIFRlc3RMaXN0ZW5lciBnZXRMaXN0ZW5lcigpIHsKLSAgICAgICAgcmV0dXJuIGxpc3RlbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIFRlc3RMaXN0ZW5lci50byBiZSB1c2VkIHRvIGZvcm1hdCB0aGUgb3V0cHV0IG9mIHJ1bm5pbmcgdGhlIHVuaXQgdGVzdCBjYXNlcwotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGlzdGVuZXIoVGVzdExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0KLQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFRlc3RSZXN1bHQgdG8gY2FwdHVyZSB0aGUgb3V0cHV0IG9mCi0gICAgICogdGhlIHRlc3QgY2FzZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVGVzdFJlc3VsdCBjcmVhdGVSZXN1bHQoWE1MT3V0cHV0IG91dHB1dCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RSZXN1bHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgVGVzdExpc3RlbmVyIHRvIGNhcHR1cmUgdGhlIG91dHB1dCBvZgotICAgICAqIHRoZSB0ZXN0IGNhc2VzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRlc3RMaXN0ZW5lciBjcmVhdGVUZXN0TGlzdGVuZXIoZmluYWwgWE1MT3V0cHV0IG91dHB1dCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc3RhcnRFbGVtZW50KCJlcnJvciIpOwotCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dC5zdGFydEVsZW1lbnQoIm1lc3NhZ2UiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmVuZEVsZW1lbnQoIm1lc3NhZ2UiKTsKLQotICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc3RhcnRFbGVtZW50KCJzdGFjayIpOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoIHN0YWNrVHJhY2VUb1N0cmluZyh0KSApOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZW5kRWxlbWVudCgic3RhY2siKTsKLQotICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZW5kRWxlbWVudCgiZXJyb3IiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVNBWEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZEZhaWx1cmUoVGVzdCB0ZXN0LCBBc3NlcnRpb25GYWlsZWRFcnJvciB0KSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnN0YXJ0RWxlbWVudCgiZmFpbHVyZSIpOwotCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dC5zdGFydEVsZW1lbnQoIm1lc3NhZ2UiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmVuZEVsZW1lbnQoIm1lc3NhZ2UiKTsKLQotICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc3RhcnRFbGVtZW50KCJzdGFjayIpOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoIHN0YWNrVHJhY2VUb1N0cmluZyh0KSApOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZW5kRWxlbWVudCgic3RhY2siKTsKLQotICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZW5kRWxlbWVudCgiZmFpbHVyZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU0FYRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZW5kVGVzdChUZXN0IHRlc3QpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZW5kRWxlbWVudCgidGVzdCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU0FYRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc3RhcnRUZXN0KFRlc3QgdGVzdCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdGVzdC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzSW1wbCBhdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKCIiLCAibmFtZSIsICJuYW1lIiwgIkNEQVRBIiwgbmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnN0YXJ0RWxlbWVudCgidGVzdCIsIGF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU0FYRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdGFjayB0cmFjZSBhcyBhIFN0cmluZwotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgc3RhY2tUcmFjZVRvU3RyaW5nKFRocm93YWJsZSB0KSB7Ci0gICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIHQucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcih3cml0ZXIpKTsKLSAgICAgICAgcmV0dXJuIHdyaXRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgU0FYIEV4Y2VwdGlvbnMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTQVhFeGNlcHRpb24oU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgbG9nLmVycm9yKCAiQ2F1Z2h0OiAiICsgZSwgZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvanVuaXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvU3VpdGVUYWcuamF2YSBiL2plbGx5LXRhZ3MvanVuaXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvU3VpdGVUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcwN2M5NC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2p1bml0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L1N1aXRlVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBUZXN0Q2FzZXMuLiBUaGlzIHRhZyBpcyBhbmFsYWdvdXMgdG8KLSAqIEpVbml0J3MgVGVzdFN1aXRlIGNsYXNzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIFN1aXRlVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogdGhlIHRlc3Qgc3VpdGUgdGhpcyB0YWcgY3JlYXRlZCAqLwotICAgIHByaXZhdGUgVGVzdFN1aXRlIHN1aXRlOwotCi0gICAgLyoqIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBvZiB0aGUgdGVzdCBzdWl0ZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIHZhcjsKLQotICAgIC8qKiB0aGUgbmFtZSBvZiB0aGUgdGVzdCBzdWl0ZSB0byBjcmVhdGUgKi8KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgcHVibGljIFN1aXRlVGFnKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBuZXcgVGVzdCB0byB0aGlzIHN1aXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVGVzdChUZXN0IHRlc3QpIHsKLSAgICAgICAgZ2V0U3VpdGUoKS5hZGRUZXN0KHRlc3QpOwotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBzdWl0ZSA9IGNyZWF0ZVN1aXRlKCk7Ci0KLSAgICAgICAgVGVzdFN1aXRlIHBhcmVudCA9IChUZXN0U3VpdGUpIGNvbnRleHQuZ2V0VmFyaWFibGUoIm9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5qdW5pdC5zdWl0ZSIpOwotICAgICAgICBpZiAoIHBhcmVudCA9PSBudWxsICkgewotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSgib3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lmp1bml0LnN1aXRlIiwgc3VpdGUgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHBhcmVudC5hZGRUZXN0KCBzdWl0ZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotCi0gICAgICAgIGlmICggdmFyICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhciwgc3VpdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBUZXN0U3VpdGUgZ2V0U3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IHN1aXRlIHdoaWNoaSBpcyBleHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0gICAgICAgIHRoaXMudmFyID0gdmFyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB0ZXN0IHN1aXRlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgdGVzdCBzdWl0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgVGVzdFN1aXRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRlc3RTdWl0ZSBjcmVhdGVTdWl0ZSgpIHsKLSAgICAgICAgaWYgKCBuYW1lID09IG51bGwgKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUobmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2p1bml0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L3BhY2thZ2UuaHRtbCBiL2plbGx5LXRhZ3MvanVuaXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjE5NzY4Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvanVuaXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxodG1sPgotPGhlYWQ+Ci08L2hlYWQ+Ci08Ym9keT4KLQotICA8cD5BIGNvbGxlY3Rpb24gb2YgPGEgaHJlZj0iaHR0cDovL3d3dy5qdW5pdC5vcmciPkpVbml0PC9hPiB0YWdzIGZvciAKLSAgCXBlcmZvcm1pbmcgdW5pdCB0ZXN0cyB3cml0dGVuIGluIEplbGx5IHNjcmlwdC4KLSAgPC9wPgotICAKLSAgPHA+Ci0gICAgVGhlICZsdDtzdWl0ZSZndDsgdGFnIGFsbG93cyBhIHRlc3Qgc3VpdGUgdG8gYmUgY3JlYXRlZCBhbmQgdGhlbiB0ZXN0IGNhc2VzIGNhbiBlaXRoZXIgCi0gICAgYmUgaW5kaXZpZHVhbGx5IHJhbiBvciB0aGUgd2hvbGUgc3VpdGUgcmFuLgotICA8L3A+Ci0gIDxwPgotICAgIFRoZSAmbHQ7Y2FzZSZndDsgdGFnIGFsbG93cyBhIHNpbmdsZSB0ZXN0IGNhc2UgdG8gYmUgY3JlYXRlZCBhcyBwYXJ0IG9mIGEgc3VpdGUuCi0gIDwvcD4KLSAgPHA+Ci0gICAgVGhlICZsdDtydW4mZ3Q7IHRhZyBjYW4gYmUgdXNlZCB0byBydW4gYSBnaXZlbiBUZXN0LCBUZXN0Q2FzZSBvciBUZXN0U3VpdGUKLSAgPC9wPgotICAKLSAgPHA+VGhlcmUgaXMgYW4gZXhhbXBsZSBvZiB0aGVzZSB0YWdzIGluIGFjdGlvbiAKLQk8YSBocmVmPSJodHRwOi8vY3ZzLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvamFrYXJ0YS1jb21tb25zL2plbGx5L2plbGx5LXRhZ3MvanVuaXQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvc3VpdGUuamVsbHk/cmV2PUhFQUQmY29udGVudC10eXBlPXRleHQvdm5kLnZpZXdjdnMtbWFya3VwIj5oZXJlPC9hPgotICA8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2p1bml0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L1Rlc3RKVW5pdC5qYXZhIGIvamVsbHktdGFncy9qdW5pdC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9UZXN0SlVuaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzN2IyOC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2p1bml0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L1Rlc3RKVW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgdG8gcnVuIGplbGx5IHRlc3QgY2FzZXMgYXMgcGFydCBvZiBBbnQncyBKVW5pdCB0ZXN0cwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uIDEuMQotICovCi1wdWJsaWMgY2xhc3MgVGVzdEpVbml0IGV4dGVuZHMgSmVsbHlUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oIHN1aXRlKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3JlYXRlVGVzdFN1aXRlKFRlc3RKVW5pdC5jbGFzcywgInN1aXRlLmplbGx5Iik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qdW5pdC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9ydW5TdWl0ZS5qZWxseSBiL2plbGx5LXRhZ3MvanVuaXQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvcnVuU3VpdGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNjFlZDUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qdW5pdC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9ydW5TdWl0ZS5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLg0KLSAgDQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgDQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxuczp0ZXN0PSJqZWxseTpqdW5pdCI+DQotDQotPCEtLSBsZXRzIGRlZmluZSBhIHRlc3Qgc3VpdGUgLS0+DQotPHRlc3Q6c3VpdGUgdmFyPSJzdWl0ZSI+IA0KLSAgPGo6aW5jbHVkZSB1cmk9InN1aXRlLmplbGx5Ii8+DQotPC90ZXN0OnN1aXRlPg0KLQ0KLUxldHMgcnVuIHRoZSB0ZXN0IHN1aXRlLg0KLQ0KLTx0ZXN0OnJ1biB0ZXN0PSIke3N1aXRlfSIvPg0KLQ0KLVRlc3RzIGZpbmlzaGVkLg0KLQ0KLTwvajpqZWxseT4NCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2p1bml0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L3N1aXRlLmplbGx5IGIvamVsbHktdGFncy9qdW5pdC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9zdWl0ZS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY2MzQxOS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2p1bml0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L3N1aXRlLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLg0KLSAgDQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgDQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08dGVzdDpzdWl0ZSB4bWxuczpqPSJqZWxseTpjb3JlIiANCi0gIHhtbG5zOnRlc3Q9ImplbGx5Omp1bml0Ij4NCi0NCi0gIDx0ZXN0OmNhc2UgbmFtZT0iYXNzZXJ0VGVzdHMiPg0KLSAgDQotICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIkezIgPT0gMn0iPlRoaXMgc2hvdWxkIG5ldmVyIGZhaWw8L3Rlc3Q6YXNzZXJ0Pg0KLSAgICANCi0gICAgPGo6Y2F0Y2ggdmFyPSJleCI+DQotICAgICAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7MiAhPSAyfSI+VGhpcyBzaG91bGQgYWx3YXlzIGZhaWw8L3Rlc3Q6YXNzZXJ0Pg0KLSAgICAgICAgPC9qOmNhdGNoPiAgICAgICAgDQotICAgIA0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7ZXggIT0gbnVsbH0iPldlIHNob3VsZCBoYXZlIGNyZWF0ZWQgYW4gZXhjZXB0aW9uPC90ZXN0OmFzc2VydD4NCi0gICAgDQotICAgICAgICBUaGUgZXhjZXB0aW9uIHdhczogJHtleC5tZXNzYWdlfSAgICANCi0gICAgDQotICA8L3Rlc3Q6Y2FzZT4NCi0NCi0NCi0gIDx0ZXN0OmNhc2UgbmFtZT0iZmFpbFRlc3RzIj4NCi0gIA0KLSAgICAgICAgPGo6Y2F0Y2ggdmFyPSJleCI+DQotICAgICAgICAgICAgPHRlc3Q6ZmFpbD5UaGlzIHNob3VsZCBhbHdheXMgZmFpbDwvdGVzdDpmYWlsPg0KLSAgICAgICAgPC9qOmNhdGNoPiAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2V4ICE9IG51bGx9Ij5XZSBzaG91bGQgaGF2ZSBjcmVhdGVkIGFuIGV4Y2VwdGlvbjwvdGVzdDphc3NlcnQ+DQotICAgICAgICANCi0gICAgICAgIFRoZSBleGNlcHRpb24gd2FzOiAke2V4Lm1lc3NhZ2V9ICAgIA0KLSAgICANCi0gICAgPGo6Y2F0Y2ggdmFyPSJleCI+DQotICAgICAgICAgIDx0ZXN0OmZhaWwgbWVzc2FnZT0iVGhpcyBzaG91bGQgYWx3YXlzIGZhaWwiLz4NCi0gICAgICAgIDwvajpjYXRjaD4gICAgICAgIA0KLSAgICANCi0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2V4ICE9IG51bGx9Ij5XZSBzaG91bGQgaGF2ZSBjcmVhdGVkIGFuIGV4Y2VwdGlvbjwvdGVzdDphc3NlcnQ+DQotICAgICAgICANCi0gICAgICAgIFRoZSBleGNlcHRpb24gd2FzOiAke2V4Lm1lc3NhZ2V9ICAgIA0KLSAgPC90ZXN0OmNhc2U+DQotDQotICAgIA0KLSAgPHRlc3Q6Y2FzZSBuYW1lPSJhc3NlcnRFcXVhbFRlc3RzIj4NCi0gIA0KLSAgICA8ajpzZXQgdmFyPSJmb28iIHZhbHVlPSJhYmMiLz4NCi0gICAgDQotICAgIDx0ZXN0OmFzc2VydEVxdWFscyBhY3R1YWw9IiR7Zm9vfSIgZXhwZWN0ZWQ9ImFiYyI+VGhpcyBzaG91bGQgbmV2ZXIgZmFpbDwvdGVzdDphc3NlcnRFcXVhbHM+DQotICAgIA0KLSAgICA8ajpjYXRjaCB2YXI9ImV4Ij4NCi0gICAgICA8dGVzdDphc3NlcnRFcXVhbHMgYWN0dWFsPSIke2Zvb30iIGV4cGVjdGVkPSJkZWYiPlRoaXMgc2hvdWxkIGFsd2F5cyBmYWlsPC90ZXN0OmFzc2VydEVxdWFscz4NCi0gICAgICAgIDwvajpjYXRjaD4gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtleCAhPSBudWxsfSI+V2Ugc2hvdWxkIGhhdmUgY3JlYXRlZCBhbiBleGNlcHRpb248L3Rlc3Q6YXNzZXJ0Pg0KLSAgICAgICAgDQotICAgICAgICBUaGUgZXhjZXB0aW9uIHdhczogJHtleC5tZXNzYWdlfSAgICANCi0gIDwvdGVzdDpjYXNlPg0KLQ0KLQ0KLSAgPHRlc3Q6Y2FzZSBuYW1lPSJhc3NlcnRUaHJvd3NUZXN0cyI+DQotDQotICAgIDwhLS0gdGVzdCB1c2luZyB2YXIgYXR0cmlidXRlIC0tPg0KLSAgICA8dGVzdDphc3NlcnRUaHJvd3MgdmFyPSJleCI+DQotICAgICAgPHRlc3Q6ZmFpbCBtZXNzYWdlPSJUaGlzIGV4ZXB0aW9uIHNob3VsZCBiZSBleHBvcnRlZCIvPg0KLSAgICA8L3Rlc3Q6YXNzZXJ0VGhyb3dzPg0KLSAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtleCAhPSBudWxsfSI+Tm8gZXhjZXB0aW9uIGV4cG9ydGVkPC90ZXN0OmFzc2VydD4NCi0NCi0gICAgPCEtLSB0ZXN0IHVzaW5nIHN1cGVyY2xhc3Mgb2YgZXhwZWN0ZWQgdGhyb3dhYmxlIC0tPg0KLSAgICA8dGVzdDphc3NlcnRUaHJvd3MgZXhwZWN0ZWQ9ImphdmEubGFuZy5FcnJvciI+DQotICAgICAgPHRlc3Q6ZmFpbCBtZXNzYWdlPSJUaGlzIHNob3VsZCBhbHdheXMgZmFpbCIvPg0KLSAgICA8L3Rlc3Q6YXNzZXJ0VGhyb3dzPg0KLQ0KLSAgICA8IS0tIHRlc3QgdXNpbmcgbm9uIGV4Y2VwdGlvbiBjbGFzcyAtLT4NCi0gICAgPHRlc3Q6YXNzZXJ0VGhyb3dzIGV4cGVjdGVkPSJqYXZhLmxhbmcuQ2xhc3MiPg0KLSAgICAgIDx0ZXN0OmZhaWwgbWVzc2FnZT0iVGhpcyBzaG91bGQgYWx3YXlzIGZhaWwiLz4NCi0gICAgPC90ZXN0OmFzc2VydFRocm93cz4NCi0NCi0gICAgPCEtLSB0ZXN0IHVzaW5nIHVuZGVmaW5lZCBjbGFzcyAtLT4NCi0gICAgPHRlc3Q6YXNzZXJ0VGhyb3dzIGV4cGVjdGVkPSJqYXZhLmxhbmcuQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiI+DQotICAgICAgICAgICAgPHRlc3Q6YXNzZXJ0VGhyb3dzIGV4cGVjdGVkPSJmb28uYmFyLkJheiI+DQotICAgICAgICAgICAgICAgIDx0ZXN0OmZhaWwgbWVzc2FnZT0iVGhpcyBzaG91bGQgYWx3YXlzIGZhaWwiLz4NCi0gICAgICAgICAgICA8L3Rlc3Q6YXNzZXJ0VGhyb3dzPg0KLSAgICAgICAgPC90ZXN0OmFzc2VydFRocm93cz4NCi0NCi0gICAgPCEtLSB0ZXN0IHVzaW5nIG90aGVyIGV4Y2VwdGlvbiBjbGFzcyAtLT4NCi0gICAgPGo6Y2F0Y2ggdmFyPSJleCI+DQotICAgICAgPHRlc3Q6YXNzZXJ0VGhyb3dzIGV4cGVjdGVkPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4NCi0gICAgICAgIDx0ZXN0OmZhaWwgbWVzc2FnZT0iVGhpcyBzaG91bGQgYWx3YXlzIGZhaWwiLz4NCi0gICAgICA8L3Rlc3Q6YXNzZXJ0VGhyb3dzPg0KLSAgICA8L2o6Y2F0Y2g+DQotICAgIA0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7ZXggIT0gbnVsbH0iPldlIHNob3VsZCBoYXZlIGNyZWF0ZWQgYW4gZXhjZXB0aW9uPC90ZXN0OmFzc2VydD4NCi0NCi0gICAgPCEtLSB0ZXN0IHdpdGggbm8gZXhjZXB0aW9uIGZyb20gYm9keSAtLT4NCi0gICAgPGo6Y2F0Y2ggdmFyPSJleCI+DQotICAgICAgPHRlc3Q6YXNzZXJ0VGhyb3dzPg0KLSAgICAgIDwvdGVzdDphc3NlcnRUaHJvd3M+DQotICAgIDwvajpjYXRjaD4NCi0gICAgDQotICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtleCAhPSBudWxsfSI+YXNzZXJ0VGhyb3dzIHNob3VsZCBmYWlsIHdoZW4gbm90aGluZyBpcyB0aHJvd24gZnJvbSB3aXRoaW4gaXQ8L3Rlc3Q6YXNzZXJ0Pg0KLSAgICAgICAgDQotICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2V4Lm1lc3NhZ2UuZW5kc1dpdGgoJ05vIGV4Y2VwdGlvbiB3YXMgdGhyb3duLicpfSIvPg0KLQ0KLSAgICA8dGVzdDphc3NlcnRFcXVhbHMgYWN0dWFsPSIke2V4LmVsZW1lbnROYW1lfSIgZXhwZWN0ZWQ9InRlc3Q6YXNzZXJ0VGhyb3dzIi8+DQotICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2V4LmZpbGVOYW1lICE9IG51bGx9Ij5maWxlTmFtZSBub3Qgc2V0PC90ZXN0OmFzc2VydD4NCi0gICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7ZXgubGluZU51bWJlciBndCAwfSI+bGluZU51bWJlciBub3Qgc2V0PC90ZXN0OmFzc2VydD4NCi0gICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7ZXguY29sdW1uTnVtYmVyIGd0IDB9Ij5jb2x1bW5OdW1iZXIgbm90IHNldDwvdGVzdDphc3NlcnQ+DQotICA8L3Rlc3Q6Y2FzZT4NCi0NCi08IS0tDQotICAgIA0KLSAgICAjIyMjIHVuY29tbWVudCB3aGVuIGFzc2VydEVxdWFscyBzdXBwb3J0cyB0eXBlIGNvbnZlcnNpb25zDQotICAgIA0KLSAgPHRlc3Q6Y2FzZSBuYW1lPSJhc3NlcnRFcXVhbHNDb252ZXJzaW9uIj4NCi0gIA0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSIkezR9IiBhY3R1YWw9IiR7MisyfSIvPg0KLQ0KLSAgPC90ZXN0OmNhc2U+DQotLS0+DQotDQotPC90ZXN0OnN1aXRlPg0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvanVuaXQveGRvY3MvY2hhbmdlcy54bWwgYi9qZWxseS10YWdzL2p1bml0L3hkb2NzL2NoYW5nZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjNlOGUxLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvanVuaXQveGRvY3MvY2hhbmdlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tIAotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotIC0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5DaGFuZ2VzPC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0gIDxib2R5PgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMCIgZGF0ZT0iMjAwNC0wOS0xMCI+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0iYWRkIj5Jbml0aWFsIFJlbGVhc2U8L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2p1bml0L3hkb2NzL2luZGV4LnhtbCBiL2plbGx5LXRhZ3MvanVuaXQveGRvY3MvaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmI3MzZmLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvanVuaXQveGRvY3MvaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+SmV0dHkgVGFnIExpYnJhcnk8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLQotICA8Ym9keT4KLSAgICA8c2VjdGlvbiBuYW1lPSJPdmVydmlldyI+Ci0gICAgCi0gICAgICA8cD5BIGNvbGxlY3Rpb24gb2YgPGEgaHJlZj0iaHR0cDovL3d3dy5qdW5pdC5vcmciPkpVbml0PC9hPiB0YWdzIGZvciAKLSAgICAgICAgcGVyZm9ybWluZyB1bml0IHRlc3RzIHdyaXR0ZW4gaW4gSmVsbHkgc2NyaXB0LgotICAgICAgPC9wPgotICAKLSAgICAgIDxwPgotICAgICAgICBUaGUgJmx0O3N1aXRlJmd0OyB0YWcgYWxsb3dzIGEgdGVzdCBzdWl0ZSB0byBiZSBjcmVhdGVkIGFuZCB0aGVuIHRlc3QgY2FzZXMgY2FuIGVpdGhlciAKLSAgICAgICAgYmUgaW5kaXZpZHVhbGx5IHJhbiBvciB0aGUgd2hvbGUgc3VpdGUgcmFuLgotICAgICAgPC9wPgotICAgICAgPHA+Ci0gICAgICAgIFRoZSAmbHQ7Y2FzZSZndDsgdGFnIGFsbG93cyBhIHNpbmdsZSB0ZXN0IGNhc2UgdG8gYmUgY3JlYXRlZCBhcyBwYXJ0IG9mIGEgc3VpdGUuCi0gICAgICA8L3A+Ci0gICAgICA8cD4KLSAgICAgICAgVGhlICZsdDtydW4mZ3Q7IHRhZyBjYW4gYmUgdXNlZCB0byBydW4gYSBnaXZlbiBUZXN0LCBUZXN0Q2FzZSBvciBUZXN0U3VpdGUKLSAgICAgIDwvcD4KLSAgCi0gICAgICA8cD4KLSAgICAgICAgVGhlcmUgaXMgYW4gZXhhbXBsZSBvZiB0aGVzZSB0YWdzIGluIGFjdGlvbiAKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL2N2cy5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2pha2FydGEtY29tbW9ucy9qZWxseS9qZWxseS10YWdzL2p1bml0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L3N1aXRlLmplbGx5P3Jldj1IRUFEJmFtcDtjb250ZW50LXR5cGU9dGV4dC92bmQudmlld2N2cy1tYXJrdXAiPmhlcmU8L2E+Ci0gICAgICA8L3A+Ci0gICAgICA8cD4KLSAgICAgICAgU2VlIHRoZSA8YSBocmVmPSJ0YWdzLmh0bWwiPnRhZ3M8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgICAgPC9wPgotICAgIDwvc2VjdGlvbj4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9qdW5pdC94ZG9jcy9uYXZpZ2F0aW9uLnhtbCBiL2plbGx5LXRhZ3MvanVuaXQveGRvY3MvbmF2aWdhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNzRjNWIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9qdW5pdC94ZG9jcy9uYXZpZ2F0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgbmFtZT0iSlVuaXQgVGFnIExpYnJhcnkiPgotCi0gIDx0aXRsZT5KVW5pdCBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gIAotICA8Ym9keT4KLSAgICA8bWVudSBuYW1lPSJKVW5pdCBUYWcgTGlicmFyeSI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgICAgICAgICAgaHJlZj0iL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IlRhZ3MiICAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFncy5odG1sIi8+Ci0gICAgPC9tZW51PgotICA8L2JvZHk+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2xvZy8uY3ZzaWdub3JlIGIvamVsbHktdGFncy9sb2cvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNhMmNkYS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2xvZy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi10YXJnZXQKLW1hdmVuLmxvZwotdmVsb2NpdHkubG9nCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2xvZy9idWlsZC54bWwgYi9qZWxseS10YWdzL2xvZy9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNzNiZDEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9sb2cvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS1idWlsZC54bWwgZ2VuZXJhdGVkIGJ5IG1hdmVuIGZyb20gcHJvamVjdC54bWwgdmVyc2lvbiAxLjAtU05BUFNIT1QKLSAgb24gZGF0ZSBNYXkgMjQgMjAwNCwgdGltZSAyMzAxLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXIiIG5hbWU9ImNvbW1vbnMtamVsbHktdGFncy1sb2ciIGJhc2VkaXI9Ii4iPgotICA8cHJvcGVydHkgbmFtZT0iZGVmYXVsdHRhcmdldGRpciIgdmFsdWU9InRhcmdldCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJkaXIiIHZhbHVlPSJ0YXJnZXQvbGliIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXNkaXIiIHZhbHVlPSJ0YXJnZXQvY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Y2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0idGVzdHJlcG9ydGRpciIgdmFsdWU9InRhcmdldC90ZXN0LXJlcG9ydHMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZGlzdGRpciIgdmFsdWU9ImRpc3QiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iamF2YWRvY2RpciIgdmFsdWU9ImRpc3QvZG9jcy9hcGkiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZmluYWwubmFtZSIgdmFsdWU9ImNvbW1vbnMtamVsbHktdGFncy1sb2ctMS4wLVNOQVBTSE9UIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0ibyBJbml0aWFsaXplcyBzb21lIHByb3BlcnRpZXMiPgotICAgIDxta2RpciBkaXI9IiR7bGliZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJub2dldCI+Ci0gICAgICA8ZXF1YWxzIGFyZzI9Im9ubHkiIGFyZzE9IiR7YnVpbGQuc3lzY2xhc3NwYXRofSI+Ci0gICAgICA8L2VxdWFscz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249Im8gQ29tcGlsZSB0aGUgY29kZSIgZGVwZW5kcz0iZ2V0LWRlcHMiPgotICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7Y2xhc3Nlc2Rpcn0iIGRlcHJlY2F0aW9uPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSIgb3B0aW1pemU9ImZhbHNlIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIj4KLSAgICAgIDxzcmM+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL2phdmEiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9zcmM+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgICA8Y29weSB0b2Rpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy9qYXZhIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgICA8Y29weSB0b2Rpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamVsbHkiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhzbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5ybmciPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouZHRkIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouaHRtbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphciIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIHRoZSBqYXIiIGRlcGVuZHM9ImNvbXBpbGUsdGVzdCI+Ci0gICAgPGphciBqYXJmaWxlPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiIGJhc2VkaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgIDwvamFyPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249Im8gQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBkaXJlY3RvcmllcyI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iPgotICAgIDwvZGVsZXRlPgotICAgIDxkZWxldGUgZGlyPSIke2Rpc3RkaXJ9Ij4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIGEgZGlzdHJpYnV0aW9uIiBkZXBlbmRzPSJqYXIsIGphdmFkb2MiPgotICAgIDxta2RpciBkaXI9ImRpc3QiPgotICAgIDwvbWtkaXI+Ci0gICAgPGNvcHkgdG9kaXI9ImRpc3QiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2RlZmF1bHR0YXJnZXRkaXJ9IiBpbmNsdWRlcz0iKi5qYXIiPgotICAgICAgPC9maWxlc2V0PgotICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRlcz0iTElDRU5TRSosIFJFQURNRSoiPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249Im8gUnVuIHRoZSB0ZXN0IGNhc2VzIiBpZj0idGVzdC5mYWlsdXJlIiBkZXBlbmRzPSJpbnRlcm5hbC10ZXN0Ij4KLSAgICA8ZmFpbCBtZXNzYWdlPSJUaGVyZSB3ZXJlIHRlc3QgZmFpbHVyZXMuIj4KLSAgICA8L2ZhaWw+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImludGVybmFsLXRlc3QiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdHMiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdHJlcG9ydGRpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGp1bml0IGRpcj0iLi8iIGZhaWx1cmVwcm9wZXJ0eT0idGVzdC5mYWlsdXJlIiBwcmludFN1bW1hcnk9InllcyIgZm9yaz0idHJ1ZSIgaGFsdG9uZXJyb3I9InRydWUiPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYmFzZWRpciIgdmFsdWU9Ii4iPgotICAgICAgPC9zeXNwcm9wZXJ0eT4KLSAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIj4KLSAgICAgIDwvZm9ybWF0dGVyPgotICAgICAgPGZvcm1hdHRlciB1c2VmaWxlPSJmYWxzZSIgdHlwZT0icGxhaW4iPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdHJlcG9ydGRpcn0iPgotICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9UZXN0Ki5qYXZhIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvYmF0Y2h0ZXN0PgotICAgIDwvanVuaXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtdGVzdHMiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqYXZhYyBkZXN0ZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvdGVzdCI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MiIGRlc2NyaXB0aW9uPSJvIEdlbmVyYXRlIGphdmFkb2MiIGRlcGVuZHM9ImphciI+Ci0gICAgPG1rZGlyIGRpcj0iJHtqYXZhZG9jZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8dHN0YW1wPgotICAgICAgPGZvcm1hdCBwYXR0ZXJuPSIyMDAyLXl5eXkiIHByb3BlcnR5PSJ5ZWFyIj4KLSAgICAgIDwvZm9ybWF0PgotICAgIDwvdHN0YW1wPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb3B5cmlnaHQiIHZhbHVlPSJDb3B5cmlnaHQgJmFtcDtjb3B5OyAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSIgdmFsdWU9ImNvbW1vbnMtamVsbHktdGFncy1sb2cgMS4wLVNOQVBTSE9UIEFQSSI+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgICA8amF2YWRvYyB1c2U9InRydWUiIHByaXZhdGU9InRydWUiIGRlc3RkaXI9IiR7amF2YWRvY2Rpcn0iIGF1dGhvcj0idHJ1ZSIgdmVyc2lvbj0idHJ1ZSIgc291cmNlcGF0aD0ic3JjL2phdmEiIHBhY2thZ2VuYW1lcz0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MubG9nLioiPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhZG9jPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJnZXQtZGVwcyIgdW5sZXNzPSJub2dldCIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS10YWdzLWp1bml0LVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS10YWdzLWp1bml0LVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamV4bC9qYXJzL2NvbW1vbnMtamV4bC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3htbC1hcGlzLTEuMC5iMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veG1sLWFwaXMvamFycy94bWwtYXBpcy0xLjAuYjIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWJlYW51dGlscy0xLjYuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtYmVhbnV0aWxzL2phcnMvY29tbW9ucy1iZWFudXRpbHMtMS42LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtY29sbGVjdGlvbnMvamFycy9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1sb2dnaW5nL2phcnMvY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vZG9tNGotMS41LWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vZG9tNGovamFycy9kb200ai0xLjUtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vamF4ZW4tMS4xLWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vamF4ZW4vamFycy9qYXhlbi0xLjEtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veGVyY2VzLTIuMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94ZXJjZXMvamFycy94ZXJjZXMtMi4yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qdW5pdC0zLjguMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vanVuaXQvamFycy9qdW5pdC0zLjguMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FudC0xLjUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC0xLjUuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtb3B0aW9uYWwtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtb3B0aW9uYWwtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtbWF2ZW4iPgotICAgIDxnZXQgZGVzdD0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBzcmM9IiR7cmVwb30vbWF2ZW4vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8dW5qYXIgZGVzdD0iJHttYXZlbi5ob21lfSIgc3JjPSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L3VuamFyPgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2xvZy9tYXZlbi54bWwgYi9qZWxseS10YWdzL2xvZy9tYXZlbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5N2FkYjMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9sb2cvbWF2ZW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImphdmE6amFyIj4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9sb2cvcHJvamVjdC5wcm9wZXJ0aWVzIGIvamVsbHktdGFncy9sb2cvcHJvamVjdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDE5Y2JjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvbG9nL3Byb2plY3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jIAotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUCBSIE8gSiBFIEMgVCAgUCBSIE8gUCBFIFIgVCBJIEUgUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2xvZy9wcm9qZWN0LnhtbCBiL2plbGx5LXRhZ3MvbG9nL3Byb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDUxMDQ4Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvbG9nL3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdD4KLSAgPGV4dGVuZD4ke2Jhc2VkaXJ9Ly4uL3RhZy1wcm9qZWN0LnhtbDwvZXh0ZW5kPgotICA8aWQ+Y29tbW9ucy1qZWxseS10YWdzLWxvZzwvaWQ+Ci0gIDxuYW1lPmNvbW1vbnMtamVsbHktdGFncy1sb2c8L25hbWU+Ci0gIDxjdXJyZW50VmVyc2lvbj4xLjA8L2N1cnJlbnRWZXJzaW9uPgotCi0gIDxwYWNrYWdlPm9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmxvZzwvcGFja2FnZT4KLQotICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgVGhlIEplbGx5IExvZyBUYWcgTGlicmFyeQotICA8L2Rlc2NyaXB0aW9uPgotICA8c2hvcnREZXNjcmlwdGlvbj5Db21tb25zIEplbGx5IExvZyBUYWcgTGlicmFyeTwvc2hvcnREZXNjcmlwdGlvbj4KLSAgCi0gIDx2ZXJzaW9ucz4KLSAgICA8dmVyc2lvbj4KLSAgICAgIDxpZD4xLjA8L2lkPgotICAgICAgPG5hbWU+MS4wPC9uYW1lPgotICAgICAgPHRhZz5DT01NT05TX0pFTExZX0xPRy0xXzA8L3RhZz4KLSAgICA8L3ZlcnNpb24+Ci0gIDwvdmVyc2lvbnM+Ci0gIAotICA8ZGVwZW5kZW5jaWVzPgotICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtamVsbHk8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWplbGx5LXRhZ3MtanVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICA8dXJsPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9qZWxseS90YWdzL2p1bml0LzwvdXJsPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICA8L2RlcGVuZGVuY2llcz4KLSAgCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2xvZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9sb2cvRGVidWdUYWcuamF2YSBiL2plbGx5LXRhZ3MvbG9nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2xvZy9EZWJ1Z1RhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGM3MDc5Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvbG9nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2xvZy9EZWJ1Z1RhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5sb2c7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci0KLS8qKgotICogQSB0YWcgd2hpY2ggZ2VuZXJhdGVzIERFQlVHIGxldmVsIGxvZ2dpbmcgc3RhdGVtZW50IHVzaW5nCi0gKiB0aGUgZ2l2ZW4gY2F0ZWdvcnkgbmFtZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWJ1Z1RhZyBleHRlbmRzIExvZ1RhZ1N1cHBvcnQgewotCi0gICAgcHVibGljIERlYnVnVGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBMb2cgbG9nID0gZ2V0TG9nKCk7Ci0gICAgICAgIGlmICggbG9nLmlzRGVidWdFbmFibGVkKCkgKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIGdldEJvZHlUZXh0KGlzRW5jb2RlKCkpICk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2xvZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9sb2cvRXJyb3JUYWcuamF2YSBiL2plbGx5LXRhZ3MvbG9nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2xvZy9FcnJvclRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTYwYTNhLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvbG9nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2xvZy9FcnJvclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5sb2c7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci0KLS8qKgotICogQSB0YWcgd2hpY2ggZ2VuZXJhdGVzIEVSUk9SIGxldmVsIGxvZ2dpbmcgc3RhdGVtZW50IHVzaW5nCi0gKiB0aGUgZ2l2ZW4gY2F0ZWdvcnkgbmFtZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBFcnJvclRhZyBleHRlbmRzIExvZ1RhZ1N1cHBvcnQgewotCi0gICAgcHVibGljIEVycm9yVGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBMb2cgbG9nID0gZ2V0TG9nKCk7Ci0gICAgICAgIGlmICggbG9nLmlzRXJyb3JFbmFibGVkKCkgKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIGdldEJvZHlUZXh0KGlzRW5jb2RlKCkpICk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2xvZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9sb2cvRmF0YWxUYWcuamF2YSBiL2plbGx5LXRhZ3MvbG9nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2xvZy9GYXRhbFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmEyMGIyLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvbG9nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2xvZy9GYXRhbFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5sb2c7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci0KLS8qKgotICogQSB0YWcgd2hpY2ggZ2VuZXJhdGVzIEZBVEFMIGxldmVsIGxvZ2dpbmcgc3RhdGVtZW50IHVzaW5nCi0gKiB0aGUgZ2l2ZW4gY2F0ZWdvcnkgbmFtZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBGYXRhbFRhZyBleHRlbmRzIExvZ1RhZ1N1cHBvcnQgewotCi0gICAgcHVibGljIEZhdGFsVGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBMb2cgbG9nID0gZ2V0TG9nKCk7Ci0gICAgICAgIGlmICggbG9nLmlzRmF0YWxFbmFibGVkKCkgKSB7Ci0gICAgICAgICAgICBsb2cuZmF0YWwoIGdldEJvZHlUZXh0KGlzRW5jb2RlKCkpICk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2xvZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9sb2cvSW5mb1RhZy5qYXZhIGIvamVsbHktdGFncy9sb2cvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvbG9nL0luZm9UYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmN2QzNy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2xvZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9sb2cvSW5mb1RhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5sb2c7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci0KLS8qKgotICogQSB0YWcgd2hpY2ggZ2VuZXJhdGVzIElORk8gbGV2ZWwgbG9nZ2luZyBzdGF0ZW1lbnQgdXNpbmcKLSAqIHRoZSBnaXZlbiBjYXRlZ29yeSBuYW1lLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIEluZm9UYWcgZXh0ZW5kcyBMb2dUYWdTdXBwb3J0IHsKLQotICAgIHB1YmxpYyBJbmZvVGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBMb2cgbG9nID0gZ2V0TG9nKCk7Ci0gICAgICAgIGlmICggbG9nLmlzSW5mb0VuYWJsZWQoKSApIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCBnZXRCb2R5VGV4dChpc0VuY29kZSgpKSApOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9sb2cvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvbG9nL0xvZ1RhZ0xpYnJhcnkuamF2YSBiL2plbGx5LXRhZ3MvbG9nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2xvZy9Mb2dUYWdMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMTU3YWEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9sb2cvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvbG9nL0xvZ1RhZ0xpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MubG9nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ0xpYnJhcnk7Ci0KLS8qKiBEZXNjcmliZXMgdGhlIFRhZ2xpYi4gVGhpcyBjbGFzcyBjb3VsZCBiZSBnZW5lcmF0ZWQgYnkgWERvY2xldAotICAqCi0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBMb2dUYWdMaWJyYXJ5IGV4dGVuZHMgVGFnTGlicmFyeSB7Ci0KLSAgICBwdWJsaWMgTG9nVGFnTGlicmFyeSgpIHsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInRyYWNlIiwgVHJhY2VUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygiZGVidWciLCBEZWJ1Z1RhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJpbmZvIiwgSW5mb1RhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJ3YXJuIiwgV2FyblRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJlcnJvciIsIEVycm9yVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImZhdGFsIiwgRmF0YWxUYWcuY2xhc3MpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9sb2cvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvbG9nL0xvZ1RhZ1N1cHBvcnQuamF2YSBiL2plbGx5LXRhZ3MvbG9nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2xvZy9Mb2dUYWdTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYzhkNzIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9sb2cvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvbG9nL0xvZ1RhZ1N1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MubG9nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIEFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFueSBsb2dnaW5nIHRhZy4uCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTG9nVGFnU3VwcG9ydCBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgcHJpdmF0ZSBMb2cgbG9nOwotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGU7Ci0KLSAgICBwdWJsaWMgTG9nVGFnU3VwcG9ydCgpIHsKLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBMb2cgYmVpbmcgdXNlZCBieSB0aGlzIHRhZy4gSWYgbm9uZSBpcyByZXR1cm5lZCB0aGVuIGEgbmV3IG9uZSB3aWxsIGJlIGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIExvZyBnZXRMb2coKSB7Ci0gICAgICAgIGlmICggbG9nID09IG51bGwgKSB7Ci0gICAgICAgICAgICAvLyB1c2UgYSBkZWZhdWx0IExvZwotICAgICAgICAgICAgLy8gIyMjIHdlIGNvdWxkIGluaGVyaXQgZnJvbSBhIHBhcmVudCB0YWc/Ci0gICAgICAgICAgICBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyggZ2V0Q2xhc3MoKSApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsb2c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgbG9nZ2VyIHRvIHVzZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc2V0TG9nKCBMb2dGYWN0b3J5LmdldExvZyhuYW1lKSApOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSBMb2cgaW5zdGFuY2UgdG8gdXNlIGZvciBsb2dnaW5nLiAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvZyhMb2cgbG9nKSB7Ci0gICAgICAgIHRoaXMubG9nID0gbG9nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYm9keSBvZiB0aGlzIHRhZyB3aWxsIGJlIFhNTCBlbmNvZGVkIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuY29kZSgpIHsKLSAgICAgICAgcmV0dXJuIGVuY29kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGJvZHkgb2YgdGhlIHRhZyBzaG91bGQgYmUgZW5jb2RlZCBhcyB0ZXh0IChzbyB0aGF0ICZsdDsgYW5kICZndDsgYXJlCi0gICAgICogZW5jb2RlZCBhcyAmYW1wO2x0OyBhbmQgJmFtcDtndDspIG9yIGxlYXZlIHRoZSB0ZXh0IGFzIFhNTCB3aGljaCBpcyB0aGUgZGVmYXVsdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGUoYm9vbGVhbiBlbmNvZGUpIHsKLSAgICAgICAgdGhpcy5lbmNvZGUgPSBlbmNvZGU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2xvZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9sb2cvVHJhY2VUYWcuamF2YSBiL2plbGx5LXRhZ3MvbG9nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2xvZy9UcmFjZVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmMyMDk2Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvbG9nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2xvZy9UcmFjZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5sb2c7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci0KLS8qKgotICogQSB0YWcgd2hpY2ggZ2VuZXJhdGVzIFRSQUNFIGxldmVsIGxvZ2dpbmcgc3RhdGVtZW50IHVzaW5nCi0gKiB0aGUgZ2l2ZW4gY2F0ZWdvcnkgbmFtZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFjZVRhZyBleHRlbmRzIExvZ1RhZ1N1cHBvcnQgewotCi0gICAgcHVibGljIFRyYWNlVGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBMb2cgbG9nID0gZ2V0TG9nKCk7Ci0gICAgICAgIGlmICggbG9nLmlzVHJhY2VFbmFibGVkKCkgKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UoIGdldEJvZHlUZXh0KGlzRW5jb2RlKCkpICk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2xvZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9sb2cvV2FyblRhZy5qYXZhIGIvamVsbHktdGFncy9sb2cvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvbG9nL1dhcm5UYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiYzE1OS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2xvZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9sb2cvV2FyblRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5sb2c7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci0KLS8qKgotICogQSB0YWcgd2hpY2ggZ2VuZXJhdGVzIFdBUk4gbGV2ZWwgbG9nZ2luZyBzdGF0ZW1lbnQgdXNpbmcKLSAqIHRoZSBnaXZlbiBjYXRlZ29yeSBuYW1lLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIFdhcm5UYWcgZXh0ZW5kcyBMb2dUYWdTdXBwb3J0IHsKLQotICAgIHB1YmxpYyBXYXJuVGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBMb2cgbG9nID0gZ2V0TG9nKCk7Ci0gICAgICAgIGlmICggbG9nLmlzV2FybkVuYWJsZWQoKSApIHsKLSAgICAgICAgICAgIGxvZy53YXJuKCBnZXRCb2R5VGV4dChpc0VuY29kZSgpKSApOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9sb2cvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvbG9nL3BhY2thZ2UuaHRtbCBiL2plbGx5LXRhZ3MvbG9nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2xvZy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZDQ5ZDcuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9sb2cvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvbG9nL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci0KLSAgPHA+Q3VzdG9tIHRhZ3MgZm9yIGdlbmVyYXRpbmcgdGV4dHVhbCBsb2dnaW5nIGluZm9ybWF0aW9uIHVzaW5nCi0gIAk8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvbG9nZ2luZy5odG1sIj5jb21tb25zLWxvZ2dpbmc8L2E+IAotICAJd2hpY2ggd2lsbCB1c2UgZWl0aGVyIGxvZzRqLCBsb2draXQgb3IgSkRLMS40IGxvZ2dpbmcKLSAgCWRlcGVuZGluZyBvbiB0aGUgY2xhc3NwYXRoIGFuZCBjb25maWd1cmF0aW9uLgotICA8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2xvZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9sb2cvTW9ja0xvZy5qYXZhIGIvamVsbHktdGFncy9sb2cvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvbG9nL01vY2tMb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzllZWRhMDguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9sb2cvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvbG9nL01vY2tMb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmxvZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLQotLyoqCi0gKiBBIE1vY2sgT2JqZWN0IHVzZWZ1bCBmb3IgdW5pdCB0ZXN0aW5nIG9mIGNvbW1vbnMtbG9nZ2luZy4gKE1heWJlIHRoaXMgc2hvdWxkCi0gKiBiZSBjb250cmlidXRlZCBiYWNrIHRvIGNvbW1vbnMtbG9nZ2luZz8pCi0gKgotICogQGF1dGhvciBKYW1lcyBTdHJhY2hhbgotICogQHZlcnNpb24gMS4xIDIwMDMvMDEvMjIgMTA6MjI6MzAKLSAqLwotcHVibGljIGNsYXNzIE1vY2tMb2cgaW1wbGVtZW50cyBMb2cgewotCi0gICAgcHJpdmF0ZSBPYmplY3QgZGVidWc7Ci0gICAgcHJpdmF0ZSBPYmplY3QgdHJhY2U7Ci0gICAgcHJpdmF0ZSBPYmplY3QgaW5mbzsKLSAgICBwcml2YXRlIE9iamVjdCB3YXJuOwotICAgIHByaXZhdGUgT2JqZWN0IGVycm9yOwotICAgIHByaXZhdGUgT2JqZWN0IGZhdGFsOwotICAgIHByaXZhdGUgVGhyb3dhYmxlIGxhc3RUaHJvd2FibGU7Ci0KLSAgICBwdWJsaWMgTW9ja0xvZygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgYWxsIHRoZSBsYXN0IGxvZ2dpbmcgbWVzc2FnZXMgcmVjZWl2ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgdGhpcy5kZWJ1ZyA9IG51bGw7Ci0gICAgICAgIHRoaXMudHJhY2UgPSBudWxsOwotICAgICAgICB0aGlzLmluZm8gPSBudWxsOwotICAgICAgICB0aGlzLndhcm4gPSBudWxsOwotICAgICAgICB0aGlzLmVycm9yID0gbnVsbDsKLSAgICAgICAgdGhpcy5mYXRhbCA9IG51bGw7Ci0gICAgICAgIHRoaXMubGFzdFRocm93YWJsZSA9IG51bGw7Ci0gICAgfQotCi0KLSAgICAvLyBMb2cgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyNkZWJ1ZyhqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuVGhyb3dhYmxlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlYnVnKE9iamVjdCBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIHRoaXMuZGVidWcgPSBtZXNzYWdlOwotICAgICAgICB0aGlzLmxhc3RUaHJvd2FibGUgPSBleGNlcHRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cjZGVidWcoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWJ1ZyhPYmplY3QgbWVzc2FnZSkgewotICAgICAgICB0aGlzLmRlYnVnID0gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyNlcnJvcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuVGhyb3dhYmxlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVycm9yKE9iamVjdCBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIHRoaXMuZXJyb3IgPSBtZXNzYWdlOwotICAgICAgICB0aGlzLmxhc3RUaHJvd2FibGUgPSBleGNlcHRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cjZXJyb3IoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlcnJvcihPYmplY3QgbWVzc2FnZSkgewotICAgICAgICB0aGlzLmVycm9yID0gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyNmYXRhbChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuVGhyb3dhYmxlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZhdGFsKE9iamVjdCBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIHRoaXMuZmF0YWwgPSBtZXNzYWdlOwotICAgICAgICB0aGlzLmxhc3RUaHJvd2FibGUgPSBleGNlcHRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cjZmF0YWwoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmYXRhbChPYmplY3QgbWVzc2FnZSkgewotICAgICAgICB0aGlzLmZhdGFsID0gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyNpbmZvKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5UaHJvd2FibGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5mbyhPYmplY3QgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotICAgICAgICB0aGlzLmluZm8gPSBtZXNzYWdlOwotICAgICAgICB0aGlzLmxhc3RUaHJvd2FibGUgPSBleGNlcHRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cjaW5mbyhqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluZm8oT2JqZWN0IG1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcy5pbmZvID0gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyNpc0RlYnVnRW5hYmxlZCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWJ1Z0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nI2lzRXJyb3JFbmFibGVkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Vycm9yRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cjaXNGYXRhbEVuYWJsZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRmF0YWxFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyNpc0luZm9FbmFibGVkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luZm9FbmFibGVkKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyNpc1RyYWNlRW5hYmxlZCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNUcmFjZUVuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nI2lzV2FybkVuYWJsZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzV2FybkVuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nI3RyYWNlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5UaHJvd2FibGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdHJhY2UoT2JqZWN0IG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgdGhpcy50cmFjZSA9IG1lc3NhZ2U7Ci0gICAgICAgIHRoaXMubGFzdFRocm93YWJsZSA9IGV4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyN0cmFjZShqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRyYWNlKE9iamVjdCBtZXNzYWdlKSB7Ci0gICAgICAgIHRoaXMudHJhY2UgPSBtZXNzYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nI3dhcm4oamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlRocm93YWJsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3YXJuKE9iamVjdCBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIHRoaXMud2FybiA9IG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cjd2FybihqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdhcm4oT2JqZWN0IG1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcy53YXJuID0gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlcnJvci4KLSAgICAgKiBAcmV0dXJuIE9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0RXJyb3IoKSB7Ci0gICAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmYXRhbC4KLSAgICAgKiBAcmV0dXJuIE9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0RmF0YWwoKSB7Ci0gICAgICAgIHJldHVybiBmYXRhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbmZvLgotICAgICAqIEByZXR1cm4gT2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRJbmZvKCkgewotICAgICAgICByZXR1cm4gaW5mbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsYXN0VGhyb3dhYmxlLgotICAgICAqIEByZXR1cm4gVGhyb3dhYmxlCi0gICAgICovCi0gICAgcHVibGljIFRocm93YWJsZSBnZXRMYXN0VGhyb3dhYmxlKCkgewotICAgICAgICByZXR1cm4gbGFzdFRocm93YWJsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB3YXJuLgotICAgICAqIEByZXR1cm4gT2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRXYXJuKCkgewotICAgICAgICByZXR1cm4gd2FybjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0cmFjZS4KLSAgICAgKiBAcmV0dXJuIE9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VHJhY2UoKSB7Ci0gICAgICAgIHJldHVybiB0cmFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWJ1Zy4KLSAgICAgKiBAcmV0dXJuIE9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0RGVidWcoKSB7Ci0gICAgICAgIHJldHVybiBkZWJ1ZzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvbG9nL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2xvZy9UZXN0SmVsbHkuamF2YSBiL2plbGx5LXRhZ3MvbG9nL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2xvZy9UZXN0SmVsbHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY2NjYwMC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL2xvZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9sb2cvVGVzdEplbGx5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmxvZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qdW5pdC5KZWxseVRlc3RTdWl0ZTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyB0byBydW4gamVsbHkgdGVzdCBjYXNlcyBhcyBwYXJ0IG9mIEFudCdzIEpVbml0IHRlc3RzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0SmVsbHkgZXh0ZW5kcyBKZWxseVRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUZXN0UnVubmVyLnJ1biggc3VpdGUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVUZXN0U3VpdGUoVGVzdEplbGx5LmNsYXNzLCAic3VpdGUuamVsbHkiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2xvZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9sb2cvc3VpdGUuamVsbHkgYi9qZWxseS10YWdzL2xvZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9sb2cvc3VpdGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NWVhMmYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9sb2cvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvbG9nL3N1aXRlLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHRlc3Q6c3VpdGUgeG1sbnM6dGVzdD0iamVsbHk6anVuaXQiIHhtbG5zOmo9ImplbGx5OmNvcmUiIHhtbG5zOmxvZz0iamVsbHk6bG9nIj4KLQotICAgIDx0ZXN0OmNhc2UgbmFtZT0iZGVidWdUZXN0Ij4KLSAgICAgICAgCi0gICAgICAgIDxqOnVzZUJlYW4gdmFyPSJsb2dnZXIiIGNsYXNzPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5sb2cuTW9ja0xvZyIvPgotICAgICAgICAKLSAgICAgICAgPGxvZzpkZWJ1ZyBsb2c9IiR7bG9nZ2VyfSI+YWJjZGU8L2xvZzpkZWJ1Zz4KLSAgICAgICAgCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iYWJjZGUiIGFjdHVhbD0iJHtsb2dnZXIuZGVidWd9IiAvPgotICAgICAgICAKLSAgICA8L3Rlc3Q6Y2FzZT4KLQotICAgIDx0ZXN0OmNhc2UgbmFtZT0idHJhY2VUZXN0Ij4KLSAgICAgICAgCi0gICAgICAgIDxqOnVzZUJlYW4gdmFyPSJsb2dnZXIiIGNsYXNzPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5sb2cuTW9ja0xvZyIvPgotICAgICAgICAKLSAgICAgICAgPGxvZzp0cmFjZSBsb2c9IiR7bG9nZ2VyfSI+YWJjZGU8L2xvZzp0cmFjZT4KLSAgICAgICAgCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iYWJjZGUiIGFjdHVhbD0iJHtsb2dnZXIudHJhY2V9IiAvPgotICAgICAgICAKLSAgICA8L3Rlc3Q6Y2FzZT4KLQotICAgIDx0ZXN0OmNhc2UgbmFtZT0iaW5mb1Rlc3QiPgotICAgICAgICAKLSAgICAgICAgPGo6dXNlQmVhbiB2YXI9ImxvZ2dlciIgY2xhc3M9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmxvZy5Nb2NrTG9nIi8+Ci0gICAgICAgIAotICAgICAgICA8bG9nOmluZm8gbG9nPSIke2xvZ2dlcn0iPmFiY2RlPC9sb2c6aW5mbz4KLSAgICAgICAgCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iYWJjZGUiIGFjdHVhbD0iJHtsb2dnZXIuaW5mb30iIC8+Ci0gICAgICAgIAotICAgIDwvdGVzdDpjYXNlPgotCi0gICAgPHRlc3Q6Y2FzZSBuYW1lPSJ3YXJuVGVzdCI+Ci0gICAgICAgIAotICAgICAgICA8ajp1c2VCZWFuIHZhcj0ibG9nZ2VyIiBjbGFzcz0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MubG9nLk1vY2tMb2ciLz4KLSAgICAgICAgCi0gICAgICAgIDxsb2c6d2FybiBsb2c9IiR7bG9nZ2VyfSI+YWJjZGU8L2xvZzp3YXJuPgotICAgICAgICAKLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJhYmNkZSIgYWN0dWFsPSIke2xvZ2dlci53YXJufSIgLz4KLSAgICAgICAgCi0gICAgPC90ZXN0OmNhc2U+Ci0KLSAgICA8dGVzdDpjYXNlIG5hbWU9ImVycm9yVGVzdCI+Ci0gICAgICAgIAotICAgICAgICA8ajp1c2VCZWFuIHZhcj0ibG9nZ2VyIiBjbGFzcz0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MubG9nLk1vY2tMb2ciLz4KLSAgICAgICAgCi0gICAgICAgIDxsb2c6ZXJyb3IgbG9nPSIke2xvZ2dlcn0iPmFiY2RlPC9sb2c6ZXJyb3I+Ci0gICAgICAgIAotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9ImFiY2RlIiBhY3R1YWw9IiR7bG9nZ2VyLmVycm9yfSIgLz4KLSAgICAgICAgCi0gICAgPC90ZXN0OmNhc2U+Ci0KLSAgICA8dGVzdDpjYXNlIG5hbWU9ImZhdGFsVGVzdCI+Ci0gICAgICAgIAotICAgICAgICA8ajp1c2VCZWFuIHZhcj0ibG9nZ2VyIiBjbGFzcz0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MubG9nLk1vY2tMb2ciLz4KLSAgICAgICAgCi0gICAgICAgIDxsb2c6ZmF0YWwgbG9nPSIke2xvZ2dlcn0iPmFiY2RlPC9sb2c6ZmF0YWw+Ci0gICAgICAgIAotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9ImFiY2RlIiBhY3R1YWw9IiR7bG9nZ2VyLmZhdGFsfSIgLz4KLSAgICAgICAgCi0gICAgPC90ZXN0OmNhc2U+Ci0gICAgCi08L3Rlc3Q6c3VpdGU+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL2xvZy94ZG9jcy9jaGFuZ2VzLnhtbCBiL2plbGx5LXRhZ3MvbG9nL3hkb2NzL2NoYW5nZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjNlOGUxLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvbG9nL3hkb2NzL2NoYW5nZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLSAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSAtLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+Q2hhbmdlczwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotICA8Ym9keT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjAiIGRhdGU9IjIwMDQtMDktMTAiPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImFkZCI+SW5pdGlhbCBSZWxlYXNlPC9hY3Rpb24+Ci0gICAgPC9yZWxlYXNlPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9sb2cveGRvY3MvaW5kZXgueG1sIGIvamVsbHktdGFncy9sb2cveGRvY3MvaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjdhMTQzLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvbG9nL3hkb2NzL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkxvZ2dpbmcgVGFnIExpYnJhcnk8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLQotICA8Ym9keT4KLSAgICA8c2VjdGlvbiBuYW1lPSJPdmVydmlldyI+Ci0gICAgICA8cD4KLSAgICAgICAgQ3VzdG9tIHRhZ3MgZm9yIGdlbmVyYXRpbmcgdGV4dHVhbCBsb2dnaW5nIGluZm9ybWF0aW9uIHVzaW5nCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2xvZ2dpbmcvaW5kZXguaHRtbCI+Y29tbW9ucy1sb2dnaW5nPC9hPiAKLSAgICAgICAgICB3aGljaCB3aWxsIHVzZSBlaXRoZXIgbG9nNGosIGxvZ2tpdCBvciBKREsxLjQgbG9nZ2luZwotICAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgY2xhc3NwYXRoIGFuZCBjb25maWd1cmF0aW9uLgotICAgICAgPC9wPgotICAgICAgPHA+Ci0gICAgICAgIFNlZSB0aGUgPGEgaHJlZj0idGFncy5odG1sIj50YWdzPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvbG9nL3hkb2NzL25hdmlnYXRpb24ueG1sIGIvamVsbHktdGFncy9sb2cveGRvY3MvbmF2aWdhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNjFhZTAuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9sb2cveGRvY3MvbmF2aWdhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IG5hbWU9IkxvZ2dpbmcgVGFnIExpYnJhcnkiPgotCi0gIDx0aXRsZT5Mb2dnaW5nIFRhZyBMaWJyYXJ5PC90aXRsZT4KLSAgCi0gIDxib2R5PgotICAgIDxtZW51IG5hbWU9IkxvZ2dpbmcgVGFnIExpYnJhcnkiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgICAgICAgICAgIGhyZWY9Ii9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJUYWdzIiAgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZ3MuaHRtbCIvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9tYXZlbi54bWwgYi9qZWxseS10YWdzL21hdmVuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxMGM3ZS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL21hdmVuLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgZGVmYXVsdD0iamFyIj4KLSAgPCEtLSBkZXJlZ2lzdGVyIGxpbmtjaGVjayAtLT4KLSAgPHBvc3RHb2FsIG5hbWU9Inhkb2M6cmVnaXN0ZXItcmVwb3J0cyI+Ci0gICAgPGF0dGFpbkdvYWwgbmFtZT0ibWF2ZW4tbGlua2NoZWNrLXBsdWdpbjpkZXJlZ2lzdGVyIi8+ICAKLSAgPC9wb3N0R29hbD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL29qYi8uY3ZzaWdub3JlIGIvamVsbHktdGFncy9vamIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZjZWI3Ni4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL29qYi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1tYXZlbi5sb2cKLXRhcmdldAotdmVsb2NpdHkubG9nCi1qY292ZXJhZ2Uuc2VyCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL29qYi9idWlsZC54bWwgYi9qZWxseS10YWdzL29qYi9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYTljN2MuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9vamIvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS1idWlsZC54bWwgZ2VuZXJhdGVkIGJ5IG1hdmVuIGZyb20gcHJvamVjdC54bWwgdmVyc2lvbiAxLjAtU05BUFNIT1QKLSAgb24gZGF0ZSBNYXkgMjQgMjAwNCwgdGltZSAyMzAyLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXIiIG5hbWU9ImNvbW1vbnMtamVsbHktdGFncy1vamIiIGJhc2VkaXI9Ii4iPgotICA8cHJvcGVydHkgbmFtZT0iZGVmYXVsdHRhcmdldGRpciIgdmFsdWU9InRhcmdldCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJkaXIiIHZhbHVlPSJ0YXJnZXQvbGliIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXNkaXIiIHZhbHVlPSJ0YXJnZXQvY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Y2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0idGVzdHJlcG9ydGRpciIgdmFsdWU9InRhcmdldC90ZXN0LXJlcG9ydHMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZGlzdGRpciIgdmFsdWU9ImRpc3QiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iamF2YWRvY2RpciIgdmFsdWU9ImRpc3QvZG9jcy9hcGkiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZmluYWwubmFtZSIgdmFsdWU9ImNvbW1vbnMtamVsbHktdGFncy1vamItMS4wLVNOQVBTSE9UIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0ibyBJbml0aWFsaXplcyBzb21lIHByb3BlcnRpZXMiPgotICAgIDxta2RpciBkaXI9IiR7bGliZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJub2dldCI+Ci0gICAgICA8ZXF1YWxzIGFyZzI9Im9ubHkiIGFyZzE9IiR7YnVpbGQuc3lzY2xhc3NwYXRofSI+Ci0gICAgICA8L2VxdWFscz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249Im8gQ29tcGlsZSB0aGUgY29kZSIgZGVwZW5kcz0iZ2V0LWRlcHMiPgotICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7Y2xhc3Nlc2Rpcn0iIGRlcHJlY2F0aW9uPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSIgb3B0aW1pemU9ImZhbHNlIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIj4KLSAgICAgIDxzcmM+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL2phdmEiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9zcmM+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgICA8Y29weSB0b2Rpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy9qYXZhIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgICA8Y29weSB0b2Rpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamVsbHkiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhzbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5ybmciPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouZHRkIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouaHRtbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphciIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIHRoZSBqYXIiIGRlcGVuZHM9ImNvbXBpbGUsdGVzdCI+Ci0gICAgPGphciBqYXJmaWxlPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiIGJhc2VkaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgIDwvamFyPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249Im8gQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBkaXJlY3RvcmllcyI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iPgotICAgIDwvZGVsZXRlPgotICAgIDxkZWxldGUgZGlyPSIke2Rpc3RkaXJ9Ij4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIGEgZGlzdHJpYnV0aW9uIiBkZXBlbmRzPSJqYXIsIGphdmFkb2MiPgotICAgIDxta2RpciBkaXI9ImRpc3QiPgotICAgIDwvbWtkaXI+Ci0gICAgPGNvcHkgdG9kaXI9ImRpc3QiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2RlZmF1bHR0YXJnZXRkaXJ9IiBpbmNsdWRlcz0iKi5qYXIiPgotICAgICAgPC9maWxlc2V0PgotICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRlcz0iTElDRU5TRSosIFJFQURNRSoiPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249Im8gUnVuIHRoZSB0ZXN0IGNhc2VzIiBpZj0idGVzdC5mYWlsdXJlIiBkZXBlbmRzPSJpbnRlcm5hbC10ZXN0Ij4KLSAgICA8ZmFpbCBtZXNzYWdlPSJUaGVyZSB3ZXJlIHRlc3QgZmFpbHVyZXMuIj4KLSAgICA8L2ZhaWw+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImludGVybmFsLXRlc3QiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdHMiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdHJlcG9ydGRpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGp1bml0IGRpcj0iLi8iIGZhaWx1cmVwcm9wZXJ0eT0idGVzdC5mYWlsdXJlIiBwcmludFN1bW1hcnk9InllcyIgZm9yaz0idHJ1ZSIgaGFsdG9uZXJyb3I9InRydWUiPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYmFzZWRpciIgdmFsdWU9Ii4iPgotICAgICAgPC9zeXNwcm9wZXJ0eT4KLSAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIj4KLSAgICAgIDwvZm9ybWF0dGVyPgotICAgICAgPGZvcm1hdHRlciB1c2VmaWxlPSJmYWxzZSIgdHlwZT0icGxhaW4iPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdHJlcG9ydGRpcn0iPgotICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9UZXN0Ki5qYXZhIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvYmF0Y2h0ZXN0PgotICAgIDwvanVuaXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtdGVzdHMiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqYXZhYyBkZXN0ZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvdGVzdCI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MiIGRlc2NyaXB0aW9uPSJvIEdlbmVyYXRlIGphdmFkb2MiIGRlcGVuZHM9ImphciI+Ci0gICAgPG1rZGlyIGRpcj0iJHtqYXZhZG9jZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8dHN0YW1wPgotICAgICAgPGZvcm1hdCBwYXR0ZXJuPSIyMDAyLXl5eXkiIHByb3BlcnR5PSJ5ZWFyIj4KLSAgICAgIDwvZm9ybWF0PgotICAgIDwvdHN0YW1wPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb3B5cmlnaHQiIHZhbHVlPSJDb3B5cmlnaHQgJmFtcDtjb3B5OyAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSIgdmFsdWU9ImNvbW1vbnMtamVsbHktdGFncy1vamIgMS4wLVNOQVBTSE9UIEFQSSI+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgICA8amF2YWRvYyB1c2U9InRydWUiIHByaXZhdGU9InRydWUiIGRlc3RkaXI9IiR7amF2YWRvY2Rpcn0iIGF1dGhvcj0idHJ1ZSIgdmVyc2lvbj0idHJ1ZSIgc291cmNlcGF0aD0ic3JjL2phdmEiIHBhY2thZ2VuYW1lcz0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Mub2piLioiPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhZG9jPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJnZXQtZGVwcyIgdW5sZXNzPSJub2dldCIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9vamItMC45LjYuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL29qYi9qYXJzL29qYi0wLjkuNi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtbGFuZy1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1sYW5nL2phcnMvY29tbW9ucy1sYW5nLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZXhsLVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWpleGwvamFycy9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS94bWwtYXBpcy0xLjAuYjIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3htbC1hcGlzL2phcnMveG1sLWFwaXMtMS4wLmIyLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1iZWFudXRpbHMtMS42LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWJlYW51dGlscy9qYXJzL2NvbW1vbnMtYmVhbnV0aWxzLTEuNi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtY29sbGVjdGlvbnMtMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWNvbGxlY3Rpb25zL2phcnMvY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWxvZ2dpbmctMS4wLjMuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtbG9nZ2luZy9qYXJzL2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2RvbTRqLTEuNS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2RvbTRqL2phcnMvZG9tNGotMS41LWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2pheGVuLTEuMS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2pheGVuL2phcnMvamF4ZW4tMS4xLWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3hlcmNlcy0yLjIuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veGVyY2VzL2phcnMveGVyY2VzLTIuMi4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vanVuaXQtMy44LjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2p1bml0L2phcnMvanVuaXQtMy44LjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vYW50LW9wdGlvbmFsLTEuNS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vYW50L2phcnMvYW50LW9wdGlvbmFsLTEuNS5qYXIiPgotICAgIDwvZ2V0PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJpbnN0YWxsLW1hdmVuIj4KLSAgICA8Z2V0IGRlc3Q9IiR7dXNlci5ob21lfS9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgc3JjPSIke3JlcG99L21hdmVuL21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPHVuamFyIGRlc3Q9IiR7bWF2ZW4uaG9tZX0iIHNyYz0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC91bmphcj4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9vamIvbWF2ZW4ueG1sIGIvamVsbHktdGFncy9vamIvbWF2ZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTdhZGIzLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvb2piL21hdmVuLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXZhOmphciI+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvb2piL3Byb2plY3QucHJvcGVydGllcyBiL2plbGx5LXRhZ3Mvb2piL3Byb2plY3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQxOWNiYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL29qYi9wcm9qZWN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIyAKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFAgUiBPIEogRSBDIFQgIFAgUiBPIFAgRSBSIFQgSSBFIFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9vamIvcHJvamVjdC54bWwgYi9qZWxseS10YWdzL29qYi9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY0N2UyNC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL29qYi9wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3Q+Ci0gIDxleHRlbmQ+JHtiYXNlZGlyfS8uLi90YWctcHJvamVjdC54bWw8L2V4dGVuZD4KLSAgPGlkPmNvbW1vbnMtamVsbHktdGFncy1vamI8L2lkPgotICA8bmFtZT5jb21tb25zLWplbGx5LXRhZ3Mtb2piPC9uYW1lPgotICA8Y3VycmVudFZlcnNpb24+MS4wPC9jdXJyZW50VmVyc2lvbj4KLQotICA8cGFja2FnZT5vcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5vamI8L3BhY2thZ2U+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICAgICAgIEEgdmFyaWV0eSBvZiB0YWdzIGZvciB3b3JraW5nIHdpdGggdGhlICBPYmplY3RCcmlkZ2UgcGVyc2lzdGVuY2UgZW5naW5lIAotICA8L2Rlc2NyaXB0aW9uPgotICA8c2hvcnREZXNjcmlwdGlvbj5Db21tb25zIEplbGx5IE9qQiBUYWcgTGlicmFyeTwvc2hvcnREZXNjcmlwdGlvbj4KLSAgCi0gIDx2ZXJzaW9ucz4KLSAgICA8dmVyc2lvbj4KLSAgICAgIDxpZD4xLjA8L2lkPgotICAgICAgPG5hbWU+MS4wPC9uYW1lPgotICAgICAgPHRhZz5DT01NT05TLUpFTExZLU9KQi0xXzA8L3RhZz4KLSAgICA8L3ZlcnNpb24+Ci0gIDwvdmVyc2lvbnM+Ci0gIAotICA8ZGVwZW5kZW5jaWVzPgotICAgIAotICAgIDwhLS0gb2piIHRhZ2xpYiAtLT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5vamI8L2lkPgotICAgICAgPHZlcnNpb24+MC45LjY8L3ZlcnNpb24+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGd1bXAucHJvamVjdD5kYi1vamItZnJvbS1wYWNrYWdlczwvZ3VtcC5wcm9qZWN0PgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5jb21tb25zLWxhbmc8L2lkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9vamIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvb2piL0Jyb2tlclRhZy5qYXZhIGIvamVsbHktdGFncy9vamIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvb2piL0Jyb2tlclRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjQzMDUyLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvb2piL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL29qYi9Ccm9rZXJUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Mub2piOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5vamIuYnJva2VyLlBlcnNpc3RlbmNlQnJva2VyOwotaW1wb3J0IG9yZy5hcGFjaGUub2piLmJyb2tlci5QZXJzaXN0ZW5jZUJyb2tlckZhY3Rvcnk7Ci0KLS8qKgotICogPHA+VGFnIGhhbmRsZXIgZm9yICZsdDtEcml2ZXImZ3Q7IGluIEpTVEwsIHVzZWQgdG8gY3JlYXRlCi0gKiBhIHNpbXBsZSBEYXRhU291cmNlIGZvciBwcm90b3R5cGluZy48L3A+Ci0gKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBCcm9rZXJUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgdmFyaWFibGUgbmFtZSB0byBleHBvcnQuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyOwotCi0gICAgLyoqIFRoZSBwZXJzaXN0ZW5jZSBicm9rZXIgaW5zdGFuY2UgKi8KLSAgICBwcml2YXRlIFBlcnNpc3RlbmNlQnJva2VyIGJyb2tlcjsKLQotICAgIHB1YmxpYyBCcm9rZXJUYWcoKSB7Ci0gICAgfQotCi0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCB2YXIgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHZhciA9ICJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkub2piLkJyb2tlciI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBicm9rZXIgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUodmFyLCBicm9rZXIpOwotICAgICAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYnJva2VyID0gUGVyc2lzdGVuY2VCcm9rZXJGYWN0b3J5LmRlZmF1bHRQZXJzaXN0ZW5jZUJyb2tlcigpOwotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIGJyb2tlcik7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgYnJva2VyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgYnJva2VyID0gbnVsbDsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnJlbW92ZVZhcmlhYmxlKHZhcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqIFNldHMgdGhlIHZhcmlhYmxlIG5hbWUgdG8gZGVmaW5lIGZvciB0aGlzIGV4cHJlc3Npb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiB0aGUgcGVyc2lzdGVuY2UgYnJva2VyIGluc3RhbmNlICovCi0gICAgcHVibGljIFBlcnNpc3RlbmNlQnJva2VyIGdldEJyb2tlcigpIHsKLSAgICAgICAgcmV0dXJuIGJyb2tlcjsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyB0aGUgcGVyc2lzdGVuY2UgYnJva2VyIGluc3RhbmNlICovCi0gICAgcHVibGljIHZvaWQgc2V0QnJva2VyKFBlcnNpc3RlbmNlQnJva2VyIGJyb2tlcikgewotICAgICAgICB0aGlzLmJyb2tlciA9IGJyb2tlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL29qYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9vamIvT2piVGFnTGlicmFyeS5qYXZhIGIvamVsbHktdGFncy9vamIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvb2piL09qYlRhZ0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMyMDVjMS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL29qYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9vamIvT2piVGFnTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLm9qYjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmUuQ29yZVRhZ0xpYnJhcnk7Ci0KLS8qKiBEZXNjcmliZXMgdGhlIFRhZ2xpYi4gVGhpcyBjbGFzcyBjb3VsZCBiZSBnZW5lcmF0ZWQgYnkgWERvY2xldAotICAqCi0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAgKi8KLQotcHVibGljIGNsYXNzIE9qYlRhZ0xpYnJhcnkgZXh0ZW5kcyBDb3JlVGFnTGlicmFyeSB7Ci0KLSAgICBwdWJsaWMgT2piVGFnTGlicmFyeSgpIHsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImJyb2tlciIsIEJyb2tlclRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJzdG9yZSIsIFN0b3JlVGFnLmNsYXNzKTsKLSAgICAgICAgLy9yZWdpc3RlclRhZygiZGVsZXRlIiwgRGVsZXRlVGFnLmNsYXNzKTsKLSAgICAgICAgLy9yZWdpc3RlclRhZygicXVlcnkiLCBRdWVyeVRhZy5jbGFzcyk7Ci0gICAgICAgIC8vcmVnaXN0ZXJUYWcoInRyYW5zYWN0aW9uIiwgVHJhbnNhY3Rpb25UYWcuY2xhc3MpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9vamIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvb2piL1N0b3JlVGFnLmphdmEgYi9qZWxseS10YWdzL29qYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9vamIvU3RvcmVUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE1N2EzNi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL29qYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9vamIvU3RvcmVUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Mub2piOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5vamIuYnJva2VyLlBlcnNpc3RlbmNlQnJva2VyOwotCi0vKioKLSAqIDxwPlRoaXMgU3RvcmUgdGFnIHdpbGwgc3RvcmUgdGhlIGdpdmVuIG9iamVjdCBpbiBPYmplY3RCcmlkZ2UgdXNpbmcKLSAqIHRoZSBnaXZlbiBicm9rZXIgb3IgaXQgd2lsbCB1c2UgdGhlIHBhcmVudCBicm9rZXIgdGFncyBicm9rZXIgaW5zdGFuY2UuPC9wPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAqLwotcHVibGljIGNsYXNzIFN0b3JlVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogdGhlIHZhbHVlIHRvIHBlcnNpc3QgKi8KLSAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKLQotICAgIC8qKiBUaGUgcGVyc2lzdGVuY2UgYnJva2VyIGluc3RhbmNlICovCi0gICAgcHJpdmF0ZSBQZXJzaXN0ZW5jZUJyb2tlciBicm9rZXI7Ci0KLSAgICBwdWJsaWMgU3RvcmVUYWcoKSB7Ci0gICAgfQotCi0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCB2YWx1ZSA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCAiTm8gdmFsdWUgaXMgc3VwcGxpZWQhIiApOwotICAgICAgICB9Ci0gICAgICAgIGdldEJyb2tlcigpLnN0b3JlKCB2YWx1ZSApOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSB0byBiZSBwZXJzaXN0ZWQgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSBicm9rZXIgaW5zdGFuY2UgKi8KLSAgICBwdWJsaWMgUGVyc2lzdGVuY2VCcm9rZXIgZ2V0QnJva2VyKCkgewotICAgICAgICBpZiAoYnJva2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIEJyb2tlclRhZyBicm9rZXJUYWcgPSAoQnJva2VyVGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoIEJyb2tlclRhZy5jbGFzcyApOwotICAgICAgICAgICAgaWYgKCBicm9rZXJUYWcgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICBicm9rZXIgPSBicm9rZXJUYWcuZ2V0QnJva2VyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBicm9rZXIgPSAoUGVyc2lzdGVuY2VCcm9rZXIpIGNvbnRleHQuZ2V0VmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkub2piLkJyb2tlciIKLSAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBicm9rZXI7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIHBlcnNpc3RlbmNlIGJyb2tlciBpbnN0YW5jZSAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJyb2tlcihQZXJzaXN0ZW5jZUJyb2tlciBicm9rZXIpIHsKLSAgICAgICAgdGhpcy5icm9rZXIgPSBicm9rZXI7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL29qYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9vamIvcGFja2FnZS5odG1sIGIvamVsbHktdGFncy9vamIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvb2piL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NhMTQxYi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL29qYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9vamIvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxodG1sPgotPGhlYWQ+Ci08L2hlYWQ+Ci08Ym9keT4KLQotICA8cD5BIHZhcmlldHkgb2YgdGFncyBmb3Igd29ya2luZyB3aXRoIHRoZSAKLSAgCTxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvb2piLyI+T2JqZWN0QnJpZGdlPC9hPiBwZXJzaXN0ZW5jZSBlbmdpbmUKLSAgPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9vamIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvb2piL3NhbXBsZS5qZWxseSBiL2plbGx5LXRhZ3Mvb2piL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL29qYi9zYW1wbGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMGQ4Y2UuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9vamIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvb2piL3NhbXBsZS5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM6b2piPSJqZWxseTpvamIiPgotCi0gICAgPCEtLSBzb21lIHNhbXBsZSBzY3JpcHRzIHdvdWxkIGJlIGEgZ29vZCBpZGVhIC0tPgotCi08L2plbGx5PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvb2piL3hkb2NzL2NoYW5nZXMueG1sIGIvamVsbHktdGFncy9vamIveGRvY3MvY2hhbmdlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNDQwODEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9vamIveGRvY3MvY2hhbmdlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tIAotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotIC0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5DaGFuZ2VzPC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0gIDxib2R5PgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMCIgZGF0ZT0iMjAwNC0wOS0xMiI+Ci0gICAgPC9yZWxlYXNlPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9vamIveGRvY3MvaW5kZXgueG1sIGIvamVsbHktdGFncy9vamIveGRvY3MvaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjQ2NTZmLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvb2piL3hkb2NzL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPk9KQiBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotICAgIDxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KLSAgICAgIDxwPgotICAgICAgICBBIHZhcmlldHkgb2YgdGFncyBmb3Igd29ya2luZyB3aXRoIHRoZSAKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZGIuYXBhY2hlLm9yZy9vamIvIj5PYmplY3RCcmlkZ2U8L2E+IHBlcnNpc3RlbmNlIGVuZ2luZS4KLSAgICAgICAgU2VlIHRoZSA8YSBocmVmPSJ0YWdzLmh0bWwiPnRhZ3M8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgICAgPC9wPgotICAgIDwvc2VjdGlvbj4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9vamIveGRvY3MvbmF2aWdhdGlvbi54bWwgYi9qZWxseS10YWdzL29qYi94ZG9jcy9uYXZpZ2F0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNiM2NmMC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL29qYi94ZG9jcy9uYXZpZ2F0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgbmFtZT0iT0pCIFRhZyBMaWJyYXJ5Ij4KLQotICA8dGl0bGU+T0pCIFRhZyBMaWJyYXJ5PC90aXRsZT4KLSAgCi0gIDxib2R5PgotICAgIDxtZW51IG5hbWU9Ik9KQiBUYWcgTGlicmFyeSI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgICAgICAgICAgaHJlZj0iL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IlRhZ3MiICAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFncy5odG1sIi8+Ci0gICAgPC9tZW51PgotICA8L2JvZHk+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3Byb2plY3QucHJvcGVydGllcyBiL2plbGx5LXRhZ3MvcHJvamVjdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWNlMjU1Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvcHJvamVjdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUCBSIE8gSiBFIEMgVCAgUCBSIE8gUCBFIFIgVCBJIEUgUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1tYXZlbi5qdW5pdC5mb3JrPXRydWUKLQotbWF2ZW4uY29tcGlsZS5kZXByZWNhdGlvbiA9IG9uCi0KLW1hdmVuLmNoZWNrc3R5bGUucHJvcGVydGllcz0ke2Jhc2VkaXJ9Ly4uL3RhZy1jaGVja3N0eWxlLnhtbAotbWF2ZW4uY2hlY2tzdHlsZS5oZWFkZXIuZmlsZT0ke2Jhc2VkaXJ9Ly4uLy4uL3Nob3J0LWxpY2Vuc2UudHh0Ci0KLW1hdmVuLmNoYW5nZXMuaXNzdWUudGVtcGxhdGU9aHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlLyVJU1NVRSUKLQotbWF2ZW4ubGljZW5zZS5saWNlbnNlRmlsZT0ke2Jhc2VkaXJ9Ly4uLy4uL0xJQ0VOU0UudHh0Ci0KLW1hdmVuLnhkb2MuZGF0ZT1sZWZ0Ci1tYXZlbi54ZG9jLmRldmVsb3BtZW50UHJvY2Vzc1VybD1odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvY2hhcnRlci5odG1sCi1tYXZlbi54ZG9jLnBvd2VyZWRieS5pbWFnZT1tYXZlbi1mZWF0aGVyLnBuZwotCi1tYXZlbi54ZG9jLmpzbD1maWxlOiR7YmFzZWRpcn0vLi4vLi4vLi4vY29tbW9ucy1idWlsZC9jb21tb25zLXNpdGUuanNsCi1tYXZlbi54ZG9jLmRpc3RyaWJ1dGlvblVybD1odHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9qYXZhLXJlcG9zaXRvcnkvY29tbW9ucy1qZWxseS9qYXJzCi0KLW1hdmVuLmxpbmtjaGVjay5lbmFibGU9ZmFsc2UKLW1hdmVuLnBtZC5ydWxlc2V0ZmlsZXM9XAotICBydWxlc2V0cy9iYXNpYy54bWwsXAotICBydWxlc2V0cy91bnVzZWRjb2RlLnhtbCxcCi0gIHJ1bGVzZXRzL2ltcG9ydHMueG1sLFwKLSAgcnVsZXNldHMvY29kZXNpemUueG1sLFwKLSAgcnVsZXNldHMvY291cGxpbmcueG1sLFwKLSAgcnVsZXNldHMvZGVzaWduLnhtbCxcCi0gIHJ1bGVzZXRzL3N0cmluZ3MueG1sCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3Byb2plY3QueG1sIGIvamVsbHktdGFncy9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU3YTFkOC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdD4KLSAgPHBvbVZlcnNpb24+MzwvcG9tVmVyc2lvbj4KLSAgPGlkPmNvbW1vbnMtamVsbHktdGFnczwvaWQ+Ci0gIDxuYW1lPkplbGx5IExpYnJhcnkgTWFzdGVyIE1hdmVuIFBPTTwvbmFtZT4KLSAgPGN1cnJlbnRWZXJzaW9uPjEuMDwvY3VycmVudFZlcnNpb24+Ci0KLSAgPG9yZ2FuaXphdGlvbj4KLSAgICA8bmFtZT5BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KLSAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZzwvdXJsPgotICAgIDxsb2dvPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9pbWFnZXMvamFrYXJ0YS1sb2dvLWJsdWUuZ2lmPC9sb2dvPgotICA8L29yZ2FuaXphdGlvbj4KLSAgPGxvZ28+L2ltYWdlcy9sb2dvLmpwZzwvbG9nbz4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuKjwvcGFja2FnZT4KLSAgPGd1bXBSZXBvc2l0b3J5SWQ+amFrYXJ0YTwvZ3VtcFJlcG9zaXRvcnlJZD4KLSAgCi0gIDx1cmw+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5L2xpYnMvPC91cmw+Ci0gIDxpc3N1ZVRyYWNraW5nVXJsPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy88L2lzc3VlVHJhY2tpbmdVcmw+Ci0gIAotICA8c2l0ZUFkZHJlc3M+amFrYXJ0YS5hcGFjaGUub3JnPC9zaXRlQWRkcmVzcz4KLSAgPHNpdGVEaXJlY3Rvcnk+L3d3dy9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9qZWxseS9qZWxseS10YWdzPC9zaXRlRGlyZWN0b3J5PgotICA8ZGlzdHJpYnV0aW9uRGlyZWN0b3J5Pi93d3cvamFrYXJ0YS5hcGFjaGUub3JnL2J1aWxkcy9qYWthcnRhLWNvbW1vbnMvamVsbHkvamVsbHktdGFnczwvZGlzdHJpYnV0aW9uRGlyZWN0b3J5PgotICAKLSAgPHJlcG9zaXRvcnk+Ci0gICAgPGNvbm5lY3Rpb24+c2NtOmN2czpwc2VydmVyOmFub25jdnNAY3ZzLmFwYWNoZS5vcmc6L2hvbWUvY3ZzcHVibGljOmpha2FydGEtY29tbW9ucy9qZWxseS9qZWxseS10YWdzPC9jb25uZWN0aW9uPgotICAgIDx1cmw+aHR0cDovL2N2cy5hcGFjaGUub3JnL3ZpZXdjdnMvamFrYXJ0YS1jb21tb25zL2plbGx5L2plbGx5LXRhZ3M8L3VybD4KLSAgPC9yZXBvc2l0b3J5PgotICAKLSAgPG1haWxpbmdMaXN0cz4KLSAgICA8bWFpbGluZ0xpc3Q+Ci0gICAgICA8bmFtZT5Db21tb25zIERldiBMaXN0PC9uYW1lPgotICAgICAgPHN1YnNjcmliZT5jb21tb25zLWRldi1zdWJzY3JpYmVAamFrYXJ0YS5hcGFjaGUub3JnPC9zdWJzY3JpYmU+Ci0gICAgICA8dW5zdWJzY3JpYmU+Y29tbW9ucy1kZXYtdW5zdWJzY3JpYmVAamFrYXJ0YS5hcGFjaGUub3JnPC91bnN1YnNjcmliZT4KLSAgICAgIDxhcmNoaXZlPmh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvZXllYnJvd3NlL1N1bW1hcml6ZUxpc3Q/bGlzdE5hbWU9Y29tbW9ucy1kZXZAamFrYXJ0YS5hcGFjaGUub3JnPC9hcmNoaXZlPgotICAgIDwvbWFpbGluZ0xpc3Q+Ci0gICAgPG1haWxpbmdMaXN0PgotICAgICAgPG5hbWU+Q29tbW9ucyBVc2VyIExpc3Q8L25hbWU+Ci0gICAgICA8c3Vic2NyaWJlPmNvbW1vbnMtdXNlci1zdWJzY3JpYmVAamFrYXJ0YS5hcGFjaGUub3JnPC9zdWJzY3JpYmU+Ci0gICAgICA8dW5zdWJzY3JpYmU+Y29tbW9ucy11c2VyLXVuc3Vic2NyaWJlQGpha2FydGEuYXBhY2hlLm9yZzwvdW5zdWJzY3JpYmU+Ci0gICAgICA8YXJjaGl2ZT5odHRwOi8vbWFpbC1hcmNoaXZlcy5hcGFjaGUub3JnL2V5ZWJyb3dzZS9TdW1tYXJpemVMaXN0P2xpc3ROYW1lPWNvbW1vbnMtdXNlckBqYWthcnRhLmFwYWNoZS5vcmc8L2FyY2hpdmU+Ci0gICAgPC9tYWlsaW5nTGlzdD4KLSAgPC9tYWlsaW5nTGlzdHM+Ci0KLSAgPGJ1aWxkPgotICAgIDxuYWdFbWFpbEFkZHJlc3M+Y29tbW9ucy1kZXZAamFrYXJ0YS5hcGFjaGUub3JnPC9uYWdFbWFpbEFkZHJlc3M+Ci0gICAgPHNvdXJjZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9qYXZhPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgPHVuaXRUZXN0U291cmNlRGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL3Rlc3Q8L3VuaXRUZXN0U291cmNlRGlyZWN0b3J5PgotICAgIDxpbnRlZ3JhdGlvblVuaXRUZXN0U291cmNlRGlyZWN0b3J5Lz4KLSAgICA8YXNwZWN0U291cmNlRGlyZWN0b3J5Lz4KLQotICAgIDwhLS0gVW5pdCB0ZXN0IGNsYXNzZXMgLS0+Ci0gICAgPHVuaXRUZXN0PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qKi9UZXN0Ki5qYXZhPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L3VuaXRUZXN0PgotCi0gICAgPCEtLSBJbnRlZ3JhdGlvbiB1bml0IHRlc3QgY2xhc3NlcyAtLT4KLSAgICA8aW50ZWdyYXRpb25Vbml0VGVzdFBhdHRlcm5zPjwvaW50ZWdyYXRpb25Vbml0VGVzdFBhdHRlcm5zPgotICAgIAotICAgIDxyZXNvdXJjZXM+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPioqLyoucHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9yZXNvdXJjZXM+Ci0gICAgCi0gICAgPGphcnM+PC9qYXJzPgotICA8L2J1aWxkPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3F1YXJ0ei8uY3ZzaWdub3JlIGIvamVsbHktdGFncy9xdWFydHovLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZjZWI3Ni4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3F1YXJ0ei8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1tYXZlbi5sb2cKLXRhcmdldAotdmVsb2NpdHkubG9nCi1qY292ZXJhZ2Uuc2VyCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3F1YXJ0ei9idWlsZC54bWwgYi9qZWxseS10YWdzL3F1YXJ0ei9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwN2U4MzUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9xdWFydHovYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS1idWlsZC54bWwgZ2VuZXJhdGVkIGJ5IG1hdmVuIGZyb20gcHJvamVjdC54bWwgdmVyc2lvbiAxLjAtU05BUFNIT1QKLSAgb24gZGF0ZSBNYXkgMjQgMjAwNCwgdGltZSAyMzAyLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXIiIG5hbWU9ImNvbW1vbnMtamVsbHktdGFncy1xdWFydHoiIGJhc2VkaXI9Ii4iPgotICA8cHJvcGVydHkgbmFtZT0iZGVmYXVsdHRhcmdldGRpciIgdmFsdWU9InRhcmdldCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJkaXIiIHZhbHVlPSJ0YXJnZXQvbGliIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXNkaXIiIHZhbHVlPSJ0YXJnZXQvY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Y2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0idGVzdHJlcG9ydGRpciIgdmFsdWU9InRhcmdldC90ZXN0LXJlcG9ydHMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZGlzdGRpciIgdmFsdWU9ImRpc3QiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iamF2YWRvY2RpciIgdmFsdWU9ImRpc3QvZG9jcy9hcGkiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZmluYWwubmFtZSIgdmFsdWU9ImNvbW1vbnMtamVsbHktdGFncy1xdWFydHotMS4wLVNOQVBTSE9UIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0ibyBJbml0aWFsaXplcyBzb21lIHByb3BlcnRpZXMiPgotICAgIDxta2RpciBkaXI9IiR7bGliZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJub2dldCI+Ci0gICAgICA8ZXF1YWxzIGFyZzI9Im9ubHkiIGFyZzE9IiR7YnVpbGQuc3lzY2xhc3NwYXRofSI+Ci0gICAgICA8L2VxdWFscz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249Im8gQ29tcGlsZSB0aGUgY29kZSIgZGVwZW5kcz0iZ2V0LWRlcHMiPgotICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7Y2xhc3Nlc2Rpcn0iIGRlcHJlY2F0aW9uPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSIgb3B0aW1pemU9ImZhbHNlIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIj4KLSAgICAgIDxzcmM+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL2phdmEiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9zcmM+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgICA8Y29weSB0b2Rpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy9qYXZhIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgICA8Y29weSB0b2Rpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamVsbHkiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhzbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5ybmciPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouZHRkIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouaHRtbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphciIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIHRoZSBqYXIiIGRlcGVuZHM9ImNvbXBpbGUsdGVzdCI+Ci0gICAgPGphciBqYXJmaWxlPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiIGJhc2VkaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgIDwvamFyPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249Im8gQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBkaXJlY3RvcmllcyI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iPgotICAgIDwvZGVsZXRlPgotICAgIDxkZWxldGUgZGlyPSIke2Rpc3RkaXJ9Ij4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIGEgZGlzdHJpYnV0aW9uIiBkZXBlbmRzPSJqYXIsIGphdmFkb2MiPgotICAgIDxta2RpciBkaXI9ImRpc3QiPgotICAgIDwvbWtkaXI+Ci0gICAgPGNvcHkgdG9kaXI9ImRpc3QiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2RlZmF1bHR0YXJnZXRkaXJ9IiBpbmNsdWRlcz0iKi5qYXIiPgotICAgICAgPC9maWxlc2V0PgotICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRlcz0iTElDRU5TRSosIFJFQURNRSoiPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249Im8gUnVuIHRoZSB0ZXN0IGNhc2VzIiBpZj0idGVzdC5mYWlsdXJlIiBkZXBlbmRzPSJpbnRlcm5hbC10ZXN0Ij4KLSAgICA8ZmFpbCBtZXNzYWdlPSJUaGVyZSB3ZXJlIHRlc3QgZmFpbHVyZXMuIj4KLSAgICA8L2ZhaWw+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImludGVybmFsLXRlc3QiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdHMiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdHJlcG9ydGRpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGp1bml0IGRpcj0iLi8iIGZhaWx1cmVwcm9wZXJ0eT0idGVzdC5mYWlsdXJlIiBwcmludFN1bW1hcnk9InllcyIgZm9yaz0idHJ1ZSIgaGFsdG9uZXJyb3I9InRydWUiPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYmFzZWRpciIgdmFsdWU9Ii4iPgotICAgICAgPC9zeXNwcm9wZXJ0eT4KLSAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIj4KLSAgICAgIDwvZm9ybWF0dGVyPgotICAgICAgPGZvcm1hdHRlciB1c2VmaWxlPSJmYWxzZSIgdHlwZT0icGxhaW4iPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdHJlcG9ydGRpcn0iPgotICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9UZXN0Ki5qYXZhIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvYmF0Y2h0ZXN0PgotICAgIDwvanVuaXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtdGVzdHMiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqYXZhYyBkZXN0ZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvdGVzdCI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MiIGRlc2NyaXB0aW9uPSJvIEdlbmVyYXRlIGphdmFkb2MiIGRlcGVuZHM9ImphciI+Ci0gICAgPG1rZGlyIGRpcj0iJHtqYXZhZG9jZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8dHN0YW1wPgotICAgICAgPGZvcm1hdCBwYXR0ZXJuPSIyMDAyLXl5eXkiIHByb3BlcnR5PSJ5ZWFyIj4KLSAgICAgIDwvZm9ybWF0PgotICAgIDwvdHN0YW1wPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb3B5cmlnaHQiIHZhbHVlPSJDb3B5cmlnaHQgJmFtcDtjb3B5OyAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSIgdmFsdWU9ImNvbW1vbnMtamVsbHktdGFncy1xdWFydHogMS4wLVNOQVBTSE9UIEFQSSI+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgICA8amF2YWRvYyB1c2U9InRydWUiIHByaXZhdGU9InRydWUiIGRlc3RkaXI9IiR7amF2YWRvY2Rpcn0iIGF1dGhvcj0idHJ1ZSIgdmVyc2lvbj0idHJ1ZSIgc291cmNlcGF0aD0ic3JjL2phdmEiIHBhY2thZ2VuYW1lcz0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MucXVhcnR6LioiPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhZG9jPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJnZXQtZGVwcyIgdW5sZXNzPSJub2dldCIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vcXVhcnR6LTEuMC4yLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9xdWFydHovamFycy9xdWFydHotMS4wLjIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtY2xpLVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWNsaS9qYXJzL2NvbW1vbnMtY2xpLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vbG9nNGotMS4yLjUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2xvZzRqL2phcnMvbG9nNGotMS4yLjUuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamV4bC9qYXJzL2NvbW1vbnMtamV4bC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3htbC1hcGlzLTEuMC5iMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veG1sLWFwaXMvamFycy94bWwtYXBpcy0xLjAuYjIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWJlYW51dGlscy0xLjYuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtYmVhbnV0aWxzL2phcnMvY29tbW9ucy1iZWFudXRpbHMtMS42LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtY29sbGVjdGlvbnMvamFycy9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1sb2dnaW5nL2phcnMvY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vZG9tNGotMS41LWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vZG9tNGovamFycy9kb200ai0xLjUtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vamF4ZW4tMS4xLWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vamF4ZW4vamFycy9qYXhlbi0xLjEtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veGVyY2VzLTIuMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94ZXJjZXMvamFycy94ZXJjZXMtMi4yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qdW5pdC0zLjguMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vanVuaXQvamFycy9qdW5pdC0zLjguMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FudC0xLjUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC0xLjUuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtb3B0aW9uYWwtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtb3B0aW9uYWwtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtbWF2ZW4iPgotICAgIDxnZXQgZGVzdD0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBzcmM9IiR7cmVwb30vbWF2ZW4vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8dW5qYXIgZGVzdD0iJHttYXZlbi5ob21lfSIgc3JjPSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L3VuamFyPgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3F1YXJ0ei9tYXZlbi54bWwgYi9qZWxseS10YWdzL3F1YXJ0ei9tYXZlbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMjY2OWMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9xdWFydHovbWF2ZW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImphdmE6amFyIj4KLQotICA8Z29hbCBuYW1lPSJjcmVhdGUtY2xhc3NwYXRoIiBwcmVyZXFzPSJqYXZhOmNvbXBpbGUsdGVzdDpjb21waWxlIj4KLSAgICAgICAgPHBhdGggaWQ9InRlc3QuY2xhc3NwYXRoIj4KLSAgICAgICAgICAgIDwhLS0gYWRkIGxvZzRqIGNvbmZpZyBmaWxlcyB0byBjbGFzc3BhdGggLS0+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy9jb25mIi8+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke21hdmVuLmJ1aWxkLmRlc3R9Ii8+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0idGFyZ2V0L2NsYXNzZXMiLz4KLSAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIi8+Ci0gICAgICAgICAgICA8cGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIAotICAgICAgICA8L3BhdGg+Ci0gIDwvZ29hbD4KLQotICA8Z29hbCBuYW1lPSJkZW1vIiBwcmVyZXFzPSJjcmVhdGUtY2xhc3NwYXRoIgotICAgICAgICBkZXNjcmlwdGlvbj0iUnVucyB0aGUgZXhhbXBsZSBxdWFydHogZGVtbyI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHkiIGZvcms9InllcyI+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgPGFyZyB2YWx1ZT0ic3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvcXVhcnR6L2V4YW1wbGUuamVsbHkiLz4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImxvZzRqLmNvbmZpZ3VyYXRpb24iIHZhbHVlPSJzcmMvY29uZi9sb2c0ai5jb25maWd1cmF0aW9uIi8+Ci0gICAgICAgIDwvamF2YT4KLSAgPC9nb2FsPgotCi0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvcXVhcnR6L3Byb2plY3QucHJvcGVydGllcyBiL2plbGx5LXRhZ3MvcXVhcnR6L3Byb2plY3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQxOWNiYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3F1YXJ0ei9wcm9qZWN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIyAKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFAgUiBPIEogRSBDIFQgIFAgUiBPIFAgRSBSIFQgSSBFIFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9xdWFydHovcHJvamVjdC54bWwgYi9qZWxseS10YWdzL3F1YXJ0ei9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNiODhhMC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3F1YXJ0ei9wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3Q+Ci0gIDxleHRlbmQ+JHtiYXNlZGlyfS8uLi90YWctcHJvamVjdC54bWw8L2V4dGVuZD4KLSAgPGlkPmNvbW1vbnMtamVsbHktdGFncy1xdWFydHo8L2lkPgotICA8bmFtZT5jb21tb25zLWplbGx5LXRhZ3MtcXVhcnR6PC9uYW1lPgotICA8Y3VycmVudFZlcnNpb24+MS4wPC9jdXJyZW50VmVyc2lvbj4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MucXVhcnR6PC9wYWNrYWdlPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgICAgIFRoaXMgaXMgYSBKZWxseSBpbnRlcmZhY2UgZm9yIHRoZSBRdWFydHogU2NoZWR1bGVyLgotICA8L2Rlc2NyaXB0aW9uPgotICA8c2hvcnREZXNjcmlwdGlvbj5Db21tb25zIEplbGx5IFF1YXJ0eiBUYWcgTGlicmFyeTwvc2hvcnREZXNjcmlwdGlvbj4KLSAgCi0gIDx2ZXJzaW9ucz4KLSAgICA8dmVyc2lvbj4KLSAgICAgIDxpZD4xLjA8L2lkPgotICAgICAgPG5hbWU+MS4wPC9uYW1lPgotICAgICAgPHRhZz5DT01NT05TLUpFTExZLVFVQVJUWi0xXzA8L3RhZz4KLSAgICA8L3ZlcnNpb24+Ci0gIDwvdmVyc2lvbnM+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8IS0tIFNUQVJUIGZvciBjb21waWxhdGlvbiAtLT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5xdWFydHo8L2lkPgotICAgICAgPHZlcnNpb24+MS4wLjI8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDwhLS0gRU5EIGZvciBjb21waWxhdGlvbiAtLT4KLSAgICAKLSAgICA8IS0tIFNUQVJUIGZvciBydW5uaW5nIGRlbW9zIC0tPgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+Y29tbW9ucy1jbGk8L2lkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5sb2c0ajwvaWQ+Ci0gICAgICA8dmVyc2lvbj4xLjIuNTwvdmVyc2lvbj4KLSAgICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8Z3VtcC5wcm9qZWN0PmxvZ2dpbmctbG9nNGo8L2d1bXAucHJvamVjdD4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPCEtLSBFTkQgZm9yIHJ1bm5pbmcgZGVtb3MgLS0+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICAKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvcXVhcnR6L3NyYy9jb25mL2xvZzRqLnByb3BlcnRpZXMgYi9qZWxseS10YWdzL3F1YXJ0ei9zcmMvY29uZi9sb2c0ai5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTE1MmRlLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvcXVhcnR6L3NyYy9jb25mL2xvZzRqLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIyAKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotbG9nNGoucm9vdExvZ2dlcj1ERUJVRywgQTEKLWxvZzRqLnJvb3RDYXRlZ29yeT1JTkZPLCBBMQotCi1sb2c0ai5hcHBlbmRlci5BMT1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuQTEubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAotCi1sb2c0ai5sb2dnZXIuc2NoZWR1bGVyPUlORk8KLWxvZzRqLmxvZ2dlci5vcmc9SU5GTwotCi1sb2c0ai5jYXRlZ29yeS5zY2hlZHVsZXI9SU5GTwotbG9nNGouY2F0ZWdvcnkub3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnBhcnNlcj1JTkZPCi0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvcXVhcnR6L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3F1YXJ0ei9Dcm9uVHJpZ2dlclRhZy5qYXZhIGIvamVsbHktdGFncy9xdWFydHovc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvcXVhcnR6L0Nyb25UcmlnZ2VyVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMWQ1YjQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9xdWFydHovc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvcXVhcnR6L0Nyb25UcmlnZ2VyVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5xdWFydHo7Ci0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLnF1YXJ0ei5Dcm9uVHJpZ2dlcjsKLWltcG9ydCBvcmcucXVhcnR6LlNjaGVkdWxlcjsKLWltcG9ydCBvcmcucXVhcnR6LlNjaGVkdWxlckV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi0vKiogRGVmaW5lIGEgdHJpZ2dlciB1c2luZyBhIGNyb24gdGltZSBzcGVjLgotICoKLSAqICBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpib2JAZW5nLndlcmtlbi5jb20iPmJvYiBtY3doaXJ0ZXI8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDcm9uVHJpZ2dlclRhZyBleHRlbmRzIFF1YXJ0elRhZ1N1cHBvcnQKLXsKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyAgICAgSW5zdGFuY2UgbWVtYmVycwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqIENyb24gdGltZSBzcGVjLiAqLwotICAgIHByaXZhdGUgU3RyaW5nIHNwZWM7Ci0KLSAgICAvKiogVHJpZ2dlciBuYW1lLiAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKiogVHJpZ2dlciBncm91cC4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBncm91cDsKLQotICAgIC8qKiBKb2IgbmFtZS4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBqb2JOYW1lOwotCi0gICAgLyoqIEpvYiBncm91cC4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBqb2JHcm91cDsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vICAgICBDT25zdHJ1Y3RvcnMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKiBDb25zdHJ1Y3QuCi0gICAgICovCi0gICAgcHVibGljIENyb25UcmlnZ2VyVGFnKCkKLSAgICB7Ci0gICAgICAgIC8vIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKiBTZXQgdGhlIG5hbWUuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqIFJldHJpZXZlIHRoZSBuYW1lLgotICAgICAqCi0gICAgICogIEByZXR1cm4gVGhlIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5hbWU7Ci0gICAgfQotCi0gICAgLyoqIFNldCB0aGUgZ3JvdXAKLSAgICAgKgotICAgICAqICBAcGFyYW0gZ3JvdXAgVGhlIGdyb3VwCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R3JvdXAoU3RyaW5nIGdyb3VwKQotICAgIHsKLSAgICAgICAgdGhpcy5ncm91cCA9IGdyb3VwOwotICAgIH0KLQotICAgIC8qKiBSZXRyaWV2ZSB0aGUgZ3JvdXAuCi0gICAgICoKLSAgICAgKiAgQHJldHVybiBUaGUgZ3JvdXAuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRHcm91cCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5ncm91cDsKLSAgICB9Ci0KLSAgICAvKiogU2V0IHRoZSBjcm9uIHRpbWUgc3BlYy4KLSAgICAgKgotICAgICAqICBAcGFyYW0gc3BlYyBUaGUgY3JvbiB0aW1lIHNwZWMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3BlYyhTdHJpbmcgc3BlYykKLSAgICB7Ci0gICAgICAgIHRoaXMuc3BlYyA9IHNwZWM7Ci0gICAgfQotCi0gICAgLyoqIFJldHJpZXZlIHRoZSBjcm9uIHRpbWUgc3BlYy4KLSAgICAgKgotICAgICAqICBAcGFyYW0gc3BlYyBUaGUgY3JvbiB0aW1lIHNwZWMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTcGVjKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNwZWM7Ci0gICAgfQotCi0gICAgLyoqIFNldCB0aGUgam9iIG5hbWUuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIGpvYk5hbWUgVGhlIGpvYiBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEpvYk5hbWUoU3RyaW5nIGpvYk5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmpvYk5hbWUgPSBqb2JOYW1lOwotICAgIH0KLQotICAgIC8qKiBSZXRyaWV2ZSB0aGUgam9iIG5hbWUuCi0gICAgICoKLSAgICAgKiAgQHJldHVybiBUaGUgam9iIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRKb2JOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmpvYk5hbWU7Ci0gICAgfQotCi0gICAgLyoqIFNldCB0aGUgam9iIGdyb3VwLgotICAgICAqCi0gICAgICogIEBwYXJhbSBqb2JHcm91cCBUaGUgam9iIGdyb3VwLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEpvYkdyb3VwKFN0cmluZyBqb2JHcm91cCkKLSAgICB7Ci0gICAgICAgIHRoaXMuam9iR3JvdXAgPSBqb2JHcm91cDsKLSAgICB9Ci0KLSAgICAvKiogUmV0cmlldmUgdGhlIGpvYiBncm91cC4KLSAgICAgKgotICAgICAqICBAcmV0dXJuIFRoZSBqb2IgZ3JvdXAuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRKb2JHcm91cCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5qb2JHcm91cDsKLSAgICB9Ci0KLSAgICAvLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQotICAgIC8vICAgICBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnCi0gICAgLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KLQotICAgIC8qKiBQZXJmb3JtIHRoaXMgdGFnLgotICAgICAqCi0gICAgICogIEBwYXJhbSBvdXRwdXQgT3V0cHV0IHNpbmsuCi0gICAgICoKLSAgICAgKiAgQHRocm93cyBFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKCBnZXRTcGVjKCkgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCAic3BlYyIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZ2V0TmFtZSgpID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiggIm5hbWUiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGdldEdyb3VwKCkgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCAiZ3JvdXAiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGdldEpvYk5hbWUoKSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oICJqb2JOYW1lIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBnZXRKb2JHcm91cCgpID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiggImpvYkdyb3VwIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgQ3JvblRyaWdnZXIgdHJpZ2dlciA9IG5ldyBDcm9uVHJpZ2dlciggZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRHcm91cCgpICk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0cmlnZ2VyLnNldENyb25FeHByZXNzaW9uKCBnZXRTcGVjKCkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHRyaWdnZXIuc2V0Sm9iTmFtZSggZ2V0Sm9iTmFtZSgpICk7Ci0gICAgICAgIHRyaWdnZXIuc2V0Sm9iR3JvdXAoIGdldEpvYkdyb3VwKCkgKTsKLSAgICAgICAgdHJpZ2dlci5zZXRTdGFydFRpbWUoIG5ldyBEYXRlKCkgKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2NoZWR1bGVyIHNjaGVkID0gZ2V0U2NoZWR1bGVyKCk7Ci0gICAgICAgICAgICBzY2hlZC5zY2hlZHVsZUpvYiggdHJpZ2dlciApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTY2hlZHVsZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9xdWFydHovc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvcXVhcnR6L0plbGx5Sm9iLmphdmEgYi9qZWxseS10YWdzL3F1YXJ0ei9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9xdWFydHovSmVsbHlKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4YTI2NS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3F1YXJ0ei9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9xdWFydHovSmVsbHlKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MucXVhcnR6OwotCi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5TY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotaW1wb3J0IG9yZy5xdWFydHouSm9iOwotaW1wb3J0IG9yZy5xdWFydHouSm9iRGV0YWlsOwotaW1wb3J0IG9yZy5xdWFydHouSm9iRGF0YU1hcDsKLWltcG9ydCBvcmcucXVhcnR6LkpvYkV4ZWN1dGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnF1YXJ0ei5Kb2JFeGVjdXRpb25FeGNlcHRpb247Ci0KLS8qKiBJbXBsZW1lbnRhdGlvbiBvZiBhIHF1YXJ0IDxjb2RlPkpvYjwvY29kZT4gdG8gZXhlY3V0ZSBqZWxseXNjcmlwdC4KLSAqCi0gKiAgQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Ym9iQGVuZy53ZXJrZW4uY29tIj5ib2IgbWN3aGlydGVyPC9hPgotICovCi1wdWJsaWMgY2xhc3MgSmVsbHlKb2IgaW1wbGVtZW50cyBKb2IKLXsKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyAgICAgQ29uc3RydWN0b3JzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKiogQ29uc3RydWN0LgotICAgICAqLwotICAgIHB1YmxpYyBKZWxseUpvYigpCi0gICAgewotICAgICAgICAvLyBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuCi0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gICAgIEluc3RhbmNlIG1ldGhvZHMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi0gICAgLy8gICAgIG9yZy5xdWFydHouSm9iCi0gICAgLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KLQotICAgIC8qKiBFeGVjdXRlIHRoaXMgam9iLgotICAgICAqCi0gICAgICogIEBwYXJhbSBqb2JDb250ZXh0IEpvYiBjb250ZXh0IGRhdGEuCi0gICAgICoKLSAgICAgKiAgQHRocm93cyBKb2JFeGVjdXRpb25FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBqb2IgZXhlY3V0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoSm9iRXhlY3V0aW9uQ29udGV4dCBqb2JDb250ZXh0KSB0aHJvd3MgSm9iRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotCi0gICAgICAgIEpvYkRldGFpbCAgZGV0YWlsID0gam9iQ29udGV4dC5nZXRKb2JEZXRhaWwoKTsKLQotICAgICAgICBKb2JEYXRhTWFwIGRhdGEgICA9IGRldGFpbC5nZXRKb2JEYXRhTWFwKCk7Ci0KLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IChTY3JpcHQpIGRhdGEuZ2V0KCAiamVsbHkuc2NyaXB0IiApOwotCi0gICAgICAgIEplbGx5Q29udGV4dCBqZWxseUNvbnRleHQgPSAoSmVsbHlDb250ZXh0KSBkYXRhLmdldCggImplbGx5LmNvbnRleHQiICk7Ci0KLSAgICAgICAgWE1MT3V0cHV0ICAgIG91dHB1dCAgICAgICA9IChYTUxPdXRwdXQpIGRhdGEuZ2V0KCAiamVsbHkub3V0cHV0IiApOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzY3JpcHQucnVuKCBqZWxseUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgKTsKLSAgICAgICAgICAgIG91dHB1dC5mbHVzaCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBKb2JFeGVjdXRpb25FeGNlcHRpb24oIGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9xdWFydHovc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvcXVhcnR6L0pvYlRhZy5qYXZhIGIvamVsbHktdGFncy9xdWFydHovc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvcXVhcnR6L0pvYlRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODYzNDE4Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvcXVhcnR6L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3F1YXJ0ei9Kb2JUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnF1YXJ0ejsKLQotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcucXVhcnR6LlNjaGVkdWxlcjsKLWltcG9ydCBvcmcucXVhcnR6LlNjaGVkdWxlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcucXVhcnR6LkpvYkRldGFpbDsKLWltcG9ydCBvcmcucXVhcnR6LkpvYkRhdGFNYXA7Ci0KLS8qKiBEZWZpbmVzIGEgc2NoZWR1bGFibGUgam9iLgotICoKLSAqICBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpib2JAZW5nLndlcmtlbi5jb20iPmJvYiBtY3doaXJ0ZXI8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKb2JUYWcgZXh0ZW5kcyBRdWFydHpUYWdTdXBwb3J0Ci17Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gICAgIEluc3RhbmNlIG1lbWJlcnMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKiBHcm91cCBvZiB0aGUgam9iLiAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdyb3VwOwotCi0gICAgLyoqIE5hbWUgb2YgdGhlIGpvYi4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gICAgIENvbnN0cnVjdG9ycwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqIENvbnN0cnVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSm9iVGFnKCkKLSAgICB7Ci0gICAgICAgIC8vIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyAgICAgSW5zdGFuY2UgbWV0aG9kcwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqIFNldCB0aGUgbmFtZSBvZiB0aGlzIGpvYi4KLSAgICAgKgotICAgICAqICBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIGpvYi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKiogUmV0cmlldmUgdGhlIG5hbWUgb2YgdGhpcyBqb2IuCi0gICAgICoKLSAgICAgKiAgQHJldHVybiBUaGUgbmFtZSBvZiB0aGlzIGpvYi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKLSAgICB9Ci0KLSAgICAvKiogU2V0IHRoZSBncm91cCBvZiB0aGlzIGpvYi4KLSAgICAgKgotICAgICAqICBAcGFyYW0gZ3JvdXAgVGhlIGdyb3VwIG9mIHRoaXMgam9iLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwKFN0cmluZyBncm91cCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZ3JvdXAgPSBncm91cDsKLSAgICB9Ci0KLSAgICAvKiogUmV0cmlldmUgdGhlIGdyb3VwIG9mIHRoaXMgam9iLgotICAgICAqCi0gICAgICogIEByZXR1cm4gVGhlIGdyb3VwIG9mIHRoaXMgam9iLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JvdXAoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXA7Ci0gICAgfQotCi0gICAgLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KLSAgICAvLyAgICAgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZwotICAgIC8vIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi0KLSAgICAvKiogUGVyZm9ybSB0aGlzIHRhZy4KLSAgICAgKgotICAgICAqICBAcGFyYW0gb3V0cHV0IE91dHB1dCBzaW5rLgotICAgICAqCi0gICAgICogIEB0aHJvd3MgRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiwgSmVsbHlUYWdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICggZ2V0TmFtZSgpID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiggIm5hbWUiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGdldEdyb3VwKCkgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCAiZ3JvdXAiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBKb2JEZXRhaWwgZGV0YWlsID0gbmV3IEpvYkRldGFpbCggZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0R3JvdXAoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEplbGx5Sm9iLmNsYXNzICk7Ci0KLSAgICAgICAgZGV0YWlsLnNldER1cmFiaWxpdHkoIHRydWUgKTsKLQotICAgICAgICBKb2JEYXRhTWFwIGRhdGEgPSBuZXcgSm9iRGF0YU1hcCgpOwotCi0gICAgICAgIGRhdGEucHV0KCAiamVsbHkub3V0cHV0IiwKLSAgICAgICAgICAgICAgICAgIG91dHB1dCApOwotCi0gICAgICAgIGRhdGEucHV0KCAiamVsbHkuY29udGV4dCIsCi0gICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkgKTsKLQotICAgICAgICBkYXRhLnB1dCggImplbGx5LnNjcmlwdCIsCi0gICAgICAgICAgICAgICAgICBnZXRCb2R5KCkgKTsKLQotICAgICAgICBkZXRhaWwuc2V0Sm9iRGF0YU1hcCggZGF0YSApOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTY2hlZHVsZXIgc2NoZWQgPSBnZXRTY2hlZHVsZXIoKTsKLSAgICAgICAgICAgIHNjaGVkLmFkZEpvYiggZGV0YWlsLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNjaGVkdWxlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvcXVhcnR6L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3F1YXJ0ei9RdWFydHpUYWdMaWJyYXJ5LmphdmEgYi9qZWxseS10YWdzL3F1YXJ0ei9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9xdWFydHovUXVhcnR6VGFnTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmU1Y2VmLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvcXVhcnR6L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3F1YXJ0ei9RdWFydHpUYWdMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnF1YXJ0ejsKLQotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ0xpYnJhcnk7Ci0KLS8qKiBUYWcgbGlicmFyeSBmb3IgdGhlIFF1YXJ0eiBlbnRlcnByaXNlIGpvYiBzY2hlZHVsZXIuCi0gKgotICogIDxwPgotICogIDxhIGhyZWY9Imh0dHA6Ly9xdWFydHouc2YubmV0LyI+cXVhcnR6IEAgc291cmNlZm9yZ2U8L2E+Ci0gKiAgPC9wPgotICoKLSAqICBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpib2JAZW5nLndlcmtlbi5jb20iPmJvYiBtY3doaXJ0ZXI8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBRdWFydHpUYWdMaWJyYXJ5IGV4dGVuZHMgVGFnTGlicmFyeQotewotICAgIC8qKiBDb25zdHJ1Y3QgYW5kIHJlZ2lzdGVyIHRhZ3MuCi0gICAgICovCi0gICAgcHVibGljIFF1YXJ0elRhZ0xpYnJhcnkoKQotICAgIHsKLSAgICAgICAgcmVnaXN0ZXJUYWcoICJqb2IiLAotICAgICAgICAgICAgICAgICAgICAgSm9iVGFnLmNsYXNzICk7Ci0KLSAgICAgICAgcmVnaXN0ZXJUYWcoICJjcm9uIiwKLSAgICAgICAgICAgICAgICAgICAgIENyb25UcmlnZ2VyVGFnLmNsYXNzICk7Ci0KLSAgICAgICAgcmVnaXN0ZXJUYWcoICJ3YWl0LWZvci1zY2hlZHVsZXIiLAotICAgICAgICAgICAgICAgICAgICAgV2FpdEZvclNjaGVkdWxlclRhZy5jbGFzcyApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvcXVhcnR6L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3F1YXJ0ei9RdWFydHpUYWdTdXBwb3J0LmphdmEgYi9qZWxseS10YWdzL3F1YXJ0ei9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9xdWFydHovUXVhcnR6VGFnU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTcwOWQ5Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvcXVhcnR6L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3F1YXJ0ei9RdWFydHpUYWdTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnF1YXJ0ejsKLQotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLnF1YXJ0ei5TY2hlZHVsZXI7Ci1pbXBvcnQgb3JnLnF1YXJ0ei5TY2hlZHVsZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnF1YXJ0ei5pbXBsLlN0ZFNjaGVkdWxlckZhY3Rvcnk7Ci0KLS8qKiBCYXNpYyBzdXBwb3J0IGZvciBhbGwgdGFncyByZXF1aXJpbmcgYSBRdWFydHogc2NoZWR1bGVyLgotICoKLSAqICBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpib2JAZW5nLndlcmtlbi5jb20iPmJvYiBtY3doaXJ0ZXI8L2E+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBRdWFydHpUYWdTdXBwb3J0IGV4dGVuZHMgVGFnU3VwcG9ydAotewotICAgIC8qKiBUaGUgc2NoZWR1bGVyIHZhcmlhYmxlIG5hbWUgaW4gdGhlIEplbGx5Q29udGV4dC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFRF9WQVJfTkFNRSA9ICJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkucXVhcnR6LlNjaGVkdWxlciI7Ci0KLQotICAgIC8qKiBSZXRyaWV2ZSBvciBjcmVhdGUgYSBzY2hlZHVsZXIuCi0gICAgICoKLSAgICAgKiAgPHA+Ci0gICAgICogIElmIGEgc2NoZWR1bGVyIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCBhbiBpbnN0YWxsZWQKLSAgICAgKiAgaW4gdGhlIHZhcmlhYmxlIHtAbGluayAjU0NIRURfVkFSX05BTUV9LCB0aGVuIHRoYXQgc2NoZWR1bGVyCi0gICAgICogIHdpbGwgYmUgcmV0dXJuZWQuICBPdGhlcndpc2UsIGEgbmV3IFN0ZFNjaGVkdWxlciB3aWxsIGJlCi0gICAgICogIGNyZWF0ZWQsIHN0YXJ0ZWQsIGFuZCBpbnN0YWxsZWQuICBBZGRpdGlvbmFsbHksIGEgcnVudGltZQotICAgICAqICBzaHV0ZG93biBob29rIHdpbGwgYmUgYWRkZWQgdG8gY2xlYW5seSBzaHV0ZG93biB0aGUgc2NoZWR1bGVyLgotICAgICAqCi0gICAgICogIEByZXR1cm4gVGhlIHNjaGVkdWxlci4KLSAgICAgKgotICAgICAqICBAdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbiBJZiB0aGVyZSBpcyBhbiBlcnJvciBjcmVhdGluZyB0aGUKLSAgICAgKiAgICAgICAgICBzY2hlZHVsZXIuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVkdWxlciBnZXRTY2hlZHVsZXIoKSB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTY2hlZHVsZXIgc2NoZWQgPSAoU2NoZWR1bGVyKSBnZXRDb250ZXh0KCkuZ2V0VmFyaWFibGUoIFNDSEVEX1ZBUl9OQU1FICk7Ci0KLSAgICAgICAgaWYgKCBzY2hlZCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RkU2NoZWR1bGVyRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFN0ZFNjaGVkdWxlckZhY3RvcnkoKTsKLQotICAgICAgICAgICAgZmluYWwgU2NoZWR1bGVyIG5ld1NjaGVkID0gZmFjdG9yeS5nZXRTY2hlZHVsZXIoKTsKLQotICAgICAgICAgICAgc2NoZWQgPSBuZXdTY2hlZDsKLQotICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnNldFZhcmlhYmxlKCBTQ0hFRF9WQVJfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U2NoZWQgKTsKLQotICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKAotICAgICAgICAgICAgICAgIG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISBuZXdTY2hlZC5pc1NodXRkb3duKCkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U2NoZWQuc2h1dGRvd24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoU2NoZWR1bGVyRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgbmV3U2NoZWQuc3RhcnQoKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcmV0dXJuIHNjaGVkOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9xdWFydHovc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvcXVhcnR6L1RyaWdnZXJUYWcuamF2YSBiL2plbGx5LXRhZ3MvcXVhcnR6L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3F1YXJ0ei9UcmlnZ2VyVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYzQ3ZmMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9xdWFydHovc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvcXVhcnR6L1RyaWdnZXJUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MucXVhcnR6OwotCi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKiBBYnN0cmFjdCBiYXNlIGZvciBhbGwgdHJpZ2dlcnMuCi0gKgotICogIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmJvYkBlbmcud2Vya2VuLmNvbSI+Ym9iIG1jd2hpcnRlcjwvYT4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyaWdnZXJUYWcgZXh0ZW5kcyBRdWFydHpUYWdTdXBwb3J0Ci17Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gICAgIENvbnN0cnVjdG9ycwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqIENvbnN0cnVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHJpZ2dlclRhZygpCi0gICAgewotICAgICAgICAvLyBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3F1YXJ0ei9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9xdWFydHovV2FpdEZvclNjaGVkdWxlclRhZy5qYXZhIGIvamVsbHktdGFncy9xdWFydHovc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvcXVhcnR6L1dhaXRGb3JTY2hlZHVsZXJUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZmMWRjZi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3F1YXJ0ei9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9xdWFydHovV2FpdEZvclNjaGVkdWxlclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5xdWFydHo7Ci0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcucXVhcnR6LlNjaGVkdWxlcjsKLWltcG9ydCBvcmcucXVhcnR6LlNjaGVkdWxlckV4Y2VwdGlvbjsKLQotLyoqIEJsb2NrIGFuZCB3YWl0IGZvciB0aGUgUXVhcnR6IHNjaGVkdWxlciB0byBzaHV0ZG93bi4KLSAqCi0gKiAgQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Ym9iQGVuZy53ZXJrZW4uY29tIj5ib2IgbWN3aGlydGVyPC9hPgotICovCi1wdWJsaWMgY2xhc3MgV2FpdEZvclNjaGVkdWxlclRhZyBleHRlbmRzIFF1YXJ0elRhZ1N1cHBvcnQKLXsKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyAgICAgQ29uc3RydWN0b3JzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKiogQ29uc3RydWN0LgotICAgICAqLwotICAgIHB1YmxpYyBXYWl0Rm9yU2NoZWR1bGVyVGFnKCkKLSAgICB7Ci0gICAgICAgIC8vIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyAgICAgSW5zdGFuY2UgbWV0aG9kcwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KLSAgICAvLyAgICAgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZwotICAgIC8vIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi0KLSAgICAvKiogUGVyZm9ybSB0aGlzIHRhZy4KLSAgICAgKgotICAgICAqICBAcGFyYW0gb3V0cHV0IE91dHB1dCBzaW5rLgotICAgICAqCi0gICAgICogIEB0aHJvd3MgRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTY2hlZHVsZXIgc2NoZWQgPSBnZXRTY2hlZHVsZXIoKTsKLQotICAgICAgICAgICAgd2hpbGUgKCAhIHNjaGVkLmlzU2h1dGRvd24oKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoIDUwMCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2NoZWR1bGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9xdWFydHovc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvcXVhcnR6L3BhY2thZ2UuaHRtbCBiL2plbGx5LXRhZ3MvcXVhcnR6L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3F1YXJ0ei9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNTgxNDUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9xdWFydHovc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvcXVhcnR6L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci0KLSAgPHA+QSB0YWcgbGlicmFyeSBmb3Igc2NoZWR1bGluZyB0YXNrcyB0byBiZSBydW4gdXNpbmcgdGhlIAotICA8YSBocmVmPSJodHRwOi8vd3d3LnBhcnQubmV0L3F1YXJ0ei5odG1sIj5RdWFydHo8L2E+IGxpYnJhcnkKLSAgPC9wPgotICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvcXVhcnR6L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3F1YXJ0ei9leGFtcGxlLmplbGx5IGIvamVsbHktdGFncy9xdWFydHovc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvcXVhcnR6L2V4YW1wbGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OTQ0M2MuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9xdWFydHovc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvcXVhcnR6L2V4YW1wbGUuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4NCi0gIA0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIA0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIA0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSINCi0gICAgICAgICB4bWxuczpxPSJqZWxseTpxdWFydHoiPg0KLQ0KLQ0KLSAgPHE6am9iIGdyb3VwPSJkZW1vIiBuYW1lPSJjaGVlc2UiPg0KLSAgICBJIGxpa2UgY2hlZXNlDQotICA8L3E6am9iPg0KLQ0KLSAgPHE6Y3JvbiBzcGVjPSIqLzUgKiAqID8gKiAqIg0KLSAgICAgICAgICBuYW1lPSJldmVyeS41LnNlY29uZHMiDQotICAgICAgICAgIGdyb3VwPSJkZW1vIg0KLSAgICAgICAgICBqb2JOYW1lPSJjaGVlc2UiDQotICAgICAgICAgIGpvYkdyb3VwPSJkZW1vIi8+DQotDQotICA8cTp3YWl0LWZvci1zY2hlZHVsZXIvPg0KLQ0KLTwvajpqZWxseT4NCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3F1YXJ0ei94ZG9jcy9jaGFuZ2VzLnhtbCBiL2plbGx5LXRhZ3MvcXVhcnR6L3hkb2NzL2NoYW5nZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTQ0MDgxLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvcXVhcnR6L3hkb2NzL2NoYW5nZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLSAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSAtLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+Q2hhbmdlczwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotICA8Ym9keT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjAiIGRhdGU9IjIwMDQtMDktMTIiPgotICAgIDwvcmVsZWFzZT4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvcXVhcnR6L3hkb2NzL2luZGV4LnhtbCBiL2plbGx5LXRhZ3MvcXVhcnR6L3hkb2NzL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZiODIzOS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3F1YXJ0ei94ZG9jcy9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5RdWFydHogVGFnIExpYnJhcnk8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLQotICA8Ym9keT4KLSAgICA8c2VjdGlvbiBuYW1lPSJPdmVydmlldyI+Ci0gICAgICA8cD4KLSAgICAgICAgQSB0YWcgbGlicmFyeSBmb3Igc2NoZWR1bGluZyB0YXNrcyB0byBiZSBydW4gdXNpbmcgdGhlIAotICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnBhcnQubmV0L3F1YXJ0ei5odG1sIj5RdWFydHo8L2E+IGxpYnJhcnkuCi0gICAgICAgIFNlZSB0aGUgPGEgaHJlZj0idGFncy5odG1sIj50YWdzPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvcXVhcnR6L3hkb2NzL25hdmlnYXRpb24ueG1sIGIvamVsbHktdGFncy9xdWFydHoveGRvY3MvbmF2aWdhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OTZjNDIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9xdWFydHoveGRvY3MvbmF2aWdhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IG5hbWU9IlF1YXJ0eiBUYWcgTGlicmFyeSI+Ci0KLSAgPHRpdGxlPlF1YXJ0eiBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gIAotICA8Ym9keT4KLSAgICA8bWVudSBuYW1lPSJRdWFydHogVGFnIExpYnJhcnkiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgICAgICAgICAgIGhyZWY9Ii9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJUYWdzIiAgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZ3MuaHRtbCIvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9yZWdleHAvLmN2c2lnbm9yZSBiL2plbGx5LXRhZ3MvcmVnZXhwLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Y2ViNzYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9yZWdleHAvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotbWF2ZW4ubG9nCi10YXJnZXQKLXZlbG9jaXR5LmxvZwotamNvdmVyYWdlLnNlcgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9yZWdleHAvcHJvamVjdC5wcm9wZXJ0aWVzIGIvamVsbHktdGFncy9yZWdleHAvcHJvamVjdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDAzNDNjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvcmVnZXhwL3Byb2plY3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFAgUiBPIEogRSBDIFQgIFAgUiBPIFAgRSBSIFQgSSBFIFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9yZWdleHAvcHJvamVjdC54bWwgYi9qZWxseS10YWdzL3JlZ2V4cC9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4ZTZlMy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3JlZ2V4cC9wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3Q+Ci0gIDxleHRlbmQ+JHtiYXNlZGlyfS8uLi90YWctcHJvamVjdC54bWw8L2V4dGVuZD4KLSAgPGlkPmNvbW1vbnMtamVsbHktdGFncy1yZWdleHA8L2lkPgotICA8bmFtZT5jb21tb25zLWplbGx5LXRhZ3MtcmVnZXhwPC9uYW1lPgotICA8Y3VycmVudFZlcnNpb24+MS4wPC9jdXJyZW50VmVyc2lvbj4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MucmVnZXhwPC9wYWNrYWdlPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgICAgIFRoaXMgaXMgYSBKZWxseSBpbnRlcmZhY2UgZm9yIE9STy4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPHNob3J0RGVzY3JpcHRpb24+Q29tbW9ucyBKZWxseSBSZWd1bGFyIEV4cHJlc3Npb24gVGFnIExpYnJhcnk8L3Nob3J0RGVzY3JpcHRpb24+Ci0gIAotICA8dmVyc2lvbnM+Ci0gICAgPHZlcnNpb24+Ci0gICAgICA8aWQ+MS4wPC9pZD4KLSAgICAgIDxuYW1lPjEuMDwvbmFtZT4KLSAgICAgIDx0YWc+Q09NTU9OUy1KRUxMWS1SRUdFWFAtMV8wPC90YWc+Ci0gICAgPC92ZXJzaW9uPgotICA8L3ZlcnNpb25zPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcm88L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5vcm88L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjAuODwvdmVyc2lvbj4KLSAgICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8Z3VtcC5wcm9qZWN0Pmpha2FydGEtb3JvPC9ndW1wLnByb2plY3Q+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gIDwvZGVwZW5kZW5jaWVzPgotICAKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvcmVnZXhwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3JlZ2V4cC9Db250YWluc1RhZy5qYXZhIGIvamVsbHktdGFncy9yZWdleHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvcmVnZXhwL0NvbnRhaW5zVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNDg2YmIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9yZWdleHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvcmVnZXhwL0NvbnRhaW5zVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MucmVnZXhwOwotCi0vKioKLSAqIFRoaXMgdGFnIGNoZWNrcyB3aGV0aGVyIGEgcmVnZXhwIGNvbnRhaW5zIGEgc3RyaW5nLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNocmlzdGlhbkBpbngtc29mdC5jb20iPkNocmlzdGlhbiBBbW9yIEt2YWxoZWltPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJAotICovCi1wdWJsaWMgY2xhc3MgQ29udGFpbnNUYWcgZXh0ZW5kcyBSZWdleHBUYWcgewotICAgIHByb3RlY3RlZCBib29sZWFuIGdldFJlc3VsdCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFBhdHRlcm5NYXRjaGVyKCkuY29udGFpbnMoZ2V0VGV4dCgpLCBnZXRQYXR0ZXJuKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvcmVnZXhwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3JlZ2V4cC9NYXRjaFRhZy5qYXZhIGIvamVsbHktdGFncy9yZWdleHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvcmVnZXhwL01hdGNoVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1N2M5Y2QuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9yZWdleHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvcmVnZXhwL01hdGNoVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnJlZ2V4cDsKLQotLyoqCi0gKiBUaGlzIHRhZyBjaGVja3Mgd2hldGhlciBhIHJlZ2V4cCBtYXRjaGVzIGEgc3RyaW5nLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNocmlzdGlhbkBpbngtc29mdC5jb20iPkNocmlzdGlhbiBBbW9yIEt2YWxoZWltPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJAotICovCi1wdWJsaWMgY2xhc3MgTWF0Y2hUYWcgZXh0ZW5kcyBSZWdleHBUYWcgewotICAgIHByb3RlY3RlZCBib29sZWFuIGdldFJlc3VsdCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFBhdHRlcm5NYXRjaGVyKCkubWF0Y2hlcyhnZXRUZXh0KCksIGdldFBhdHRlcm4oKSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvcmVnZXhwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3JlZ2V4cC9SZWdleHBUYWcuamF2YSBiL2plbGx5LXRhZ3MvcmVnZXhwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3JlZ2V4cC9SZWdleHBUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwZjY0NS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3JlZ2V4cC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9yZWdleHAvUmVnZXhwVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5yZWdleHA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm9yby50ZXh0LnJlZ2V4LlBlcmw1TWF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm9yby50ZXh0LnJlZ2V4LlBlcmw1Q29tcGlsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5vcm8udGV4dC5yZWdleC5QYXR0ZXJuOwotaW1wb3J0IG9yZy5hcGFjaGUub3JvLnRleHQucmVnZXguTWFsZm9ybWVkUGF0dGVybkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciB0YWdzIHVzaW5nIHRoZSBPcm8gUmVnZXhwIGxpYnJhcnkuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2hyaXN0aWFuQGlueC1zb2Z0LmNvbSI+Q2hyaXN0aWFuIEFtb3IgS3ZhbGhlaW08L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWdleHBUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLSAgICBwcml2YXRlIFBlcmw1TWF0Y2hlciBwYXR0ZXJuTWF0Y2hlciA9IG5ldyBQZXJsNU1hdGNoZXIoKTsKLSAgICBwcml2YXRlIFBhdHRlcm4gcGF0dGVybjsKLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLSAgICBwcml2YXRlIFN0cmluZyBzY29wZTsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0VGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFBhdHRlcm4gZ2V0UGF0dGVybigpIHsKLSAgICAgICAgcmV0dXJuIHBhdHRlcm47Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFBlcmw1TWF0Y2hlciBnZXRQYXR0ZXJuTWF0Y2hlcigpIHsKLSAgICAgICAgcmV0dXJuIHBhdHRlcm5NYXRjaGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldEV4cHIoU3RyaW5nIGV4cHIpIHRocm93cyBNYWxmb3JtZWRQYXR0ZXJuRXhjZXB0aW9uIHsKLSAgICAgICAgUGVybDVDb21waWxlciBwYXR0ZXJuQ29tcGlsZXIgPSBuZXcgUGVybDVDb21waWxlcigpOwotICAgICAgICBwYXR0ZXJuID0gcGF0dGVybkNvbXBpbGVyLmNvbXBpbGUoZXhwcik7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OwotICAgIH0KLQotICAgIC8vIFNldHMgdGhlIHZhcmlhYmxlIG5hbWUgdG8gZGVmaW5lIGZvciB0aGlzIGV4cHJlc3Npb24KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YXJpYWJsZSBzY29wZSBmb3IgdGhpcyB2YXJpYWJsZS4gRm9yIGV4YW1wbGUgc2V0dGluZyB0aGlzIHZhbHVlIHRvICdwYXJlbnQnIHdpbGwKLSAgICAgKiBzZXQgdGhpcyB2YWx1ZSBpbiB0aGUgcGFyZW50IHNjb3BlLiBXaGVuIEplbGx5IGlzIHJ1biBmcm9tIGluc2lkZSBhIFNlcnZsZXQgZW52aXJvbm1lbnQKLSAgICAgKiB0aGVuIG90aGVyIHNjb3BlcyB3aWxsIGJlIGF2YWlsYWJsZSBzdWNoIGFzICdyZXF1ZXN0JywgJ3Nlc3Npb24nIG9yICdhcHBsaWNhdGlvbicuCi0gICAgICoKLSAgICAgKiBPdGhlciBhcHBsaWNhdGlvbnMgbWF5IGltcGxlbWVudCB0aGVpciBvd24gY3VzdG9tIHNjb3Blcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRTY29wZShTdHJpbmcgc2NvcGUpIHsKLSAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIENoZWNrIHJlcXVpcmVkIHByb3BlcnRpZXMKLSAgICAgICAgaWYgKGdldFRleHQoKSA9PSBudWxsIHx8IGdldFRleHQoKS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oInRleHQgbXVzdCBiZSBwcm92aWRlZCIpOwotCi0gICAgICAgIGlmIChwYXR0ZXJuID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbigiZXhwciBtdXN0IGJlIHByb3ZpZGVkIik7Ci0KLSAgICAgICAgaWYgKHZhciA9PSBudWxsIHx8IHZhci5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oInZhciBtdXN0IGJlIHByb3ZpZGVkIik7Ci0KLSAgICAgICAgLy8gRXZhbHVhdGUgcGF0dGVybiBhZ2FpbnN0IHRleHQgc3RyaW5nCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZ2V0UmVzdWx0KCk7Ci0gICAgICAgIFN0cmluZyByZXN1bHRTdHJpbmcgPSByZXN1bHQgPyAidHJ1ZSIgOiAiZmFsc2UiOwotCi0gICAgICAgIGlmICh2YXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHNjb3BlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhciwgc2NvcGUsIHJlc3VsdFN0cmluZyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUodmFyLCByZXN1bHRTdHJpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gZ2V0UmVzdWx0KCk7Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3JlZ2V4cC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9yZWdleHAvUmVnZXhwVGFnTGlicmFyeS5qYXZhIGIvamVsbHktdGFncy9yZWdleHAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvcmVnZXhwL1JlZ2V4cFRhZ0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgzNmM0MC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3JlZ2V4cC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9yZWdleHAvUmVnZXhwVGFnTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnJlZ2V4cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdMaWJyYXJ5OwotLyoqIEltcGxlbWVudHMgcmVnZXhwIHRhZ3MuCi0gKgotICogIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNocmlzdGlhbkBpbngtc29mdC5jb20iPkNocmlzdGlhbiBBbW9yIEt2YWxoZWltPC9hPgotICogIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQKLSAqLwotcHVibGljIGNsYXNzIFJlZ2V4cFRhZ0xpYnJhcnkgZXh0ZW5kcyBUYWdMaWJyYXJ5IHsKLSAgICAKLSAgICBwdWJsaWMgUmVnZXhwVGFnTGlicmFyeSgpCi0gICAgewotICAgICAgICByZWdpc3RlclRhZygibWF0Y2giLCBNYXRjaFRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJjb250YWlucyIsIENvbnRhaW5zVGFnLmNsYXNzKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9yZWdleHAvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvcmVnZXhwL0NvbnRhaW5zVGFnVGVzdC5qYXZhIGIvamVsbHktdGFncy9yZWdleHAvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvcmVnZXhwL0NvbnRhaW5zVGFnVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzM0ZGI2Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvcmVnZXhwL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3JlZ2V4cC9Db250YWluc1RhZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MucmVnZXhwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5yZWdleHAuQ29udGFpbnNUYWc7Ci0KLS8qKiogPHA+PGNvZGU+Q29udGFpbnNUYWdUZXN0PC9jb2RlPiBhIGNsYXNzIHRoYXQgaXMgdXNlZnVsIHRvIHBlcmZvcm0gcmVnZXhwIG1hdGNoZXMKLSogaW4gc3RyaW5ncy48L3A+Ci0qCi0qIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNocmlzdGlhbkBpbngtc29mdC5jb20iPkNocmlzdGlhbiBBbW9yIEt2YWxoZWltPC9hPgotKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkCi0qLwotcHVibGljIGNsYXNzIENvbnRhaW5zVGFnVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBDb250YWluc1RhZ1Rlc3QoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb1RhZygpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICBDb250YWluc1RhZyBjb250YWluc0V4cFRhZyA9IG5ldyBDb250YWluc1RhZygpOwotICAgICAgWE1MT3V0cHV0IHhtbE91dHB1dCA9IG5ldyBYTUxPdXRwdXQoKTsKLQotICAgICAgY29udGFpbnNFeHBUYWcuc2V0VGV4dCgiSGVsbG8gV29ybGQiKTsKLSAgICAgIGNvbnRhaW5zRXhwVGFnLnNldEV4cHIoIldvcmxkIik7Ci0gICAgICBjb250YWluc0V4cFRhZy5zZXRWYXIoInRlc3R2YXIiKTsKLSAgICAgIGNvbnRhaW5zRXhwVGFnLnNldENvbnRleHQobmV3IEplbGx5Q29udGV4dCgpKTsKLSAgICAgIGNvbnRhaW5zRXhwVGFnLmRvVGFnKHhtbE91dHB1dCk7Ci0KLSAgICAgIGFzc2VydEVxdWFscygiVFJVRSIsIGNvbnRhaW5zRXhwVGFnLmdldENvbnRleHQoKS5nZXRWYXJpYWJsZSgidGVzdHZhciIpLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKQotICAgIHsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvcmVnZXhwL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3JlZ2V4cC9NYXRjaFRhZ1Rlc3QuamF2YSBiL2plbGx5LXRhZ3MvcmVnZXhwL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3JlZ2V4cC9NYXRjaFRhZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkyMmM1Ni4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3JlZ2V4cC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9yZWdleHAvTWF0Y2hUYWdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnJlZ2V4cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5Q29udGV4dDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MucmVnZXhwLk1hdGNoVGFnOwotCi0vKioqIDxwPjxjb2RlPk1hdGNoVGFnVGVzdDwvY29kZT4gYSBjbGFzcyB0aGF0IGlzIHVzZWZ1bCB0byBwZXJmb3JtIHJlZ2V4cCBtYXRjaGVzCi0qIGluIHN0cmluZ3MuPC9wPgotKgotKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjaHJpc3RpYW5AaW54LXNvZnQuY29tIj5DaHJpc3RpYW4gQW1vciBLdmFsaGVpbTwvYT4KLSogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJAotKi8KLXB1YmxpYyBjbGFzcyBNYXRjaFRhZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgcHVibGljIE1hdGNoVGFnVGVzdChTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REb1RhZygpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIE1hdGNoVGFnIG1hdGNoRXhwVGFnID0gbmV3IE1hdGNoVGFnKCk7Ci0gICAgWE1MT3V0cHV0IHhtbE91dHB1dCA9IG5ldyBYTUxPdXRwdXQoKTsKLQotICAgIG1hdGNoRXhwVGFnLnNldFRleHQoIklEMTIzNCIpOwotICAgIG1hdGNoRXhwVGFnLnNldEV4cHIoIltBLVpdW0EtWl1bMC05XXs0fSIpOwotICAgIG1hdGNoRXhwVGFnLnNldFZhcigidGVzdHZhciIpOwotICAgIG1hdGNoRXhwVGFnLnNldENvbnRleHQobmV3IEplbGx5Q29udGV4dCgpKTsKLSAgICBtYXRjaEV4cFRhZy5kb1RhZyh4bWxPdXRwdXQpOwotCi0gICAgYXNzZXJ0RXF1YWxzKCJUUlVFIiwgbWF0Y2hFeHBUYWcuZ2V0Q29udGV4dCgpLmdldFZhcmlhYmxlKCJ0ZXN0dmFyIikudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkKLSAgewotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9yZWdleHAveGRvY3MvY2hhbmdlcy54bWwgYi9qZWxseS10YWdzL3JlZ2V4cC94ZG9jcy9jaGFuZ2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwMTAzYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3JlZ2V4cC94ZG9jcy9jaGFuZ2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0gLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkNoYW5nZXM8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLSAgPGJvZHk+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4wLVNOQVBTSE9UIiBkYXRlPSJpbiBDVlMiPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImFkZCIgaXNzdWU9IkpFTExZLTQ5IiBkdWUtdG89IkFzbGFrIEhlbGxlc295Ij5BZGRlZDwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvcmVnZXhwL3hkb2NzL2luZGV4LnhtbCBiL2plbGx5LXRhZ3MvcmVnZXhwL3hkb2NzL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1OGQ4ZS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3JlZ2V4cC94ZG9jcy9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5SZWdleHAgVGFnIExpYnJhcnk8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLQotICA8Ym9keT4KLSAgICA8c2VjdGlvbiBuYW1lPSJPdmVydmlldyI+Ci0gICAgICA8cD4KLSAgICAgICAgVGFncyBmb3Igd29ya2luZyB3aXRoIHJlZ3VsYXIgZXhwcmVzc2lvbnMuIFNlZSB0aGUgPGEgaHJlZj0idGFncy5odG1sIj50YWdzPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvcmVnZXhwL3hkb2NzL25hdmlnYXRpb24ueG1sIGIvamVsbHktdGFncy9yZWdleHAveGRvY3MvbmF2aWdhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNzk1ZjguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9yZWdleHAveGRvY3MvbmF2aWdhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IG5hbWU9IlJlZ2V4cCBUYWcgTGlicmFyeSI+Ci0KLSAgPHRpdGxlPlJlZ2V4cCBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gIAotICA8Ym9keT4KLSAgICA8bWVudSBuYW1lPSJSZWdleHAgVGFnIExpYnJhcnkiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgICAgICAgICAgIGhyZWY9Ii9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJUYWdzIiAgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZ3MuaHRtbCIvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zb2FwLy5jdnNpZ25vcmUgYi9qZWxseS10YWdzL3NvYXAvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZjZWI3Ni4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3NvYXAvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotbWF2ZW4ubG9nCi10YXJnZXQKLXZlbG9jaXR5LmxvZwotamNvdmVyYWdlLnNlcgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zb2FwL2J1aWxkLnhtbCBiL2plbGx5LXRhZ3Mvc29hcC9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxM2VjYzIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zb2FwL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tYnVpbGQueG1sIGdlbmVyYXRlZCBieSBtYXZlbiBmcm9tIHByb2plY3QueG1sIHZlcnNpb24gMS4xLVNOQVBTSE9UCi0gIG9uIGRhdGUgU2VwdGVtYmVyIDE0IDIwMDQsIHRpbWUgMTQ1My0tPgotCi08cHJvamVjdCBkZWZhdWx0PSJqYXIiIG5hbWU9ImNvbW1vbnMtamVsbHktdGFncy1zb2FwIiBiYXNlZGlyPSIuIj4KLSAgPHByb3BlcnR5IG5hbWU9ImRlZmF1bHR0YXJnZXRkaXIiIHZhbHVlPSJ0YXJnZXQiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0ibGliZGlyIiB2YWx1ZT0idGFyZ2V0L2xpYiI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L2NsYXNzZXMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0idGVzdGNsYXNzZXNkaXIiIHZhbHVlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cmVwb3J0ZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtcmVwb3J0cyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0ZGlyIiB2YWx1ZT0iZGlzdCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jZGlyIiB2YWx1ZT0iZGlzdC9kb2NzL2FwaSI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJmaW5hbC5uYW1lIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLXNvYXAtMS4xLVNOQVBTSE9UIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHBhdGggaWQ9ImJ1aWxkLmNsYXNzcGF0aCI+Ci0gICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiPgotICAgICAgPC9pbmNsdWRlPgotICAgIDwvZmlsZXNldD4KLSAgPC9wYXRoPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlc2NyaXB0aW9uPSJvIEluaXRpYWxpemVzIHNvbWUgcHJvcGVydGllcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im5vZ2V0Ij4KLSAgICAgIDxlcXVhbHMgYXJnMj0ib25seSIgYXJnMT0iJHtidWlsZC5zeXNjbGFzc3BhdGh9Ij4KLSAgICAgIDwvZXF1YWxzPgotICAgIDwvY29uZGl0aW9uPgotICAgIDwhLS1UZXN0IGlmIEpVTklUIGlzIHByZXNlbnQgaW4gQU5UIGNsYXNzcGF0aC0tPgotCi0gICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iSnVuaXQucHJlc2VudCIgY2xhc3NuYW1lPSJqdW5pdC5mcmFtZXdvcmsuVGVzdCI+Ci0gICAgPC9hdmFpbGFibGU+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJvIENvbXBpbGUgdGhlIGNvZGUiIGRlcGVuZHM9ImdldC1kZXBzIj4KLSAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqYXZhYyBkZXN0ZGlyPSIke2NsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy9qYXZhIj4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aCByZWZpZD0iYnVpbGQuY2xhc3NwYXRoIj4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0gICAgPGNvcHkgdG9kaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvamF2YSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphciIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIHRoZSBqYXIiIGRlcGVuZHM9ImNvbXBpbGUsdGVzdCI+Ci0gICAgPGphciBqYXJmaWxlPSIke2RlZmF1bHR0YXJnZXRkaXJ9LyR7ZmluYWwubmFtZX0uamFyIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIiBiYXNlZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICA8L2phcj4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJvIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZGlyZWN0b3JpZXMiPgotICAgIDxkZWxldGUgZGlyPSIke2RlZmF1bHR0YXJnZXRkaXJ9Ij4KLSAgICA8L2RlbGV0ZT4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlc2NyaXB0aW9uPSJvIENyZWF0ZSBhIGRpc3RyaWJ1dGlvbiIgZGVwZW5kcz0iamFyLCBqYXZhZG9jIj4KLSAgICA8bWtkaXIgZGlyPSJkaXN0Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb3B5IHRvZGlyPSJkaXN0Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSIgaW5jbHVkZXM9IiouamFyIj4KLSAgICAgIDwvZmlsZXNldD4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZXM9IkxJQ0VOU0UqLCBSRUFETUUqIj4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlc2NyaXB0aW9uPSJvIFJ1biB0aGUgdGVzdCBjYXNlcyIgaWY9InRlc3QuZmFpbHVyZSIgZGVwZW5kcz0iaW50ZXJuYWwtdGVzdCI+Ci0gICAgPGZhaWwgbWVzc2FnZT0iVGhlcmUgd2VyZSB0ZXN0IGZhaWx1cmVzLiI+Ci0gICAgPC9mYWlsPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJpbnRlcm5hbC10ZXN0IiBpZj0iSnVuaXQucHJlc2VudCIgZGVwZW5kcz0ianVuaXQtcHJlc2VudCxjb21waWxlLXRlc3RzIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3RyZXBvcnRkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqdW5pdCBkaXI9Ii4vIiBmYWlsdXJlcHJvcGVydHk9InRlc3QuZmFpbHVyZSIgcHJpbnRTdW1tYXJ5PSJ5ZXMiIGZvcms9InRydWUiIGhhbHRvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImJhc2VkaXIiIHZhbHVlPSIuIj4KLSAgICAgIDwvc3lzcHJvcGVydHk+Ci0gICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxmb3JtYXR0ZXIgdXNlZmlsZT0iZmFsc2UiIHR5cGU9InBsYWluIj4KLSAgICAgIDwvZm9ybWF0dGVyPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPHBhdGggcmVmaWQ9ImJ1aWxkLmNsYXNzcGF0aCI+Ci0gICAgICAgIDwvcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICA8YmF0Y2h0ZXN0IHRvZGlyPSIke3Rlc3RyZXBvcnRkaXJ9Ij4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovVGVzdCouamF2YSI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2JhdGNodGVzdD4KLSAgICA8L2p1bml0PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJqdW5pdC1wcmVzZW50IiB1bmxlc3M9Ikp1bml0LnByZXNlbnQiIGRlcGVuZHM9ImluaXQiPgotICAgIDxlY2hvPj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBXQVJOSU5HID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PC9lY2hvPgotICAgIDxlY2hvPkp1bml0IGlzbid0IHByZXNlbnQgaW4geW91ciAke0FOVF9IT01FfS9saWIgZGlyZWN0b3J5LiBUZXN0cyBub3QgZXhlY3V0ZWQuPC9lY2hvPgotICAgIDxlY2hvPj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PC9lY2hvPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlLXRlc3RzIiBpZj0iSnVuaXQucHJlc2VudCIgZGVwZW5kcz0ianVuaXQtcHJlc2VudCxjb21waWxlIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iIGRlcHJlY2F0aW9uPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSIgb3B0aW1pemU9ImZhbHNlIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIj4KLSAgICAgIDxzcmM+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL3Rlc3QiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9zcmM+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aCByZWZpZD0iYnVpbGQuY2xhc3NwYXRoIj4KLSAgICAgICAgPC9wYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICAgIDxjb3B5IHRvZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qZWxseSI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueHNsIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnJuZyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5kdGQiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5odG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamF2YWRvYyIgZGVzY3JpcHRpb249Im8gR2VuZXJhdGUgamF2YWRvYyIgZGVwZW5kcz0iZ2V0LWRlcHMiPgotICAgIDxta2RpciBkaXI9IiR7amF2YWRvY2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPHRzdGFtcD4KLSAgICAgIDxmb3JtYXQgcGF0dGVybj0iMjAwMi15eXl5IiBwcm9wZXJ0eT0ieWVhciI+Ci0gICAgICA8L2Zvcm1hdD4KLSAgICA8L3RzdGFtcD4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29weXJpZ2h0IiB2YWx1ZT0iQ29weXJpZ2h0ICZhbXA7Y29weTsgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLiI+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgICA8cHJvcGVydHkgbmFtZT0idGl0bGUiIHZhbHVlPSJjb21tb25zLWplbGx5LXRhZ3Mtc29hcCAxLjEtU05BUFNIT1QgQVBJIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxqYXZhZG9jIHVzZT0idHJ1ZSIgcHJpdmF0ZT0idHJ1ZSIgZGVzdGRpcj0iJHtqYXZhZG9jZGlyfSIgYXV0aG9yPSJ0cnVlIiB2ZXJzaW9uPSJ0cnVlIiBzb3VyY2VwYXRoPSJzcmMvamF2YSIgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zb2FwLioiPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPHBhdGggcmVmaWQ9ImJ1aWxkLmNsYXNzcGF0aCI+Ci0gICAgICAgIDwvcGF0aD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWRvYz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iZ2V0LWRlcHMiIHVubGVzcz0ibm9nZXQiIGRlcGVuZHM9ImluaXQiPgotICAgIDwhLS1Qcm94eSBzZXR0aW5ncyB3b3JrcyBvbmx5IHdpdGggYSBKREsgMS4yIGFuZCBoaWdoZXIuLS0+Ci0KLSAgICA8c2V0cHJveHk+Ci0gICAgPC9zZXRwcm94eT4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LTEuMC1iZXRhLTQuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamVsbHkvamFycy9jb21tb25zLWplbGx5LTEuMC1iZXRhLTQuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9heGlzLTEuMC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vYXhpcy9qYXJzL2F4aXMtMS4wLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1odHRwY2xpZW50LTIuMC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1odHRwY2xpZW50L2phcnMvY29tbW9ucy1odHRwY2xpZW50LTIuMC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2pheHJwYy1hcGktMS4xLUZDUy5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vamF4cnBjL2phcnMvamF4cnBjLWFwaS0xLjEtRkNTLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vc2Fhai1hcGktMS4yLUZDUy5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vc2Fhai9qYXJzL3NhYWotYXBpLTEuMi1GQ1MuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qYXgtcW5hbWUtMS4wLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qYXgtcW5hbWUvamFycy9qYXgtcW5hbWUtMS4wLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1jbGktMS4wLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWNsaS9qYXJzL2NvbW1vbnMtY2xpLTEuMC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtZGlzY292ZXJ5LTIwMDMwMjExLjIxMzM1Ni5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1kaXNjb3ZlcnkvamFycy9jb21tb25zLWRpc2NvdmVyeS0yMDAzMDIxMS4yMTMzNTYuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9zZXJ2bGV0YXBpLTIuMy5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vc2VydmxldGFwaS9qYXJzL3NlcnZsZXRhcGktMi4zLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZXhsLTEuMC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZXhsL2phcnMvY29tbW9ucy1qZXhsLTEuMC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3htbC1hcGlzLTEuMC5iMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veG1sLWFwaXMvamFycy94bWwtYXBpcy0xLjAuYjIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWJlYW51dGlscy0xLjYuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtYmVhbnV0aWxzL2phcnMvY29tbW9ucy1iZWFudXRpbHMtMS42LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtY29sbGVjdGlvbnMvamFycy9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1sb2dnaW5nL2phcnMvY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vZG9tNGotMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9kb200ai9qYXJzL2RvbTRqLTEuNS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2pheGVuLTEuMS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2pheGVuL2phcnMvamF4ZW4tMS4xLWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3hlcmNlcy0yLjIuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veGVyY2VzL2phcnMveGVyY2VzLTIuMi4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtbWF2ZW4iPgotICAgIDxnZXQgZGVzdD0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBzcmM9IiR7cmVwb30vbWF2ZW4vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8dW5qYXIgZGVzdD0iJHttYXZlbi5ob21lfSIgc3JjPSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L3VuamFyPgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3NvYXAvbWF2ZW4ueG1sIGIvamVsbHktdGFncy9zb2FwL21hdmVuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIyMzcxMS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3NvYXAvbWF2ZW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiA/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXZhOmphciI+Ci0KLSAgPCEtLSBkZWZpbmUgdGhlIGNsYXNzcGF0aCB1c2VkIHRvIHJ1biBleGFtcGxlcyAtLT4KLSAgPGdvYWwgbmFtZT0iY3JlYXRlLWNsYXNzcGF0aCIgcHJlcmVxcz0iamF2YTpjb21waWxlLHRlc3Q6Y29tcGlsZSI+Ci0gICAgICAgIDxwYXRoIGlkPSJ0ZXN0LmNsYXNzcGF0aCI+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHttYXZlbi5idWlsZC5kZXN0fSIvPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9InRhcmdldC9jbGFzc2VzIi8+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0idGFyZ2V0L3Rlc3QtY2xhc3NlcyIvPgotICAgICAgICAgICAgPHBhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0gICAgICAgIDwvcGF0aD4KLSAgPC9nb2FsPgotCi0gICAgPCEtLSBkZW1vcyAtLT4KLSAgPGdvYWwgbmFtZT0iZGVtbyIgcHJlcmVxcz0iY3JlYXRlLWNsYXNzcGF0aCIKLSAgICAgICAgZGVzY3JpcHRpb249IlJ1bnMgYSBzYW1wbGUgdXNpbmcgQXBhY2hlIEF4aXMgdG8gaW52b2tlIGEgd2ViIHNlcnZpY2UgZnJvbSBpbnNpZGUgSmVsbHkiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5IiBmb3JrPSJ5ZXMiPgotICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KLSAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NvYXAvZXhhbXBsZS5qZWxseSIvPgotICAgIDwvamF2YT4KLSAgPC9nb2FsPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3NvYXAvcHJvamVjdC5wcm9wZXJ0aWVzIGIvamVsbHktdGFncy9zb2FwL3Byb2plY3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwMzQzYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3NvYXAvcHJvamVjdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUCBSIE8gSiBFIEMgVCAgUCBSIE8gUCBFIFIgVCBJIEUgUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3NvYXAvcHJvamVjdC54bWwgYi9qZWxseS10YWdzL3NvYXAvcHJvamVjdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ODJhYWUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zb2FwL3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3Q+Ci0gIDxleHRlbmQ+JHtiYXNlZGlyfS8uLi90YWctcHJvamVjdC54bWw8L2V4dGVuZD4KLSAgPGlkPmNvbW1vbnMtamVsbHktdGFncy1zb2FwPC9pZD4KLSAgPG5hbWU+Y29tbW9ucy1qZWxseS10YWdzLXNvYXA8L25hbWU+Ci0gIDxjdXJyZW50VmVyc2lvbj4xLjEtU05BUFNIT1Q8L2N1cnJlbnRWZXJzaW9uPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zb2FwPC9wYWNrYWdlPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgICAgIFRoaXMgaXMgYSBKZWxseSBpbnRlcmZhY2UgZm9yIFNPQVAuCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDxzaG9ydERlc2NyaXB0aW9uPkNvbW1vbnMgSmVsbHkgU09BUCBUYWcgTGlicmFyeTwvc2hvcnREZXNjcmlwdGlvbj4KLSAgCi0gIDx2ZXJzaW9ucz4KLSAgICA8dmVyc2lvbj4KLSAgICAgIDxpZD4xLjA8L2lkPgotICAgICAgPG5hbWU+MS4wPC9uYW1lPgotICAgICAgPHRhZz5DT01NT05TLUpFTExZLVNPQVAtMV8wPC90YWc+Ci0gICAgPC92ZXJzaW9uPgotICA8L3ZlcnNpb25zPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0KLSAgICA8IS0tIFNUQVJUIGZvciBjb21waWxhdGlvbiAtLT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5heGlzPC9pZD4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8Z3VtcC5wcm9qZWN0PndzLWF4aXM8L2d1bXAucHJvamVjdD4KLSAgICAgICAgPGd1bXAuaWQ+YXhpczwvZ3VtcC5pZD4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtaHR0cGNsaWVudDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8IS0tIGNhbiBiZSBmb3VuZCBpbiBqd3NkcC0xLjMvamF4cnBjL2xpYiAtLT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmpheHJwYzwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmpheHJwYy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjEtRkNTPC92ZXJzaW9uPgotICAgICAgPHVybD5odHRwOi8vamF2YS5zdW4uY29tL3dlYnNlcnZpY2VzL3dlYnNlcnZpY2VzcGFjay5odG1sPC91cmw+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGd1bXAucHJvamVjdD53cy1heGlzPC9ndW1wLnByb2plY3Q+Ci0gICAgICAgIDxndW1wLmlkPmF4aXMtamF4cnBjPC9ndW1wLmlkPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8IS0tIGNhbiBiZSBmb3VuZCBpbiBqd3NkcC0xLjMvc2Fhai9saWIgLS0+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5zYWFqPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+c2Fhai1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjItRkNTPC92ZXJzaW9uPgotICAgICAgPHVybD5odHRwOi8vamF2YS5zdW4uY29tL3dlYnNlcnZpY2VzL3dlYnNlcnZpY2VzcGFjay5odG1sPC91cmw+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGd1bXAucHJvamVjdD53cy1heGlzPC9ndW1wLnByb2plY3Q+Ci0gICAgICAgIDxndW1wLmlkPmF4aXMtc2FhajwvZ3VtcC5pZD4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLQkJCi0gICAgPGRlcGVuZGVuY3k+PCEtLSBqdXN0IGZvciBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lLi4uIHdhcyB0YWtlbiBvdXQgb2YgamF4cnBjIGluIHNvbWUgdmVyc2lvbiBqd3NkcCAtLT4KLSAgICAgIDxncm91cElkPmpheG1lPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+amF4bWUtYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MC4zPC92ZXJzaW9uPgotICAgICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxndW1wLnByb2plY3Q+d3MtamF4bWU8L2d1bXAucHJvamVjdD4KLSAgICAgICAgPGd1bXAuaWQ+YXBpPC9ndW1wLmlkPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDwhLS0gU1RBUlQgZm9yIHJ1bm5pbmcgZGVtb3MgLS0+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5jb21tb25zLWNsaTwvaWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPmNvbW1vbnMtZGlzY292ZXJ5PC9pZD4KLSAgICAgIDx2ZXJzaW9uPjIwMDMwMjExLjIxMzM1NjwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+c2VydmxldGFwaTwvaWQ+Ci0gICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICA8dXJsPmh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvc2VydmxldHMvPC91cmw+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGd1bXAucHJvamVjdD5qYWthcnRhLXNlcnZsZXRhcGktNS1zZXJ2bGV0PC9ndW1wLnByb2plY3Q+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICA8IS0tIEVORCBmb3IgcnVubmluZyBkZW1vcyAtLT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zb2FwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NvYXAvSW52b2tlUmF3VGFnLmphdmEgYi9qZWxseS10YWdzL3NvYXAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc29hcC9JbnZva2VSYXdUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ5MmMxNi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3NvYXAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc29hcC9JbnZva2VSYXdUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc29hcDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLkVudGl0eUVuY2xvc2luZ01ldGhvZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLlBvc3RNZXRob2Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLS8qKgotICogSW52b2tlcyBhIHdlYiBzZXJ2aWNlCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmppbUBibmFpbmMubmV0Ij5KYW1lcyBCaXJjaGZpZWxkPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJAotICovCi1wdWJsaWMgY2xhc3MgSW52b2tlUmF3VGFnIGV4dGVuZHMgVGFnU3VwcG9ydAotewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyOwotICAgIHByaXZhdGUgU3RyaW5nIGVuZHBvaW50ID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBzb2FwQWN0aW9uOwotCi0gICAgcHVibGljIEludm9rZVJhd1RhZygpCi0gICAgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KQotICAgICAgICB0aHJvd3MgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiwgSmVsbHlUYWdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChlbmRwb2ludCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbigiZW5kcG9pbnQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gZ2V0Qm9keVRleHQoKTsKLQotICAgICAgICBTdHJpbmcgYW5zd2VyID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFByZXBhcmUgSFRUUCBwb3N0Ci0gICAgICAgICAgICBQb3N0TWV0aG9kIHBvc3QgPSBuZXcgUG9zdE1ldGhvZChlbmRwb2ludCk7Ci0KLSAgICAgICAgICAgIC8vIFJlcXVlc3QgY29udGVudCB3aWxsIGJlIHJldHJpZXZlZCBkaXJlY3RseSAKLSAgICAgICAgICAgIC8vIGZyb20gdGhlIGlucHV0IHN0cmVhbQotICAgICAgICAgICAgcG9zdC5zZXRSZXF1ZXN0Qm9keShuZXcgU3RyaW5nSW5wdXRTdHJlYW0ocmVxdWVzdCkpOwotCi0gICAgICAgICAgICAvLyBQZXIgZGVmYXVsdCwgdGhlIHJlcXVlc3QgY29udGVudCBuZWVkcyB0byBiZSBidWZmZXJlZAotICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGl0cyBsZW5ndGguCi0gICAgICAgICAgICAvLyBSZXF1ZXN0IGJvZHkgYnVmZmVyaW5nIGNhbiBiZSBhdm9pZGVkIHdoZW4KLSAgICAgICAgICAgIC8vID0gY29udGVudCBsZW5ndGggaXMgZXhwbGljaXRseSBzcGVjaWZpZWQKLSAgICAgICAgICAgIC8vID0gY2h1bmstZW5jb2RpbmcgaXMgdXNlZAotICAgICAgICAgICAgaWYgKHJlcXVlc3QubGVuZ3RoKCkgPCBJbnRlZ2VyLk1BWF9WQUxVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb3N0LnNldFJlcXVlc3RDb250ZW50TGVuZ3RoKChpbnQpIHJlcXVlc3QubGVuZ3RoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvc3Quc2V0UmVxdWVzdENvbnRlbnRMZW5ndGgoCi0gICAgICAgICAgICAgICAgICAgIEVudGl0eUVuY2xvc2luZ01ldGhvZC5DT05URU5UX0xFTkdUSF9DSFVOS0VEKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU3BlY2lmeSBjb250ZW50IHR5cGUgYW5kIGVuY29kaW5nCi0gICAgICAgICAgICAvLyBJZiBjb250ZW50IGVuY29kaW5nIGlzIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZAotICAgICAgICAgICAgLy8gSVNPLTg4NTktMSBpcyBhc3N1bWVkCi0gICAgICAgICAgICBwb3N0LnNldFJlcXVlc3RIZWFkZXIoCi0gICAgICAgICAgICAgICAgIkNvbnRlbnQtdHlwZSIsCi0gICAgICAgICAgICAgICAgInRleHQveG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gU2V0IHRoZSBTT0FQQWN0aW9uIGhlYWRlcgotICAgICAgICAgICAgaWYgKCBzb2FwQWN0aW9uID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvc3Quc2V0UmVxdWVzdEhlYWRlciggIlNPQVBBY3Rpb24iLCAiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9zdC5zZXRSZXF1ZXN0SGVhZGVyKCAiU09BUEFjdGlvbiIsIHNvYXBBY3Rpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBHZXQgSFRUUCBjbGllbnQKLSAgICAgICAgICAgIEh0dHBDbGllbnQgaHR0cGNsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCk7Ci0gICAgICAgICAgICAvLyBFeGVjdXRlIHJlcXVlc3QKLSAgICAgICAgICAgIGludCByZXN1bHQgPSBodHRwY2xpZW50LmV4ZWN1dGVNZXRob2QocG9zdCk7Ci0KLSAgICAgICAgICAgIGFuc3dlciA9IHBvc3QuZ2V0UmVzcG9uc2VCb2R5QXNTdHJpbmcoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gUmVsZWFzZSBjdXJyZW50IGNvbm5lY3Rpb24gdG8gdGhlIGNvbm5lY3Rpb24gcG9vbCBvbmNlIHlvdSBhcmUgZG9uZQotICAgICAgICAgICAgcG9zdC5yZWxlYXNlQ29ubmVjdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChIdHRwRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhciwgYW5zd2VyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHNob3VsZCB0dXJuIHRoZSBhbnN3ZXIgaW50byBYTUwgZXZlbnRzLi4uCi0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIk5vdCBpbXBsZW1lbnRlZCB5ZXQ7IHNob3VsZCBzdHJlYW0gcmVzdWx0cyBhcyBYTUwgZXZlbnRzLiBSZXN1bHRzOiAiCi0gICAgICAgICAgICAgICAgICAgICsgYW5zd2VyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBlbmQgcG9pbnQgdG8gd2hpY2ggdGhlIGludm9jYXRpb24gd2lsbCBvY2N1cgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50KFN0cmluZyBlbmRwb2ludCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZW5kcG9pbnQgPSBlbmRwb2ludDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBvdXRwdXQgdGhlIHJlc3VsdHMgb2YgdGhlIFNPQVAgY2FsbCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikKLSAgICB7Ci0gICAgICAgIHRoaXMudmFyID0gdmFyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgU09BUEFjdGlvbiBIVFRQIGhlYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTb2FwQWN0aW9uKFN0cmluZyBhY3Rpb24pCi0gICAgewotICAgICAgICBzb2FwQWN0aW9uID0gYWN0aW9uOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zb2FwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NvYXAvSW52b2tlVGFnLmphdmEgYi9qZWxseS10YWdzL3NvYXAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc29hcC9JbnZva2VUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI5NTJiYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3NvYXAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc29hcC9JbnZva2VUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnNvYXA7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwucnBjLlNlcnZpY2VFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMuY2xpZW50LkNhbGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzLmNsaWVudC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKioKLSAqIEludm9rZXMgYSB3ZWIgc2VydmljZQotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmppbUBibmFpbmMubmV0Ij5KYW1lcyBCaXJjaGZpZWxkPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjYgJAotICovCi1wdWJsaWMgY2xhc3MgSW52b2tlVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZW5kcG9pbnQgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbWV0aG9kID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyB1c2VybmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsKLSAgICBwcml2YXRlIFNlcnZpY2Ugc2VydmljZTsKLSAgICBwcml2YXRlIE9iamVjdCBwYXJhbXM7Ci0KLSAgICBwdWJsaWMgSW52b2tlVGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiwgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oImVuZHBvaW50Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbigibmFtZXNwYWNlIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbigibWV0aG9kIik7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3RbXSBwYXJhbXMgPSBnZXRQYXJhbUFycmF5KCk7Ci0gICAgICAgIGlmIChwYXJhbXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcGFyYW1zID0gbmV3IE9iamVjdFtdeyBnZXRCb2R5VGV4dCgpIH07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBpbnZva2UgYm9keSBqdXN0IGluIGNhc2Ugd2UgaGF2ZSBuZXN0ZWQgdGFncwotICAgICAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZSgpOwotICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlID0gY3JlYXRlU2VydmljZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IGFuc3dlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDYWxsIGNhbGwgPSAoQ2FsbCkgc2VydmljZS5jcmVhdGVDYWxsKCk7Ci0KLSAgICAgICAgICAgIC8vIEB0b2RvIEplbGx5IHNob3VsZCBoYXZlIG5hdGl2ZSBzdXBwb3J0IGZvciBVUkwgYW5kIFFOYW1lCi0gICAgICAgICAgICAvLyBkaXJlY3RseSBvbiBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBjYWxsLnNldFRhcmdldEVuZHBvaW50QWRkcmVzcyhuZXcgamF2YS5uZXQuVVJMKGVuZHBvaW50KSk7Ci0gICAgICAgICAgICBjYWxsLnNldE9wZXJhdGlvbk5hbWUobmV3IFFOYW1lKG5hbWVzcGFjZSwgbWV0aG9kKSk7Ci0KLSAgICAgICAgICAgIGlmICggdXNlcm5hbWUgIT0gbnVsbCAmJiAhdXNlcm5hbWUuZXF1YWxzKCIiKSApIHsKLSAgICAgICAgICAgICAgICBjYWxsLnNldFVzZXJuYW1lKCB1c2VybmFtZSApOwotICAgICAgICAgICAgICAgIGNhbGwuc2V0UGFzc3dvcmQoIHBhc3N3b3JkICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFuc3dlciA9IGNhbGwuaW52b2tlKHBhcmFtcyk7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhciwgYW5zd2VyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHNob3VsZCB0dXJuIHRoZSBhbnN3ZXIgaW50byBYTUwgZXZlbnRzLi4uCi0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICJOb3QgaW1wbGVtZW50ZWQgeWV0OyBzaG91bGQgc3RyZWFtIHJlc3VsdHMgYXMgWE1MIGV2ZW50cy4gUmVzdWx0czogIiArIGFuc3dlciApOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZW5kIHBvaW50IHRvIHdoaWNoIHRoZSBpbnZvY2F0aW9uIHdpbGwgb2NjdXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludChTdHJpbmcgZW5kcG9pbnQpIHsKLSAgICAgICAgdGhpcy5lbmRwb2ludCA9IGVuZHBvaW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWVzcGFjZSBvZiB0aGUgb3BlcmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWV0aG9kKFN0cmluZyBtZXRob2QpIHsKLSAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2VydmljZSB0byBiZSB1c2VkIGJ5IHRoaXMgd2ViIHNlcnZpY2UgaW52b2NhdGlvbi4KLSAgICAgKiBAcmV0dXJuIFNlcnZpY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VydmljZSBnZXRTZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gc2VydmljZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzZXJ2aWNlIHRvIGJlIHVzZWQgYnkgdGhpcyBpbnZvY2F0aW9uLgotICAgICAqIElmIG5vbmUgaXMgc3BlY2lmaWVkIHRoZW4gYSBkZWZhdWx0IGlzIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZShTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBvdXRwdXQgdGhlIHJlc3VsdHMgb2YgdGhlIFNPQVAgY2FsbCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIFNPQVAgY2FsbC4gVGhpcyBjYW4gYmUgYW4gYXJyYXkgb3IgY29sbGVjdGlvbiBvZgotICAgICAqIFNPQVBCb2R5RWxlbWVudHMgb3IgdHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1zKE9iamVjdCBwYXJhbXMpIHsKLSAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBwYXNzd29yZCBmb3IgdGhlIFNPQVAgY2FsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpCi0gICAgewotICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB1c2VybmFtZSBmb3IgdGhlIFNPQVAgY2FsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VybmFtZShTdHJpbmcgdXNlcm5hbWUpCi0gICAgewotICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7Ci0gICAgfQotCi0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgZGVmYXVsdCBTZXJ2aWNlIGluc3RhbmNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNlcnZpY2UgY3JlYXRlU2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgYW55IHR5cGUgY29lcmNpb24gb24gdGhlIGdpdmVuIHBhcmFtZXRlcnMgdG8gZm9ybSBhbiBPYmplY3RbXQotICAgICAqIG9yIHJldHVybnMgbnVsbCBpZiBubyBwYXJhbWV0ZXIgaGFzIGJlZW4gc3BlY2lmaWVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdFtdIGdldFBhcmFtQXJyYXkoKSB7Ci0gICAgICAgIGlmIChwYXJhbXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtcyBpbnN0YW5jZW9mIE9iamVjdFtdKSB7Ci0gICAgICAgICAgICByZXR1cm4gKE9iamVjdFtdKSBwYXJhbXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtcyBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb24gY29sbCA9IChDb2xsZWN0aW9uKSBwYXJhbXM7Ci0gICAgICAgICAgICByZXR1cm4gY29sbC50b0FycmF5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gbGV0cyBqdXN0IHdyYXAgdGhlIGN1cnJlbnQgb2JqZWN0IGluc2lkZSBhbiBhcnJheQotICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHsgcGFyYW1zIH07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zb2FwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NvYXAvU29hcFRhZ0xpYnJhcnkuamF2YSBiL2plbGx5LXRhZ3Mvc29hcC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zb2FwL1NvYXBUYWdMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOTllODUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zb2FwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NvYXAvU29hcFRhZ0xpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc29hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdMaWJyYXJ5OwotCi0vKiogSW1wbGVtZW50cyBnZW5lcmFsIHV0aWxpdHkgdGFncy4KLSAqCi0gKiAgQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amltQGJuYWluYy5uZXQiPmppbSBiaXJjaGZpZWxkPC9hPgotICogIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIFNvYXBUYWdMaWJyYXJ5IGV4dGVuZHMgVGFnTGlicmFyeSB7Ci0gICAgcHVibGljIFNvYXBUYWdMaWJyYXJ5KCkgewotICAgICAgICByZWdpc3RlclRhZygiaW52b2tlIiwgSW52b2tlVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImludm9rZXJhdyIsIEludm9rZVJhd1RhZy5jbGFzcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zb2FwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NvYXAvU3RyaW5nSW5wdXRTdHJlYW0uamF2YSBiL2plbGx5LXRhZ3Mvc29hcC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zb2FwL1N0cmluZ0lucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NDVjYTYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zb2FwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NvYXAvU3RyaW5nSW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc29hcDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLQotLyoqCi0gKiBXcmFwcyBhIFN0cmluZyBhcyBhbiBJbnB1dFN0cmVhbS4gTm90ZSB0aGF0IGRhdGEgd2lsbCBiZSBsb3N0IGZvcgotICogY2hhcmFjdGVycyBub3QgaW4gSVNPIExhdGluIDEsIGFzIGEgc2ltcGxlIGNoYXItPmJ5dGUgbWFwcGluZyBpcyBhc3N1bWVkLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnVtYWdlc2hAYXBhY2hlLm9yZyI+TWFnZXNoIFVtYXNhbmthcjwvYT4KLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ0lucHV0U3RyZWFtCi0gICAgZXh0ZW5kcyBJbnB1dFN0cmVhbQotewotICAgIC8qKiBTb3VyY2Ugc3RyaW5nLCBzdG9yZWQgYXMgYSBTdHJpbmdSZWFkZXIgKi8KLSAgICBwcml2YXRlIFN0cmluZ1JlYWRlciBpbjsKLQotICAgIC8qKgotICAgICAqIENvbXBvc2VzIGEgc3RyZWFtIGZyb20gYSBTdHJpbmcKLSAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIHN0cmluZyB0byByZWFkIGZyb20uIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdJbnB1dFN0cmVhbSggU3RyaW5nIHNvdXJjZSApCi0gICAgewotICAgICAgICBpbiA9IG5ldyBTdHJpbmdSZWFkZXIoIHNvdXJjZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIGZyb20gdGhlIFN0cmluZ3JlYWRlciwgcmV0dXJuaW5nIHRoZSBzYW1lIHZhbHVlLiBOb3RlIHRoYXQKLSAgICAgKiBkYXRhIHdpbGwgYmUgbG9zdCBmb3IgY2hhcmFjdGVycyBub3QgaW4gSVNPIExhdGluIDEuIENsaWVudHMKLSAgICAgKiBhc3N1bWluZyBhIHJldHVybiB2YWx1ZSBpbiB0aGUgcmFuZ2UgLTEgdG8gMjU1IG1heSBldmVuIGZhaWwgb24KLSAgICAgKiBzdWNoIGlucHV0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSBTdHJpbmdSZWFkZXIKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIG9yaWdpbmFsIFN0cmluZ1JlYWRlciBmYWlscyB0byBiZSByZWFkCi0gICAgICovCi0gICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW4ucmVhZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlcyB0aGUgU3RyaW5ncmVhZGVyLgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGUgb3JpZ2luYWwgU3RyaW5nUmVhZGVyIGZhaWxzIHRvIGJlIGNsb3NlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpbi5jbG9zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hcmtzIHRoZSByZWFkIGxpbWl0IG9mIHRoZSBTdHJpbmdSZWFkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGltaXQgdGhlIG1heGltdW0gbGltaXQgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZCBiZWZvcmUgdGhlCi0gICAgICogICAgICAgICAgICAgIG1hcmsgcG9zaXRpb24gYmVjb21lcyBpbnZhbGlkCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1hcmsoIGZpbmFsIGludCBsaW1pdCApCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaW4ubWFyayggbGltaXQgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElPRXhjZXB0aW9uIGlvZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBpb2UuZ2V0TWVzc2FnZSgpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgdGhlIFN0cmluZ1JlYWRlci4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIFN0cmluZ1JlYWRlciBmYWlscyB0byBiZSByZXNldAotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW4ucmVzZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElucHV0U3RyZWFtI21hcmtTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbi5tYXJrU3VwcG9ydGVkKCk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3NvYXAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc29hcC9wYWNrYWdlLmh0bWwgYi9qZWxseS10YWdzL3NvYXAvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc29hcC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNWI3NTEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zb2FwL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NvYXAvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci0gIDxwPgotICAJVGFncyBmb3IgaW52b2tpbmcgV2ViIFNlcnZpY2VzIHZpYSA8YSBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcvYXhpcy8iPkFwYWNoZSBBeGlzPC9hPgotICA8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3NvYXAvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc29hcC9leGFtcGxlLmplbGx5IGIvamVsbHktdGFncy9zb2FwL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NvYXAvZXhhbXBsZS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA2ZmEyNy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3NvYXAvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc29hcC9leGFtcGxlLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0NCi08ajpqZWxseQ0KLSAgeG1sbnM6c29hcD0iamVsbHk6c29hcCINCi0gIHhtbG5zOmxvZz0iamVsbHk6bG9nIg0KLSAgeG1sbnM6aj0iamVsbHk6Y29yZSI+DQotDQotICA8c29hcDppbnZva2UNCi0gICAgICB2YXI9ImFuc3dlciINCi0gICAgZW5kcG9pbnQ9Imh0dHA6Ly9uYWdveWEuYXBhY2hlLm9yZzo1MDQ5L2F4aXMvc2VydmljZXMvZWNobyINCi0gICAgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyINCi0gICAgbWV0aG9kPSJlY2hvU3RyaW5nIj5IaSBKaW0hPC9zb2FwOmludm9rZT4NCi0NCi0gIDxsb2c6aW5mbz5TZW50OiBIaSBKaW0hIGFuZCByZWNlaXZlZDogJHthbnN3ZXJ9IG9mIHR5cGU6ICR7YW5zd2VyLmNsYXNzLm5hbWV9PC9sb2c6aW5mbz4NCi0NCi0gIDxzb2FwOmludm9rZQ0KLSAgICAgIHZhcj0iYW5zd2VyIg0KLSAgICAgIGVuZHBvaW50PSJodHRwOi8vc2VydmljZXMueG1ldGhvZHMubmV0OjgwL3NvYXAvc2VydmxldC9ycGNyb3V0ZXIiDQotICAgICAgbmFtZXNwYWNlPSJ1cm46eG1ldGhvZHMtVGVtcGVyYXR1cmUiDQotICAgICAgbWV0aG9kPSJnZXRUZW1wIj40MDAzMTwvc29hcDppbnZva2U+DQotICAgICAgDQotICA8bG9nOmluZm8+U2VudDogNDAwMzEgYW5kIHJlY2VpdmVkOiAke2Fuc3dlcn0gb2YgdHlwZTogJHthbnN3ZXIuY2xhc3MubmFtZX08L2xvZzppbmZvPg0KLQ0KLSAgICA8ajpzZXQgdmFyPSJ4IiB2YWx1ZT0iJHszMDB9Ii8+DQotICAgIA0KLSAgPHNvYXA6aW52b2tlDQotICAgICAgdmFyPSJhbnN3ZXIiDQotICAgICAgZW5kcG9pbnQ9Imh0dHA6Ly93d3cueG1sYnVzLmNvbTo5MDEwL3htbGJ1cy9jb250YWluZXIvQ29udmVydGVyL0NvbnZlcnRlclNlcnZpY2UvQ29udmVydGVyUG9ydC8iDQotICAgICAgbmFtZXNwYWNlPSJ1cm46dGFyZ2V0LWNvbnZlcnRlci1zZXJ2aWNlIg0KLSAgICAgIG1ldGhvZD0ibW1Ub0luY2giDQotICAgICAgcGFyYW1zPSIke3guZmxvYXRWYWx1ZSgpfSIvPg0KLSAgICAgIA0KLSAgPGxvZzppbmZvPlNlbnQ6ICR7eH0gbW0gYW5kIHJlY2VpdmVkOiAke2Fuc3dlcn0gaW5jaGVzIG9mIHR5cGU6ICR7YW5zd2VyLmNsYXNzLm5hbWV9PC9sb2c6aW5mbz4NCi08L2o6amVsbHk+DQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zb2FwL3hkb2NzL2NoYW5nZXMueG1sIGIvamVsbHktdGFncy9zb2FwL3hkb2NzL2NoYW5nZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDE4ZjY5Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc29hcC94ZG9jcy9jaGFuZ2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0gLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkNoYW5nZXM8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLSAgPGJvZHk+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4xLVNOQVBTSE9UIiBkYXRlPSJpbiBDVlMiPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImFkZCIgaXNzdWU9IkpFTExZLTYwIiBkdWUtdG89IkRhbiBEaWVwaG91c2UiPmFkZCBpbnZva2UgcmF3IHRhZzwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjAiIGRhdGU9IjIwMDQtMDktMTIiPgotICAgIDwvcmVsZWFzZT4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc29hcC94ZG9jcy9pbmRleC54bWwgYi9qZWxseS10YWdzL3NvYXAveGRvY3MvaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTA4NTNlLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc29hcC94ZG9jcy9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5TT0FQIFRhZyBMaWJyYXJ5PC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0KLSAgPGJvZHk+Ci0gICAgPHNlY3Rpb24gbmFtZT0iT3ZlcnZpZXciPgotICAgICAgPHA+Ci0gICAgICAgIFRhZ3MgZm9yIGludm9raW5nIFdlYiBTZXJ2aWNlcyB2aWEgPGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpcy8iPkFwYWNoZSBBeGlzPC9hPi4KLSAgICAgICAgICBTZWUgdGhlIDxhIGhyZWY9InRhZ3MuaHRtbCI+dGFnczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICA8L3A+Ci0gICAgPC9zZWN0aW9uPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3NvYXAveGRvY3MvbmF2aWdhdGlvbi54bWwgYi9qZWxseS10YWdzL3NvYXAveGRvY3MvbmF2aWdhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZDQ2YmMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zb2FwL3hkb2NzL25hdmlnYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBuYW1lPSJTT0FQIFRhZyBMaWJyYXJ5Ij4KLQotICA8dGl0bGU+U09BUCBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gIAotICA8Ym9keT4KLSAgICA8bWVudSBuYW1lPSJTT0FQIFRhZyBMaWJyYXJ5Ij4KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICAgICAgICAgICBocmVmPSIvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iVGFncyIgICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWdzLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3FsLy5jdnNpZ25vcmUgYi9qZWxseS10YWdzL3NxbC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmNlYjc2Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3FsLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLW1hdmVuLmxvZwotdGFyZ2V0Ci12ZWxvY2l0eS5sb2cKLWpjb3ZlcmFnZS5zZXIKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3FsL2J1aWxkLnhtbCBiL2plbGx5LXRhZ3Mvc3FsL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU4NzM1YS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3NxbC9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLWJ1aWxkLnhtbCBnZW5lcmF0ZWQgYnkgbWF2ZW4gZnJvbSBwcm9qZWN0LnhtbCB2ZXJzaW9uIDEuMC1TTkFQU0hPVAotICBvbiBkYXRlIE1heSAyNCAyMDA0LCB0aW1lIDIzMDItLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImphciIgbmFtZT0iY29tbW9ucy1qZWxseS10YWdzLXNxbCIgYmFzZWRpcj0iLiI+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkZWZhdWx0dGFyZ2V0ZGlyIiB2YWx1ZT0idGFyZ2V0Ij4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYmRpciIgdmFsdWU9InRhcmdldC9saWIiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC9jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cmVwb3J0ZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtcmVwb3J0cyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0ZGlyIiB2YWx1ZT0iZGlzdCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jZGlyIiB2YWx1ZT0iZGlzdC9kb2NzL2FwaSI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJmaW5hbC5uYW1lIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLXNxbC0xLjAtU05BUFNIT1QiPgotICA8L3Byb3BlcnR5PgotICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlc2NyaXB0aW9uPSJvIEluaXRpYWxpemVzIHNvbWUgcHJvcGVydGllcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im5vZ2V0Ij4KLSAgICAgIDxlcXVhbHMgYXJnMj0ib25seSIgYXJnMT0iJHtidWlsZC5zeXNjbGFzc3BhdGh9Ij4KLSAgICAgIDwvZXF1YWxzPgotICAgIDwvY29uZGl0aW9uPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXNjcmlwdGlvbj0ibyBDb21waWxlIHRoZSBjb2RlIiBkZXBlbmRzPSJnZXQtZGVwcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHtjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvamF2YSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICAgIDxjb3B5IHRvZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL2phdmEiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICAgIDxjb3B5IHRvZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qZWxseSI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueHNsIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnJuZyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5kdGQiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5odG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamFyIiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgdGhlIGphciIgZGVwZW5kcz0iY29tcGlsZSx0ZXN0Ij4KLSAgICA8amFyIGphcmZpbGU9InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCIgYmFzZWRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0ibyBDbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIGRpcmVjdG9yaWVzIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGlzdGRpcn0iPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgYSBkaXN0cmlidXRpb24iIGRlcGVuZHM9ImphciwgamF2YWRvYyI+Ci0gICAgPG1rZGlyIGRpcj0iZGlzdCI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29weSB0b2Rpcj0iZGlzdCI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iIGluY2x1ZGVzPSIqLmphciI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iIGluY2x1ZGVzPSJMSUNFTlNFKiwgUkVBRE1FKiI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0ibyBSdW4gdGhlIHRlc3QgY2FzZXMiIGlmPSJ0ZXN0LmZhaWx1cmUiIGRlcGVuZHM9ImludGVybmFsLXRlc3QiPgotICAgIDxmYWlsIG1lc3NhZ2U9IlRoZXJlIHdlcmUgdGVzdCBmYWlsdXJlcy4iPgotICAgIDwvZmFpbD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iaW50ZXJuYWwtdGVzdCIgZGVwZW5kcz0iY29tcGlsZS10ZXN0cyI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8anVuaXQgZGlyPSIuLyIgZmFpbHVyZXByb3BlcnR5PSJ0ZXN0LmZhaWx1cmUiIHByaW50U3VtbWFyeT0ieWVzIiBmb3JrPSJ0cnVlIiBoYWx0b25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJiYXNlZGlyIiB2YWx1ZT0iLiI+Ci0gICAgICA8L3N5c3Byb3BlcnR5PgotICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Zm9ybWF0dGVyIHVzZWZpbGU9ImZhbHNlIiB0eXBlPSJwbGFpbiI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL1Rlc3QqLmphdmEiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgPC9qdW5pdD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZS10ZXN0cyIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy90ZXN0Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamF2YWRvYyIgZGVzY3JpcHRpb249Im8gR2VuZXJhdGUgamF2YWRvYyIgZGVwZW5kcz0iamFyIj4KLSAgICA8bWtkaXIgZGlyPSIke2phdmFkb2NkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDx0c3RhbXA+Ci0gICAgICA8Zm9ybWF0IHBhdHRlcm49IjIwMDIteXl5eSIgcHJvcGVydHk9InllYXIiPgotICAgICAgPC9mb3JtYXQ+Ci0gICAgPC90c3RhbXA+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvcHlyaWdodCIgdmFsdWU9IkNvcHlyaWdodCAmYW1wO2NvcHk7ICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLXNxbCAxLjAtU05BUFNIT1QgQVBJIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxqYXZhZG9jIHVzZT0idHJ1ZSIgcHJpdmF0ZT0idHJ1ZSIgZGVzdGRpcj0iJHtqYXZhZG9jZGlyfSIgYXV0aG9yPSJ0cnVlIiB2ZXJzaW9uPSJ0cnVlIiBzb3VyY2VwYXRoPSJzcmMvamF2YSIgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zcWwuKiI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFkb2M+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImdldC1kZXBzIiB1bmxlc3M9Im5vZ2V0IiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktdGFncy1qdW5pdC1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktdGFncy1qdW5pdC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtY2xpLVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWNsaS9qYXJzL2NvbW1vbnMtY2xpLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vaHNxbGRiLTEuNy4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9oc3FsZGIvamFycy9oc3FsZGItMS43LjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamV4bC9qYXJzL2NvbW1vbnMtamV4bC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3htbC1hcGlzLTEuMC5iMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veG1sLWFwaXMvamFycy94bWwtYXBpcy0xLjAuYjIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWJlYW51dGlscy0xLjYuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtYmVhbnV0aWxzL2phcnMvY29tbW9ucy1iZWFudXRpbHMtMS42LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtY29sbGVjdGlvbnMvamFycy9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1sb2dnaW5nL2phcnMvY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vZG9tNGotMS41LWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vZG9tNGovamFycy9kb200ai0xLjUtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vamF4ZW4tMS4xLWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vamF4ZW4vamFycy9qYXhlbi0xLjEtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veGVyY2VzLTIuMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94ZXJjZXMvamFycy94ZXJjZXMtMi4yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qdW5pdC0zLjguMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vanVuaXQvamFycy9qdW5pdC0zLjguMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FudC0xLjUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC0xLjUuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtb3B0aW9uYWwtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtb3B0aW9uYWwtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtbWF2ZW4iPgotICAgIDxnZXQgZGVzdD0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBzcmM9IiR7cmVwb30vbWF2ZW4vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8dW5qYXIgZGVzdD0iJHttYXZlbi5ob21lfSIgc3JjPSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L3VuamFyPgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3NxbC9tYXZlbi54bWwgYi9qZWxseS10YWdzL3NxbC9tYXZlbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYmZiYmUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zcWwvbWF2ZW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgZGVmYXVsdD0iamF2YTpqYXIiPgotCi0gIDwhLS0gZGVmaW5lIHRoZSBjbGFzc3BhdGggdXNlZCB0byBydW4gZXhhbXBsZXMgLS0+Ci0gIDxnb2FsIG5hbWU9ImNyZWF0ZS1jbGFzc3BhdGgiIHByZXJlcXM9ImphdmE6Y29tcGlsZSx0ZXN0OmNvbXBpbGUiPgotICAgICAgICA8cGF0aCBpZD0idGVzdC5jbGFzc3BhdGgiPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7bWF2ZW4uYnVpbGQuZGVzdH0iLz4KLSAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSJ0YXJnZXQvY2xhc3NlcyIvPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9InRhcmdldC90ZXN0LWNsYXNzZXMiLz4KLSAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotICAgICAgICA8L3BhdGg+Ci0gIDwvZ29hbD4KLQotICAgIDwhLS0gZGVtb3MgLS0+Ci0gICAgPGdvYWwgbmFtZT0iZGVtbyIgcHJlcmVxcz0iY3JlYXRlLWNsYXNzcGF0aCIKLSAgICAgICAgZGVzY3JpcHRpb249IlJ1bnMgYW4gU1FMIGRlbW8iPgotCi0gICAgICA8IS0tIFZhbHVlcyB1c2VkIGZvciB0ZXN0aW5nIC0tPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGFiYXNlVXJsIiAgICAgICAgICAgICB2YWx1ZT0iamRiYzpoc3FsZGI6dGFyZ2V0L2hzcWwiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhYmFzZURyaXZlciIgICAgICAgICAgdmFsdWU9Im9yZy5oc3FsZGIuamRiY0RyaXZlciIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGFiYXNlVXNlciIgICAgICAgICAgICB2YWx1ZT0ic2EiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhYmFzZVRhYmxlIiAgICAgICAgICAgdmFsdWU9IlNZU1RFTV9UQUJMRVMiLz4KLQotICAgICAgICA8ZWNobyBtZXNzYWdlPSJSdW5uaW5nIGV4YW1wbGVzIGFuZCBvdXRwdXR0aW5nIHJlc3VsdHMgdG8gdGFyZ2V0IGRpcmVjdG9yeSIvPgotCi0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHkiIGZvcms9InllcyI+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iZGF0YWJhc2VVcmwiIHZhbHVlPSIke2RhdGFiYXNlVXJsfSIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iZGF0YWJhc2VEcml2ZXIiIHZhbHVlPSIke2RhdGFiYXNlRHJpdmVyfSIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iZGF0YWJhc2VVc2VyIiB2YWx1ZT0iJHtkYXRhYmFzZVVzZXJ9Ii8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJkYXRhYmFzZVRhYmxlIiB2YWx1ZT0iJHtkYXRhYmFzZVRhYmxlfSIvPgotICAgICAgPGFyZyB2YWx1ZT0ic3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3FsL2V4YW1wbGUzLmplbGx5Ii8+Ci0gICAgPC9qYXZhPgotCi0gIDwvZ29hbD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zcWwvcHJvamVjdC5wcm9wZXJ0aWVzIGIvamVsbHktdGFncy9zcWwvcHJvamVjdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWMxYjYxLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3FsL3Byb2plY3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQotIyBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUCBSIE8gSiBFIEMgVCAgUCBSIE8gUCBFIFIgVCBJIEUgUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3NxbC9wcm9qZWN0LnhtbCBiL2plbGx5LXRhZ3Mvc3FsL3Byb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjRmNThmLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3FsL3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3Q+Ci0gIDxleHRlbmQ+JHtiYXNlZGlyfS8uLi90YWctcHJvamVjdC54bWw8L2V4dGVuZD4KLSAgPGlkPmNvbW1vbnMtamVsbHktdGFncy1zcWw8L2lkPgotICA8bmFtZT5jb21tb25zLWplbGx5LXRhZ3Mtc3FsPC9uYW1lPgotICA8Y3VycmVudFZlcnNpb24+MS4wPC9jdXJyZW50VmVyc2lvbj4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3FsPC9wYWNrYWdlPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgICAgIFRoaXMgaXMgYSBKZWxseSBpbnRlcmZhY2UgZm9yIFNRTC4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPHNob3J0RGVzY3JpcHRpb24+Q29tbW9ucyBKZWxseSBTUUwgVGFnIExpYnJhcnk8L3Nob3J0RGVzY3JpcHRpb24+Ci0gIAotICA8dmVyc2lvbnM+Ci0gICAgPHZlcnNpb24+Ci0gICAgICA8aWQ+MS4wPC9pZD4KLSAgICAgIDxuYW1lPjEuMDwvbmFtZT4KLSAgICAgIDx0YWc+Q09NTU9OUy1KRUxMWS1TUUwtMV8wPC90YWc+Ci0gICAgPC92ZXJzaW9uPgotICA8L3ZlcnNpb25zPgotICAKLSAgICAKLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8IS0tIFNUQVJUIGZvciBjb21waWxhdGlvbiAtLT4KLSAgICA8IS0tIHVubmVlZGVkIGF0IGxlYXN0IGZvciBqYXZhIDEuNCAtLT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmpkYmM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qZGJjPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgICAgPCEtLSB0aGlzIGlzIGpkYmMyXzAtc3RkZXh0LmphciAtLT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPCEtLSBFTkQgZm9yIGNvbXBpbGF0aW9uIC0tPgotICAgIAotICAgIDwhLS0gU1RBUlQgZm9yIHRlc3RpbmcgLS0+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWplbGx5PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1qZWxseS10YWdzLWp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgPHVybD5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC88L3VybD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPCEtLSBFTkQgZm9yIHRlc3RpbmcgLS0+Ci0KLSAgICA8IS0tIFNUQVJUIGZvciBydW5uaW5nIGRlbW9zIC0tPgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+Y29tbW9ucy1jbGk8L2lkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5oc3FsZGI8L2lkPgotICAgICAgPHZlcnNpb24+MS43LjE8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICA8IS0tIEVORCBmb3IgcnVubmluZyBkZW1vcyAtLT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zcWwvc3JjL2phdmEvamF2YXgvc2VydmxldC9qc3AvanN0bC9zcWwvUmVzdWx0LmphdmEgYi9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9qYXZheC9zZXJ2bGV0L2pzcC9qc3RsL3NxbC9SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2ZmVjMi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9qYXZheC9zZXJ2bGV0L2pzcC9qc3RsL3NxbC9SZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcC5qc3RsLnNxbDsKLQotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7Ci0KLS8qKgotICogPHA+VGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIGEgJmx0O3NxbDpxdWVyeSZndDsKLSAqIGFjdGlvbi4gSXQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gaW4gdGhlCi0gKiBxdWVyeSByZXN1bHQ6PC9wPgotICoKLSAqIDx1bD4KLSAqIDxsaT4gcmVzdWx0IHJvd3MKLSAqIDxsaT4gcmVzdWx0IHJvd3MgdXNpbmcgYW4gaW5kZXgKLSAqIDxsaT4gbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHJlc3VsdAotICogPGxpPiByZXN1bHQgbWV0YSBkYXRhCi0gKiA8bGk+IGluZGljYXRpb24gd2hldGhlciByZXN1bHQgcmV0dXJuZWQgaXMgYSBjb21wbGV0ZSBzZXQgb3IKLSAqICAgICAgYSBzdWJzZXQgbGltaXRlZCBieSBhIG1heGltdW0gcm93IHNldHRpbmcKLSAqIDwvdWw+Ci0gKgotICogQGF1dGhvciBKdXN0eW5hIEhvcndhdAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXN1bHQgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBTb3J0ZWRNYXAgb2JqZWN0cy4gQ29sdW1uIG5hbWUgaXMgdXNlZCBhcyB0aGUga2V5Ci0gICAgICogZm9yIHRoZSBjb2x1bW4gdmFsdWUuIFNvcnRlZE1hcCBtdXN0IHVzZSB0aGUgQ0FTRV9JTlNFTlNJVElWRV9PUkRFUgotICAgICAqIENvbXBhcmF0b3Igc28gdGhhdCB0aGUga2V5IGlzIHRoZSBjYXNlIGluc2Vuc2l0aXZlIHJlcHJlc2VudGF0aW9uCi0gICAgICogb2YgdGhlIGNvbHVtbiBuYW1lLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IHJvd3MgYXMgYW4gYXJyYXkgb2YgPGNvZGU+U29ydGVkTWFwPC9jb2RlPiBvYmplY3RzCi0gICAgICovCi0gICAgcHVibGljIFNvcnRlZE1hcFtdIGdldFJvd3MoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgT2JqZWN0c1tdLiBUaGUgZmlyc3QgaW5kZXgKLSAgICAgKiBkZXNpZ25hdGVzIHRoZSBSb3csIHRoZSBzZWNvbmQgdGhlIENvbHVtbi4gVGhlIGFycmF5Ci0gICAgICogc3RvcmVzIHRoZSB2YWx1ZSBhdCB0aGUgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IHJvd3MgYXMgYW4gYXJyYXkgb2YgPGNvZGU+T2JqZWN0W108L2NvZGU+IG9iamVjdHMKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W11bXSBnZXRSb3dzQnlJbmRleCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBjb2x1bW4gbmFtZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb2x1bW4gbmFtZXMgYXMgYW4gYXJyYXkgb2YgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3RzCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY2FjaGVkIFJlc3VsdFNldAotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHJlc3VsdAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Um93Q291bnQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBvZiB0aGUgcXVlcnkgd2FzIGxpbWl0ZWQgYnkgYSBtYXhpbXVtIHJvdyBzZXR0aW5nCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhlIHF1ZXJ5IHdhcyBsaW1pdGVkIGJ5IGEgbWF4aW11bQotICAgICAqIHJvdyBzZXR0aW5nCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNMaW1pdGVkQnlNYXhSb3dzKCk7Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9qYXZheC9zZXJ2bGV0L2pzcC9qc3RsL3NxbC9SZXN1bHRJbXBsLmphdmEgYi9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9qYXZheC9zZXJ2bGV0L2pzcC9qc3RsL3NxbC9SZXN1bHRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMGRmNTkuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zcWwvc3JjL2phdmEvamF2YXgvc2VydmxldC9qc3AvanN0bC9zcWwvUmVzdWx0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcC5qc3RsLnNxbDsKLQotaW1wb3J0IGphdmEuc3FsLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogPHA+VGhpcyBjbGFzcyBjcmVhdGVzIGEgY2FjaGVkIHZlcnNpb24gb2YgYSA8dHQ+UmVzdWx0U2V0PC90dD4uCi0gKiBJdCdzIHJlcHJlc2VudGVkIGFzIGEgPHR0PlJlc3VsdDwvdHQ+IGltcGxlbWVudGF0aW9uLCBjYXBhYmxlIG9mCi0gKiByZXR1cmluZyBhbiBhcnJheSBvZiA8dHQ+Um93PC90dD4gb2JqZWN0cyBjb250YWluaW5nIGEgPHR0PkNvbHVtbjwvdHQ+Ci0gKiBpbnN0YW5jZSBmb3IgZWFjaCBjb2x1bW4gaW4gdGhlIHJvdy4gICBJdCBpcyBub3QgcGFydCBvZiB0aGUgSlNUTAotICogQVBJOyBpdCBzZXJ2ZXMgbWVyZWx5IGFzIGEgYmFjay1lbmQgdG8gUmVzdWx0U3VwcG9ydCdzIHN0YXRpYyBtZXRob2RzLgotICogVGh1cywgd2Ugc2NvcGUgaXRzIGFjY2VzcyB0byB0aGUgcGFja2FnZS4KLSAqCi0gKiBAYXV0aG9yIEhhbnMgQmVyZ3N0ZW4KLSAqIEBhdXRob3IgSnVzdHluYSBIb3J3YXQKLSAqLwotCi1jbGFzcyBSZXN1bHRJbXBsIGltcGxlbWVudHMgUmVzdWx0IHsKLSAgICBwcml2YXRlIExpc3Qgcm93TWFwOwotICAgIHByaXZhdGUgTGlzdCByb3dCeUluZGV4OwotICAgIHByaXZhdGUgU3RyaW5nW10gY29sdW1uTmFtZXM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzTGltaXRlZDsKLQotICAgIC8qKgotICAgICAqIFRoaXMgY29uc3RydWN0b3IgcmVhZHMgdGhlIFJlc3VsdFNldCBhbmQgc2F2ZXMgYSBjYWNoZWQKLSAgICAgKiBjb3B5LgotICAgICAqCi0gICAgICogQHBhcmFtIHJzIGFuIG9wZW4gPHR0PlJlc3VsdFNldDwvdHQ+LCBwb3NpdGlvbmVkIGJlZm9yZSB0aGUgZmlyc3QKLSAgICAgKiByb3cKLSAgICAgKiBAcGFyYW0gc3RhcnRSb3csIGJlZ2lubmluZyByb3cgdG8gYmUgY2FjaGVkCi0gICAgICogQHBhcmFtIG1heFJvd3MsIHF1ZXJ5IG1heGltdW0gcm93cyBsaW1pdAotICAgICAqIEBleGNlcHRpb24gaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzdWx0SW1wbChSZXN1bHRTZXQgcnMsIGludCBzdGFydFJvdywgaW50IG1heFJvd3MpCi0gICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJvd01hcCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcm93QnlJbmRleCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBSZXN1bHRTZXRNZXRhRGF0YSByc21kID0gcnMuZ2V0TWV0YURhdGEoKTsKLSAgICAgICAgaW50IG5vT2ZDb2x1bW5zID0gcnNtZC5nZXRDb2x1bW5Db3VudCgpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgY29sdW1uIG5hbWUgYXJyYXkKLSAgICAgICAgY29sdW1uTmFtZXMgPSBuZXcgU3RyaW5nW25vT2ZDb2x1bW5zXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbm9PZkNvbHVtbnM7IGkrKykgewotICAgICAgICAgICAgY29sdW1uTmFtZXNbaS0xXSA9IHJzbWQuZ2V0Q29sdW1uTmFtZShpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRocm93IGF3YXkgYWxsIHJvd3MgdXB0byBzdGFydFJvdwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXJ0Um93OyBpKyspIHsKLSAgICAgICAgICAgIHJzLm5leHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFByb2Nlc3MgdGhlIHJlbWFpbmluZyByb3dzIHVwdG8gbWF4Um93cwotICAgICAgICBpbnQgcHJvY2Vzc2VkUm93cyA9IDA7Ci0gICAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKLSAgICAgICAgICAgIGlmICgobWF4Um93cyAhPSAtMSkgJiYgKHByb2Nlc3NlZFJvd3MgPT0gbWF4Um93cykpIHsKLSAgICAgICAgICAgICAgICBpc0xpbWl0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT2JqZWN0W10gY29sdW1ucyA9IG5ldyBPYmplY3Rbbm9PZkNvbHVtbnNdOwotICAgICAgICAgICAgU29ydGVkTWFwIGNvbHVtbk1hcCA9Ci0gICAgICAgICAgICAgICAgbmV3IFRyZWVNYXAoU3RyaW5nLkNBU0VfSU5TRU5TSVRJVkVfT1JERVIpOwotCi0gICAgICAgICAgICAvLyBKREJDIHVzZXMgMSBhcyB0aGUgbG93ZXN0IGluZGV4IQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbm9PZkNvbHVtbnM7IGkrKykgewotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9ICBycy5nZXRPYmplY3QoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJzLndhc051bGwoKSkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbHVtbnNbaS0xXSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIGNvbHVtbk1hcC5wdXQoY29sdW1uTmFtZXNbaS0xXSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm93TWFwLmFkZChjb2x1bW5NYXApOwotICAgICAgICAgICAgcm93QnlJbmRleC5hZGQoY29sdW1ucyk7Ci0gICAgICAgICAgICBwcm9jZXNzZWRSb3dzKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFNvcnRlZE1hcCBvYmplY3RzLiBUaGUgU29ydGVkTWFwCi0gICAgICogb2JqZWN0IGtleSBpcyB0aGUgQ29sdW1uTmFtZSBhbmQgdGhlIHZhbHVlIGlzIHRoZSBDb2x1bW5WYWx1ZS4KLSAgICAgKiBTb3J0ZWRNYXAgd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIENBU0VfSU5TRU5TSVRJVkVfT1JERVIKLSAgICAgKiBDb21wYXJhdG9yIHNvIHRoZSBrZXkgaXMgdGhlIGNhc2UgaW5zZW5zaXRpdmUgcmVwcmVzZW50YXRpb24KLSAgICAgKiBvZiB0aGUgQ29sdW1uTmFtZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgTWFwLCBvciBudWxsIGlmIHRoZXJlIGFyZSBubyByb3dzCi0gICAgICovCi0gICAgcHVibGljIFNvcnRlZE1hcFtdIGdldFJvd3MoKSB7Ci0gICAgICAgIGlmIChyb3dNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3Nob3VsZCBqdXN0IGJlIGFibGUgdG8gcmV0dXJuIFNvcnRlZE1hcFtdIG9iamVjdAotICAgICAgICByZXR1cm4gKFNvcnRlZE1hcCBbXSkgcm93TWFwLnRvQXJyYXkobmV3IFNvcnRlZE1hcFswXSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIE9iamVjdFtdIG9iamVjdHMuIFRoZSBmaXJzdCBpbmRleAotICAgICAqIGRlc2lnbmF0ZXMgdGhlIFJvdywgdGhlIHNlY29uZCB0aGUgQ29sdW1uLiBUaGUgYXJyYXkKLSAgICAgKiBzdG9yZXMgdGhlIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgcm93IGFuZCBjb2x1bW4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIE9iamVjdFtdLCBvciBudWxsIGlmIHRoZXJlIGFyZSBubyByb3dzCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdW10gZ2V0Um93c0J5SW5kZXgoKSB7Ci0gICAgICAgIGlmIChyb3dCeUluZGV4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9zaG91bGQganVzdCBiZSBhYmxlIHRvIHJldHVybiBPYmplY3RbXVtdIG9iamVjdAotICAgICAgICByZXR1cm4gKE9iamVjdCBbXVtdKXJvd0J5SW5kZXgudG9BcnJheShuZXcgT2JqZWN0WzBdWzBdKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFN0cmluZyBvYmplY3RzLiBUaGUgYXJyYXkgcmVwcmVzZW50cwotICAgICAqIHRoZSBuYW1lcyBvZiB0aGUgY29sdW1ucyBhcnJhbmdlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyBpbgotICAgICAqIHRoZSBnZXRSb3dzQnlJbmRleCgpIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgU3RyaW5nW10KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29sdW1uTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBjb2x1bW5OYW1lczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY2FjaGVkIFJlc3VsdFNldAotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNhY2hlZCByb3dzLCBvciAtMSBpZiB0aGUgUmVzdWx0IGNvdWxkCi0gICAgICogICAgbm90IGJlIGluaXRpYWxpemVkIGR1ZSB0byBTUUxFeGNlcHRpb25zCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRSb3dDb3VudCgpIHsKLSAgICAgICAgaWYgKHJvd01hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJvd01hcC5zaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIG9mIHRoZSBxdWVyeSB3YXMgbGltaXRlZCBieSBhIG1heGltdW0gcm93IHNldHRpbmcKLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcXVlcnkgd2FzIGxpbWl0ZWQgYnkgYSBNYXhSb3dzIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTGltaXRlZEJ5TWF4Um93cygpIHsKLSAgICAgICAgcmV0dXJuIGlzTGltaXRlZDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3FsL3NyYy9qYXZhL2phdmF4L3NlcnZsZXQvanNwL2pzdGwvc3FsL1Jlc3VsdFN1cHBvcnQuamF2YSBiL2plbGx5LXRhZ3Mvc3FsL3NyYy9qYXZhL2phdmF4L3NlcnZsZXQvanNwL2pzdGwvc3FsL1Jlc3VsdFN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkOTcwMy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9qYXZheC9zZXJ2bGV0L2pzcC9qc3RsL3NxbC9SZXN1bHRTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgamF2YXguc2VydmxldC5qc3AuanN0bC5zcWw7Ci0KLWltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7Ci1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotCi0vKioKLSAqIDxwPlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgY29udmVyc2lvbiBvZiBhIFJlc3VsdFNldCB0bwotICogYSBSZXN1bHQgb2JqZWN0LjwvcD4KLSAqCi0gKgotICogQGF1dGhvciBKdXN0eW5hIEhvcndhdAotICoKLSAqLwotcHVibGljIGNsYXNzIFJlc3VsdFN1cHBvcnQgewotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFJvdyBvYmplY3RzLgotICAgICAqCi0gICAgICogQHBhcmFtIFJlc3VsdFNldCB0aGUgUmVzdWx0U2V0IG9iamVjdAotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+UmVzdWx0PC9jb2RlPiBvYmplY3Qgb2YgdGhlIHJlc3VsdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVzdWx0IHRvUmVzdWx0KFJlc3VsdFNldCBycykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRJbXBsKHJzLCAtMSwgLTEpOwotICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgUmVzdWx0IG9iamVjdCBvZiB0aGUgY2FjaGVkIFJlc3VsdFNldCBsaW1pdGVkIGJ5IG1heFJvd3MKLSAgICAgKgotICAgICAqIEBwYXJhbSBSZXN1bHRTZXQgdGhlIFJlc3VsdFNldCBvYmplY3QKLSAgICAgKiBAcGFyYW0gbWF4Um93cyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cwotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+UmVzdWx0PC9jb2RlPiBvYmplY3Qgb2YgdGhlIHJlc3VsdCBsaW1pdGVkIGJ5IG1heFJvd3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlc3VsdCB0b1Jlc3VsdChSZXN1bHRTZXQgcnMsIGludCBtYXhSb3dzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEltcGwocnMsIC0xLCBtYXhSb3dzKTsKLSAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zcWwvc3JjL2phdmEvamF2YXgvc2VydmxldC9qc3AvanN0bC9zcWwvU1FMRXhlY3V0aW9uVGFnLmphdmEgYi9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9qYXZheC9zZXJ2bGV0L2pzcC9qc3RsL3NxbC9TUUxFeGVjdXRpb25UYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmZDk0MS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9qYXZheC9zZXJ2bGV0L2pzcC9qc3RsL3NxbC9TUUxFeGVjdXRpb25UYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcC5qc3RsLnNxbDsKLQotLyoqCi0gKiA8cD5UaGlzIGludGVyZmFjZSBhbGxvd3MgdGFnIGhhbmRsZXJzIGltcGxlbWVudGluZyBpdCB0byByZWNlaXZlCi0gKiB2YWx1ZXMgZm9yIHBhcmFtZXRlciBtYXJrZXJzICgiPyIpIGluIHRoZWlyIFNRTCBzdGF0ZW1lbnRzLjwvcD4KLSAqCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBib3RoICZsdDtzcWw6cXVlcnkmZ3Q7IGFuZAotICogJmx0O3NxbDp1cGRhdGUmZ3Q7LiBJdHMgPGNvZGU+YWRkU1FMUGFyYW1ldGVyKCk8L2NvZGU+IG1ldGhvZAotICogaXMgY2FsbGVkIGJ5IG5lc3RlZCBwYXJhbWV0ZXIgYWN0aW9ucyAoc3VjaCBhcyAmbHQ7c3FsOnBhcmFtJmd0OykKLSAqIHRvIHN1YnN0aXR1ZSA8Y29kZT5QcmVwYXJlZFN0YXRlbWVudDxjb2RlPiBwYXJhbWV0ZXIgdmFsdWVzIGZvcgotICogIj8iIHBhcmFtZXRlciBtYXJrZXJzIGluIHRoZSBTUUwgc3RhdGVtZW50IG9mIHRoZSBlbmNsb3NpbmcKLSAqIDxjb2RlPlNRTEV4ZWN1dGlvblRhZzwvY29kZT4gYWN0aW9uLjwvcD4KLSAqCi0gKiA8cD5UaGUgZ2l2ZW4gcGFyYW1ldGVyIHZhbHVlcyBhcmUgY29udmVydGVkIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcKLSAqIFNRTCB0eXBlIChmb2xsb3dpbmcgdGhlIHJ1bGVzIGluIHRoZSBKREJDIHNwZWNpZmljYXRpb24pIGJlZm9yZQotICogdGhleSBhcmUgc2VudCB0byB0aGUgZGF0YWJhc2UuPC9wPgotICoKLSAqIDxwPktlZWluZyB0cmFjayBvZiB0aGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB2YWx1ZXMgYmVpbmcgYWRkZWQKLSAqIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgdGFnIGhhbmRsZXIgaW1wbGVtZW50aW5nIHRoaXMKLSAqIGludGVyZmFjZTwvcD4KLSAqCi0gKiA8cD5UaGUgPGNvZGU+U1FMRXhjZWN1dGlvblRhZzwvY29kZT4gaW50ZXJmYWNlIGlzIGV4cG9zZWQgaW4gb3JkZXIKLSAqIHRvIHN1cHBvcnQgY3VzdG9tIHBhcmFtZXRlciBhY3Rpb25zIHdoaWNoIG1heSByZXRyaWV2ZSB0aGVpcgotICogcGFyYW1ldGVycyBmcm9tIGFueSBzb3VyY2UgYW5kIHByb2Nlc3MgdGhlbSBiZWZvcmUgc3Vic3RpdHV0aW5nCi0gKiB0aGVtIGZvciBhIHBhcmFtZXRlciBtYXJrZXIgaW4gdGhlIHNRTCBzdGF0ZW1lbnQgb2YgdGhlCi0gKiBlbmNsb3NpbmcgPGNvZGU+U1FMRXhlY3V0aW9uVGFnPC9jb2RlPiBhY3Rpb248L3A+Ci0gKgotICogQGF1dGhvciBKdXN0eW5hIEhvcndhdAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNRTEV4ZWN1dGlvblRhZyB7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgUHJlcGFyZWRTdGF0ZW1lbnQgcGFyYW1ldGVyIHZhbHVlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGhlIFByZXBhcmVkU3RhdGVtZW50IHBhcmFtZXRlciB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFNRTFBhcmFtZXRlcihPYmplY3QgdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zcWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3FsL0RhdGFTb3VyY2VVdGlsLmphdmEgYi9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvRGF0YVNvdXJjZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg5MzgzMy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvRGF0YVNvdXJjZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3FsOwotCi1pbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7Ci1pbXBvcnQgamF2YXgubmFtaW5nLkluaXRpYWxDb250ZXh0OwotaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OwotaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5SZXNvdXJjZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiA8cD5BIHNpbXBsZSA8Y29kZT5EYXRhU291cmNlPC9jb2RlPiB1dGlsaXR5IGZvciB0aGUgc3RhbmRhcmQKLSAqIDxjb2RlPkRyaXZlck1hbmFnZXI8L2NvZGU+IGNsYXNzLgotICoKLSAqIFRPIERPOiBuZWVkIHRvIGNhY2hlIERhdGFTb3VyY2UKLSAqCi0gKiBAYXV0aG9yIEp1c3R5bmEgSG9yd2F0Ci0gKi8KLXB1YmxpYyBjbGFzcyBEYXRhU291cmNlVXRpbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNDQVBFID0gIlxcIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9LRU4gPSAiLCI7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGF0YVNvdXJjZVV0aWwuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogSWYgZGF0YVNvdXJjZSBpcyBhIFN0cmluZyBmaXJzdCBkbyBKTkRJIGxvb2t1cC4KLSAgICAgKiBJZiBsb29rdXAgZmFpbHMgcGFyc2UgU3RyaW5nIGxpa2UgaXQgd2FzIGEgc2V0IG9mIEpEQkMgcGFyYW1ldGVycwotICAgICAqIE90aGVyd2lzZSBjaGVjayB0byBzZWUgaWYgZGF0YVNvdXJjZSBpcyBhIERhdGFTb3VyY2Ugb2JqZWN0IGFuZCB1c2UgYXMKLSAgICAgKiBpcwotICAgICAqLwotICAgIHN0YXRpYyBEYXRhU291cmNlIGdldERhdGFTb3VyY2UoT2JqZWN0IHJhd0RhdGFTb3VyY2UsIEplbGx5Q29udGV4dCBwYykKLSAgICAgICAgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgRGF0YVNvdXJjZSBkYXRhU291cmNlID0gbnVsbDsKLQotICAgICAgICBpZiAocmF3RGF0YVNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByYXdEYXRhU291cmNlID0gcGMuZ2V0VmFyaWFibGUoIm9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5zcWwuRGF0YVNvdXJjZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJhd0RhdGFTb3VyY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAqIElmIHRoZSAnZGF0YVNvdXJjZScgYXR0cmlidXRlJ3MgdmFsdWUgcmVzb2x2ZXMgdG8gYSBTdHJpbmcKLSAgICAgICAgKiBhZnRlciBydGV4cHIvRUwgZXZhbHVhdGlvbiwgdXNlIHRoZSBzdHJpbmcgYXMgSk5ESSBwYXRoIHRvCi0gICAgICAgICogYSBEYXRhU291cmNlCi0gICAgICAgICovCi0gICAgICAgIGlmIChyYXdEYXRhU291cmNlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENvbnRleHQgY3R4ID0gbmV3IEluaXRpYWxDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgLy8gcmVsYXRpdmUgdG8gc3RhbmRhcmQgSk5ESSByb290IGZvciBKMkVFIGFwcAotICAgICAgICAgICAgICAgIENvbnRleHQgZW52Q3R4ID0gKENvbnRleHQpIGN0eC5sb29rdXAoImphdmE6Y29tcC9lbnYiKTsKLSAgICAgICAgICAgICAgICBkYXRhU291cmNlID0gKERhdGFTb3VyY2UpIGVudkN0eC5sb29rdXAoKFN0cmluZykgcmF3RGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgZGF0YVNvdXJjZSA9IGdldERhdGFTb3VyY2UoKFN0cmluZykgcmF3RGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocmF3RGF0YVNvdXJjZSBpbnN0YW5jZW9mIERhdGFTb3VyY2UpIHsKLSAgICAgICAgICAgIGRhdGFTb3VyY2UgPSAoRGF0YVNvdXJjZSkgcmF3RGF0YVNvdXJjZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihSZXNvdXJjZXMuZ2V0TWVzc2FnZSgiU1FMX0RBVEFTT1VSQ0VfSU5WQUxJRF9UWVBFIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRhdGFTb3VyY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgSkRCQyBwYXJhbWV0ZXJzIGFuZCBzZXR1cCBkYXRhU291cmNlIGFwcHJvcHJpYXRlbHkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBEYXRhU291cmNlIGdldERhdGFTb3VyY2UoU3RyaW5nIHBhcmFtcykgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgRGF0YVNvdXJjZVdyYXBwZXIgZGF0YVNvdXJjZSA9IG5ldyBEYXRhU291cmNlV3JhcHBlcigpOwotCi0gICAgICAgIFN0cmluZ1tdIHBhcmFtU3RyaW5nID0gbmV3IFN0cmluZ1s0XTsKLSAgICAgICAgaW50IGVzY0NvdW50ID0gMDsKLSAgICAgICAgaW50IGFyeUNvdW50ID0gMDsKLSAgICAgICAgaW50IGJlZ2luID0gMDsKLQotICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgcGFyYW1zLmxlbmd0aCgpOyBpbmRleCsrKSB7Ci0gICAgICAgICAgICBjaGFyIG5leHRDaGFyID0gcGFyYW1zLmNoYXJBdChpbmRleCk7Ci0gICAgICAgICAgICBpZiAoVE9LRU4uaW5kZXhPZihuZXh0Q2hhcikgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXNjQ291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBwYXJhbVN0cmluZ1thcnlDb3VudF0gPSBwYXJhbXMuc3Vic3RyaW5nKGJlZ2luLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGJlZ2luID0gaW5kZXggKyAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoKythcnlDb3VudCA+IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihSZXNvdXJjZXMuZ2V0TWVzc2FnZSgiSkRCQ19QQVJBTV9DT1VOVCIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChFU0NBUEUuaW5kZXhPZihuZXh0Q2hhcikgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBlc2NDb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXNjQ291bnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBhcmFtU3RyaW5nW2FyeUNvdW50XSA9IHBhcmFtcy5zdWJzdHJpbmcoYmVnaW4pOwotCi0gICAgICAgIC8vIHVzZSB0aGUgSkRCQyBVUkwgZnJvbSB0aGUgcGFyYW1ldGVyIHN0cmluZwotICAgICAgICBkYXRhU291cmNlLnNldEpkYmNVUkwocGFyYW1TdHJpbmdbMF0pOwotCi0gICAgICAgIC8vIHRyeSB0byBsb2FkIGEgZHJpdmVyIGlmIGl0J3MgcHJlc2VudAotICAgICAgICBpZiAocGFyYW1TdHJpbmdbMV0gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBkYXRhU291cmNlLnNldERyaXZlckNsYXNzTmFtZShwYXJhbVN0cmluZ1sxXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuZ2V0TWVzc2FnZSgiRFJJVkVSX0lOVkFMSURfQ0xBU1MiLCBleC5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkCi0gICAgICAgIGRhdGFTb3VyY2Uuc2V0VXNlck5hbWUocGFyYW1TdHJpbmdbMl0pOwotICAgICAgICBkYXRhU291cmNlLnNldFBhc3N3b3JkKHBhcmFtU3RyaW5nWzNdKTsKLQotICAgICAgICByZXR1cm4gZGF0YVNvdXJjZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3FsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NxbC9EYXRhU291cmNlV3JhcHBlci5qYXZhIGIvamVsbHktdGFncy9zcWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3FsL0RhdGFTb3VyY2VXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOTVlOWIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zcWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3FsL0RhdGFTb3VyY2VXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnNxbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnNxbC5Ecml2ZXJNYW5hZ2VyOwotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnNxbC5EYXRhU291cmNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS51dGlsLkNsYXNzTG9hZGVyVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogPHA+QSBzaW1wbGUgPGNvZGU+RGF0YVNvdXJjZTwvY29kZT4gd3JhcHBlciBmb3IgdGhlIHN0YW5kYXJkCi0gKiA8Y29kZT5Ecml2ZXJNYW5hZ2VyPC9jb2RlPiBjbGFzcy4KLSAqCi0gKiBAYXV0aG9yIEhhbnMgQmVyZ3N0ZW4KLSAqLwotcHVibGljIGNsYXNzIERhdGFTb3VyY2VXcmFwcGVyIGltcGxlbWVudHMgRGF0YVNvdXJjZSB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGF0YVNvdXJjZVdyYXBwZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZHJpdmVyQ2xhc3NOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGpkYmNVUkw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdXNlck5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREcml2ZXJDbGFzc05hbWUoU3RyaW5nIGRyaXZlckNsYXNzTmFtZSkKLSAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJMb2FkaW5nIEpEQkMgZHJpdmVyOiBbIiArIGRyaXZlckNsYXNzTmFtZSArICJdIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmRyaXZlckNsYXNzTmFtZSA9IGRyaXZlckNsYXNzTmFtZTsKLSAgICAgICAgQ2xhc3NMb2FkZXJVdGlscy5nZXRDbGFzc0xvYWRlcihnZXRDbGFzcygpKS5sb2FkQ2xhc3MoZHJpdmVyQ2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEpkYmNVUkwoU3RyaW5nIGpkYmNVUkwpIHsKLSAgICAgICAgdGhpcy5qZGJjVVJMID0gamRiY1VSTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VyTmFtZShTdHJpbmcgdXNlck5hbWUpIHsKLSAgICAgICAgdGhpcy51c2VyTmFtZSA9IHVzZXJOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgewotICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIENvbm5lY3Rpb24gdXNpbmcgdGhlIERyaXZlck1hbmFnZXIgYW5kIGFsbAotICAgICAqIHNldCBwcm9wZXJ0aWVzLgotICAgICAqLwotICAgIHB1YmxpYyBDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLSAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKLSAgICAgICAgaWYgKHVzZXJOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgIkNyZWF0aW5nIGNvbm5lY3Rpb24gZnJvbSB1cmw6ICIgKyBqZGJjVVJMICsgIiB1c2VyTmFtZTogIiArIHVzZXJOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY29ubiA9IERyaXZlck1hbmFnZXIuZ2V0Q29ubmVjdGlvbihqZGJjVVJMLCB1c2VyTmFtZSwgcGFzc3dvcmQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBjb25uZWN0aW9uIGZyb20gdXJsOiAiICsgamRiY1VSTCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNvbm4gPSBEcml2ZXJNYW5hZ2VyLmdldENvbm5lY3Rpb24oamRiY1VSTCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgIkNyZWF0ZWQgY29ubmVjdGlvbjogIiArIGNvbm4gKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29ubjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbHdheXMgdGhyb3dzIGEgU1FMRXhjZXB0aW9uLiBVc2VybmFtZSBhbmQgcGFzc3dvcmQgYXJlIHNldAotICAgICAqIGluIHRoZSBjb25zdHJ1Y3RvciBhbmQgY2FuIG5vdCBiZSBjaGFuZ2VkLgotICAgICAqLwotICAgIHB1YmxpYyBDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpCi0gICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgU1FMRXhjZXB0aW9uKFJlc291cmNlcy5nZXRNZXNzYWdlKCJOT1RfU1VQUE9SVEVEIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsd2F5cyB0aHJvd3MgYSBTUUxFeGNlcHRpb24uIE5vdCBzdXBwb3J0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRMb2dpblRpbWVvdXQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFNRTEV4Y2VwdGlvbihSZXNvdXJjZXMuZ2V0TWVzc2FnZSgiTk9UX1NVUFBPUlRFRCIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbHdheXMgdGhyb3dzIGEgU1FMRXhjZXB0aW9uLiBOb3Qgc3VwcG9ydGVkLgotICAgICAqLwotICAgIHB1YmxpYyBQcmludFdyaXRlciBnZXRMb2dXcml0ZXIoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFNRTEV4Y2VwdGlvbihSZXNvdXJjZXMuZ2V0TWVzc2FnZSgiTk9UX1NVUFBPUlRFRCIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbHdheXMgdGhyb3dzIGEgU1FMRXhjZXB0aW9uLiBOb3Qgc3VwcG9ydGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvZ2luVGltZW91dChpbnQgc2Vjb25kcykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBTUUxFeGNlcHRpb24oUmVzb3VyY2VzLmdldE1lc3NhZ2UoIk5PVF9TVVBQT1JURUQiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWx3YXlzIHRocm93cyBhIFNRTEV4Y2VwdGlvbi4gTm90IHN1cHBvcnRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0TG9nV3JpdGVyKFByaW50V3JpdGVyIG91dCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBTUUxFeGNlcHRpb24oUmVzb3VyY2VzLmdldE1lc3NhZ2UoIk5PVF9TVVBQT1JURUQiKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvRGF0ZVBhcmFtVGFnLmphdmEgYi9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvRGF0ZVBhcmFtVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZmY5OTYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zcWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3FsL0RhdGVQYXJhbVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3FsOwotCi1pbXBvcnQgamF2YS5zcWwuRGF0ZTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLmpzdGwuc3FsLlNRTEV4ZWN1dGlvblRhZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLlJlc291cmNlczsKLQotLyoqCi0gKiA8cD5UYWcgaGFuZGxlciBmb3IgJmx0O1BhcmFtJmd0OyBpbiBKU1RMLCB1c2VkIHRvIHNldAotICogcGFyYW1ldGVyIHZhbHVlcyBmb3IgYSBTUUwgc3RhdGVtZW50LjwvcD4KLSAqCi0gKiBAYXV0aG9yIEp1c3R5bmEgSG9yd2F0Ci0gKi8KLQotcHVibGljIGNsYXNzIERhdGVQYXJhbVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBQcml2YXRlIGNvbnN0YW50cwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVTVEFNUF9UWVBFID0gInRpbWVzdGFtcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVfVFlQRSA9ICJ0aW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFURV9UWVBFID0gImRhdGUiOwotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBQcm90ZWN0ZWQgc3RhdGUKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgdHlwZTsKLSAgICBwcm90ZWN0ZWQgamF2YS51dGlsLkRhdGUgdmFsdWU7Ci0KLSAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIC8vIENvbnN0cnVjdG9yCi0KLSAgICBwdWJsaWMgRGF0ZVBhcmFtVGFnKCkgewotICAgIH0KLQotICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgLy8gUHJvcGVydGllcwotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoRGF0ZSB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgLy8gVGFnIGxvZ2ljCi0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBTUUxFeGVjdXRpb25UYWcgcGFyZW50ID0KLSAgICAgICAgICAgIChTUUxFeGVjdXRpb25UYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyh0aGlzLCBTUUxFeGVjdXRpb25UYWcuY2xhc3MpOwotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihSZXNvdXJjZXMuZ2V0TWVzc2FnZSgiU1FMX1BBUkFNX09VVFNJREVfUEFSRU5UIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnZlcnRWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcGFyZW50LmFkZFNRTFBhcmFtZXRlcih2YWx1ZSk7Ci0gICAgfQotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBQcml2YXRlIHV0aWxpdHkgbWV0aG9kcwotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbnZlcnRWYWx1ZSgpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKCh0eXBlID09IG51bGwpIHx8ICh0eXBlLmVxdWFsc0lnbm9yZUNhc2UoVElNRVNUQU1QX1RZUEUpKSkgewotICAgICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBqYXZhLnNxbC5UaW1lc3RhbXApKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgamF2YS5zcWwuVGltZXN0YW1wKHZhbHVlLmdldFRpbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodHlwZS5lcXVhbHNJZ25vcmVDYXNlKFRJTUVfVFlQRSkpIHsKLSAgICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgamF2YS5zcWwuVGltZSkpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBqYXZhLnNxbC5UaW1lKHZhbHVlLmdldFRpbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodHlwZS5lcXVhbHNJZ25vcmVDYXNlKERBVEVfVFlQRSkpIHsKLSAgICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgamF2YS5zcWwuRGF0ZSkpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBqYXZhLnNxbC5EYXRlKHZhbHVlLmdldFRpbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgUmVzb3VyY2VzLmdldE1lc3NhZ2UoIlNRTF9EQVRFX1BBUkFNX0lOVkFMSURfVFlQRSIsIHR5cGUpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3FsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NxbC9Ecml2ZXJUYWcuamF2YSBiL2plbGx5LXRhZ3Mvc3FsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NxbC9Ecml2ZXJUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI0YjY2Ny4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvRHJpdmVyVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnNxbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKioKLSAqIDxwPlRhZyBoYW5kbGVyIGZvciAmbHQ7RHJpdmVyJmd0OyBpbiBKU1RMLCB1c2VkIHRvIGNyZWF0ZQotICogYSBzaW1wbGUgRGF0YVNvdXJjZSBmb3IgcHJvdG90eXBpbmcuPC9wPgotICoKLSAqIEBhdXRob3IgSGFucyBCZXJnc3RlbgotICovCi1wdWJsaWMgY2xhc3MgRHJpdmVyVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERSSVZFUl9DTEFTU19OQU1FID0KLSAgICAgICAgImphdmF4LnNlcnZsZXQuanNwLmpzdGwuc3FsLmRyaXZlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpEQkNfVVJMID0gImphdmF4LnNlcnZsZXQuanNwLmpzdGwuc3FsLmpkYmNVUkwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX05BTUUgPSAiamF2YXguc2VydmxldC5qc3AuanN0bC5zcWwudXNlck5hbWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRCA9ICJqYXZheC5zZXJ2bGV0LmpzcC5qc3RsLnNxbC5wYXNzd29yZCI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBkcml2ZXJDbGFzc05hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgamRiY1VSTDsKLSAgICBwcml2YXRlIFN0cmluZyBzY29wZSA9ICJwYWdlIjsKLSAgICBwcml2YXRlIFN0cmluZyB1c2VyTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0KLSAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIC8vIEFjY2Vzc29yIG1ldGhvZHMKLQotICAgIHB1YmxpYyB2b2lkIHNldERyaXZlcihTdHJpbmcgZHJpdmVyQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHRoaXMuZHJpdmVyQ2xhc3NOYW1lID0gZHJpdmVyQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEpkYmNVUkwoU3RyaW5nIGpkYmNVUkwpIHsKLSAgICAgICAgdGhpcy5qZGJjVVJMID0gamRiY1VSTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzY29wZSBvZiB0aGUgdmFyaWFibGUgdG8gaG9sZCB0aGUKLSAgICAgKiByZXN1bHQuCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTY29wZShTdHJpbmcgc2NvcGVOYW1lKSB7Ci0gICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXNlck5hbWUoU3RyaW5nIHVzZXJOYW1lKSB7Ci0gICAgICAgIHRoaXMudXNlck5hbWUgPSB1c2VyTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0KLSAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIC8vIFRhZyBsb2dpYwotCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgRGF0YVNvdXJjZVdyYXBwZXIgZHMgPSBuZXcgRGF0YVNvdXJjZVdyYXBwZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRzLnNldERyaXZlckNsYXNzTmFtZShnZXREcml2ZXJDbGFzc05hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIkludmFsaWQgZHJpdmVyIGNsYXNzIG5hbWU6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZHMuc2V0SmRiY1VSTChnZXRKZGJjVVJMKCkpOwotICAgICAgICBkcy5zZXRVc2VyTmFtZShnZXRVc2VyTmFtZSgpKTsKLSAgICAgICAgZHMuc2V0UGFzc3dvcmQoZ2V0UGFzc3dvcmQoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUodmFyLCBkcyk7Ci0gICAgfQotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBQcml2YXRlIHV0aWxpdHkgbWV0aG9kcwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3NOYW1lKCkgewotICAgICAgICBpZiAoZHJpdmVyQ2xhc3NOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkcml2ZXJDbGFzc05hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldEluaXRQYXJhbWV0ZXIoRFJJVkVSX0NMQVNTX05BTUUpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEpkYmNVUkwoKSB7Ci0gICAgICAgIGlmIChqZGJjVVJMICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBqZGJjVVJMOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXRJbml0UGFyYW1ldGVyKEpEQkNfVVJMKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRVc2VyTmFtZSgpIHsKLSAgICAgICAgaWYgKHVzZXJOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB1c2VyTmFtZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0SW5pdFBhcmFtZXRlcihVU0VSX05BTUUpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFBhc3N3b3JkKCkgewotICAgICAgICByZXR1cm4gZ2V0SW5pdFBhcmFtZXRlcihQQVNTV09SRCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBrZXkpIHsKLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3FsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NxbC9QYXJhbVRhZy5qYXZhIGIvamVsbHktdGFncy9zcWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3FsL1BhcmFtVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1M2VjYmQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zcWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3FsL1BhcmFtVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnNxbDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLmpzdGwuc3FsLlNRTEV4ZWN1dGlvblRhZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLlJlc291cmNlczsKLQotLyoqCi0gKiA8cD5UYWcgaGFuZGxlciBmb3IgJmx0O1BhcmFtJmd0OyBpbiBKU1RMLCB1c2VkIHRvIHNldAotICogcGFyYW1ldGVyIHZhbHVlcyBmb3IgYSBTUUwgc3RhdGVtZW50LjwvcD4KLSAqCi0gKiBAYXV0aG9yIEhhbnMgQmVyZ3N0ZW4KLSAqLwotCi1wdWJsaWMgY2xhc3MgUGFyYW1UYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IHZhbHVlOwotCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgLy8gVGFnIGxvZ2ljCi0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBTUUxFeGVjdXRpb25UYWcgcGFyZW50ID0KLSAgICAgICAgICAgIChTUUxFeGVjdXRpb25UYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyh0aGlzLCBTUUxFeGVjdXRpb25UYWcuY2xhc3MpOwotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihSZXNvdXJjZXMuZ2V0TWVzc2FnZSgiU1FMX1BBUkFNX09VVFNJREVfUEFSRU5UIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IHBhcmFtVmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhcmFtVmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBib2R5Q29udGVudCA9IGdldEJvZHlUZXh0KCk7Ci0gICAgICAgICAgICBpZiAoYm9keUNvbnRlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJvZHlDb250ZW50ID0gYm9keUNvbnRlbnQudHJpbSgpOwotICAgICAgICAgICAgICAgIGlmIChib2R5Q29udGVudC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZSA9IGJvZHlDb250ZW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHBhcmVudC5hZGRTUUxQYXJhbWV0ZXIocGFyYW1WYWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zcWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3FsL1F1ZXJ5VGFnLmphdmEgYi9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvUXVlcnlUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JkMWM5YS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvUXVlcnlUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3FsOwotCi1pbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudDsKLWltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7Ci1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLmpzdGwuc3FsLlJlc3VsdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLlJlc291cmNlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotCi0vKioKLSAqIDxwPlRhZyBoYW5kbGVyIGZvciAmbHQ7UXVlcnkmZ3Q7IGluIEpTVEwuCi0gKgotICogQGF1dGhvciBIYW5zIEJlcmdzdGVuCi0gKiBAYXV0aG9yIEp1c3R5bmEgSG9yd2F0Ci0gKi8KLQotcHVibGljIGNsYXNzIFF1ZXJ5VGFnIGV4dGVuZHMgU3FsVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUXVlcnlUYWcuY2xhc3MpOwotCi0gICAgLyoKLSAgICAgKiBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgdGFrZSBleHByZXNzaW9uIHZhbHVlcywgc28gdGhlCi0gICAgICogc2V0dGVyIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkIGJ5IHRoZSBleHByZXNzaW9uIHR5cGUKLSAgICAgKiBzcGVjaWZpYyBzdWJjbGFzc2VzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgbWF4Um93cyA9IC0xOwotICAgIHByb3RlY3RlZCBib29sZWFuIG1heFJvd3NTcGVjaWZpZWQ7Ci0gICAgcHJvdGVjdGVkIGludCBzdGFydFJvdzsKLQotICAgIC8qCi0gICAgICogSW5zdGFuY2UgdmFyaWFibGVzIHRoYXQgYXJlIG5vdCBmb3IgYXR0cmlidXRlcwotICAgICAqLwotICAgIHByaXZhdGUgQ29ubmVjdGlvbiBjb25uOwotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBDb25zdHJ1Y3RvciBhbmQgaW5pdGlhbGl6YXRpb24KLQotICAgIHB1YmxpYyBRdWVyeVRhZygpIHsKLSAgICB9Ci0KLSAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIC8vIEFjY2Vzc29yIG1ldGhvZHMKLQotICAgIC8qKgotICAgICAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgcm93IHJldHVybmVkIGNhbiBiZQotICAgICAqIHNwZWNpZmllZCB1c2luZyBzdGFydFJvdy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdGFydFJvdyhpbnQgc3RhcnRSb3cpIHsKLSAgICAgICAgdGhpcy5zdGFydFJvdyA9IHN0YXJ0Um93OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFF1ZXJ5IHJlc3VsdCBjYW4gYmUgbGltaXRlZCBieSBzcGVjaWZ5aW5nCi0gICAgICogdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWF4Um93cyhpbnQgbWF4Um93cykgewotICAgICAgICB0aGlzLm1heFJvd3MgPSBtYXhSb3dzOwotICAgICAgICB0aGlzLm1heFJvd3NTcGVjaWZpZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgLy8gVGFnIGxvZ2ljCi0KLSAgICAvKioKLSAgICAgKiA8cD5FeGVjdXRlIHRoZSBTUUwgc3RhdGVtZW50LCBzZXQgZWl0aGVyIHRocm91Z2ggdGhlIDxjb2RlPnNxbDwvY29kZT4KLSAgICAgKiBhdHRyaWJ1dGUgb3IgYXMgdGhlIGJvZHksIGFuZCBzYXZlIHRoZSByZXN1bHQgYXMgYSB2YXJpYWJsZQotICAgICAqIG5hbWVkIGJ5IHRoZSA8Y29kZT52YXI8L2NvZGU+IGF0dHJpYnV0ZSBpbiB0aGUgc2NvcGUgc3BlY2lmaWVkCi0gICAgICogYnkgdGhlIDxjb2RlPnNjb3BlPC9jb2RlPiBhdHRyaWJ1dGUsIGFzIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMKLSAgICAgKiB0aGUgUmVzdWx0IGludGVyZmFjZS4KLSAgICAgKgotICAgICAqIDxwPlRoZSBjb25uZWN0aW9uIHVzZWQgdG8gZXhlY3V0ZSB0aGUgc3RhdGVtZW50IGNvbWVzIGVpdGhlcgotICAgICAqIGZyb20gdGhlIDxjb2RlPkRhdGFTb3VyY2U8L2NvZGU+IHNwZWNpZmllZCBieSB0aGUKLSAgICAgKiA8Y29kZT5kYXRhU291cmNlPC9jb2RlPiBhdHRyaWJ1dGUsIHByb3ZpZGVkIGJ5IGEgcGFyZW50IGFjdGlvbgotICAgICAqIGVsZW1lbnQsIG9yIGlzIHJldHJpZXZlZCBmcm9tIGEgSlNQIHNjb3BlICBhdHRyaWJ1dGUKLSAgICAgKiBuYW1lZCA8Y29kZT5qYXZheC5zZXJ2bGV0LmpzdGwuc3FsLmRhdGFTb3VyY2U8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKCFtYXhSb3dzU3BlY2lmaWVkKSB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqID0gY29udGV4dC5nZXRWYXJpYWJsZSgib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnNxbC5tYXhSb3dzIik7Ci0gICAgICAgICAgICBpZiAob2JqICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSW50ZWdlcikgewotICAgICAgICAgICAgICAgICAgICBtYXhSb3dzID0gKChJbnRlZ2VyKSBvYmopLmludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF4Um93cyA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5nZXRNZXNzYWdlKCJTUUxfTUFYUk9XU19QQVJTRV9FUlJPUiIsIChTdHJpbmcpIG9iaiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmZlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKFJlc291cmNlcy5nZXRNZXNzYWdlKCJTUUxfTUFYUk9XU19JTlZBTElEIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFJlc3VsdCByZXN1bHQgPSBudWxsOwotICAgICAgICBTdHJpbmcgc3FsU3RhdGVtZW50ID0gbnVsbDsKLQotICAgICAgICBsb2cuZGVidWcoICJBYm91dCB0byBsb29rdXAgY29ubmVjdGlvbiIgKTsKLQotICAgICAgICBSZXN1bHRTZXQgcnMgPSBudWxsOwotICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbm4gPSBnZXRDb25uZWN0aW9uKCk7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBVc2UgdGhlIFNRTCBzdGF0ZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSBzcWwgYXR0cmlidXRlLCBpZiBhbnksCi0gICAgICAgICAgICAgKiBvdGhlcndpc2UgdXNlIHRoZSBib2R5IGFzIHRoZSBzdGF0ZW1lbnQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChzcWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNxbFN0YXRlbWVudCA9IHNxbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHNxbFN0YXRlbWVudCA9IGdldEJvZHlUZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3FsU3RhdGVtZW50ID09IG51bGwgfHwgc3FsU3RhdGVtZW50LnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKFJlc291cmNlcy5nZXRNZXNzYWdlKCJTUUxfTk9fU1RBVEVNRU5UIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFdlIHNob3VsZG4ndCBoYXZlIGEgbmVnYXRpdmUgc3RhcnRSb3cgb3IgaWxsZWdhbCBtYXhyb3dzCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICgoc3RhcnRSb3cgPCAwKSB8fCAobWF4Um93cyA8IC0xKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihSZXNvdXJjZXMuZ2V0TWVzc2FnZSgiUEFSQU1fQkFEX1ZBTFVFIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogTm90ZSEgV2UgbXVzdCBub3QgdXNlIHRoZSBzZXRNYXhSb3dzKCkgbWV0aG9kIG9uIHRoZQotICAgICAgICAgICAgICogdGhlIHN0YXRlbWVudCB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIHJvd3MsIHNpbmNlIHRoZQotICAgICAgICAgICAgICogUmVzdWx0IGZhY3RvcnkgbXVzdCBiZSBhYmxlIHRvIGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3QKLSAgICAgICAgICAgICAqIHZhbHVlIGZvciBpc0xpbWl0ZWRCeU1heFJvd3MoKTsgdGhlcmUncyBubyB3YXkgdG8gY2hlY2sKLSAgICAgICAgICAgICAqIGlmIGl0IHdhcyBmcm9tIHRoZSBSZXN1bHRTZXQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICggbG9nLmlzRGVidWdFbmFibGVkKCkgKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCAiQWJvdXQgdG8gZXhlY3V0ZSBxdWVyeTogIiArIHNxbFN0YXRlbWVudCApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIGhhc1BhcmFtZXRlcnMoKSApIHsKLSAgICAgICAgICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBwcyA9IGNvbm4ucHJlcGFyZVN0YXRlbWVudChzcWxTdGF0ZW1lbnQpOwotICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHBzOwotICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlcnMocHMpOwotICAgICAgICAgICAgICAgIHJzID0gcHMuZXhlY3V0ZVF1ZXJ5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOwotICAgICAgICAgICAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShzcWxTdGF0ZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUmVzdWx0SW1wbChycywgc3RhcnRSb3csIG1heFJvd3MpOwotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIHJlc3VsdCk7Ci0KLSAgICAgICAgICAgIC8vIGFsd2F5cyBjbG9zZSB0aGUgcmVzdWx0IHNldCBmaXJzdCBzaW5jZSBpdCBtYXkgYmUgY2xvc2VkIGJ5Ci0gICAgICAgICAgICAvLyBKREJDIDMgd2hlbiBjbG9zaW5nIHN0YXRlbWVudHMKLQotICAgICAgICAgICAgLy8gbGV0cyBudWxsaWZ5IGJlZm9yZSB3ZSBjbG9zZSBpbiBjYXNlIHdlIGdldCBleGNlcHRpb25zCi0gICAgICAgICAgICAvLyB3aGlsZSBjbG9zaW5nLCB3ZSBkb24ndCB3YW50IHRvIHRyeSB0byBjbG9zZSBhZ2FpbgotICAgICAgICAgICAgUmVzdWx0U2V0IHRlbXBScyA9IHJzOwotICAgICAgICAgICAgcnMgPSBudWxsOwotICAgICAgICAgICAgdGVtcFJzLmNsb3NlKCk7Ci0gICAgICAgICAgICBTdGF0ZW1lbnQgdGVtcFN0YXRlbWVudCA9IHN0YXRlbWVudDsKLSAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICB0ZW1wU3RhdGVtZW50LmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oc3FsU3RhdGVtZW50ICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ2F1Z2h0IGV4Y2VwdGlvbiB3aGlsZSBjbG9zaW5nIHJlc3VsdCBzZXQ6ICIgKyBlLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ2F1Z2h0IGV4Y2VwdGlvbiB3aGlsZSBjbG9zaW5nIHN0YXRlbWVudDogIiArIGUsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwgJiYgIWlzUGFydE9mVHJhbnNhY3Rpb24pIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNhdWdodCBleGNlcHRpb24gd2hpbGUgY2xvc2luZyBjb25uZWN0aW9uOiAiICsgZSwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbm4gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xlYXJQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvUmVzdWx0SW1wbC5qYXZhIGIvamVsbHktdGFncy9zcWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3FsL1Jlc3VsdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzYjdkNC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvUmVzdWx0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zcWw7Ci0KLWltcG9ydCBqYXZhLnNxbC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLmpzdGwuc3FsLlJlc3VsdDsKLQotLyoqCi0gKiA8cD5UaGlzIGNsYXNzIGNyZWF0ZXMgYSBjYWNoZWQgdmVyc2lvbiBvZiBhIDx0dD5SZXN1bHRTZXQ8L3R0Pi4KLSAqIEl0J3MgcmVwcmVzZW50ZWQgYXMgYSA8dHQ+UmVzdWx0PC90dD4gaW1wbGVtZW50YXRpb24sIGNhcGFibGUgb2YKLSAqIHJldHVyaW5nIGFuIGFycmF5IG9mIDx0dD5Sb3c8L3R0PiBvYmplY3RzIGNvbnRhaW5pbmcgYSA8dHQ+Q29sdW1uPC90dD4KLSAqIGluc3RhbmNlIGZvciBlYWNoIGNvbHVtbiBpbiB0aGUgcm93LjwvcD4KLSAqCi0gKiA8cD5Ob3RlIC0tIHRoaXMgaXMgYSBwcml2YXRlIGNvcHkgZm9yIHRoZSBSSSB0byBhdm9pZCBtYWtpbmcgdGhlCi0gKiBjb3JyZXNwb25kaW5nIGNsYXNzIGluIGphdmF4LnNlcnZsZXQuKiBwdWJsaWMuPC9wPgotICoKLSAqIEBhdXRob3IgSGFucyBCZXJnc3RlbgotICogQGF1dGhvciBKdXN0eW5hIEhvcndhdAotICovCi0KLXB1YmxpYyBjbGFzcyBSZXN1bHRJbXBsIGltcGxlbWVudHMgUmVzdWx0IHsKLSAgICBwcml2YXRlIExpc3Qgcm93TWFwOwotICAgIHByaXZhdGUgTGlzdCByb3dCeUluZGV4OwotICAgIHByaXZhdGUgU3RyaW5nW10gY29sdW1uTmFtZXM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzTGltaXRlZDsKLQotICAgIC8qKgotICAgICAqIFRoaXMgY29uc3RydWN0b3IgcmVhZHMgdGhlIFJlc3VsdFNldCBhbmQgc2F2ZXMgYSBjYWNoZWQKLSAgICAgKiBjb3B5LgotICAgICAqCi0gICAgICogQHBhcmFtIHJzIGFuIG9wZW4gPHR0PlJlc3VsdFNldDwvdHQ+LCBwb3NpdGlvbmVkIGJlZm9yZSB0aGUgZmlyc3QKLSAgICAgKiByb3cKLSAgICAgKiBAcGFyYW0gc3RhcnRSb3csIGJlZ2lubmluZyByb3cgdG8gYmUgY2FjaGVkCi0gICAgICogQHBhcmFtIG1heFJvd3MsIHF1ZXJ5IG1heGltdW0gcm93cyBsaW1pdAotICAgICAqIEBleGNlcHRpb24gaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzdWx0SW1wbChSZXN1bHRTZXQgcnMsIGludCBzdGFydFJvdywgaW50IG1heFJvd3MpCi0gICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24gewotCi0gICAgICAgIHJvd01hcCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcm93QnlJbmRleCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBSZXN1bHRTZXRNZXRhRGF0YSByc21kID0gcnMuZ2V0TWV0YURhdGEoKTsKLSAgICAgICAgaW50IG5vT2ZDb2x1bW5zID0gcnNtZC5nZXRDb2x1bW5Db3VudCgpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgY29sdW1uIG5hbWUgYXJyYXkKLSAgICAgICAgY29sdW1uTmFtZXMgPSBuZXcgU3RyaW5nW25vT2ZDb2x1bW5zXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbm9PZkNvbHVtbnM7IGkrKykgewotICAgICAgICAgICAgY29sdW1uTmFtZXNbaS0xXSA9IHJzbWQuZ2V0Q29sdW1uTmFtZShpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRocm93IGF3YXkgYWxsIHJvd3MgdXB0byBzdGFydFJvdwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXJ0Um93OyBpKyspIHsKLSAgICAgICAgICAgIHJzLm5leHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFByb2Nlc3MgdGhlIHJlbWFpbmluZyByb3dzIHVwdG8gbWF4Um93cwotICAgICAgICBpbnQgcHJvY2Vzc2VkUm93cyA9IDA7Ci0gICAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKLSAgICAgICAgICAgIGlmICgobWF4Um93cyAhPSAtMSkgJiYgKHByb2Nlc3NlZFJvd3MgPT0gbWF4Um93cykpIHsKLSAgICAgICAgICAgICAgICBpc0xpbWl0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT2JqZWN0W10gY29sdW1ucyA9IG5ldyBPYmplY3Rbbm9PZkNvbHVtbnNdOwotICAgICAgICAgICAgU29ydGVkTWFwIGNvbHVtbk1hcCA9Ci0gICAgICAgICAgICAgICAgbmV3IFRyZWVNYXAoU3RyaW5nLkNBU0VfSU5TRU5TSVRJVkVfT1JERVIpOwotCi0gICAgICAgICAgICAvLyBKREJDIHVzZXMgMSBhcyB0aGUgbG93ZXN0IGluZGV4IQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbm9PZkNvbHVtbnM7IGkrKykgewotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9ICBycy5nZXRPYmplY3QoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJzLndhc051bGwoKSkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbHVtbnNbaS0xXSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIGNvbHVtbk1hcC5wdXQoY29sdW1uTmFtZXNbaS0xXSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm93TWFwLmFkZChjb2x1bW5NYXApOwotICAgICAgICAgICAgcm93QnlJbmRleC5hZGQoY29sdW1ucyk7Ci0gICAgICAgICAgICBwcm9jZXNzZWRSb3dzKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIGdpdmVuIGEgTGlzdCBvZiBNYXBzIHdoZXJlIGVhY2ggTWFwIHJlcHJlc2VudHMgYSBSb3cgb2YgZGF0YS4KLSAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHR5cGljYWxseSB1c2VkIHRvIGNyZWF0ZSBhIE1vY2sgT2JqZWN0IHJlcHJlc2VudGluZyBhIHJlc3VsdCBzZXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdE9mTWFwcyBpcyBhIGxpc3Qgb2YgTWFwcyB3aGVyZSBhIE1hcCByZXByZXNlbnRzIGEgUm93IGtleWVkIGJ5IHRoZSBjb2x1bW4gbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBSZXN1bHRJbXBsKExpc3QgbGlzdE9mTWFwcykgewotCi0gICAgICAgIHJvd01hcCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcm93QnlJbmRleCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaXNMaW1pdGVkID0gZmFsc2U7Ci0KLSAgICAgICAgLy8gbGV0cyBidWlsZCB1cCBhIFNldCBvZiBhbGwgdGhlIHVuaXF1ZSBjb2x1bW4gbmFtZXMKLSAgICAgICAgSGFzaFNldCBrZXlTZXQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0T2ZNYXBzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIE1hcCByb3cgPSAoTWFwKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGtleVNldC5hZGRBbGwoIHJvdy5rZXlTZXQoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb2x1bW4gbmFtZSBhcnJheQotICAgICAgICBpbnQgbm9PZkNvbHVtbnMgPSBrZXlTZXQuc2l6ZSgpOwotICAgICAgICBjb2x1bW5OYW1lcyA9IG5ldyBTdHJpbmdbbm9PZkNvbHVtbnNdOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGtleVNldC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgaSsrICkgewotICAgICAgICAgICAgY29sdW1uTmFtZXNbaV0gPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdyBhZGQgZWFjaCByb3cgdG8gdGhlIHJlc3VsdCBzZXQKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdE9mTWFwcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICBNYXAgcm93ID0gKE1hcCkgaXRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIE9iamVjdFtdIGNvbHVtbnMgPSBuZXcgT2JqZWN0W25vT2ZDb2x1bW5zXTsKLSAgICAgICAgICAgIFNvcnRlZE1hcCBjb2x1bW5NYXAgPQotICAgICAgICAgICAgICAgIG5ldyBUcmVlTWFwKFN0cmluZy5DQVNFX0lOU0VOU0lUSVZFX09SREVSKTsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5vT2ZDb2x1bW5zOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29sdW1uTmFtZSA9IGNvbHVtbk5hbWVzW2ldOwotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHJvdy5nZXQoY29sdW1uTmFtZSk7Ci0gICAgICAgICAgICAgICAgY29sdW1uc1tpXSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIGNvbHVtbk1hcC5wdXQoY29sdW1uTmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm93TWFwLmFkZChjb2x1bW5NYXApOwotICAgICAgICAgICAgcm93QnlJbmRleC5hZGQoY29sdW1ucyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFNvcnRlZE1hcCBvYmplY3RzLiBUaGUgU29ydGVkTWFwCi0gICAgICogb2JqZWN0IGtleSBpcyB0aGUgQ29sdW1uTmFtZSBhbmQgdGhlIHZhbHVlIGlzIHRoZSBDb2x1bW5WYWx1ZS4KLSAgICAgKiBTb3J0ZWRNYXAgd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIENBU0VfSU5TRU5TSVRJVkVfT1JERVIKLSAgICAgKiBDb21wYXJhdG9yIHNvIHRoZSBrZXkgaXMgdGhlIGNhc2UgaW5zZW5zaXRpdmUgcmVwcmVzZW50YXRpb24KLSAgICAgKiBvZiB0aGUgQ29sdW1uTmFtZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgTWFwLCBvciBudWxsIGlmIHRoZXJlIGFyZSBubyByb3dzCi0gICAgICovCi0gICAgcHVibGljIFNvcnRlZE1hcFtdIGdldFJvd3MoKSB7Ci0gICAgICAgIGlmIChyb3dNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3Nob3VsZCBqdXN0IGJlIGFibGUgdG8gcmV0dXJuIFNvcnRlZE1hcFtdIG9iamVjdAotICAgICAgICByZXR1cm4gKFNvcnRlZE1hcCBbXSkgcm93TWFwLnRvQXJyYXkobmV3IFNvcnRlZE1hcFswXSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIE9iamVjdFtdIG9iamVjdHMuIFRoZSBmaXJzdCBpbmRleAotICAgICAqIGRlc2lnbmF0ZXMgdGhlIFJvdywgdGhlIHNlY29uZCB0aGUgQ29sdW1uLiBUaGUgYXJyYXkKLSAgICAgKiBzdG9yZXMgdGhlIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgcm93IGFuZCBjb2x1bW4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIE9iamVjdFtdLCBvciBudWxsIGlmIHRoZXJlIGFyZSBubyByb3dzCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdW10gZ2V0Um93c0J5SW5kZXgoKSB7Ci0gICAgICAgIGlmIChyb3dCeUluZGV4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9zaG91bGQganVzdCBiZSBhYmxlIHRvIHJldHVybiBPYmplY3RbXVtdIG9iamVjdAotICAgICAgICByZXR1cm4gKE9iamVjdCBbXVtdKXJvd0J5SW5kZXgudG9BcnJheShuZXcgT2JqZWN0WzBdWzBdKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFN0cmluZyBvYmplY3RzLiBUaGUgYXJyYXkgcmVwcmVzZW50cwotICAgICAqIHRoZSBuYW1lcyBvZiB0aGUgY29sdW1ucyBhcnJhbmdlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyBpbgotICAgICAqIHRoZSBnZXRSb3dzQnlJbmRleCgpIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgU3RyaW5nW10KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29sdW1uTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBjb2x1bW5OYW1lczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY2FjaGVkIFJlc3VsdFNldAotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNhY2hlZCByb3dzLCBvciAtMSBpZiB0aGUgUmVzdWx0IGNvdWxkCi0gICAgICogICAgbm90IGJlIGluaXRpYWxpemVkIGR1ZSB0byBTUUxFeGNlcHRpb25zCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRSb3dDb3VudCgpIHsKLSAgICAgICAgaWYgKHJvd01hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJvd01hcC5zaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIG9mIHRoZSBxdWVyeSB3YXMgbGltaXRlZCBieSBhIG1heGltdW0gcm93IHNldHRpbmcKLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcXVlcnkgd2FzIGxpbWl0ZWQgYnkgYSBNYXhSb3dzIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTGltaXRlZEJ5TWF4Um93cygpIHsKLSAgICAgICAgcmV0dXJuIGlzTGltaXRlZDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3FsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NxbC9SZXN1bHRTZXRUYWcuamF2YSBiL2plbGx5LXRhZ3Mvc3FsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NxbC9SZXN1bHRTZXRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg0ZDIwNC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvUmVzdWx0U2V0VGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnNxbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKioKLSAqIFRoaXMgVGFnIGNyZWF0ZXMgYSByZXN1bHQgc2V0IG9iamVjdCBiYXNlZCBvbiBpdHMgYm9keSBjb250ZW50IHZpYSBjaGlsZCByb3cgdGFncy4KLSAqIFRoaXMgdGFnIGlzIHVzZWZ1bCBmb3IgdW5pdCB0ZXN0aW5nIHdpdGggTW9jayBUYWdzIHRvIHNpbXVsYXRlIHRoZSByZXN1bHRzIHJldHVybmVkIGJ5IGRhdGFiYXNlcy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXN1bHRTZXRUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIHByaXZhdGUgTGlzdCByb3dzOwotICAgIHByaXZhdGUgU3RyaW5nIHZhcjsKLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIHJvdyB0byB0aGUgbGlzdCBvZiByb3dzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUm93KE1hcCByb3cpIHsKLSAgICAgICAgcm93cy5hZGQocm93KTsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHZhciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiggInZhciIgKTsKLSAgICAgICAgfQotICAgICAgICByb3dzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0KLSAgICAgICAgLy8gbm93IGxldHMgY3JlYXRlIGEgbmV3IFJlc3VsdCBpbXBsZW1lbnRhdGlvbgotICAgICAgICBSZXN1bHRJbXBsIHJlc3VsdHMgPSBuZXcgUmVzdWx0SW1wbCggcm93cyApOwotICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhciwgcmVzdWx0cyk7Ci0gICAgICAgIHJvd3MgPSBudWxsOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YXJpYWJsZSB0byBleHBvcnQgdGhlIHJlc3VsdCBzZXQgdG8uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvUm93VGFnLmphdmEgYi9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvUm93VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZjE4ZTAuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zcWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3FsL1Jvd1RhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zcWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1hcFRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqCi0gKiBBZGRzIGEgbmV3IHJvdyB0byBhIHBhcmVudCAmbHQ7cmVzdWx0U2V0Jmd0OyBUYWcuCi0gKiBUaGlzIHRhZyBpcyB1c2VmdWwgZm9yIHVuaXQgdGVzdGluZyB3aXRoIE1vY2sgVGFncyB0byBzaW11bGF0ZSB0aGUgcmVzdWx0cyByZXR1cm5lZCBieSBkYXRhYmFzZXMuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUm93VGFnIGV4dGVuZHMgTWFwVGFnU3VwcG9ydCB7Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgUmVzdWx0U2V0VGFnIHRhZyA9IChSZXN1bHRTZXRUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyggUmVzdWx0U2V0VGFnLmNsYXNzICk7Ci0gICAgICAgIGlmICggdGFnID09IG51bGwgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICJUaGlzIHRhZyBtdXN0IGJlIG5lc3RlZCB3aXRoIGluIGEgPHJlc3VsdFNldD4gdGFnIiApOwotICAgICAgICB9Ci0gICAgICAgIHRhZy5hZGRSb3coIGdldEF0dHJpYnV0ZXMoKSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3FsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NxbC9TZXREYXRhU291cmNlVGFnLmphdmEgYi9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvU2V0RGF0YVNvdXJjZVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjQ3Y2Y0Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3FsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NxbC9TZXREYXRhU291cmNlVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnNxbDsKLQotaW1wb3J0IGphdmF4LnNxbC5EYXRhU291cmNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIDxwPlRhZyBoYW5kbGVyIGZvciAmbHQ7U2V0RGF0YVNvdXJjZSZndDsgaW4gSlNUTCwgdXNlZCB0byBjcmVhdGUKLSAqIGEgc2ltcGxlIERhdGFTb3VyY2UgZm9yIHByb3RvdHlwaW5nLjwvcD4KLSAqCi0gKiBAYXV0aG9yIEhhbnMgQmVyZ3N0ZW4KLSAqIEBhdXRob3IgSnVzdHluYSBIb3J3YXQKLSAqLwotcHVibGljIGNsYXNzIFNldERhdGFTb3VyY2VUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTZXREYXRhU291cmNlVGFnLmNsYXNzKTsKLQotICAgIHByb3RlY3RlZCBPYmplY3QgZGF0YVNvdXJjZTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkYXRhU291cmNlU3BlY2lmaWVkOwotICAgIHByb3RlY3RlZCBTdHJpbmcgamRiY1VSTDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlckNsYXNzTmFtZTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHVzZXJOYW1lOwotICAgIHByb3RlY3RlZCBTdHJpbmcgcGFzc3dvcmQ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzY29wZSA9ICJwYWdlIjsKLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0KLSAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIC8vIENvbnN0cnVjdG9yIGFuZCBpbml0aWFsaXphdGlvbgotCi0gICAgcHVibGljIFNldERhdGFTb3VyY2VUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBBY2Nlc3NvciBtZXRob2RzCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzY29wZSBvZiB0aGUgdmFyaWFibGUgdG8gaG9sZCB0aGUKLSAgICAgKiByZXN1bHQuCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTY29wZShTdHJpbmcgc2NvcGUpIHsKLSAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0gICAgICAgIHRoaXMudmFyID0gdmFyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERhdGFTb3VyY2UoT2JqZWN0IGRhdGFTb3VyY2UpIHsKLSAgICAgICAgdGhpcy5kYXRhU291cmNlID0gZGF0YVNvdXJjZTsKLSAgICAgICAgdGhpcy5kYXRhU291cmNlU3BlY2lmaWVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREcml2ZXIoU3RyaW5nIGRyaXZlckNsYXNzTmFtZSkgewotICAgICAgICB0aGlzLmRyaXZlckNsYXNzTmFtZSA9IGRyaXZlckNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcmwoU3RyaW5nIGpkYmNVUkwpIHsKLSAgICAgICAgdGhpcy5qZGJjVVJMID0gamRiY1VSTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VyKFN0cmluZyB1c2VyTmFtZSkgewotICAgICAgICB0aGlzLnVzZXJOYW1lID0gdXNlck5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKLSAgICB9Ci0KLSAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIC8vIFRhZyBsb2dpYwotCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgRGF0YVNvdXJjZSBkcyA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGRhdGFTb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgZHMgPSBEYXRhU291cmNlVXRpbC5nZXREYXRhU291cmNlKGRhdGFTb3VyY2UsIGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKGRhdGFTb3VyY2VTcGVjaWZpZWQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oUmVzb3VyY2VzLmdldE1lc3NhZ2UoIlNRTF9EQVRBU09VUkNFX05VTEwiKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERhdGFTb3VyY2VXcmFwcGVyIGRzdyA9IG5ldyBEYXRhU291cmNlV3JhcHBlcigpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBzZXQgZHJpdmVyIGNsYXNzIGlmZiBwcm92aWRlZCBieSB0aGUgdGFnCi0gICAgICAgICAgICAgICAgaWYgKGRyaXZlckNsYXNzTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRzdy5zZXREcml2ZXJDbGFzc05hbWUoZHJpdmVyQ2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoICJDb3VsZCBub3QgbG9hZCBkcml2ZXIgY2xhc3M6ICIgKyBlLCBlICk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuZ2V0TWVzc2FnZSgiRFJJVkVSX0lOVkFMSURfQ0xBU1MiLCBlLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHN3LnNldEpkYmNVUkwoamRiY1VSTCk7Ci0gICAgICAgICAgICBkc3cuc2V0VXNlck5hbWUodXNlck5hbWUpOwotICAgICAgICAgICAgZHN3LnNldFBhc3N3b3JkKHBhc3N3b3JkKTsKLSAgICAgICAgICAgIGRzID0gKERhdGFTb3VyY2UpIGRzdzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2YXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIGRzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoIm9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5zcWwuRGF0YVNvdXJjZSIsIGRzKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3FsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NxbC9TcWxUYWdMaWJyYXJ5LmphdmEgYi9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvU3FsVGFnTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzJmOTNhLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3FsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NxbC9TcWxUYWdMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3FsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZS5Db3JlVGFnTGlicmFyeTsKLQotLyoqIERlc2NyaWJlcyB0aGUgVGFnbGliLiBUaGlzIGNsYXNzIGNvdWxkIGJlIGdlbmVyYXRlZCBieSBYRG9jbGV0Ci0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjQgJAotICAqLwotCi1wdWJsaWMgY2xhc3MgU3FsVGFnTGlicmFyeSBleHRlbmRzIENvcmVUYWdMaWJyYXJ5IHsKLQotICAgIHB1YmxpYyBTcWxUYWdMaWJyYXJ5KCkgewotICAgICAgICByZWdpc3RlclRhZygiZHJpdmVyIiwgRHJpdmVyVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInBhcmFtIiwgUGFyYW1UYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygicXVlcnkiLCBRdWVyeVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJzZXREYXRhU291cmNlIiwgU2V0RGF0YVNvdXJjZVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJ0cmFuc2FjdGlvbiIsIFRyYW5zYWN0aW9uVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInVwZGF0ZSIsIFVwZGF0ZVRhZy5jbGFzcyk7Ci0KLSAgICAgICAgLy8gZXh0ZW5zaW9uIHRhZ3MgZm9yIE1vY2sgVGFncyBzdXBwb3J0Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJyZXN1bHRTZXQiLCBSZXN1bHRTZXRUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygicm93IiwgUm93VGFnLmNsYXNzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3FsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NxbC9TcWxUYWdTdXBwb3J0LmphdmEgYi9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvU3FsVGFnU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MThmMDZhLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3FsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NxbC9TcWxUYWdTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnNxbDsKLQotaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7Ci1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5qc3RsLnNxbC5TUUxFeGVjdXRpb25UYWc7Ci1pbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuUmVzb3VyY2VzOwotCi0vKioKLSAqIDxwPkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFueSBTUUwgcmVsYXRlZCB0YWcgaW4gSlNUTC4KLSAqCi0gKiBAYXV0aG9yIEhhbnMgQmVyZ3N0ZW4KLSAqIEBhdXRob3IgSnVzdHluYSBIb3J3YXQKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3FsVGFnU3VwcG9ydCBleHRlbmRzIFRhZ1N1cHBvcnQgaW1wbGVtZW50cyBTUUxFeGVjdXRpb25UYWcgewotCi0gICAgcHJvdGVjdGVkIFN0cmluZyB2YXI7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBzY29wZSA9ICJwYWdlIjsKLQotICAgIC8qCi0gICAgICogVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIHRha2UgZXhwcmVzc2lvbiB2YWx1ZXMsIHNvIHRoZQotICAgICAqIHNldHRlciBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZCBieSB0aGUgZXhwcmVzc2lvbiB0eXBlCi0gICAgICogc3BlY2lmaWMgc3ViY2xhc3Nlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IHJhd0RhdGFTb3VyY2U7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZGF0YVNvdXJjZVNwZWNpZmllZDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHNxbDsKLQotICAgIC8qCi0gICAgICogSW5zdGFuY2UgdmFyaWFibGVzIHRoYXQgYXJlIG5vdCBmb3IgYXR0cmlidXRlcwotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBwYXJhbWV0ZXJzOwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzUGFydE9mVHJhbnNhY3Rpb247Ci0KLSAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIC8vIENvbnN0cnVjdG9yIGFuZCBpbml0aWFsaXphdGlvbgotCi0gICAgcHVibGljIFNxbFRhZ1N1cHBvcnQoKSB7Ci0JCXN1cGVyLnNldEVzY2FwZVRleHQoZmFsc2UpOwotICAgIH0KLQotICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgLy8gQWNjZXNzb3IgbWV0aG9kcwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gaG9sZCB0aGUKLSAgICAgKiByZXN1bHQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2NvcGUgb2YgdGhlIHZhcmlhYmxlIHRvIGhvbGQgdGhlCi0gICAgICogcmVzdWx0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNjb3BlKFN0cmluZyBzY29wZU5hbWUpIHsKLSAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBTUUwgRGF0YVNvdXJjZS4gRGF0YVNvdXJjZSBjYW4gYmUKLSAgICAgKiBhIFN0cmluZyBvciBhIERhdGFTb3VyY2Ugb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERhdGFTb3VyY2UoT2JqZWN0IGRhdGFTb3VyY2UpIHsKLSAgICAgICAgdGhpcy5yYXdEYXRhU291cmNlID0gZGF0YVNvdXJjZTsKLSAgICAgICAgdGhpcy5kYXRhU291cmNlU3BlY2lmaWVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBTUUwgc3RhdGVtZW50IHRvIHVzZSBmb3IgdGhlCi0gICAgICogcXVlcnkuIFRoZSBzdGF0ZW1lbnQgbWF5IGNvbnRhaW4gcGFyYW1ldGVyIG1hcmtlcnMKLSAgICAgKiAocXVlc3Rpb24gbWFya3MsID8pLiBJZiBzbywgdGhlIHBhcmFtZXRlciB2YWx1ZXMgbXVzdAotICAgICAqIGJlIHNldCB1c2luZyBuZXN0ZWQgdmFsdWUgZWxlbWVudHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3FsKFN0cmluZyBzcWwpIHsKLSAgICAgICAgdGhpcy5zcWwgPSBzcWw7Ci0gICAgfQotCi0KLSAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIC8vIFB1YmxpYyB1dGlsaXR5IG1ldGhvZHMKLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSBuZXN0ZWQgcGFyYW1ldGVyIGVsZW1lbnRzIHRvIGFkZCBQcmVwYXJlZFN0YXRlbWVudAotICAgICAqIHBhcmFtZXRlciB2YWx1ZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkU1FMUGFyYW1ldGVyKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyYW1ldGVycy5hZGQobyk7Ci0gICAgfQotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBQcm90ZWN0ZWQgdXRpbGl0eSBtZXRob2RzCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIFNRTCBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzUGFyYW1ldGVycygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMgIT0gbnVsbCAmJiBwYXJhbWV0ZXJzLnNpemUoKSA+IDA7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY2xlYXJQYXJhbWV0ZXJzKCkgewotICAgICAgICBwYXJhbWV0ZXJzID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uLCBTUUxFeGNlcHRpb24gewotICAgICAgICAvLyBGaXg6IEFkZCBhbGwgb3RoZXIgbWVjaGFuaXNtcwotICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOwotICAgICAgICBpc1BhcnRPZlRyYW5zYWN0aW9uID0gZmFsc2U7Ci0KLSAgICAgICAgVHJhbnNhY3Rpb25UYWcgcGFyZW50ID0KLSAgICAgICAgICAgIChUcmFuc2FjdGlvblRhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKFRyYW5zYWN0aW9uVGFnLmNsYXNzKTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZGF0YVNvdXJjZVNwZWNpZmllZCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihSZXNvdXJjZXMuZ2V0TWVzc2FnZSgiRVJST1JfTkVTVEVEX0RBVEFTT1VSQ0UiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb25uID0gcGFyZW50LmdldFNoYXJlZENvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgIGlzUGFydE9mVHJhbnNhY3Rpb24gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKChyYXdEYXRhU291cmNlID09IG51bGwpICYmIGRhdGFTb3VyY2VTcGVjaWZpZWQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oUmVzb3VyY2VzLmdldE1lc3NhZ2UoIlNRTF9EQVRBU09VUkNFX05VTEwiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEYXRhU291cmNlIGRhdGFTb3VyY2UgPSBEYXRhU291cmNlVXRpbC5nZXREYXRhU291cmNlKHJhd0RhdGFTb3VyY2UsIGNvbnRleHQpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuZ2V0TWVzc2FnZSgiREFUQVNPVVJDRV9JTlZBTElEIiwgZXguZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29ubjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRQYXJhbWV0ZXJzKFByZXBhcmVkU3RhdGVtZW50IHBzKQotICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IHBhcmFtZXRlciBoYXMgaW5kZXggMQotICAgICAgICAgICAgICAgIHBzLnNldE9iamVjdChpICsgMSwgcGFyYW1ldGVycy5nZXQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zcWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3FsL1RyYW5zYWN0aW9uVGFnLmphdmEgYi9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvVHJhbnNhY3Rpb25UYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI1ODlhZS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvVHJhbnNhY3Rpb25UYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3FsOwotCi1pbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5zcWwuRGF0YVNvdXJjZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLlJlc291cmNlczsKLQotLyoqCi0gKiA8cD5UYWcgaGFuZGxlciBmb3IgJmx0O1RyYW5zYWN0aW9uJmd0OyBpbiBKU1RMLgotICoKLSAqIEBhdXRob3IgSGFucyBCZXJnc3RlbgotICovCi0KLXB1YmxpYyBjbGFzcyBUcmFuc2FjdGlvblRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBQcml2YXRlIGNvbnN0YW50cwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TQUNUSU9OX1JFQURfQ09NTUlUVEVEID0gInJlYWRfY29tbWl0dGVkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNBQ1RJT05fUkVBRF9VTkNPTU1JVFRFRCA9ICJyZWFkX3VuY29tbWl0dGVkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNBQ1RJT05fUkVQRUFUQUJMRV9SRUFEID0gInJlcGVhdGFibGVfcmVhZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TQUNUSU9OX1NFUklBTElaQUJMRSA9ICJzZXJpYWxpemFibGUiOwotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBQcm90ZWN0ZWQgc3RhdGUKLQotICAgIHByb3RlY3RlZCBPYmplY3QgcmF3RGF0YVNvdXJjZTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkYXRhU291cmNlU3BlY2lmaWVkOwotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBQcml2YXRlIHN0YXRlCi0KLSAgICBwcml2YXRlIENvbm5lY3Rpb24gY29ubjsKLSAgICBwcml2YXRlIGludCBpc29sYXRpb24gPSBDb25uZWN0aW9uLlRSQU5TQUNUSU9OX05PTkU7Ci0gICAgcHJpdmF0ZSBpbnQgb3JpZ0lzb2xhdGlvbjsKLQotICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgLy8gQ29uc3RydWN0b3IgYW5kIGluaXRpYWxpemF0aW9uCi0KLSAgICBwdWJsaWMgVHJhbnNhY3Rpb25UYWcoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgU1FMIERhdGFTb3VyY2UuIERhdGFTb3VyY2UgY2FuIGJlCi0gICAgICogYSBTdHJpbmcgb3IgYSBEYXRhU291cmNlIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhU291cmNlKE9iamVjdCBkYXRhU291cmNlKSB7Ci0gICAgICAgIHRoaXMucmF3RGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7Ci0gICAgICAgIHRoaXMuZGF0YVNvdXJjZVNwZWNpZmllZCA9IHRydWU7Ci0gICAgfQotCi0KLSAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIC8vIFRhZyBsb2dpYwotCi0gICAgLyoqCi0gICAgICogUHJlcGFyZXMgZm9yIGV4ZWN1dGlvbiBieSBzZXR0aW5nIHRoZSBpbml0aWFsIHN0YXRlLCBzdWNoIGFzCi0gICAgICogZ2V0dGluZyB0aGUgPGNvZGU+Q29ubmVjdGlvbjwvY29kZT4gYW5kIHByZXBhcmluZyBpdCBmb3IKLSAgICAgKiB0aGUgdHJhbnNhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoKHJhd0RhdGFTb3VyY2UgPT0gbnVsbCkgJiYgZGF0YVNvdXJjZVNwZWNpZmllZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKFJlc291cmNlcy5nZXRNZXNzYWdlKCJTUUxfREFUQVNPVVJDRV9OVUxMIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgRGF0YVNvdXJjZSBkYXRhU291cmNlID0gRGF0YVNvdXJjZVV0aWwuZ2V0RGF0YVNvdXJjZShyYXdEYXRhU291cmNlLCBjb250ZXh0KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOwotICAgICAgICAgICAgb3JpZ0lzb2xhdGlvbiA9IGNvbm4uZ2V0VHJhbnNhY3Rpb25Jc29sYXRpb24oKTsKLSAgICAgICAgICAgIGlmIChvcmlnSXNvbGF0aW9uID09IENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fTk9ORSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihSZXNvdXJjZXMuZ2V0TWVzc2FnZSgiVFJBTlNBQ1RJT05fTk9fU1VQUE9SVCIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoaXNvbGF0aW9uICE9IENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fTk9ORSkKLSAgICAgICAgICAgICAgICAmJiAoaXNvbGF0aW9uICE9IG9yaWdJc29sYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgY29ubi5zZXRUcmFuc2FjdGlvbklzb2xhdGlvbihpc29sYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29ubi5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBSZXNvdXJjZXMuZ2V0TWVzc2FnZSgiRVJST1JfR0VUX0NPTk5FQ1RJT04iLCBlLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBmaW5pc2hlZCA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSB0byBub3QgaGlkZSBvcmlnbmFsIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkb0ZpbmFsbHkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGxldHMgY29tbWl0Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb25uLmNvbW1pdCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFJlc291cmNlcy5nZXRNZXNzYWdlKCJUUkFOU0FDVElPTl9DT01NSVRfRVJST1IiLCBlLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgZG9GaW5hbGx5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIC8vIFB1YmxpYyB1dGlsaXR5IG1ldGhvZHMKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRyYW5zYWN0aW9uIGlzb2xhdGlvbiBsZXZlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJc29sYXRpb24oU3RyaW5nIGlzbykgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoVFJBTlNBQ1RJT05fUkVBRF9DT01NSVRURUQuZXF1YWxzKGlzbykpIHsKLSAgICAgICAgICAgIGlzb2xhdGlvbiA9IENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fUkVBRF9DT01NSVRURUQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoVFJBTlNBQ1RJT05fUkVBRF9VTkNPTU1JVFRFRC5lcXVhbHMoaXNvKSkgewotICAgICAgICAgICAgaXNvbGF0aW9uID0gQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9SRUFEX1VOQ09NTUlUVEVEOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKFRSQU5TQUNUSU9OX1JFUEVBVEFCTEVfUkVBRC5lcXVhbHMoaXNvKSkgewotICAgICAgICAgICAgaXNvbGF0aW9uID0gQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9SRVBFQVRBQkxFX1JFQUQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoVFJBTlNBQ1RJT05fU0VSSUFMSVpBQkxFLmVxdWFscyhpc28pKSB7Ci0gICAgICAgICAgICBpc29sYXRpb24gPSBDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1NFUklBTElaQUJMRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihSZXNvdXJjZXMuZ2V0TWVzc2FnZSgiVFJBTlNBQ1RJT05fSU5WQUxJRF9JU09MQVRJT04iKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgbmVzdGVkIHBhcmFtZXRlciBlbGVtZW50cyB0byBnZXQgYSByZWZlcmVuY2UgdG8KLSAgICAgKiB0aGUgQ29ubmVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29ubmVjdGlvbiBnZXRTaGFyZWRDb25uZWN0aW9uKCkgewotICAgICAgICByZXR1cm4gY29ubjsKLSAgICB9Ci0KLSAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMgbWV0aG9kcwotCi0gICAgLyoqCi0gICAgICogUmVzdG9yZXMgdGhlIDxjb2RlPkNvbm5lY3Rpb248L2NvZGU+IHRvIGl0cyBpbml0aWFsIHN0YXRlIGFuZAotICAgICAqIGNsb3NlcyBpdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0ZpbmFsbHkoKSB7Ci0gICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKChpc29sYXRpb24gIT0gQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9OT05FKQotICAgICAgICAgICAgICAgICAgICAmJiAoaXNvbGF0aW9uICE9IG9yaWdJc29sYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm4uc2V0VHJhbnNhY3Rpb25Jc29sYXRpb24ob3JpZ0lzb2xhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbm4uc2V0QXV0b0NvbW1pdCh0cnVlKTsKLSAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3QgbXVjaCB3ZSBjYW4gZG8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25uID0gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3FsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NxbC9VcGRhdGVUYWcuamF2YSBiL2plbGx5LXRhZ3Mvc3FsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NxbC9VcGRhdGVUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQyYmRjZS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3NxbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvVXBkYXRlVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnNxbDsKLQotaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7Ci1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLlJlc291cmNlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiA8cD5UYWcgaGFuZGxlciBmb3IgJmx0O1VwZGF0ZSZndDsgaW4gSlNUTC4KLSAqCi0gKiBAYXV0aG9yIEhhbnMgQmVyZ3N0ZW4KLSAqIEBhdXRob3IgSnVzdHluYSBIb3J3YXQKLSAqLwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlVGFnIGV4dGVuZHMgU3FsVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVXBkYXRlVGFnLmNsYXNzKTsKLQotICAgIC8qCi0gICAgICogSW5zdGFuY2UgdmFyaWFibGVzIHRoYXQgYXJlIG5vdCBmb3IgYXR0cmlidXRlcwotICAgICAqLwotICAgIHByaXZhdGUgQ29ubmVjdGlvbiBjb25uOwotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBDb25zdHJ1Y3RvciBhbmQgaW5pdGlhbGl6YXRpb24KLQotICAgIHB1YmxpYyBVcGRhdGVUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBUYWcgbG9naWMKLQotICAgIC8qKgotICAgICAqIDxwPkV4ZWN1dGUgdGhlIFNRTCBzdGF0ZW1lbnQsIHNldCBlaXRoZXIgdGhyb3VnaCB0aGUgPGNvZGU+c3FsPC9jb2RlPgotICAgICAqIGF0dHJpYnV0ZSBvciBhcyB0aGUgYm9keSwgYW5kIHNhdmUgdGhlIHJlc3VsdCBhcyBhIHZhcmlhYmxlCi0gICAgICogbmFtZWQgYnkgdGhlIDxjb2RlPnZhcjwvY29kZT4gYXR0cmlidXRlIGluIHRoZSBzY29wZSBzcGVjaWZpZWQKLSAgICAgKiBieSB0aGUgPGNvZGU+c2NvcGU8L2NvZGU+IGF0dHJpYnV0ZSwgYXMgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cwotICAgICAqIHRoZSBSZXN1bHQgaW50ZXJmYWNlLgotICAgICAqCi0gICAgICogPHA+VGhlIGNvbm5lY3Rpb24gdXNlZCB0byBleGVjdXRlIHRoZSBzdGF0ZW1lbnQgY29tZXMgZWl0aGVyCi0gICAgICogZnJvbSB0aGUgPGNvZGU+RGF0YVNvdXJjZTwvY29kZT4gc3BlY2lmaWVkIGJ5IHRoZQotICAgICAqIDxjb2RlPmRhdGFTb3VyY2U8L2NvZGU+IGF0dHJpYnV0ZSwgcHJvdmlkZWQgYnkgYSBwYXJlbnQgYWN0aW9uCi0gICAgICogZWxlbWVudCwgb3IgaXMgcmV0cmlldmVkIGZyb20gYSBKU1Agc2NvcGUgIGF0dHJpYnV0ZQotICAgICAqIG5hbWVkIDxjb2RlPmphdmF4LnNlcnZsZXQuanNwLmpzdGwuc3FsLmRhdGFTb3VyY2U8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb25uID0gZ2V0Q29ubmVjdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKHNxbCArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBVc2UgdGhlIFNRTCBzdGF0ZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSBzcWwgYXR0cmlidXRlLCBpZiBhbnksCi0gICAgICAgICAqIG90aGVyd2lzZSB1c2UgdGhlIGJvZHkgYXMgdGhlIHN0YXRlbWVudC4KLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZyBzcWxTdGF0ZW1lbnQgPSBudWxsOwotICAgICAgICBpZiAoc3FsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNxbFN0YXRlbWVudCA9IHNxbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHNxbFN0YXRlbWVudCA9IGdldEJvZHlUZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNxbFN0YXRlbWVudCA9PSBudWxsIHx8IHNxbFN0YXRlbWVudC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKFJlc291cmNlcy5nZXRNZXNzYWdlKCJTUUxfTk9fU1RBVEVNRU5UIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7Ci0gICAgICAgIGludCByZXN1bHQgPSAwOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCBoYXNQYXJhbWV0ZXJzKCkgKSB7Ci0gICAgICAgICAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgcHMgPSBjb25uLnByZXBhcmVTdGF0ZW1lbnQoc3FsU3RhdGVtZW50KTsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBwczsKLSAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXJzKHBzKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBwcy5leGVjdXRlVXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN0YXRlbWVudC5leGVjdXRlVXBkYXRlKHNxbFN0YXRlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmFyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhciwgbmV3IEludGVnZXIocmVzdWx0KSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGxldHMgbnVsbGlmeSBiZWZvcmUgd2UgY2xvc2UgaW4gY2FzZSB3ZSBnZXQgZXhjZXB0aW9ucwotICAgICAgICAgICAgLy8gd2hpbGUgY2xvc2luZywgd2UgZG9uJ3Qgd2FudCB0byB0cnkgdG8gY2xvc2UgYWdhaW4KLSAgICAgICAgICAgIFN0YXRlbWVudCB0ZW1wU3RhdGVtZW50ID0gc3RhdGVtZW50OwotICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgIHRlbXBTdGF0ZW1lbnQuY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihzcWxTdGF0ZW1lbnQgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNhdWdodCBleGNlcHRpb24gd2hpbGUgY2xvc2luZyBzdGF0ZW1lbnQ6ICIgKyBlLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29ubiAhPSBudWxsICYmICFpc1BhcnRPZlRyYW5zYWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDYXVnaHQgZXhjZXB0aW9uIHdoaWxlIGNsb3NpbmcgY29ubmVjdGlvbjogIiArIGUsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsZWFyUGFyYW1ldGVycygpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zcWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3FsL3BhY2thZ2UuaHRtbCBiL2plbGx5LXRhZ3Mvc3FsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NxbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYzZlMjQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zcWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3FsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08L2hlYWQ+Ci08Ym9keT4KLQotICA8cD5UaGUgU1FMIFRhZ3MgZnJvbSB0aGUgSlNUTAotICA8L3A+Ci0gIAotICA8cD5UaGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiB0aGVzZSB0YWdzIGluIGFjdGlvbiAKLSAgPGEgaHJlZj0iaHR0cDovL2N2cy5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2pha2FydGEtY29tbW9ucy9qZWxseS9qZWxseS10YWdzL3NxbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvIj5oZXJlPC9hPgotICA8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3NxbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvVGVzdEpVbml0LmphdmEgYi9qZWxseS10YWdzL3NxbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvVGVzdEpVbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYTkzMTkuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zcWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3FsL1Rlc3RKVW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zcWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuanVuaXQuSmVsbHlUZXN0U3VpdGU7Ci0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgdG8gcnVuIGplbGx5IHRlc3QgY2FzZXMgYXMgcGFydCBvZiBBbnQncyBKVW5pdCB0ZXN0cwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAqLwotcHVibGljIGNsYXNzIFRlc3RKVW5pdCBleHRlbmRzIEplbGx5VGVzdFN1aXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlc3RSdW5uZXIucnVuKCBzdWl0ZSgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0U3VpdGUgc3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVRlc3RTdWl0ZShUZXN0SlVuaXQuY2xhc3MsICJzdWl0ZS5qZWxseSIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3FsL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NxbC9leGFtcGxlLmplbGx5IGIvamVsbHktdGFncy9zcWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3FsL2V4YW1wbGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNmE0NjYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zcWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3FsL2V4YW1wbGUuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxuczpzcWw9ImplbGx5OnNxbCI+Ci0KLSAgPHNxbDpzZXREYXRhU291cmNlIAotICAgIHVybD0iJHtkYXRhYmFzZVVybH0iIAotICAgIGRyaXZlcj0iJHtkYXRhYmFzZURyaXZlcn0iIAotICAgIHVzZXI9IiR7ZGF0YWJhc2VVc2VyfSIKLSAgICBwYXNzd29yZD0iJHtkYXRhYmFzZVBhc3N3b3JkfSIvPgotCi0gIDxzcWw6cXVlcnkgdmFyPSJyZXN1bHRzIj4KLSAgICAgIHNlbGVjdCAqIGZyb20gJHtkYXRhYmFzZVRhYmxlfQotICA8L3NxbDpxdWVyeT4KLQotICA8ZGF0YVNldD4KLQotICAgIDxqOmZvckVhY2ggaXRlbXM9IiR7cmVzdWx0cy5yb3dzQnlJbmRleH0iIHZhcj0icm93Ij4KLSAgICAgIDxyb3c+Ci0gICAgICAgIDxqOmZvckVhY2ggdmFyPSJjb2x1bW5OYW1lIiBpdGVtcz0iJHtyZXN1bHRzLmNvbHVtbk5hbWVzfSIgaW5kZXhWYXI9ImkiPgotICAgICAgICAgIDxmaWVsZCBjb2x1bW49IiR7Y29sdW1uTmFtZX0iPiR7cm93W2ldfTwvZmllbGQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgPC9qOmZvckVhY2g+Ci0gICAgICA8L3Jvdz4KLSAgICA8L2o6Zm9yRWFjaD4gICAgICAgICAgICAgICAgICAKLQotICA8L2RhdGFTZXQ+Ci0KLTwvajpqZWxseT4KLQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3NxbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvZXhhbXBsZTIuamVsbHkgYi9qZWxseS10YWdzL3NxbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvZXhhbXBsZTIuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNTY5ZDcuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zcWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3FsL2V4YW1wbGUyLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM6c3FsPSJqZWxseTpzcWwiPgotCi0gIDxzcWw6c2V0RGF0YVNvdXJjZSAKLSAgICAgIHZhcj0iZGIiCi0gICAgdXJsPSIke2RhdGFiYXNlVXJsfSIgCi0gICAgZHJpdmVyPSIke2RhdGFiYXNlRHJpdmVyfSIgCi0gICAgdXNlcj0iJHtkYXRhYmFzZVVzZXJ9IgotICAgIHBhc3N3b3JkPSIke2RhdGFiYXNlUGFzc3dvcmR9Ii8+Ci0KLSAgPHNxbDpxdWVyeSB2YXI9InJlc3VsdHMiIGRhdGFTb3VyY2U9IiR7ZGJ9Ij4KLSAgICAgIHNlbGVjdCAqIGZyb20gJHtkYXRhYmFzZVRhYmxlfQotICA8L3NxbDpxdWVyeT4KLQotICA8ZGF0YVNldD4KLQotICAgIDxqOmZvckVhY2ggdmFyPSJjb2x1bW5OYW1lIiBpdGVtcz0iJHtyZXN1bHRzLmNvbHVtbk5hbWVzfSIgaW5kZXhWYXI9ImkiPgotICAgICAgPGNvbHVtbj4ke2NvbHVtbk5hbWV9PC9jb2x1bW4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICA8L2o6Zm9yRWFjaD4KLQotICAgIDxqOmZvckVhY2ggaXRlbXM9IiR7cmVzdWx0cy5yb3dzQnlJbmRleH0iIHZhcj0icm93Ij4KLSAgICAgIDxyb3c+Ci0gICAgICAgIDxqOmZvckVhY2ggdmFyPSJmaWVsZCIgaXRlbXM9IiR7cm93fSI+Ci0gICAgICAgICAgPGZpZWxkPiR7ZmllbGR9PC9maWVsZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA8L2o6Zm9yRWFjaD4KLSAgICAgIDwvcm93PgotICAgIDwvajpmb3JFYWNoPiAgICAgICAgICAgICAgICAgIAotICA8L2RhdGFTZXQ+Ci0KLTwvajpqZWxseT4KLQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3NxbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvZXhhbXBsZTMuamVsbHkgYi9qZWxseS10YWdzL3NxbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvZXhhbXBsZTMuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNDM1OGQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zcWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3FsL2V4YW1wbGUzLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0NCi08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxuczpzcWw9ImplbGx5OnNxbCIgeG1sbnM6bG9nPSJqZWxseTpsb2ciPg0KLQ0KLSAgPHNxbDpzZXREYXRhU291cmNlIA0KLSAgICB1cmw9IiR7ZGF0YWJhc2VVcmx9IiANCi0gICAgZHJpdmVyPSIke2RhdGFiYXNlRHJpdmVyfSIgDQotICAgIHVzZXI9IiR7ZGF0YWJhc2VVc2VyfSINCi0gICAgcGFzc3dvcmQ9IiR7ZGF0YWJhc2VQYXNzd29yZH0iLz4NCi0NCi0gIDxqOnNldCB2YXI9ImRhdGFiYXNlVGFibGUiIHZhbHVlPSJkdW1teSIvPg0KLQ0KLQ0KLSAgPGxvZzppbmZvPkRyb3BwaW5nIGFuZCByZWNyZWF0aW5nIHRoZSB0YWJsZSAke2RhdGFiYXNlVGFibGV9Li4uPC9sb2c6aW5mbz4NCi0gIA0KLSAgPGo6Y2F0Y2g+DQotICAgIDwhLS0gaWdub3JlIGFueSBleGNlcHRpb25zIC0tPg0KLSAgICA8c3FsOnVwZGF0ZT4NCi0gICAgICBkcm9wIHRhYmxlICR7ZGF0YWJhc2VUYWJsZX0NCi0gICAgPC9zcWw6dXBkYXRlPg0KLSAgPC9qOmNhdGNoPg0KLSAgICAgIA0KLSAgPHNxbDp1cGRhdGU+DQotICAgICAgY3JlYXRlIHRhYmxlICR7ZGF0YWJhc2VUYWJsZX0gKA0KLSAgICAgICAgaWQgaW50ZWdlciwNCi0gICAgICAgIG5hbWUgdmFyY2hhcigyNTUpDQotICAgICAgKQ0KLSAgPC9zcWw6dXBkYXRlPg0KLQ0KLQ0KLSAgPGxvZzppbmZvPkluc2VydGluZyBzb21lIGRhdGEuLi48L2xvZzppbmZvPg0KLSAgDQotICA8ajpmb3JFYWNoIGJlZ2luPSIxIiBlbmQ9IjIwIiB2YXI9ImkiPg0KLSAgICA8c3FsOnVwZGF0ZT4NCi0gICAgICBpbnNlcnQgaW50byAke2RhdGFiYXNlVGFibGV9IChpZCwgbmFtZSkgdmFsdWVzICg/LCA/KQ0KLSAgICAgIDxzcWw6cGFyYW0gdmFsdWU9IiR7aX0iLz4NCi0gICAgICA8c3FsOnBhcmFtIHZhbHVlPSJGb29fJHtpfSIvPg0KLSAgICA8L3NxbDp1cGRhdGU+DQotICANCi0gIDwvajpmb3JFYWNoPg0KLSAgICAgIA0KLSAgPGxvZzppbmZvPk5vdyBwZXJmb3JtaW5nIGEgcXVlcnkuLi48L2xvZzppbmZvPg0KLSAgDQotICA8c3FsOnF1ZXJ5IHZhcj0icmVzdWx0cyI+DQotICAgICAgc2VsZWN0ICogZnJvbSAke2RhdGFiYXNlVGFibGV9DQotICA8L3NxbDpxdWVyeT4NCi0NCi0gIDxkYXRhU2V0Pg0KLQ0KLSAgICA8IS0tIHdlJ2xsIHR1cm4gb2ZmIHdoaXRlc3BhY2UgdHJpbW1pbmcgZm9yIHRoZSBsb29wIC0tPg0KLSAgICA8ajpmb3JFYWNoIHRyaW09ImZhbHNlIiBpdGVtcz0iJHtyZXN1bHRzLnJvd3NCeUluZGV4fSIgdmFyPSJyb3ciPg0KLSAgICAgIDxyb3c+DQotICAgICAgICA8ajpmb3JFYWNoIHZhcj0iY29sdW1uTmFtZSIgaXRlbXM9IiR7cmVzdWx0cy5jb2x1bW5OYW1lc30iIGluZGV4VmFyPSJpIj4NCi0gICAgICAgICAgPGZpZWxkIGNvbHVtbj0iJHtjb2x1bW5OYW1lfSI+JHtyb3dbaV19PC9maWVsZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgPC9qOmZvckVhY2g+DQotICAgICAgPC9yb3c+DQotICAgIDwvajpmb3JFYWNoPiAgICAgICAgICAgICAgICAgIA0KLQ0KLSAgPC9kYXRhU2V0Pg0KLQ0KLTwvajpqZWxseT4NCi0NCi0NCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3NxbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvc3VpdGUuamVsbHkgYi9qZWxseS10YWdzL3NxbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvc3VpdGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZTFkYzIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zcWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3FsL3N1aXRlLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08dGVzdDpzdWl0ZSB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxuczp0ZXN0PSJqZWxseTpqdW5pdCIgeG1sbnM6c3FsPSJqZWxseTpzcWwiPg0KLQ0KLSAgICA8dGVzdDpjYXNlIG5hbWU9InRlc3RSZXN1bHRTZXQiPg0KLSAgICANCi0gICAgICA8c3FsOnJlc3VsdFNldCB2YXI9InJlc3VsdHMiPg0KLSAgICAgICAgPHNxbDpyb3cgaWQ9ImFiYyIgbmFtZT0iSmFtZXMiLz4NCi0gICAgICAgIDxzcWw6cm93IGlkPSJkZWYiIG5hbWU9IkpvZSIvPg0KLSAgICAgIDwvc3FsOnJlc3VsdFNldD4NCi0gICAgDQotICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtyZXN1bHRzICE9IG51bGx9Ij5jcmVhdGVkIGEgcmVzdWx0cyBvYmplY3Q8L3Rlc3Q6YXNzZXJ0PiAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke3Jlc3VsdHMucm93Q291bnQgPT0gMn0iPmNvbnRhaW5zIDIgcm93czwvdGVzdDphc3NlcnQ+DQotDQotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9ImFiYyIgYWN0dWFsPSIke3Jlc3VsdHMucm93c1swXS5pZH0iLz4NCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iZGVmIiBhY3R1YWw9IiR7cmVzdWx0cy5yb3dzWzFdLmlkfSIvPg0KLSAgICAgICAgDQotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IkphbWVzIiBhY3R1YWw9IiR7cmVzdWx0cy5yb3dzWzBdLm5hbWV9Ii8+DQotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IkpvZSIgYWN0dWFsPSIke3Jlc3VsdHMucm93c1sxXS5uYW1lfSIvPg0KLSAgICAgICAgDQotICAgIDwvdGVzdDpjYXNlPg0KLQ0KLTwvdGVzdDpzdWl0ZT4NCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3NxbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zcWwvdGVzdFNxbC5qZWxseSBiL2plbGx5LXRhZ3Mvc3FsL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NxbC90ZXN0U3FsLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjVlNDdjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3FsL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NxbC90ZXN0U3FsLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiIHhtbG5zOnNxbD0iamVsbHk6c3FsIj4KLQotICA8c3FsOnNldERhdGFTb3VyY2UgCi0gICAgICB2YXI9ImRiIgotICAgIHVybD0iJHtkYXRhYmFzZVVybH0iIAotICAgIGRyaXZlcj0iJHtkYXRhYmFzZURyaXZlcn0iIAotICAgIHVzZXI9IiR7ZGF0YWJhc2VVc2VyfSIKLSAgICBwYXNzd29yZD0iJHtkYXRhYmFzZVBhc3N3b3JkfSIvPgotCi0gIDxzcWw6cXVlcnkgdmFyPSJyZXN1bHRzIiBkYXRhU291cmNlPSIke2RifSI+Ci0gICAgICBzZWxlY3QgKiBmcm9tICR7ZGF0YWJhc2VUYWJsZX0KLSAgPC9zcWw6cXVlcnk+Ci0KLSAgPGRhdGFTZXQ+Ci0gICAgPHNpemU+JHtyZXN1bHRzLnJvd0NvdW50fTwvc2l6ZT4KLSAgPC9kYXRhU2V0PgotCi08L2o6amVsbHk+Ci0KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zcWwveGRvY3MvY2hhbmdlcy54bWwgYi9qZWxseS10YWdzL3NxbC94ZG9jcy9jaGFuZ2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U0NDA4MS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3NxbC94ZG9jcy9jaGFuZ2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0gLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkNoYW5nZXM8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLSAgPGJvZHk+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4wIiBkYXRlPSIyMDA0LTA5LTEyIj4KLSAgICA8L3JlbGVhc2U+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3NxbC94ZG9jcy9pbmRleC54bWwgYi9qZWxseS10YWdzL3NxbC94ZG9jcy9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5M2JlMWMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zcWwveGRvY3MvaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+U1FMIFRhZyBMaWJyYXJ5PC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0KLSAgPGJvZHk+Ci0gICAgPHNlY3Rpb24gbmFtZT0iT3ZlcnZpZXciPgotICAgICAgPHA+VGhlIFNRTCBUYWdzIGZyb20gdGhlIEpTVEw8L3A+Ci0gIAotICAgICAgPHA+Ci0gICAgICAgIFRoZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIHRoZXNlIHRhZ3MgaW4gYWN0aW9uIAotICAgICAgICA8YSBocmVmPSJodHRwOi8vY3ZzLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvamFrYXJ0YS1jb21tb25zL2plbGx5L2plbGx5LXRhZ3Mvc3FsL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3NxbC8iPmhlcmU8L2E+Ci0gICAgICA8L3A+Ci0gICAgICA8cD5TZWUgdGhlIDxhIGhyZWY9InRhZ3MuaHRtbCI+dGFnczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotICAgIDwvc2VjdGlvbj4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zcWwveGRvY3MvbmF2aWdhdGlvbi54bWwgYi9qZWxseS10YWdzL3NxbC94ZG9jcy9uYXZpZ2F0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyNTk4YS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3NxbC94ZG9jcy9uYXZpZ2F0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgbmFtZT0iU1FMIFRhZyBMaWJyYXJ5Ij4KLQotICA8dGl0bGU+U1FMIFRhZyBMaWJyYXJ5PC90aXRsZT4KLSAgCi0gIDxib2R5PgotICAgIDxtZW51IG5hbWU9IlNRTCBUYWcgTGlicmFyeSI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgICAgICAgICAgaHJlZj0iL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IlRhZ3MiICAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFncy5odG1sIi8+Ci0gICAgPC9tZW51PgotICA8L2JvZHk+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3aW5nLy5jdnNpZ25vcmUgYi9qZWxseS10YWdzL3N3aW5nLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYjE3NjYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd2luZy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi10YXJnZXQKLW1hdmVuLmxvZwotdmVsb2NpdHkubG9nCi1qY292ZXJhZ2Uuc2VyCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3aW5nL2J1aWxkLnhtbCBiL2plbGx5LXRhZ3Mvc3dpbmcvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjAxMDZmLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS1idWlsZC54bWwgZ2VuZXJhdGVkIGJ5IG1hdmVuIGZyb20gcHJvamVjdC54bWwgdmVyc2lvbiAxLjAtU05BUFNIT1QKLSAgb24gZGF0ZSBNYXkgMjQgMjAwNCwgdGltZSAyMzAyLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXIiIG5hbWU9ImNvbW1vbnMtamVsbHktdGFncy1zd2luZyIgYmFzZWRpcj0iLiI+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkZWZhdWx0dGFyZ2V0ZGlyIiB2YWx1ZT0idGFyZ2V0Ij4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYmRpciIgdmFsdWU9InRhcmdldC9saWIiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC9jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cmVwb3J0ZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtcmVwb3J0cyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0ZGlyIiB2YWx1ZT0iZGlzdCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jZGlyIiB2YWx1ZT0iZGlzdC9kb2NzL2FwaSI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJmaW5hbC5uYW1lIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLXN3aW5nLTEuMC1TTkFQU0hPVCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVzY3JpcHRpb249Im8gSW5pdGlhbGl6ZXMgc29tZSBwcm9wZXJ0aWVzIj4KLSAgICA8bWtkaXIgZGlyPSIke2xpYmRpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibm9nZXQiPgotICAgICAgPGVxdWFscyBhcmcyPSJvbmx5IiBhcmcxPSIke2J1aWxkLnN5c2NsYXNzcGF0aH0iPgotICAgICAgPC9lcXVhbHM+Ci0gICAgPC9jb25kaXRpb24+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJvIENvbXBpbGUgdGhlIGNvZGUiIGRlcGVuZHM9ImdldC1kZXBzIj4KLSAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqYXZhYyBkZXN0ZGlyPSIke2NsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy9qYXZhIj4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0gICAgPGNvcHkgdG9kaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvamF2YSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gICAgPGNvcHkgdG9kaXI9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmplbGx5Ij4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54c2wiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucm5nIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmR0ZCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmh0bWwiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJqYXIiIGRlc2NyaXB0aW9uPSJvIENyZWF0ZSB0aGUgamFyIiBkZXBlbmRzPSJjb21waWxlLHRlc3QiPgotICAgIDxqYXIgamFyZmlsZT0idGFyZ2V0LyR7ZmluYWwubmFtZX0uamFyIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIiBiYXNlZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICA8L2phcj4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJvIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZGlyZWN0b3JpZXMiPgotICAgIDxkZWxldGUgZGlyPSIke2RlZmF1bHR0YXJnZXRkaXJ9Ij4KLSAgICA8L2RlbGV0ZT4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlc2NyaXB0aW9uPSJvIENyZWF0ZSBhIGRpc3RyaWJ1dGlvbiIgZGVwZW5kcz0iamFyLCBqYXZhZG9jIj4KLSAgICA8bWtkaXIgZGlyPSJkaXN0Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb3B5IHRvZGlyPSJkaXN0Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSIgaW5jbHVkZXM9IiouamFyIj4KLSAgICAgIDwvZmlsZXNldD4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZXM9IkxJQ0VOU0UqLCBSRUFETUUqIj4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlc2NyaXB0aW9uPSJvIFJ1biB0aGUgdGVzdCBjYXNlcyIgaWY9InRlc3QuZmFpbHVyZSIgZGVwZW5kcz0iaW50ZXJuYWwtdGVzdCI+Ci0gICAgPGZhaWwgbWVzc2FnZT0iVGhlcmUgd2VyZSB0ZXN0IGZhaWx1cmVzLiI+Ci0gICAgPC9mYWlsPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJpbnRlcm5hbC10ZXN0IiBkZXBlbmRzPSJjb21waWxlLXRlc3RzIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3RyZXBvcnRkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqdW5pdCBkaXI9Ii4vIiBmYWlsdXJlcHJvcGVydHk9InRlc3QuZmFpbHVyZSIgcHJpbnRTdW1tYXJ5PSJ5ZXMiIGZvcms9InRydWUiIGhhbHRvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImJhc2VkaXIiIHZhbHVlPSIuIj4KLSAgICAgIDwvc3lzcHJvcGVydHk+Ci0gICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxmb3JtYXR0ZXIgdXNlZmlsZT0iZmFsc2UiIHR5cGU9InBsYWluIj4KLSAgICAgIDwvZm9ybWF0dGVyPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICA8YmF0Y2h0ZXN0IHRvZGlyPSIke3Rlc3RyZXBvcnRkaXJ9Ij4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovVGVzdCouamF2YSI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2JhdGNodGVzdD4KLSAgICA8L2p1bml0PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlLXRlc3RzIiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iIGRlcHJlY2F0aW9uPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSIgb3B0aW1pemU9ImZhbHNlIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIj4KLSAgICAgIDxzcmM+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL3Rlc3QiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9zcmM+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJqYXZhZG9jIiBkZXNjcmlwdGlvbj0ibyBHZW5lcmF0ZSBqYXZhZG9jIiBkZXBlbmRzPSJqYXIiPgotICAgIDxta2RpciBkaXI9IiR7amF2YWRvY2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPHRzdGFtcD4KLSAgICAgIDxmb3JtYXQgcGF0dGVybj0iMjAwMi15eXl5IiBwcm9wZXJ0eT0ieWVhciI+Ci0gICAgICA8L2Zvcm1hdD4KLSAgICA8L3RzdGFtcD4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29weXJpZ2h0IiB2YWx1ZT0iQ29weXJpZ2h0ICZhbXA7Y29weTsgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLiI+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgICA8cHJvcGVydHkgbmFtZT0idGl0bGUiIHZhbHVlPSJKZWxseVN3aW5nIDEuMC1TTkFQU0hPVCBBUEkiPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPGphdmFkb2MgdXNlPSJ0cnVlIiBwcml2YXRlPSJ0cnVlIiBkZXN0ZGlyPSIke2phdmFkb2NkaXJ9IiBhdXRob3I9InRydWUiIHZlcnNpb249InRydWUiIHNvdXJjZXBhdGg9InNyYy9qYXZhIiBwYWNrYWdlbmFtZXM9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nLioiPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhZG9jPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJnZXQtZGVwcyIgdW5sZXNzPSJub2dldCIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LXRhZ3MtZGVmaW5lLVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS10YWdzLWRlZmluZS1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktdGFncy1pbnRlcmFjdGlvbi1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktdGFncy1pbnRlcmFjdGlvbi1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktdGFncy1qdW5pdC1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktdGFncy1qdW5pdC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktdGFncy1sb2ctU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamVsbHkvamFycy9jb21tb25zLWplbGx5LXRhZ3MtbG9nLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1jbGktU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtY2xpL2phcnMvY29tbW9ucy1jbGktU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamV4bC9qYXJzL2NvbW1vbnMtamV4bC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3htbC1hcGlzLTEuMC5iMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veG1sLWFwaXMvamFycy94bWwtYXBpcy0xLjAuYjIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWJlYW51dGlscy0xLjYuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtYmVhbnV0aWxzL2phcnMvY29tbW9ucy1iZWFudXRpbHMtMS42LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtY29sbGVjdGlvbnMvamFycy9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1sb2dnaW5nL2phcnMvY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vZG9tNGotMS41LWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vZG9tNGovamFycy9kb200ai0xLjUtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vamF4ZW4tMS4xLWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vamF4ZW4vamFycy9qYXhlbi0xLjEtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veGVyY2VzLTIuMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94ZXJjZXMvamFycy94ZXJjZXMtMi4yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qdW5pdC0zLjguMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vanVuaXQvamFycy9qdW5pdC0zLjguMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FudC0xLjUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC0xLjUuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtb3B0aW9uYWwtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtb3B0aW9uYWwtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtbWF2ZW4iPgotICAgIDxnZXQgZGVzdD0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBzcmM9IiR7cmVwb30vbWF2ZW4vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8dW5qYXIgZGVzdD0iJHttYXZlbi5ob21lfSIgc3JjPSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L3VuamFyPgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3aW5nL21hdmVuLnhtbCBiL2plbGx5LXRhZ3Mvc3dpbmcvbWF2ZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjBiZTU4Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvbWF2ZW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgZGVmYXVsdD0iamFyOmphciIgeG1sbnM6aj0iamVsbHk6Y29yZSI+Ci0KLSAgPCEtLSBkZWZpbmUgdGhlIGNsYXNzcGF0aCB1c2VkIHRvIHJ1biBleGFtcGxlcyAtLT4KLSAgPGdvYWwgbmFtZT0iY3JlYXRlLWNsYXNzcGF0aCIgcHJlcmVxcz0iamF2YTpjb21waWxlLCB0ZXN0OmNvbXBpbGUiPgotICAgICAgICA8cGF0aCBpZD0idGVzdC5jbGFzc3BhdGgiPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7bWF2ZW4uYnVpbGQuZGVzdH0iLz4KLSAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSJ0YXJnZXQvY2xhc3NlcyIvPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9InRhcmdldC90ZXN0LWNsYXNzZXMiLz4KLSAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotICAgICAgICA8L3BhdGg+Ci0gIDwvZ29hbD4KLQotCi0gIDxnb2FsIG5hbWU9ImRlbW86c3dpbmciIHByZXJlcXM9ImNyZWF0ZS1jbGFzc3BhdGgiCi0gICAgZGVzY3JpcHRpb249IlJ1bnMgYSBzYW1wbGUgU3dpbmcgZGVtbywgY3JlYXRpbmcgYSBTd2luZyBVSSBmcm9tIEplbGx5IHNjcmlwdCI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHkiIGZvcms9InllcyI+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgPGFyZyB2YWx1ZT0ic3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3N3aW5nL2V4YW1wbGUuamVsbHkiLz4KLSAgICA8L2phdmE+Ci0gIDwvZ29hbD4KLQotCi0gICAgPCEtLSBtb3ZlIHRoaXMgaW50byBhIE1hdmVuIHBsdWdpbiAtLT4KLSAgPGdvYWwgbmFtZT0iamVsbHk6cnVubmVyIiBwcmVyZXFzPSJjcmVhdGUtY2xhc3NwYXRoIgotICAgIGRlc2NyaXB0aW9uPSJSdW5zIHRoZSBKZWxseSBSdW5uZXIgd2hpY2ggaXMgYSBKZWxseVN3aW5nIHNjcmlwdCB0byBydW4gb3RoZXIgSmVsbHkgc2NyaXB0cykiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5IiBmb3JrPSJ5ZXMiPgotICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9Imh0dHAucHJveHlIb3N0IiB2YWx1ZT0iJHttYXZlbi5wcm94eS5ob3N0fSIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iaHR0cC5wcm94eVBvcnQiIHZhbHVlPSIke21hdmVuLnByb3h5LnBvcnR9Ii8+Ci0gICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9zd2luZy9ydW4uamVsbHkiLz4KLSAgICA8L2phdmE+Ci0gIDwvZ29hbD4KLQotICA8Z29hbCBuYW1lPSJqZWxseTpydW5uZXIyIiBwcmVyZXFzPSJjcmVhdGUtY2xhc3NwYXRoIgotICAgIGRlc2NyaXB0aW9uPSJSdW5zIHRoZSBKZWxseSBSdW5uZXIgd2hpY2ggaXMgYSBKZWxseVN3aW5nIHNjcmlwdCB0byBydW4gb3RoZXIgSmVsbHkgc2NyaXB0cykiPgotICAgIDxqOmluY2x1ZGUgdXJpPSJmaWxlOi8vLyR7dXNlci5kaXJ9L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9zd2luZy9ydW4uamVsbHkiLz4KLSAgICA8aTphc2sgcXVlc3Rpb249IkhpdCBFbnRlciB0byB0ZXJtaW5hdGUiIGFuc3dlcj0iZHVtbXkiIHhtbG5zOmk9ImplbGx5OmludGVyYWN0aW9uIi8+Ci0gIDwvZ29hbD4KLQotICA8Z29hbCBuYW1lPSJqZWxseTp3aXphcmQiIHByZXJlcXM9ImNyZWF0ZS1jbGFzc3BhdGgiCi0gICAgZGVzY3JpcHRpb249IlJ1bnMgdGhlIEplbGx5IFJ1bm5lciB3aGljaCBpcyBhIEplbGx5U3dpbmcgc2NyaXB0IHRvIHJ1biBvdGhlciBKZWxseSBzY3JpcHRzKSI+Ci0gICAgPGo6aW5jbHVkZSB1cmk9ImZpbGU6Ly8vJHt1c2VyLmRpcn0vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3N3aW5nL3dpemFyZC5qZWxseSIvPgotICAgIDxpOmFzayBxdWVzdGlvbj0iSGl0IEVudGVyIHRvIHRlcm1pbmF0ZSIgYW5zd2VyPSJkdW1teSIgeG1sbnM6aT0iamVsbHk6aW50ZXJhY3Rpb24iLz4KLSAgPC9nb2FsPgotCi0KLSAgICA8IS0tIGEgc2ltcGxlIGV4YW1wbGUgcHJvZ3JhbSB0byBkZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIDx0YWJsZU1vZGVsPiAtLT4KLSAgPGdvYWwgbmFtZT0iamVsbHk6c2hvd3ZhcnMiIHByZXJlcXM9ImNyZWF0ZS1jbGFzc3BhdGgiCi0gICAgZGVzY3JpcHRpb249IkRpc3BsYXlzIHRoZSBjdXJyZW50IHZhcmlhYmxlcyBpbiB0aGUgTWF2ZW4gcHJvamVjdCI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHkiIGZvcms9InllcyI+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iaHR0cC5wcm94eUhvc3QiIHZhbHVlPSIke21hdmVuLnByb3h5Lmhvc3R9Ii8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJodHRwLnByb3h5UG9ydCIgdmFsdWU9IiR7bWF2ZW4ucHJveHkucG9ydH0iLz4KLSAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9zd2luZy9zaG93VmFyaWFibGVzLmplbGx5Ii8+Ci0gICAgPC9qYXZhPgotICA8L2dvYWw+Ci0KLSAgCi0gIDxnb2FsIG5hbWU9InRyYXNoIj4gCi0gICAgPGVjaG8+JHtwb20uaWQuc3Vic3RyaW5nKDI4KX08L2VjaG8+Ci0gIDwvZ29hbD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy9wcm9qZWN0LnByb3BlcnRpZXMgYi9qZWxseS10YWdzL3N3aW5nL3Byb2plY3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQyMWMzNC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3aW5nL3Byb2plY3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLQotIyBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUCBSIE8gSiBFIEMgVCAgUCBSIE8gUCBFIFIgVCBJIEUgUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1tYXZlbi5qdW5pdC5zeXNwcm9wZXJ0aWVzPWphdmEuYXd0LmhlYWRsZXNzCi1qYXZhLmF3dC5oZWFkbGVzcz10cnVlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3aW5nL3Byb2plY3QueG1sIGIvamVsbHktdGFncy9zd2luZy9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThiZmY5OC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3aW5nL3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3Q+Ci0gIDxleHRlbmQ+JHtiYXNlZGlyfS8uLi90YWctcHJvamVjdC54bWw8L2V4dGVuZD4KLSAgPGlkPmNvbW1vbnMtamVsbHktdGFncy1zd2luZzwvaWQ+Ci0gIDxuYW1lPkplbGx5U3dpbmc8L25hbWU+Ci0gIDxjdXJyZW50VmVyc2lvbj4xLjEtU05BUFNIT1Q8L2N1cnJlbnRWZXJzaW9uPgotCi0gIDxwYWNrYWdlPm9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nPC9wYWNrYWdlPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgICAgIFRoaXMgaXMgYSBKZWxseSBpbnRlcmZhY2UgZm9yIGNvbmZpZ3VyaW5nIFN3aW5nIGFwcGxpY2F0aW9ucy4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPHNob3J0RGVzY3JpcHRpb24+Q29tbW9ucyBKZWxseSBTd2luZyBUYWcgTGlicmFyeTwvc2hvcnREZXNjcmlwdGlvbj4KLSAgCi0gIDx2ZXJzaW9ucz4KLSAgICA8dmVyc2lvbj4KLSAgICAgIDxpZD4xLjA8L2lkPgotICAgICAgPG5hbWU+MS4wPC9uYW1lPgotICAgICAgPHRhZz5DT01NT05TLUpFTExZLVNXSU5HLTFfMDwvdGFnPgotICAgIDwvdmVyc2lvbj4KLSAgPC92ZXJzaW9ucz4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sYW5nPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sYW5nPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDwhLS0gU1RBUlQgZm9yIHRlc3QgLS0+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWplbGx5PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1qZWxseS10YWdzLWRlZmluZTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgIDx1cmw+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5L3RhZ3MvZGVmaW5lLzwvdXJsPgotICAgICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxjbGFzc2xvYWRlcj5yb290Lm1hdmVuPC9jbGFzc2xvYWRlcj4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtamVsbHk8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWplbGx5LXRhZ3MtaW50ZXJhY3Rpb248L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICA8dXJsPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9qZWxseS90YWdzL2ludGVyYWN0aW9uLzwvdXJsPgotICAgICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxjbGFzc2xvYWRlcj5yb290Lm1hdmVuPC9jbGFzc2xvYWRlcj4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtamVsbHk8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWplbGx5LXRhZ3MtanVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGNsYXNzbG9hZGVyPnJvb3QubWF2ZW48L2NsYXNzbG9hZGVyPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHVybD5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC88L3VybD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtamVsbHk8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWplbGx5LXRhZ3MtbG9nPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgPHVybD5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvamVsbHkvdGFncy9sb2cvPC91cmw+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGNsYXNzbG9hZGVyPnJvb3QubWF2ZW48L2NsYXNzbG9hZGVyPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDwhLS0gRU5EIGZvciB0ZXN0IC0tPgotICAgIAotICAgIDwhLS0gU1RBUlQgZm9yIGRlbW9zIC0tPgotICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5jb21tb25zLWNsaTwvaWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgICAgCi0gICAgPCEtLSBFTkQgZm9yIGRlbW9zIC0tPgotICAgIAotICA8L2RlcGVuZGVuY2llcz4KLSAgCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL0FjdGlvblRhZy5qYXZhIGIvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9BY3Rpb25UYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQyNzE3ZS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL0FjdGlvblRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5CZWFuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZS5Vc2VCZWFuVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIENyZWF0ZXMgYSBTd2luZyBBY3Rpb24gd2hpY2ggb24gaW52b2NhdGlvbiB3aWxsIGV4ZWN1dGUgdGhlIGJvZHkgb2YgdGhpcyB0YWcuCi0gKiBUaGUgQWN0aW9uIGlzIHRoZW4gb3V0cHV0IGFzIGEgdmFyaWFibGUgZm9yIHJldXNlIGlmIHRoZSAndmFyJyBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkCi0gKiBvdGhlcndpc2UgdGhlIGFjdGlvbiBpcyBhZGRlZCB0byB0aGUgcGFyZW50IEplbGx5U3dpbmcgd2lkZ2V0LgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS43ICQKLSAqLwotcHVibGljIGNsYXNzIEFjdGlvblRhZyBleHRlbmRzIFVzZUJlYW5UYWcgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFjdGlvblRhZy5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgQWN0aW9uVGFnKCkgewotICAgIH0KLQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgQWN0aW9uIG9iamVjdCBmb3IgdGhpcyB0YWcKLSAgICAgKi8KLSAgICBwdWJsaWMgQWN0aW9uIGdldEFjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChBY3Rpb24pIGdldEJlYW4oKTsKLSAgICB9Ci0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gICAgLyoqCi0gICAgICogQW4gZXhpc3RpbmcgQWN0aW9uIGNvdWxkIGJlIHNwZWNpZmllZCB2aWEgdGhlICdhY3Rpb24nIGF0dHJpYnV0ZSBvciBhbiBhY3Rpb24gY2xhc3MKLSAgICAgKiBtYXkgYmUgc3BlY2lmaWVkIHZpYSB0aGUgJ2NsYXNzJyBhdHRyaWJ1dGUsIG90aGVyd2lzZSBhIGRlZmF1bHQgQWN0aW9uIGNsYXNzIGlzIGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENsYXNzIGNvbnZlcnRUb0NsYXNzKE9iamVjdCBjbGFzc09iamVjdCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpZiAoY2xhc3NPYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuY29udmVydFRvQ2xhc3MoY2xhc3NPYmplY3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW4gZXhpc3RpbmcgQWN0aW9uIGNvdWxkIGJlIHNwZWNpZmllZCB2aWEgdGhlICdhY3Rpb24nIGF0dHJpYnV0ZSBvciBhbiBhY3Rpb24gY2xhc3MKLSAgICAgKiBtYXkgYmUgc3BlY2lmaWVkIHZpYSB0aGUgJ2NsYXNzJyBhdHRyaWJ1dGUsIG90aGVyd2lzZSBhIGRlZmF1bHQgQWN0aW9uIGNsYXNzIGlzIGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBuZXdJbnN0YW5jZShDbGFzcyB0aGVDbGFzcywgTWFwIGF0dHJpYnV0ZXMsIGZpbmFsIFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIEFjdGlvbiBhY3Rpb24gPSAoQWN0aW9uKSBhdHRyaWJ1dGVzLnJlbW92ZSggImFjdGlvbiIgKTsKLSAgICAgICAgaWYgKCBhY3Rpb24gPT0gbnVsbCApIHsKLSAgICAgICAgICAgIGlmICh0aGVDbGFzcyAhPSBudWxsICkgewotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoZUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoICJldmVudCIsIGV2ZW50ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvblRhZy5zdXBlci5pbnZva2VCb2R5KG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoICJDYXVnaHQ6ICIgKyBlLCBlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhY3Rpb247Ci0gICAgfQotCQotCXB1YmxpYyB2b2lkIGludm9rZUJvZHkoWE1MT3V0cHV0IG91dHB1dCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0KLSAgICAvKioKLSAgICAgKiBFaXRoZXIgZGVmaW5lcyBhIHZhcmlhYmxlIG9yIGFkZHMgdGhlIGN1cnJlbnQgY29tcG9uZW50IHRvIHRoZSBwYXJlbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQmVhbihTdHJpbmcgdmFyLCBPYmplY3QgYmVhbikgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHZhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhciwgYmVhbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBDb21wb25lbnRUYWcgdGFnID0gKENvbXBvbmVudFRhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKCBDb21wb25lbnRUYWcuY2xhc3MgKTsKLSAgICAgICAgICAgIGlmICggdGFnICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgdGFnLnNldEFjdGlvbigoQWN0aW9uKSBiZWFuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIkVpdGhlciB0aGUgJ3ZhcicgYXR0cmlidXRlIG11c3QgYmUgc3BlY2lmaWVkIHRvIGV4cG9ydCB0aGlzIEFjdGlvbiBvciB0aGlzIHRhZyBtdXN0IGJlIG5lc3RlZCB3aXRoaW4gYSBKZWxseVN3aW5nIHdpZGdldCB0YWciICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm0gdGhlIHN0cmFuZ2Ugc2V0dGluZyBvZiBBY3Rpb24gcHJvcGVydGllcyB1c2luZyBpdHMgY3VzdG9tIEFQSQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEJlYW5Qcm9wZXJ0aWVzKE9iamVjdCBiZWFuLCBNYXAgYXR0cmlidXRlcykgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvbigpOwotCi0gICAgICAgIFN0cmluZyBlbmFibGVkID0gImVuYWJsZWQiOwotICAgICAgICBpZiAoYXR0cmlidXRlcy5jb250YWluc0tleShlbmFibGVkKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBCZWFuVXRpbHMuY29weVByb3BlcnR5KGFjdGlvbiwgZW5hYmxlZCwgYXR0cmlidXRlcy5nZXQoZW5hYmxlZCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJGYWlsZWQgdG8gc2V0IHRoZSBlbmFibGVkIHByb3BlcnR5LiIsIGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJGYWlsZWQgdG8gc2V0IHRoZSBlbmFibGVkIHByb3BlcnR5LiIsIGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhdHRyaWJ1dGVzLnJlbW92ZShlbmFibGVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCi0gICAgICAgICAgICAvLyB0eXBpY2FsbHkgc3RhbmRhcmQgQWN0aW9uIG5hbWVzIHN0YXJ0IHdpdGggdXBwZXIgY2FzZSwgc28gbGV0cyB1cHBlciBjYXNlIGl0Ci0gICAgICAgICAgICBuYW1lID0gY2FwaXRhbGl6ZShuYW1lKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0KLSAgICAgICAgICAgIGFjdGlvbi5wdXRWYWx1ZSggbmFtZSwgdmFsdWUgKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjYXBpdGFsaXplKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIGNoYXIgY2ggPSB0ZXh0LmNoYXJBdCgwKTsKLSAgICAgICAgaWYgKCBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoIGNoICkgKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGV4dDsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcih0ZXh0Lmxlbmd0aCgpKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCggQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKCBjaCApICk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIHRleHQuc3Vic3RyaW5nKDEpICk7Ci0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvQmVhbkZhY3RvcnkuamF2YSBiL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvQmVhbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhkNTIyMS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL0JlYW5GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nOwotCi0vKioKLSAqIEEgZGVmYXVsdCBGYWN0b3J5IGltcGxlbWVudGF0aW9uIHRoYXQgY3JlYXRlcyBuZXcgaW5zdGFuY2VzIGZyb20gYSBiZWFuIGNsYXNzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjcgJAotICovCi1wdWJsaWMgY2xhc3MgQmVhbkZhY3RvcnkgaW1wbGVtZW50cyBGYWN0b3J5IHsKLQotICAgIHByaXZhdGUgQ2xhc3MgYmVhbkNsYXNzOwotCi0gICAgcHVibGljIEJlYW5GYWN0b3J5KENsYXNzIGJlYW5DbGFzcykgewotICAgICAgICB0aGlzLmJlYW5DbGFzcyA9IGJlYW5DbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgY29tcG9uZW50IGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZSgpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICByZXR1cm4gYmVhbkNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvQm9yZGVyQWxpZ25UYWcuamF2YSBiL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvQm9yZGVyQWxpZ25UYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExYzlkYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL0JvcmRlckFsaWduVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBsYXlvdXQgb2YgYSBjaGlsZCBjb21wb25lbnQgd2l0aGluIGl0cyBwYXJlbnQgJmx0O2JvcmRlckxheW91dCZndDsgbGF5b3V0LgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS43ICQKLSAqLwotcHVibGljIGNsYXNzIEJvcmRlckFsaWduVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCBpbXBsZW1lbnRzIENvbnRhaW5lclRhZyB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBhbGlnbjsKLQotICAgIC8vIENvbnRhaW5lclRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBjaGlsZCBjb21wb25lbnQgdG8gdGhpcyBwYXJlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZChDb21wb25lbnQgY29tcG9uZW50LCBPYmplY3QgY29uc3RyYWludHMpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJvcmRlckxheW91dFRhZyB0YWcgPSAoQm9yZGVyTGF5b3V0VGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoIEJvcmRlckxheW91dFRhZy5jbGFzcyApOwotICAgICAgICBpZiAodGFnID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggInRoaXMgdGFnIG11c3QgYmUgbmVzdGVkIHdpdGhpbiBhIDxib3JkZXJMYXlvdXQ+IHRhZyIgKTsKLSAgICAgICAgfQotICAgICAgICB0YWcuYWRkTGF5b3V0Q29tcG9uZW50KGNvbXBvbmVudCwgZ2V0Q29uc3RyYWludHMoKSk7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKGZpbmFsIFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhbGlnbi4KLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxpZ24oKSB7Ci0gICAgICAgIHJldHVybiBhbGlnbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBhbGlnbm1lbnQgb2YgdGhlIGNoaWxkIGNvbXBvbmVudCB3aGljaCBpcyBhIGNhc2UgaW5zZW5zaXRpdmUgdmFsdWUKLSAgICAgKiBvZiB7Tk9SVEgsIFNPVVRILCBFQVNULCBXRVNULCBDRU5URVJ9IHdoaWNoIGRlZmF1bHRzIHRvIENFTlRFUgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFsaWduKFN0cmluZyBhbGlnbikgewotICAgICAgICB0aGlzLmFsaWduID0gYWxpZ247Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRDb25zdHJhaW50cygpIHsKLSAgICAgICAgaWYgKCJub3J0aCIuZXF1YWxzSWdub3JlQ2FzZShhbGlnbikpIHsKLSAgICAgICAgICAgIHJldHVybiBCb3JkZXJMYXlvdXQuTk9SVEg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoInNvdXRoIi5lcXVhbHNJZ25vcmVDYXNlKGFsaWduKSkgewotICAgICAgICAgICAgcmV0dXJuIEJvcmRlckxheW91dC5TT1VUSDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgiZWFzdCIuZXF1YWxzSWdub3JlQ2FzZShhbGlnbikpIHsKLSAgICAgICAgICAgIHJldHVybiBCb3JkZXJMYXlvdXQuRUFTVDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgid2VzdCIuZXF1YWxzSWdub3JlQ2FzZShhbGlnbikpIHsKLSAgICAgICAgICAgIHJldHVybiBCb3JkZXJMYXlvdXQuV0VTVDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gQ0VOVEVSCi0gICAgICAgICAgICByZXR1cm4gQm9yZGVyTGF5b3V0LkNFTlRFUjsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9Cb3JkZXJMYXlvdXRUYWcuamF2YSBiL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvQm9yZGVyTGF5b3V0VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlM2M3MDcuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9Cb3JkZXJMYXlvdXRUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuTGF5b3V0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIEEgTGF5b3V0IHRhZyB3aGljaCB1c2VzIG5lc3RlZCAmbHQ7Ym9yZGVyQWxpZ24mZ3Q7IHRhZ3MgdG8gaW1wbGVtZW50IGEgQm9yZGVyTGF5b3V0Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjcgJAotICovCi1wdWJsaWMgY2xhc3MgQm9yZGVyTGF5b3V0VGFnIGV4dGVuZHMgTGF5b3V0VGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTGF5b3V0VGFnU3VwcG9ydC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIGludCBoZ2FwOwotICAgIHByaXZhdGUgaW50IHZnYXA7Ci0KLSAgICBwdWJsaWMgQm9yZGVyTGF5b3V0VGFnKCkgewotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGhnYXAuCi0gICAgICogQHJldHVybiBpbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEhnYXAoKSB7Ci0gICAgICAgIHJldHVybiBoZ2FwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZnYXAuCi0gICAgICogQHJldHVybiBpbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZnYXAoKSB7Ci0gICAgICAgIHJldHVybiB2Z2FwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGhvcml6b250YWwgZ2FwIGluIHBpeGVscy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIZ2FwKGludCBoZ2FwKSB7Ci0gICAgICAgIHRoaXMuaGdhcCA9IGhnYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmVydGljYWwgZ2FwIGluIHBpeGVscwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZnYXAoaW50IHZnYXApIHsKLSAgICAgICAgdGhpcy52Z2FwID0gdmdhcDsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgQm9yZGVyTGF5b3V0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIExheW91dE1hbmFnZXIgY3JlYXRlTGF5b3V0TWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCb3JkZXJMYXlvdXQoaGdhcCwgdmdhcCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9Cb3JkZXJUYWdTdXBwb3J0LmphdmEgYi9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL0JvcmRlclRhZ1N1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcwMDIwZC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL0JvcmRlclRhZ1N1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQm9yZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyB1c2VkIGZvciBjb25jcmV0ZSBib3JkZXIgdGFncyB3aGljaCBjcmVhdGUgbmV3IEJvcmRlciBpbXBsZW1lbnRhdGlvbnMKLSAqIGFuZCBzZXRzIHRoZW4gb24gcGFyZW50IHdpZGdldHMgYW5kIG9wdGlvbmFsbHkgZXhwb3J0IHRoZW0gYXMgdmFyaWFibGVzIC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNyAkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCb3JkZXJUYWdTdXBwb3J0IGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQm9yZGVyVGFnU3VwcG9ydC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0KLSAgICBwdWJsaWMgQm9yZGVyVGFnU3VwcG9ydCgpIHsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoZmluYWwgWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLQotICAgICAgICBCb3JkZXIgYm9yZGVyID0gY3JlYXRlQm9yZGVyKCk7Ci0KLSAgICAgICAgLy8gYWxsb3cgc29tZSBuZXN0ZWQgdGFncyB0byBzZXQgcHJvcGVydGllcwotICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0KLSAgICAgICAgaWYgKHZhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhciwgYm9yZGVyKTsKLSAgICAgICAgfQotICAgICAgICBDb21wb25lbnRUYWcgdGFnID0gKENvbXBvbmVudFRhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKCBDb21wb25lbnRUYWcuY2xhc3MgKTsKLSAgICAgICAgaWYgKCB0YWcgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIHRhZy5zZXRCb3JkZXIoYm9yZGVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmICh2YXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIkVpdGhlciB0aGUgJ3ZhcicgYXR0cmlidXRlIG11c3QgYmUgc3BlY2lmaWVkIHRvIGV4cG9ydCB0aGlzIEJvcmRlciBvciB0aGlzIHRhZyBtdXN0IGJlIG5lc3RlZCB3aXRoaW4gYSBKZWxseVN3aW5nIHdpZGdldCB0YWciICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHVzZSB0byBleHBvc2UgdGhlIG5ldyBCb3JkZXIgb2JqZWN0LgotICAgICAqIElmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBzZXQgdGhlbiB0aGUgcGFyZW50IHdpZGdldCB0YWcgd2lsbCBoYXZlIGl0cwotICAgICAqIGJvcmRlciBwcm9wZXJ0eSBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IEJvcmRlciBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQm9yZGVyIGNyZWF0ZUJvcmRlcigpOwotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9CdXR0b25Hcm91cFRhZy5qYXZhIGIvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9CdXR0b25Hcm91cFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGYzOWJiLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvQnV0dG9uR3JvdXBUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkJ1dHRvbkdyb3VwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLS8qKiBJbXBsZW1lbnRzIGEgQnV0dG9uR3JvdXAuIFRoaXMgdGFnIGFjdHMgbGlrZSBhIFN3aW5nIGNvbXBvbmVudAotICogZXhjZXB0IHRoYXQgYWRkaW5nIGEgY29tcG9uZW50IG90aGVyIHRoYW4gYW4gQWJzdHJhY3RCdXR0b24sIHdpbGwgYmUgcGFzc2VkCi0gKiB0aHJvdWdoIHRvIHRoZSBwYXJlbnQgdGFnLiBUaGlzIGlzIG1lYW50IHRvIG1ha2UgdGhlCi0gKiBidXR0b25Hcm91cCBlYXNpZXIgdG8gdXNlIGxpa2UgdGhpczoKLSAqIDxwcmU+Ci0gKiAmbHQ7cGFuZWwmZ3Q7Ci0gKiAgJmx0O2J1dHRvbkdyb3VwJmd0OwotICogICAgICAmbHQ7cGFuZWwmZ3Q7Ci0gKiAgICAgICAgICAmbHQ7cmFkaW9CdXR0b24vJmd0OwotICogICAgICAmbHQ7L3BhbmVsJmd0OwotICogICAgICAmbHQ7cGFuZWwmZ3Q7Ci0gKiAgICAgICAgICAmbHQ7cmFkaW9CdXR0b24vJmd0OwotICogICAgICAmbHQ7L3BhbmVsJmd0OwotICogICZsdDsvYnV0dG9uR3JvdXAmZ3Q7Ci0gKiAmbHQ7L3BhbmVsJmd0OwotICogPC9wcmU+Ci0gKgotICogPHA+IE5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIGNvbnN0cnVjdCB3aWxsIHNpbGVudGx5IGZhaWwsIGFuZCBzaGFtZSBvbiBzL2hlIHdobyBldmVuIHRyaWVkIGl0OgotICogPHByZT4KLSAgKiAmbHQ7cGFuZWwmZ3Q7Ci0gKiAgJmx0O2J1dHRvbkdyb3VwJmd0OwotICogICAgICAmbHQ7Zm9udCAuLi4vJmd0OwotICogICAgICAmbHQ7cGFuZWwmZ3Q7Ci0gKiAgICAgICAgICAmbHQ7cmFkaW9CdXR0b24vJmd0OwotICogICAgICAmbHQ7L3BhbmVsJmd0OwotICogICAgICAmbHQ7cGFuZWwmZ3Q7Ci0gKiAgICAgICAgICAmbHQ7cmFkaW9CdXR0b24vJmd0OwotICogICAgICAmbHQ7L3BhbmVsJmd0OwotICogICZsdDsvYnV0dG9uR3JvdXAmZ3Q7Ci0gKiAmbHQ7L3BhbmVsJmd0OwotICogPC9wcmU+Ci0gKiA8L3A+Ci0gKgotICogQGF1dGhvciBIYW5zIEdpbGRlCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQnV0dG9uR3JvdXBUYWcgZXh0ZW5kcyBDb21wb25lbnRUYWcgewotCi0gICAgLyoqSWYgdGhlIGNoaWxkIGlzIGFuIEFic3RyYWN0QnV0dG9uLCBhZGQgaXQgdG8gdGhlIGJ1dHRvbiBncm91cC4gT3RoZXJ3aXNlLAotICAgICAqIHBhc3MgdGhyb3VnaCB0byB0aGUgcGFyZW50IGNvbXBvbmVudCB0YWcuCi0gICAgICogQHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3dpbmcuQ29udGFpbmVyVGFnI2FkZENoaWxkKGphdmEuYXd0LkNvbXBvbmVudCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZChDb21wb25lbnQgY29tcG9uZW50LCBPYmplY3QgY29uc3RyYWludHMpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdEJ1dHRvbikgewotICAgICAgICAgICAgZ2V0QnV0dG9uR3JvdXAoKS5hZGQoKEFic3RyYWN0QnV0dG9uKSBjb21wb25lbnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCBjb21wb25lbnQgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICBDb250YWluZXJUYWcgcGFyZW50VGFnID0gKENvbnRhaW5lclRhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKCBDb250YWluZXJUYWcuY2xhc3MgKTsKLSAgICAgICAgICAgICAgICBpZiAoIHBhcmVudFRhZyAhPSBudWxsICkgewotICAgICAgICAgICAgICAgICAgICBwYXJlbnRUYWcuYWRkQ2hpbGQoY29tcG9uZW50LCBnZXRDb25zdHJhaW50KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCAiVGhpcyBidXR0b25Hcm91cCB0YWcgbXVzdCBiZSBuZXN0ZWQgd2l0aGluIGEgU3dpbmcgY29tcG9uZW50IHRhZy4iICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqQ3JlYXRlcyBhIG5ldyBidXR0b25Hcm91cC4KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmUuVXNlQmVhblRhZyNuZXdJbnN0YW5jZShqYXZhLmxhbmcuQ2xhc3MsIGphdmEudXRpbC5NYXAsIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBuZXdJbnN0YW5jZShDbGFzcyB0aGVDbGFzcywgTWFwIGF0dHJpYnV0ZXMsCi0gICAgICAgICAgICBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IEJ1dHRvbkdyb3VwKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEJ1dHRvbkdyb3VwIGdldEJ1dHRvbkdyb3VwKCkgewotICAgICAgICByZXR1cm4gKEJ1dHRvbkdyb3VwKSBnZXRCZWFuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9Db21wb25lbnRUYWcuamF2YSBiL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvQ29tcG9uZW50VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOTRkMzEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9Db21wb25lbnRUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nOwotCi0KLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29udGFpbmVyOwotaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKLWltcG9ydCBqYXZhLmF3dC5Gb250OwotaW1wb3J0IGphdmEuYXd0LkxheW91dE1hbmFnZXI7Ci1pbXBvcnQgamF2YS5hd3QuUG9pbnQ7Ci1pbXBvcnQgamF2YS5hd3QuV2luZG93OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkZvY3VzTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KTWVudTsKLWltcG9ydCBqYXZheC5zd2luZy5KTWVudUJhcjsKLWltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KU3BsaXRQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLlJvb3RQYW5lQ29udGFpbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5Cb3JkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkJlYW5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkNvbnZlcnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5jb3JlLlVzZUJlYW5UYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3dpbmcuY29udmVydGVycy5EZWJ1Z0dyYXBoaWNzQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgdGFnIGNyZWF0ZXMgYSBTd2luZyBjb21wb25lbnQgYW5kIGFkZHMgaXQgdG8gaXRzIHBhcmVudCB0YWcsIG9wdGlvbmFsbHkgZGVjbGFyaW5nIHRoaXMKLSAqIGNvbXBvbmVudCBhcyBhIHZhcmlhYmxlIGlmIHRoZSA8aT52YXI8L2k+IGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQuPC9wPgotICoKLSAqIDxwPiBUaGlzIHRhZyBjbGVhcnMgdGhlIHJlZmVyZW5jZSB0byBpdCdzIGJlYW4gYWZ0ZXIgZG9UYWcgcnVucy4KLSAqIFRoaXMgbWVhbnMgdGhhdCBjaGlsZCB0YWdzIGNhbiBhY2Nlc3MgdGhlIGNvbXBvbmVudCAoYmVhbikgbm9ybWFsbHkKLSAqIGR1cmluZyBleGVjdXRpb24gYnV0IHNob3VsZCBub3QgaG9sZCBhIHJlZmVyZW5jZSB0byB0aGlzCi0gKiB0YWcgYWZ0ZXIgdGhlaXIgZG9UYWcgY29tcGxldGVzLgotICogPC9wPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS43ICQKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudFRhZyBleHRlbmRzIFVzZUJlYW5UYWcgaW1wbGVtZW50cyBDb250YWluZXJUYWcgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvbXBvbmVudFRhZy5jbGFzcyk7Ci0gICAgCi0gICAgLyoqIFRoaXMgaXMgYSBjb252ZXJ0ZXIgdGhhdCBtaWdodCBub3JtYWxseSBiZSB1c2VkIHRocm91Z2ggdGhlIAotICAgICAqIEJlYW5VdGlscyBwcm9kdWN0LiBIb3dldmVyLCBpdCBvbmx5IGFwcGxpZXMgdG8gb25lIENvbXBvbmVudAotICAgICAqIHByb3BlcnR5IGFuZCBub3QgdG8gYWxsIGludHMsIHNvIGl0J3Mgbm90IHJlZ2lzdGVyZWQgd2l0aCBCZWFuVXRpbHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVidWdHcmFwaGljc0NvbnZlcnRlciBkZWJ1Z0dyYXBoaWNzQ29udmVydGVyID0gbmV3IERlYnVnR3JhcGhpY3NDb252ZXJ0ZXIoKTsKLSAgICAKLSAgICAvKiogdGhlIGZhY3Rvcnkgb2Ygd2lkZ2V0cyAqLwotICAgIHByaXZhdGUgRmFjdG9yeSBmYWN0b3J5OwotCi0gICAgcHVibGljIENvbXBvbmVudFRhZygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcG9uZW50VGFnKEZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCUNvbXBvbmVudCBjb21wID0gZ2V0Q29tcG9uZW50KCk7Ci0gICAgICAgIFN0cmluZyBjb21wb25lbnROYW1lID0gKGNvbXAhPW51bGwpID8gY29tcC5nZXROYW1lKCkgOiBudWxsOwotICAgICAgICBpZiAoY29tcCE9bnVsbCAmJiAoY29tcG9uZW50TmFtZSA9PSBudWxsIHx8IGNvbXBvbmVudE5hbWUubGVuZ3RoKCkgPT0gMCkpCi0gICAgICAgICAgICBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50KCkudG9TdHJpbmcoKTsKLSAgICAgICAgcmV0dXJuICJDb21wb25lbnRUYWcgd2l0aCBiZWFuICIgKyBjb21wb25lbnROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEFjdGlvbiBvZiB0aGlzIGNvbXBvbmVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGlvbihBY3Rpb24gYWN0aW9uKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBDb21wb25lbnQgY29tcG9uZW50ID0gZ2V0Q29tcG9uZW50KCk7Ci0gICAgICAgIGlmICggY29tcG9uZW50ICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAvLyBsZXRzIGp1c3QgdHJ5IHNldCB0aGUgJ2FjdGlvbicgcHJvcGVydHkKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQmVhblV0aWxzLnNldFByb3BlcnR5KCBjb21wb25lbnQsICJhY3Rpb24iLCBhY3Rpb24gKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEZvbnQgb2YgdGhpcyBjb21wb25lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb250KEZvbnQgZm9udCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCA9IGdldENvbXBvbmVudCgpOwotICAgICAgICBpZiAoIGNvbXBvbmVudCAhPSBudWxsICkgewotICAgICAgICAgICAgLy8gbGV0cyBqdXN0IHRyeSBzZXQgdGhlICdmb250JyBwcm9wZXJ0eQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBCZWFuVXRpbHMuc2V0UHJvcGVydHkoIGNvbXBvbmVudCwgImZvbnQiLCBmb250ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEJvcmRlciBvZiB0aGlzIGNvbXBvbmVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJvcmRlcihCb3JkZXIgYm9yZGVyKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBDb21wb25lbnQgY29tcG9uZW50ID0gZ2V0Q29tcG9uZW50KCk7Ci0gICAgICAgIGlmICggY29tcG9uZW50ICE9IG51bGwgKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIGxldHMganVzdCB0cnkgc2V0IHRoZSAnYm9yZGVyJyBwcm9wZXJ0eQotICAgICAgICAgICAgICAgIEJlYW5VdGlscy5zZXRQcm9wZXJ0eSggY29tcG9uZW50LCAiYm9yZGVyIiwgYm9yZGVyICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIExheW91dE1hbmFnZXIgb2YgdGhpcyBjb21wb25lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXlvdXQoTGF5b3V0TWFuYWdlciBsYXlvdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIENvbXBvbmVudCBjb21wb25lbnQgPSBnZXRDb21wb25lbnQoKTsKLSAgICAgICAgaWYgKCBjb21wb25lbnQgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIGlmICggY29tcG9uZW50IGluc3RhbmNlb2YgUm9vdFBhbmVDb250YWluZXIgKSB7Ci0gICAgICAgICAgICAgICAgUm9vdFBhbmVDb250YWluZXIgcnBjID0gKFJvb3RQYW5lQ29udGFpbmVyKSBjb21wb25lbnQ7Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50ID0gcnBjLmdldENvbnRlbnRQYW5lKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gbGV0cyBqdXN0IHRyeSBzZXQgdGhlICdsYXlvdXQnIHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgQmVhblV0aWxzLnNldFByb3BlcnR5KCBjb21wb25lbnQsICJsYXlvdXQiLCBsYXlvdXQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIFdpbmRvd0xpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkV2luZG93TGlzdGVuZXIoV2luZG93TGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIENvbXBvbmVudCBjb21wb25lbnQgPSBnZXRDb21wb25lbnQoKTsKLSAgICAgICAgaWYgKCBjb21wb25lbnQgaW5zdGFuY2VvZiBXaW5kb3cgKSB7Ci0gICAgICAgICAgICBXaW5kb3cgd2luZG93ID0gKFdpbmRvdykgY29tcG9uZW50OwotICAgICAgICAgICAgd2luZG93LmFkZFdpbmRvd0xpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBGb2N1c0xpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRm9jdXNMaXN0ZW5lcihGb2N1c0xpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBDb21wb25lbnQgY29tcG9uZW50ID0gZ2V0Q29tcG9uZW50KCk7Ci0gICAgICAgIGNvbXBvbmVudC5hZGRGb2N1c0xpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgS2V5TGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRLZXlMaXN0ZW5lcihLZXlMaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCA9IGdldENvbXBvbmVudCgpOwotICAgICAgICBjb21wb25lbnQuYWRkS2V5TGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHZpc2libGUgY29tcG9uZW50LCBpZiB0aGVyZSBpcyBvbmUuCi0gICAgICovCi0gICAgcHVibGljIENvbXBvbmVudCBnZXRDb21wb25lbnQoKSB7Ci0gICAgICAgIE9iamVjdCBiZWFuID0gZ2V0QmVhbigpOwotICAgICAgICBpZiAoIGJlYW4gaW5zdGFuY2VvZiBDb21wb25lbnQgKSB7Ci0gICAgICAgICAgICByZXR1cm4gKENvbXBvbmVudCkgYmVhbjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQotICAgIC8vIENvbnRhaW5lclRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBjaGlsZCBjb21wb25lbnQgdG8gdGhpcyBwYXJlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZChDb21wb25lbnQgY29tcG9uZW50LCBPYmplY3QgY29uc3RyYWludHMpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCBwYXJlbnQgPSBnZXRCZWFuKCk7Ci0gICAgICAgIGlmICggcGFyZW50IGluc3RhbmNlb2YgSkZyYW1lICYmIGNvbXBvbmVudCBpbnN0YW5jZW9mIEpNZW51QmFyICkgewotICAgICAgICAgICAgSkZyYW1lIGZyYW1lID0gKEpGcmFtZSkgcGFyZW50OwotICAgICAgICAgICAgZnJhbWUuc2V0Sk1lbnVCYXIoIChKTWVudUJhcikgY29tcG9uZW50ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHBhcmVudCBpbnN0YW5jZW9mIFJvb3RQYW5lQ29udGFpbmVyICkgewotICAgICAgICAgICAgUm9vdFBhbmVDb250YWluZXIgcnBjID0gKFJvb3RQYW5lQ29udGFpbmVyKSBwYXJlbnQ7Ci0gICAgICAgICAgICBpZiAoY29uc3RyYWludHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJwYy5nZXRDb250ZW50UGFuZSgpLmFkZCggY29tcG9uZW50LCBjb25zdHJhaW50cyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcnBjLmdldENvbnRlbnRQYW5lKCkuYWRkKCBjb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBwYXJlbnQgaW5zdGFuY2VvZiBKU2Nyb2xsUGFuZSApIHsKLSAgICAgICAgICAgIEpTY3JvbGxQYW5lIHNjcm9sbFBhbmUgPSAoSlNjcm9sbFBhbmUpIHBhcmVudDsKLSAgICAgICAgICAgIHNjcm9sbFBhbmUuc2V0Vmlld3BvcnRWaWV3KCBjb21wb25lbnQgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggcGFyZW50IGluc3RhbmNlb2YgSlNwbGl0UGFuZSkgewotICAgICAgICAgICAgSlNwbGl0UGFuZSBzcGxpdFBhbmUgPSAoSlNwbGl0UGFuZSkgcGFyZW50OwotICAgICAgICAgICAgaWYgKCBzcGxpdFBhbmUuZ2V0T3JpZW50YXRpb24oKSA9PSBKU3BsaXRQYW5lLkhPUklaT05UQUxfU1BMSVQgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBzcGxpdFBhbmUuZ2V0VG9wQ29tcG9uZW50KCkgPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICAgICAgc3BsaXRQYW5lLnNldFRvcENvbXBvbmVudCggY29tcG9uZW50ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzcGxpdFBhbmUuc2V0Qm90dG9tQ29tcG9uZW50KCBjb21wb25lbnQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIHNwbGl0UGFuZS5nZXRMZWZ0Q29tcG9uZW50KCkgPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICAgICAgc3BsaXRQYW5lLnNldExlZnRDb21wb25lbnQoIGNvbXBvbmVudCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3BsaXRQYW5lLnNldFJpZ2h0Q29tcG9uZW50KCBjb21wb25lbnQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHBhcmVudCBpbnN0YW5jZW9mIEpNZW51QmFyICYmIGNvbXBvbmVudCBpbnN0YW5jZW9mIEpNZW51ICkgewotICAgICAgICAgICAgSk1lbnVCYXIgbWVudUJhciA9IChKTWVudUJhcikgcGFyZW50OwotICAgICAgICAgICAgbWVudUJhci5hZGQoIChKTWVudSkgY29tcG9uZW50ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHBhcmVudCBpbnN0YW5jZW9mIENvbnRhaW5lciApIHsKLSAgICAgICAgICAgIENvbnRhaW5lciBjb250YWluZXIgPSAoQ29udGFpbmVyKSBwYXJlbnQ7Ci0gICAgICAgICAgICBpZiAoY29uc3RyYWludHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGQoIGNvbXBvbmVudCwgY29uc3RyYWludHMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGQoIGNvbXBvbmVudCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIG1heSBiZSBzcGVjaWZpZWQgb3RoZXJ3aXNlIHRoZSBGYWN0b3J5IHdpbGwgYmUgdXNlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ2xhc3MgY29udmVydFRvQ2xhc3MoT2JqZWN0IGNsYXNzT2JqZWN0KSB0aHJvd3MgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjbGFzc09iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5jb252ZXJ0VG9DbGFzcyhjbGFzc09iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIG1heSBiZSBzcGVjaWZpZWQgb3RoZXJ3aXNlIHRoZSBGYWN0b3J5IHdpbGwgYmUgdXNlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IG5ld0luc3RhbmNlKENsYXNzIHRoZUNsYXNzLCBNYXAgYXR0cmlidXRlcywgWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh0aGVDbGFzcyAhPSBudWxsICkgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEVpdGhlciBkZWZpbmVzIGEgdmFyaWFibGUgb3IgYWRkcyB0aGUgY3VycmVudCBjb21wb25lbnQgdG8gdGhlIHBhcmVudAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NCZWFuKFN0cmluZyB2YXIsIE9iamVjdCBiZWFuKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAodmFyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUodmFyLCBiZWFuKTsKLSAgICAgICAgfQotICAgICAgICBDb21wb25lbnQgY29tcG9uZW50ID0gZ2V0Q29tcG9uZW50KCk7Ci0gICAgICAgIGlmICggY29tcG9uZW50ICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBDb250YWluZXJUYWcgcGFyZW50VGFnID0gKENvbnRhaW5lclRhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKCBDb250YWluZXJUYWcuY2xhc3MgKTsKLSAgICAgICAgICAgIGlmICggcGFyZW50VGFnICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50VGFnLmFkZENoaWxkKGNvbXBvbmVudCwgZ2V0Q29uc3RyYWludCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmICh2YXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICJUaGUgJ3ZhcicgYXR0cmlidXRlIG11c3QgYmUgc3BlY2lmaWVkIG9yIHRoaXMgdGFnIG11c3QgYmUgbmVzdGVkIGluc2lkZSBhIEplbGx5U3dpbmcgY29udGFpbmVyIHRhZyBsaWtlIGEgd2lkZ2V0IG9yIGEgbGF5b3V0IiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgd2llcmQgcHJvcGVydGllcyB0aGF0IGRvbid0IHF1aXRlIG1hdGNoIHRoZSBKYXZhIEJlYW5zIGNvbnRyYWN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0QmVhblByb3BlcnRpZXMoT2JqZWN0IGJlYW4sIE1hcCBhdHRyaWJ1dGVzKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICAgICAgCi0gICAgICAgICAgICBDb21wb25lbnQgY29tcG9uZW50ID0gZ2V0Q29tcG9uZW50KCk7Ci0gICAgICAgICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlcy5jb250YWluc0tleSgibG9jYXRpb24iKSkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBhdHRyaWJ1dGVzLmdldCgibG9jYXRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgUG9pbnQgcCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFBvaW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwID0gKFBvaW50KSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUG9pbnQpIENvbnZlcnRVdGlscy5jb252ZXJ0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludC5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNldExvY2F0aW9uKHApOwotICAgICAgICAgICAgICAgICAgICBhZGRJZ25vcmVQcm9wZXJ0eSgibG9jYXRpb24iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlcy5jb250YWluc0tleSgic2l6ZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0KCJzaXplIik7Ci0gICAgICAgICAgICAgICAgICAgIERpbWVuc2lvbiBkID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGltZW5zaW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkID0gKERpbWVuc2lvbikgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKERpbWVuc2lvbikgQ29udmVydFV0aWxzLmNvbnZlcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpbWVuc2lvbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNldFNpemUoZCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZElnbm9yZVByb3BlcnR5KCJzaXplIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLmNvbnRhaW5zS2V5KCJkZWJ1Z0dyYXBoaWNzT3B0aW9ucyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGRlYnVnR3JhcGhpY3NDb252ZXJ0ZXIuY29udmVydChhdHRyaWJ1dGVzLmdldCgiZGVidWdHcmFwaGljc09wdGlvbnMiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dCgiZGVidWdHcmFwaGljc09wdGlvbnMiLCBvKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlcy5jb250YWluc0tleSgiZGVidWdHcmFwaGljcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGRlYnVnR3JhcGhpY3NDb252ZXJ0ZXIuY29udmVydChhdHRyaWJ1dGVzLmdldCgiZGVidWdHcmFwaGljcyIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0KCJkZWJ1Z0dyYXBoaWNzT3B0aW9ucyIsIG8pOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBhZGRJZ25vcmVQcm9wZXJ0eSgiZGVidWdHcmFwaGljcyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICBzdXBlci5zZXRCZWFuUHJvcGVydGllcyhiZWFuLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0Q29uc3RyYWludCgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IFVzZUJlYW4gZnVuY3Rpb25hbGl0eSB0byBjbGVhciB0aGUgYmVhbiBhZnRlciB0aGUKLSAgICAgKiB0YWcgcnVucy4gVGhpcyBwcmV2ZW50cyB1cyBmcm9tIGtlZXBpbmcgcmVmZXJlbmNlcyB0byBoZWF2eSBTd2luZyBvYmplY3RzCi0gICAgICogYXJvdW5kIGZvciBsb25nZXIgdGhhbiB0aGV5IGFyZSBuZWVkZWQuCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnI2RvVGFnKG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9UYWcob3V0cHV0KTsKLSAgICAgICAgY2xlYXJCZWFuKCk7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIGJlYW4gdG8gbnVsbCwgdG8gcHJldmVudCBpdCBmcm9tCi0gICAgICogc3RpY2tpbmcgYXJvdW5kIGluIHRoZSBldmVudCB0aGF0IHRoaXMgdGFnIGluc3RhbmNlIGlzCi0gICAgICogY2FjaGVkLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXQgdGhlIGVuZCBvZiBkb1RhZy4KLSAgICAgKgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFyQmVhbigpIHsKLSAgICAgICAgc2V0QmVhbihudWxsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL0NvbnN0cmFpbnRUYWcuamF2YSBiL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvQ29uc3RyYWludFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjAyMTVkLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvQ29uc3RyYWludFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0qIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0qCi0qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd2luZzsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkJlYW5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuRHluYUJlYW5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLlRhZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotLyoqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGxheW91dC1tYW5hZ2VyIGNvbnN0cmFpbnRzIGFzIHBhc3NlZCBpbgotICAgICogdGhlIHNlY29uZCBhcmd1bWVudCBvZiB7QGxpbmsgQ29udGFpbmVyI2FkZChDb21wb25lbnQsT2JqZWN0KX0uCi0gICAgKiAgICA8cD4KLSAgICAqICAgIEluIGVzc2VuY2UsIGl0IGxvb2tzIHJlYWxseSBsaWtlIG5vdGhpbmcgZWxzZSB0aGFuIGEgYmVhbi1jbGFzcy4uLgotICAgICogICAgd2l0aCB7QGxpbmsgI2dldENvbnN0cmFpbnRPYmplY3R9LgotICAgICogICAgUHJvYmFibHkgYSBzaG9ydGVyIGphdmEtc291cmNlIGlzIGRvLWFibGUuCi0gICAgKiAgICA8cD4KLSAgICAqICAgIFRPRE86IHRoaXMgY2xhc3Mgc2hvdWxkIHByb2JhYmx5IGJlIGV4dGVuZGVkIHdpdGggc3BlY2lhbCB0cmVhdG1lbnQgZm9yIGRpbWVuc2lvcwotICAgICogICAgdXNpbmcgdGhlIGNvbnZlcnRlciBwYWNrYWdlLgotICAgICovCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludFRhZyBleHRlbmRzIER5bmFCZWFuVGFnU3VwcG9ydCB7Ci0KLS8qICAgIFRPRE86IG1ha2UgYSBncmlkYmFnY29uc3RyYWludFRhZyBjbGFzcyB3aGljaCBzdXBwb3J0cyBhbiBhdHRyaWJ1dGUgInBhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIChvci4uLiBzdGFydFdpdGgpIHdoaWNoIGlzIGFub3RoZXIgZ3JpZGJhZ2NvbnN0cmFpbnRUYWcgd2hvc2UgZ3JpZGJhZ2NvbnN0cmFpbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzIGNsb25lZCB0aGVuIGF0dHJpYnV0ZXMgYXJlIHNldAotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB0YWcgc2hvdWxkIGFsc28gc3VwcG9ydCB0aGUgYXR0cmlidXRlcyBzdWNoIGFzIGZpbGw9Qk9USAotICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFuY2hvcj1OT1JUSEVBU1QuLi4KLSAgICAgICAgICAgICAgICAgICAgICAgIFdvb29wcy4uLiBuZWVkIHRvIGRlZmluZSBzZXR0ZXJzID8/IGxldCdzIHNlZSBpZiBCZWFuVXRpbHMgZG9lcyBpdCBvbiBwdWJsaWMgdmFycwotICAgICAgICAgICAgICAgICAgICAgICAgQW5kLi4uIGhhdmUgYW4gaW5zZXRzPz8gQSBjaGlsZCA/Ci0gICAgKi8KLQotICAgIHByb3RlY3RlZCBGYWN0b3J5IGZhY3Rvcnk7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyB2YXIgPSBudWxsOwotICAgIHByb3RlY3RlZCBPYmplY3QgYmVhbiA9IG51bGw7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZXJlRmFjdG9yeSBleHRlbmRzIEJlYW5GYWN0b3J5IGltcGxlbWVudHMgVGFnRmFjdG9yeSB7Ci0gICAgICAgICAgICBwdWJsaWMgSGVyZUZhY3RvcnkoQ2xhc3MgYykgeyBzdXBlcihjKTsgfQotICAgICAgICAgICAgcHVibGljIFRhZyBjcmVhdGVUYWcoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29uc3RyYWludFRhZyAoIHRoaXMgKTsKLSAgICAgICAgICAgICAgICAvLyBzdGlsbCBzY3JhdGNoaW5nIG15IGhlYWQgYWJvdXQgInRoaXMiIHVzYWdlLi4uCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gLy8gY2xhc3MgSGVyZUZhY3RvcnkKLSAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb25zdGFudEZhY3RvcnkgaW1wbGVtZW50cyBUYWdGYWN0b3J5LCBGYWN0b3J5IHsKLSAgICAgICAgICAgIHB1YmxpYyBDb25zdGFudEZhY3RvcnkoT2JqZWN0IGMpIHsgdGhpcy5jb25zdGFudCA9IGM7fQotICAgICAgICAgICAgcHJpdmF0ZSBPYmplY3QgY29uc3RhbnQ7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKCkgeyByZXR1cm4gY29uc3RhbnQ7IH0KLSAgICAgICAgICAgIHB1YmxpYyBUYWcgY3JlYXRlVGFnKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25zdHJhaW50VGFnICggdGhpcyApOwotICAgICAgICAgICAgfQotICAgICAgICB9IC8vIGNsYXNzIENvbnN0YXRuU3RyaW5nRmFjdG9yeQotCi0gICAgICAgIC8vIHdlIGNvdWxkIGJlIGFibGUgdG8gbWFrZSBmYWN0b3JpZXMgdGhhdCBjcmVhdGUgdGhlaXIgdGFncyBpbiBwYXJhbWV0cml6ZWQKLSAgICAgICAgLy8gc3ViY2xhc3NlcyBvZiB0aGUgdGFnIGRlcGVuZGluZyBvbiB0aGUgbmFtZSBhbmQgYXR0cmlidXRlcwotICAgICAgICAvLyBpdCB3b3VsZCB1c2VmdWwsIGZvciBleGFtcGxlLCB0byBtYWtlIGEgY2FyZExheW91dCdzIDxjYXJkIG5hbWU9IiI+Ci0KLQotICAgIHB1YmxpYyBDb25zdHJhaW50VGFnIChGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCZWFuICggRmFjdG9yeSBmYWN0b3J5ICkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotICAgICAgICBiZWFuID0gZmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBVFRSSUJVVEVTCi0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVTZXRBdHRyaWJ1dGVzICggICkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNyZWF0ZUJlYW4oZmFjdG9yeSk7Ci0gICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZSAoIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUgKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICAvLyBubyByZWFsIG5lZWQgZm9yIER5bmFCZWFucyBvciA/Ci0gICAgICAgIGlmICggInZhciIuZXF1YWxzKG5hbWUpICkgewotICAgICAgICAgICAgdmFyID0gdmFsdWUudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgQmVhblV0aWxzLnNldFByb3BlcnR5KCBiZWFuLCBuYW1lLCB2YWx1ZSApOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKiogQ2hpbGRyZW4gaW52b2NhdGlvbi4uLiBqdXN0IG5vdGhpbmcuLi4KLSAgICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyAoIFhNTE91dHB1dCBvdXRwdXQgKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAoIHZhciAhPSBudWxsICkgY29udGV4dC5zZXRWYXJpYWJsZSAoIHZhciwgZ2V0QmVhbigpICk7Ci0gICAgICAgIGludm9rZUJvZHkgKCBvdXRwdXQgKTsKLSAgICAgICAgLy8gbm90aGluZyBlbHNlIHRvIGRvLi4uIHRoZSBnZXRDb25zdHJhaW50T2JqZWN0IG1ldGhvZCBzaG91bGQgaGF2ZSBiZWVuIGNhbGxlZC4KLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKCkgewotICAgICAgICByZXR1cm4gYmVhbjsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgYXR0YWNoZWQgY29uc3RyYWludCBvYmplY3QuCi0gICAgICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRDb25zdHJhaW50T2JqZWN0KCkgewotICAgICAgICByZXR1cm4gZ2V0QmVhbigpOwotICAgIH0KLX0gLy8gY2xhc3MgQ29uc3RyYWludFRhZwpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9Db250YWluZXJUYWcuamF2YSBiL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvQ29udGFpbmVyVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MmM4MzUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9Db250YWluZXJUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3dpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIHdoaWNoIHJlcHJlc2VudHMgYSBUYWcgd2hpY2ggaXMgY2FwYWJsZSBvZiBjb250YWluaW5nIEFXVCBDb21wb25lbnRzLgotICogU28gdGFncyBzdWNoIGFzIENvbnRhaW5lclRhZyBhbmQgTGF5b3V0VGFnU3VwcG9ydCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgYXMgdGhleSBjYW4gaGF2ZQotICogbmVzdGVkIGNoaWxkIGNvbXBvbmVudCB0YWdzLjwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNyAkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGFpbmVyVGFnIHsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBjaGlsZCBjb21wb25lbnQgdG8gdGhpcyBjb250YWluZXIgd2l0aCBvcHRpb25hbCBjb25zdHJhaW50cy4KLSAgICAgKiBJZiB0aGUgY29uc3RyYWludHMgYXJlIG51bGwgdGhleSBhcmUgaWdub3JlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKENvbXBvbmVudCBjb21wb25lbnQsIE9iamVjdCBjb25zdHJhaW50cykgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9EaWFsb2dUYWcuamF2YSBiL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvRGlhbG9nVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMDIzNWUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9EaWFsb2dUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29udGFpbmVyOwotaW1wb3J0IGphdmEuYXd0LkRpYWxvZzsKLWltcG9ydCBqYXZhLmF3dC5GcmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmF4LnN3aW5nLkpEaWFsb2c7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5jb3JlLlVzZUJlYW5UYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogQ3JlYXRlcyBhIFN3aW5nIERpYWxvZy4gIEEgSkRpYWxvZyBuZWVkcyB0byBoYXZlIGl0J3Mgb3duZXIgc2V0IGluIHRoZSBjb25zdHJ1Y3RvciwKLSAqIHdoaWNoIGlzIHdoeSB0aGlzIGNsYXNzIGlzIG5lZWRlZCBpbnN0ZWFkIG9mIGp1c3QgdXNpbmcgYSBCZWFuRmFjdG9yeS4KLSAqCi0gKiBAYXV0aG9yIERhdmUgUGVrYXJlayBLcm9obgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjcgJAotICovCi1wdWJsaWMgY2xhc3MgRGlhbG9nVGFnIGV4dGVuZHMgVXNlQmVhblRhZyBpbXBsZW1lbnRzIENvbnRhaW5lclRhZyB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGlhbG9nVGFnLmNsYXNzKTsKLQotICAgIHB1YmxpYyBEaWFsb2dUYWcoKSB7Ci0gICAgICAgIHN1cGVyKEpEaWFsb2cuY2xhc3MpOwotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBKRGlhbG9nLiAgVGhlIGNvbnN0cnVjdG9yIHVzZWQgZGVwZW5kcyBvbiB0aGUgdmFsdWUgb2YgdGhlIG93bmVyIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IG5ld0luc3RhbmNlKENsYXNzIHRoZUNsYXNzLCBNYXAgYXR0cmlidXRlcywgWE1MT3V0cHV0IG91dHB1dCkKLSAgICB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBPYmplY3Qgb3duZXIgPSBhdHRyaWJ1dGVzLnJlbW92ZSggIm93bmVyIiApOwotICAgICAgICBpZiAob3duZXIgaW5zdGFuY2VvZiBGcmFtZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKRGlhbG9nKChGcmFtZSkgb3duZXIpOwotICAgICAgICB9IGVsc2UgaWYgKG93bmVyIGluc3RhbmNlb2YgRGlhbG9nKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEpEaWFsb2coKERpYWxvZykgb3duZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKRGlhbG9nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDb250YWluZXJUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgY29tcG9uZW50IHRvIHRoZSBkaWFsb2cuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ2hpbGQoQ29tcG9uZW50IGNvbXBvbmVudCwgT2JqZWN0IGNvbnN0cmFpbnRzKSB7Ci0gICAgICAgIENvbnRhaW5lciBjb250ZW50UGFuZSA9ICgoSkRpYWxvZykgZ2V0QmVhbigpKS5nZXRDb250ZW50UGFuZSgpOwotICAgICAgICBpZiAoY29uc3RyYWludHMgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGVudFBhbmUuYWRkKCBjb21wb25lbnQsIGNvbnN0cmFpbnRzICk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb250ZW50UGFuZS5hZGQoIGNvbXBvbmVudCApOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL0VtcHR5Qm9yZGVyVGFnLmphdmEgYi9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL0VtcHR5Qm9yZGVyVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OTBlNzcuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9FbXB0eUJvcmRlclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5Cb3JkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBDcmVhdGVzIGFuIGVtcHR5IGJvcmRlci4KLSAqIFRoZSBib3JkZXIgd2lsbCBlaXRoZXIgYmUgZXhwb3J0ZWQgYXMgYSB2YXJpYWJsZSBkZWZpbmVkIGJ5IHRoZSAndmFyJyBhdHRyaWJ1dGUKLSAqIG9yIHdpbGwgYmUgc2V0IG9uIHRoZSBwYXJlbnQgd2lkZ2V0J3MgYm9yZGVyIHByb3BlcnR5Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86cm9iZXJ0QGJ1bGwtZW50ZXJwcmlzZXMuY29tIj5Sb2JlcnQgTWNJbnRvc2g8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbXB0eUJvcmRlclRhZyBleHRlbmRzIEJvcmRlclRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEVtcHR5Qm9yZGVyVGFnLmNsYXNzKTsKLQotICAgIHByaXZhdGUgaW50IGxlZnQgICA9IC0xOwotICAgIHByaXZhdGUgaW50IHJpZ2h0ICA9IC0xOwotICAgIHByaXZhdGUgaW50IHRvcCAgICA9IC0xOwotICAgIHByaXZhdGUgaW50IGJvdHRvbSA9IC0xOwotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKGZpbmFsIFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICggbGVmdCA9PSAtMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oImxlZnQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIHJpZ2h0ID09IC0xKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbigicmlnaHQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIHRvcCA9PSAtMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oInRvcCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICggYm90dG9tID09IC0xKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbigiYm90dG9tIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZG9UYWcob3V0cHV0KTsKLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbGVmdCBpbnNldAotICAgICAqIEBwYXJhbSBsZWZ0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGVmdCggaW50IGxlZnQgKSB7Ci0gICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcmlnaHQgaW5zZXQKLSAgICAgKiBAcGFyYW0gcmlnaHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSaWdodCggaW50IHJpZ2h0ICkgewotICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdG9wIGluc2V0Ci0gICAgICogQHBhcmFtIHRvcAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvcCggaW50IHRvcCApIHsKLSAgICAgICAgdGhpcy50b3AgPSB0b3A7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYm90dG9tIGluc2V0Ci0gICAgICogQHBhcmFtIGJvdHRvbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJvdHRvbSggaW50IGJvdHRvbSApIHsKLSAgICAgICAgdGhpcy5ib3R0b20gPSBib3R0b207Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IEVtcHR5Qm9yZGVyIGluc3RhbmNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBCb3JkZXIgY3JlYXRlQm9yZGVyKCkgewotICAgICAgICByZXR1cm4gQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlciggdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvRXRjaGVkQm9yZGVyVGFnLmphdmEgYi9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL0V0Y2hlZEJvcmRlclRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNThhNWRhLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvRXRjaGVkQm9yZGVyVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkJvcmRlcjsKLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuRXRjaGVkQm9yZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogQ3JlYXRlcyBhbiBldGNoZWQgYm9yZGVyLgotICogVGhlIGJvcmRlciB3aWxsIGVpdGhlciBiZSBleHBvcnRlZCBhcyBhIHZhcmlhYmxlIGRlZmluZWQgYnkgdGhlICd2YXInIGF0dHJpYnV0ZQotICogb3Igd2lsbCBiZSBzZXQgb24gdGhlIHBhcmVudCB3aWRnZXQncyBib3JkZXIgcHJvcGVydHkKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpyb2JlcnRAYnVsbC1lbnRlcnByaXNlcy5jb20iPlJvYmVydCBNY0ludG9zaDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKLSAqLwotcHVibGljIGNsYXNzIEV0Y2hlZEJvcmRlclRhZyBleHRlbmRzIEJvcmRlclRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEV0Y2hlZEJvcmRlclRhZy5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIGludCAgICAgZXRjaFR5cGUgID0gLTE7Ci0gICAgcHJpdmF0ZSBDb2xvciAgIGhpZ2hsaWdodCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBDb2xvciAgIHNoYWRvdyAgICA9IG51bGw7Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoZmluYWwgWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYoIGhpZ2hsaWdodCAhPSBudWxsICYmIHNoYWRvdyA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oInNoYWRvdyBtdXN0IGJlIHN1cHBsaWVkIHdoZW4gaGlnaGxpZ2h0IGlzIHN1cHBsaWVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoIHNoYWRvdyAhPSBudWxsICYmIGhpZ2hsaWdodCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbigiaGlnaGxpZ2h0IG11c3QgYmUgc3VwcGxpZWQgd2hlbiBzaGFkb3cgaXMgc3VwcGxpZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiggZXRjaFR5cGUgIT0gRXRjaGVkQm9yZGVyLkxPV0VSRUQgfHwgZXRjaFR5cGUgIT0gRXRjaGVkQm9yZGVyLlJBSVNFRCApIHsKLSAgICAgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIGxvZy5kZWJ1ZyggImV0Y2hUeXBlIHNldCB0byBbIiArIGV0Y2hUeXBlICsgIl0sIHdoaWNoIGlzIGludmFsaWQuIFJlc2V0aW5nIHRvIC0xIiApOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmRvVGFnKG91dHB1dCk7Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGV0Y2ggdHlwZS4gTXVzdCBiZSBlaXRoZXIgRXRjaGVkQm9yZGVyLkxPV0VSRUQgb3IgRXRjaGVkQm9yZGVyLlJBSVNFRAotICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXRjaFR5cGUoIGludCB0eXBlICkgewotICAgICAgICBldGNoVHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgaGlnaGxpZ2h0IGNvbG9yCi0gICAgICogQHBhcmFtIGhpZ2hsaWdodAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhpZ2hsaWdodCggQ29sb3IgaGlnaGxpZ2h0ICkgewotICAgICAgICB0aGlzLmhpZ2hsaWdodCA9IGhpZ2hsaWdodDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzaGFkb3cgY29sb3IKLSAgICAgKiBAcGFyYW0gc2hhZG93Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VG9wKCBDb2xvciBzaGFkb3cgKSB7Ci0gICAgICAgIHRoaXMuc2hhZG93ID0gc2hhZG93OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBFdGNoZWRCb3JkZXIgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJvcmRlciBjcmVhdGVCb3JkZXIoKSB7Ci0gICAgICAgIGlmKCBldGNoVHlwZSA9PSAtMSAmJiBzaGFkb3cgPT0gbnVsbCAmJiBoaWdobGlnaHQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEJvcmRlckZhY3RvcnkuY3JlYXRlRXRjaGVkQm9yZGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIGhpZ2hsaWdodCAhPSBudWxsICYmIHNoYWRvdyAhPSBudWxsICYmIGV0Y2hUeXBlID4gLTEgKSB7Ci0gICAgICAgICAgICByZXR1cm4gQm9yZGVyRmFjdG9yeS5jcmVhdGVFdGNoZWRCb3JkZXIoIGV0Y2hUeXBlLCBoaWdobGlnaHQsIHNoYWRvdyApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEJvcmRlckZhY3RvcnkuY3JlYXRlRXRjaGVkQm9yZGVyKCBoaWdobGlnaHQsIHNoYWRvdyApOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvRmFjdG9yeS5qYXZhIGIvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZTdiMzYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nOwotCi0KLS8qKgotICogQW4gaW50ZXJmYWNlIHRvIHJlcHJlc2VudCBhIGZhY3Rvcnkgb2YgYmVhbnMKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNyAkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgY29tcG9uZW50IGluc3RhbmNlCi0gICAgICovCi0gICAgT2JqZWN0IG5ld0luc3RhbmNlKCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL0ZvY3VzTGlzdGVuZXJUYWcuamF2YSBiL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvRm9jdXNMaXN0ZW5lclRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjUzNjdjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvRm9jdXNMaXN0ZW5lclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qCi0qIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0qCi0qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkZvY3VzRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuRm9jdXNMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuU2NyaXB0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBGb2N1c0xpc3RlbmVyVGFnIGV4dGVuZHMgVGFnU3VwcG9ydAotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhGb2N1c0xpc3RlbmVyVGFnLmNsYXNzKTsKLQotICBwcm90ZWN0ZWQgU3RyaW5nIHZhcjsKLSAgcHJvdGVjdGVkIFNjcmlwdCBnYWluZWQ7Ci0gIHByb3RlY3RlZCBTY3JpcHQgbG9zdDsKLQotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgRm9jdXNMaXN0ZW5lclRhZygpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICogQHBhcmFtIHZhcgotICAqLwotICBwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikKLSAgewotICAgIHRoaXMudmFyID0gdmFyOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBnYWluZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEdhaW5lZChTY3JpcHQgZ2FpbmVkKQotICB7Ci0gICAgdGhpcy5nYWluZWQgPSBnYWluZWQ7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGxvc3QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExvc3QoU2NyaXB0IGxvc3QpCi0gIHsKLSAgICB0aGlzLmxvc3QgPSBsb3N0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9UYWcoZmluYWwgWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBub3cgbGV0cyBhZGQgdGhpcyBhY3Rpb24gdG8gaXRzIHBhcmVudCBpZiB3ZSBoYXZlIG9uZQotICAgIENvbXBvbmVudFRhZyB0YWcgPSAoQ29tcG9uZW50VGFnKWZpbmRBbmNlc3RvcldpdGhDbGFzcyhDb21wb25lbnRUYWcuY2xhc3MpOwotICAgIGlmICh0YWcgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBGb2N1c0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEZvY3VzTGlzdGVuZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnZva2VTY3JpcHQob3V0cHV0LCBlLCBnYWluZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkKLSAgICAgICAgewotICAgICAgICAgIGludm9rZVNjcmlwdChvdXRwdXQsIGUsIGxvc3QpOwotICAgICAgICB9Ci0gICAgICB9OwotICAgICAgdGFnLmFkZEZvY3VzTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGludm9rZVNjcmlwdChYTUxPdXRwdXQgb3V0cHV0LCBGb2N1c0V2ZW50IGV2ZW50LCBTY3JpcHQgc2NyaXB0KQotICB7Ci0gICAgaWYgKHZhciAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIGRlZmluZSBhIHZhcmlhYmxlIG9mIHRoZSBldmVudAotICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIGV2ZW50KTsKLSAgICB9Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAoc2NyaXB0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNjcmlwdC5ydW4oY29udGV4dCwgb3V0cHV0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gaW52b2tlIHRoZSBib2R5Ci0gICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGxvZy5lcnJvcigiQ2F1Z2h0IGV4Y2VwdGlvbiBwcm9jZXNzaW5nIHdpbmRvdyBldmVudDogIiArIGV2ZW50LCBlKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9Gb250VGFnLmphdmEgYi9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL0ZvbnRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU1ZTlkOC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL0ZvbnRUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuRm9udDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NYXBUYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBDcmVhdGVzIGFuIEZvbnQgYW5kIGF0dGFjaGVzIGl0IHRvIHRoZSBwYXJlbnQgY29tcG9uZW50IG9yIGV4cG9ydHMgdGhlIGZvbnQgYXMKLSAqIGEgcmV1c2FibGUgdmFyaWFibGUgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gbXVsdGlwbGUgd2lkZ2V0cy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBGb250VGFnIGV4dGVuZHMgTWFwVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRm9udFRhZy5jbGFzcyk7Ci0KLSAgICAvKiogdGhlIGN1cnJlbnQgZm9udCBpbnN0YW5jZSAqLwotICAgIHByaXZhdGUgRm9udCBmb250OwotCi0gICAgcHVibGljIEZvbnRUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIG1heWJlIGRvIHNvbWUgdHlwZSBjb252ZXJzaW9ucyBvciBuYW1lIG1hcHBpbmcgY29kZS4uLgotICoKLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAobmFtZS5lcXVhbHMoInNpemUiKSkgewotICAgICAgICAgICAgc3VwZXIuc2V0QXR0cmlidXRlKG5hbWUsIENvbnZlcnRVdGlscy5jb252ZXJ0KEludGVnZXIuY2xhc3MsIHZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzdXBlci5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotKi8KLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKGZpbmFsIFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIE1hcCBhdHRyaWJ1dGVzID0gZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBTdHJpbmcgdmFyID0gKFN0cmluZykgYXR0cmlidXRlcy5yZW1vdmUoInZhciIpOwotCi0gICAgICAgIGZvbnQgPSBjcmVhdGVGb250KGF0dHJpYnV0ZXMpOwotCi0gICAgICAgIGlmICh2YXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIGZvbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gbm93IGxldHMgYWRkIHRoaXMgZm9udCB0byBpdHMgcGFyZW50IGlmIHdlIGhhdmUgb25lCi0gICAgICAgICAgICBDb21wb25lbnRUYWcgdGFnID0gKENvbXBvbmVudFRhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKCBDb21wb25lbnRUYWcuY2xhc3MgKTsKLSAgICAgICAgICAgIGlmICggdGFnICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgdGFnLnNldEZvbnQoZm9udCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICJ0aGlzIHRhZyBtdXN0IGJlIG5lc3RlZCB3aXRoaW4gYSBKZWxseVN3aW5nIHdpZGdldCB0YWcgb3IgdGhlICd2YXInIGF0dHJpYnV0ZSBtdXN0IGJlIHNwZWNpZmllZCIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIEZvbnQgb2JqZWN0IGZvciB0aGlzIHRhZwotICAgICAqLwotICAgIHB1YmxpYyBGb250IGdldEZvbnQoKSB7Ci0gICAgICAgIHJldHVybiBmb250OwotICAgIH0KLQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IEZvbnQgYmFzZWQgb24gdGhlIGdpdmVuIHByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRm9udCBjcmVhdGVGb250KE1hcCBtYXApIHsKLSAgICAgICAgbG9nLmluZm8oICJDcmVhdGluZyBmb250IGZyb20gcHJvcGVydGllczogIiArIG1hcCApOwotICAgICAgICBGb250IGZvbnQgPSBuZXcgRm9udChtYXApOwotICAgICAgICAvL0ZvbnQgZm9udCA9IEZvbnQuZ2V0Rm9udChtYXApOwotICAgICAgICBsb2cuaW5mbyggIkNyZWF0ZWQgZm9udDogIiArIGZvbnQgKTsKLSAgICAgICAgcmV0dXJuIGZvbnQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9HYmNUYWcuamF2YSBiL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvR2JjVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmOWE4NjYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9HYmNUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50czsKLWltcG9ydCBqYXZhLmF3dC5JbnNldHM7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZS5Vc2VCZWFuVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nLmltcGwuR3JpZEJhZ0NvbnN0cmFpbnRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHtAbGluayBHcmlkQmFnQ29uc3RyYWludHN9IGNvbnN0cmFpbnRzIGFzIHBhc3NlZCBpbgotICogdGhlIHNlY29uZCBhcmd1bWVudCBvZiB7QGxpbmsgQ29udGFpbmVyI2FkZChDb21wb25lbnQsT2JqZWN0KX0uCi0gKiBJdCBzdXBwb3J0cyBpbmhlcml0ZW5jZSBiZXR3ZWVuIHN1Y2ggdGFncyBpbiB0aGUgZm9sbG93aW5nIGZhc2hpb246Ci0gKiA8dWw+Ci0gKiAgICAgPGxpPmVpdGhlciB1c2luZyBhIDxjb2RlPmJhc2VkT248L2NvZGU+IGF0dHJpYnV0ZSB3aGljaCBpcwotICogICAgICAgICBzdXBwb3NlZCB0byBwcm92aWRlIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIge0BsaW5rIEdiY1RhZ30uPC9saT4KLSAqICAgICA8bGk+ZWl0aGVyIHVzaW5nIGEgcGFyZW50IHtAbGluayBHYmNUYWd9LjwvbGk+Ci0gKiA8L3VsPgotICogVGhlIGZpcnN0IHZlcnNpb24gdGFrZXMgcHJlY2VkZW5jZS4KLSAqIEEgR3JpZC1iYWctY29uc3RyYWludCBpbmhlcml0cyBmcm9tIGFub3RoZXIgc2ltcGx5IGJ5IHNldHRpbmcgb3RoZXIgYXR0cmlidXRlcwotICogYXMgaXMgZG9uZSBpbiB7QGxpbmsgR3JpZEJhZ0NvbnN0cmFpbnRCZWFuI3NldEJhc2VkT259LgotICogPHA+Ci0gKiBJbiBlc3NlbmNlLCBpdCBsb29rcyByZWFsbHkgbGlrZSBub3RoaW5nIGVsc2UgdGhhbiBhIGJlYW4tY2xhc3MuLi4KLSAqIHdpdGgge0BsaW5rICNnZXRDb25zdHJhaW50c30uCi0gKiBQcm9iYWJseSBhIHNob3J0ZXIgamF2YS1zb3VyY2UgaXMgZG8tYWJsZS4KLSAqIDxwPgotICogVE9ETzogdGhpcyBjbGFzcyBzaG91bGQgcHJvYmFibHkgYmUgZXh0ZW5kZWQgd2l0aCBzcGVjaWFsIHRyZWF0bWVudCBmb3IgZGltZW5zaW9ucwotICogdXNpbmcgdGhlIGNvbnZlcnRlciBwYWNrYWdlLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnBhdWxAYWN0aXZlbWF0aC5vcmciPlBhdWwgTGliYnJlY2h0PC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAkCi0gKi8KLXB1YmxpYyBjbGFzcyBHYmNUYWcgZXh0ZW5kcyBVc2VCZWFuVGFnIGltcGxlbWVudHMgQ29udGFpbmVyVGFnIHsKLQotICAgIHB1YmxpYyBHcmlkQmFnQ29uc3RyYWludHMgZ2V0Q29uc3RyYWludHMoKSB7Ci0gICAgICAgIHJldHVybiAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnZXRCZWFuKCk7Ci0gICAgfQotCi0KLSAgICAvLyBDb250YWluZXJUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgY2hpbGQgY29tcG9uZW50IHRvIHRoaXMgcGFyZW50Ci0gICAgICogQHBhcmFtIGNvbXBvbmVudCB0aGUgY2hpbGQgdG8gYWRkCi0gICAgICogQHBhcmFtIGNvbnN0cmFpbnRzIHRoZSBjb25zdHJhaW50cyB0byB1c2UKLSAgICAgKiBAVE9ETyBjb25zdHJhaW50cyBsb29rcyBsaWtlIGl0J3MgaWdub3JlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKENvbXBvbmVudCBjb21wb25lbnQsIE9iamVjdCBjb25zdHJhaW50cykgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgR3JpZEJhZ0xheW91dFRhZyB0YWcgPSAoR3JpZEJhZ0xheW91dFRhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKCBHcmlkQmFnTGF5b3V0VGFnLmNsYXNzICk7Ci0gICAgICAgIGlmICh0YWcgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCAidGhpcyB0YWcgbXVzdCBiZSBuZXN0ZWQgd2l0aGluIGEgPGdyaWRCYWdMYXlvdXQ+IHRhZyIgKTsKLSAgICAgICAgfQotICAgICAgICB0YWcuYWRkTGF5b3V0Q29tcG9uZW50KGNvbXBvbmVudCwgZ2V0Q29uc3RyYWludHMoKSk7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyBtYXkgYmUgc3BlY2lmaWVkIG90aGVyd2lzZSB0aGUgRmFjdG9yeSB3aWxsIGJlIHVzZWQuCi0gICAgICogQHBhcmFtIGNsYXNzT2JqZWN0IHRoZSBvYmplY3QgdG8gYmUgY29udmVydGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENsYXNzIGNvbnZlcnRUb0NsYXNzKE9iamVjdCBjbGFzc09iamVjdCkKLSAgICB0aHJvd3MgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjbGFzc09iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5jb252ZXJ0VG9DbGFzcyhjbGFzc09iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIG1heSBiZSBzcGVjaWZpZWQgb3RoZXJ3aXNlIHRoZSBGYWN0b3J5IHdpbGwgYmUgdXNlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IG5ld0luc3RhbmNlKENsYXNzIHRoZUNsYXNzLCBNYXAgYXR0cmlidXRlcywgWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoZUNsYXNzICE9IG51bGwgKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBHcmlkQmFnQ29uc3RyYWludEJlYW4oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldEJlYW5Qcm9wZXJ0aWVzKE9iamVjdCBiZWFuLCBNYXAgYXR0cmlidXRlcykKLSAgICAgICAgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLQotICAgICAgICBJbnNldHMgaW5zID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IGluc2V0U3RyaW5nID0gYXR0cmlidXRlcy5nZXQoImluc2V0cyIpOwotICAgICAgICBpZiAoaW5zZXRTdHJpbmcgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMucmVtb3ZlKCJpbnNldHMiKTsKLQotCi0gICAgICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IFN0cmluZ1V0aWxzLnNwbGl0KChTdHJpbmcpIGluc2V0U3RyaW5nLCAiLCIpOwotCi0gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoICE9IDQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJpbnNldHMgbXVzdCBiZSBzcGVjaWZpZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJhcyBmb3VyIGNvbW1hIC0gc2VwYXJhdGVkIGludGVnZXJzLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnMgPQotICAgICAgICAgICAgICAgIG5ldyBJbnNldHMoCi0gICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQocGFydHNbMF0udHJpbSgpKSwKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChwYXJ0c1sxXS50cmltKCkpLAotICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzJdLnRyaW0oKSksCi0gICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQocGFydHNbM10udHJpbSgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5zZXRCZWFuUHJvcGVydGllcyhiZWFuLCBhdHRyaWJ1dGVzKTsKLQotICAgICAgICAvLyBzZXQgYmFzZWRPbiBpbmZvIG9mIHRoZSBiZWFuIGlmIHdlIGhhdmUgYSBwYXJlbnQgZ2JjIHRhZwotICAgICAgICAvLyBpbiB0aGUgY29udGV4dCBvZiB0aGUgY2xvc2VzdCBncmlkYmFnbGF5b3V0IHRhZwotCi0gICAgICAgIGlmIChiZWFuIGluc3RhbmNlb2YgR3JpZEJhZ0NvbnN0cmFpbnRCZWFuKSB7Ci0gICAgICAgICAgICBHcmlkQmFnQ29uc3RyYWludEJlYW4gZ2JjID0gKEdyaWRCYWdDb25zdHJhaW50QmVhbikgYmVhbjsKLQotICAgICAgICAgICAgaWYgKGlucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZ2JjLnNldEluc2V0cyhpbnMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBHcmlkQmFnTGF5b3V0VGFnIHBhcmVudExheW91dFRhZyA9Ci0gICAgICAgICAgICAgICAgKEdyaWRCYWdMYXlvdXRUYWcpIChmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoR3JpZEJhZ0xheW91dFRhZwotICAgICAgICAgICAgICAgICAgICAuY2xhc3MpKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnRMYXlvdXRUYWcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEdiY1RhZyBwYXJlbnRHYmNUYWcgPQotICAgICAgICAgICAgICAgICAgICAoR2JjVGFnKSAoZmluZEFuY2VzdG9yV2l0aENsYXNzKGdldFBhcmVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgR2JjVGFnLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TGF5b3V0VGFnKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmVudEdiY1RhZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBwYXJlbnRHYmMgPQotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50R2JjVGFnLmdldENvbnN0cmFpbnRzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudEdiYyAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwYXJlbnRHYmMgaW5zdGFuY2VvZiBHcmlkQmFnQ29uc3RyYWludEJlYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdiYy5zZXRCYXNlZE9uKChHcmlkQmFnQ29uc3RyYWludEJlYW4pIHBhcmVudEdiYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXRTdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdiYy5zZXRJbnNldHMocGFyZW50R2JjLmluc2V0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRhZyBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoCi0gICAgICAgIFRhZyBmcm9tLAotICAgICAgICBDbGFzcyB0YWdDbGFzcywKLSAgICAgICAgVGFnIHBhcmVudCkgewotICAgICAgICB3aGlsZSAoZnJvbSAhPSBudWxsICYmIGZyb20gIT0gcGFyZW50KSB7Ci0gICAgICAgICAgICBpZiAodGFnQ2xhc3MuaXNJbnN0YW5jZShmcm9tKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmcm9tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJvbSA9IGZyb20uZ2V0UGFyZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL0dyaWRCYWdMYXlvdXRUYWcuamF2YSBiL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvR3JpZEJhZ0xheW91dFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTQ3OGFiLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvR3JpZEJhZ0xheW91dFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkdyaWRCYWdMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuTGF5b3V0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIEEgTGF5b3V0IHRhZyB3aGljaCB1c2VzIG5lc3RlZCAmbHQ7Z2JjJmd0OyB0YWdzIHRvIGltcGxlbWVudCBhIEdyaWRCYWdMYXlvdXQKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmlkQmFnTGF5b3V0VGFnIGV4dGVuZHMgTGF5b3V0VGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTGF5b3V0VGFnU3VwcG9ydC5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgR3JpZEJhZ0xheW91dFRhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgR3JpZEJhZ0xheW91dAotICAgICAqLwotICAgIHByb3RlY3RlZCBMYXlvdXRNYW5hZ2VyIGNyZWF0ZUxheW91dE1hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgR3JpZEJhZ0xheW91dCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvS2V5TGlzdGVuZXJUYWcuamF2YSBiL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvS2V5TGlzdGVuZXJUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhMDhlOC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL0tleUxpc3RlbmVyVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSogQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSoKLSogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlNjcmlwdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgS2V5TGlzdGVuZXJUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0Ci17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEtleUxpc3RlbmVyVGFnLmNsYXNzKTsKLQotICBwcm90ZWN0ZWQgU3RyaW5nIHZhcjsKLSAgcHJvdGVjdGVkIFNjcmlwdCBwcmVzc2VkOwotICBwcm90ZWN0ZWQgU2NyaXB0IHR5cGVkOwotICBwcm90ZWN0ZWQgU2NyaXB0IHJlbGVhc2VkOwotCi0gIHB1YmxpYyBLZXlMaXN0ZW5lclRhZygpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpCi0gIHsKLSAgICB0aGlzLnZhciA9IHZhcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFByZXNzZWQoU2NyaXB0IHByZXNzZWQpCi0gIHsKLSAgICB0aGlzLnByZXNzZWQgPSBwcmVzc2VkOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVsZWFzZWQoU2NyaXB0IHJlbGVhc2VkKQotICB7Ci0gICAgdGhpcy5yZWxlYXNlZCA9IHJlbGVhc2VkOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VHlwZWQoU2NyaXB0IHR5cGVkKQotICB7Ci0gICAgdGhpcy50eXBlZCA9IHR5cGVkOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9UYWcoZmluYWwgWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBub3cgbGV0cyBhZGQgdGhpcyBhY3Rpb24gdG8gaXRzIHBhcmVudCBpZiB3ZSBoYXZlIG9uZQotICAgIENvbXBvbmVudFRhZyB0YWcgPSAoQ29tcG9uZW50VGFnKWZpbmRBbmNlc3RvcldpdGhDbGFzcyhDb21wb25lbnRUYWcuY2xhc3MpOwotICAgIGlmICh0YWcgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBLZXlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBLZXlMaXN0ZW5lcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGtleVR5cGVkKEtleUV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnZva2VTY3JpcHQob3V0cHV0LCBlLCB0eXBlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnZva2VTY3JpcHQob3V0cHV0LCBlLCBwcmVzc2VkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnZva2VTY3JpcHQob3V0cHV0LCBlLCByZWxlYXNlZCk7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgICB0YWcuYWRkS2V5TGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGludm9rZVNjcmlwdChYTUxPdXRwdXQgb3V0cHV0LCBLZXlFdmVudCBldmVudCwgU2NyaXB0IHNjcmlwdCkKLSAgewotICAgIGlmICh2YXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBkZWZpbmUgYSB2YXJpYWJsZSBvZiB0aGUgZXZlbnQKLSAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUodmFyLCBldmVudCk7Ci0gICAgfQotCi0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKHNjcmlwdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBzY3JpcHQucnVuKGNvbnRleHQsIG91dHB1dCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIGludm9rZSB0aGUgYm9keQotICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBsb2cuZXJyb3IoIkNhdWdodCBleGNlcHRpb24gcHJvY2Vzc2luZyB3aW5kb3cgZXZlbnQ6ICIgKyBldmVudCwgZSk7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvTGF5b3V0VGFnU3VwcG9ydC5qYXZhIGIvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9MYXlvdXRUYWdTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OGE0MDkuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9MYXlvdXRUYWdTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkxheW91dE1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIHVzZWQgZm9yIGNvbmNyZXRlIGxheW91dCB0YWdzIHdoaWNoIGNyZWF0ZSBuZXcgTGF5b3V0TWFuYWdlciBpbXBsZW1lbnRhdGlvbnMKLSAqIGFuZCBlaXRoZXIgZXhwb3J0IHRoZW0gYXMgdmFyaWFibGVzIG9yIHNldCB0aGVtIG9uIHBhcmVudCB3aWRnZXRzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS43ICQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIExheW91dFRhZ1N1cHBvcnQgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhMYXlvdXRUYWdTdXBwb3J0LmNsYXNzKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHZhcjsKLQotICAgIHB1YmxpYyBMYXlvdXRUYWdTdXBwb3J0KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIGxheW91dCBjb21wb25lbnQgdG8gdGhlIGNvbnRhaW5lciB3aXRoIHRoZSBzcGVjaWZpZWQgY29uc3RyYWludHMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRMYXlvdXRDb21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCwgT2JqZWN0IGNvbnN0cmFpbnRzKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBnZXRDb21wb25lbnRUYWcoKS5hZGRDaGlsZChjb21wb25lbnQsIGNvbnN0cmFpbnRzKTsKLSAgICB9Ci0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhmaW5hbCBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotCi0gICAgICAgIExheW91dE1hbmFnZXIgbGF5b3V0ID0gY3JlYXRlTGF5b3V0TWFuYWdlcigpOwotCi0gICAgICAgIGlmICh2YXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIGxheW91dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBnZXRDb21wb25lbnRUYWcoKS5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgICAgICAvLyBhbGxvdyBzb21lIG5lc3RlZCB0YWdzIHRvIHNldCBwcm9wZXJ0aWVzCi0gICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHVzZSB0byBleHBvc2UgdGhlIG5ldyBMYXlvdXRNYW5hZ2VyIG9iamVjdC4KLSAgICAgKiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3Qgc2V0IHRoZW4gdGhlIHBhcmVudCB3aWRnZXQgdGFnIHdpbGwgaGF2ZSBpdHMKLSAgICAgKiBsYXlvdXQgcHJvcGVydHkgc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0gICAgICAgIHRoaXMudmFyID0gdmFyOwotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCBjb21wb25lbnQgdGFnIG9yIHRocm93IGFuIGV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBDb21wb25lbnRUYWcgZ2V0Q29tcG9uZW50VGFnKCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tcG9uZW50VGFnIHRhZyA9IChDb21wb25lbnRUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyggQ29tcG9uZW50VGFnLmNsYXNzICk7Ci0gICAgICAgIGlmICggdGFnID09IG51bGwgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICJUaGlzIHRhZyBtdXN0IGJlIG5lc3RlZCB3aXRoaW4gYSBKZWxseVN3aW5nIHdpZGdldCB0YWciICk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRhZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgTGF5b3V0TWFuYWdlciBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTGF5b3V0TWFuYWdlciBjcmVhdGVMYXlvdXRNYW5hZ2VyKCk7Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL1N3aW5nVGFnTGlicmFyeS5qYXZhIGIvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9Td2luZ1RhZ0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NiNTg3YS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL1N3aW5nVGFnTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247Ci1pbXBvcnQgamF2YS5hd3QuUG9pbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkNvbnZlcnRVdGlsczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdMaWJyYXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLlRhZ1NjcmlwdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5UYWdGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nLmNvbnZlcnRlcnMuRGltZW5zaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nLmNvbnZlcnRlcnMuUG9pbnRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3dpbmcuY29udmVydGVycy5Db2xvckNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd2luZy5jb252ZXJ0ZXJzLkRlYnVnR3JhcGhpY3NDb252ZXJ0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci0KLS8qKgotICogQSBKZWxseSBjdXN0b20gdGFnIGxpYnJhcnkgdGhhdCBhbGxvd3MgQW50IHRhc2tzIHRvIGJlIGNhbGxlZCBmcm9tIGluc2lkZSBKZWxseS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpib2JAZW5nLndlcmtlbi5jb20iPmJvYiBtY3doaXJ0ZXI8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNiAkCi0gKi8KLXB1YmxpYyBjbGFzcyBTd2luZ1RhZ0xpYnJhcnkgZXh0ZW5kcyBUYWdMaWJyYXJ5IHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTd2luZ1RhZ0xpYnJhcnkuY2xhc3MpOwotCi0gICAgLyoqIEEgbWFwIG9mIGVsZW1lbnQgbmFtZSB0byBiZWFuIGNsYXNzIG9iamVjdHMgKi8KLSAgICBwcml2YXRlIE1hcCBmYWN0b3J5TWFwOwotCi0gICAgc3RhdGljIHsKLQotICAgICAgICAvLyAjIyMgd2Ugc2hvdWxkIGNyZWF0ZSBDb252ZXJ0ZXJzIGZyb20gU3RyaW5ncyB0byB2YXJpb3VzIFN3aW5nIHR5cGVzIHN1Y2ggYXMKLSAgICAgICAgLy8gIyMjIEljb24sIEtleVN0cm9rZSBldGMuCi0gICAgICAgIENvbnZlcnRVdGlscy5yZWdpc3RlciggbmV3IERpbWVuc2lvbkNvbnZlcnRlcigpLCBEaW1lbnNpb24uY2xhc3MgKTsKLSAgICAgICAgQ29udmVydFV0aWxzLnJlZ2lzdGVyKCBuZXcgUG9pbnRDb252ZXJ0ZXIoKSwgUG9pbnQuY2xhc3MgKTsKLSAgICAgICAgQ29udmVydFV0aWxzLnJlZ2lzdGVyKCBuZXcgQ29sb3JDb252ZXJ0ZXIoKSwgamF2YS5hd3QuQ29sb3IuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3dpbmdUYWdMaWJyYXJ5KCkgewotICAgICAgICByZWdpc3RlclRhZyggImFjdGlvbiIsIEFjdGlvblRhZy5jbGFzcyApOwotICAgICAgICByZWdpc3RlclRhZyggImJ1dHRvbkdyb3VwIiwgQnV0dG9uR3JvdXBUYWcuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoICJjb21wb25lbnQiLCBDb21wb25lbnRUYWcuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoICJmb250IiwgRm9udFRhZy5jbGFzcyApOwotICAgICAgICByZWdpc3RlclRhZyggIndpbmRvd0xpc3RlbmVyIiwgV2luZG93TGlzdGVuZXJUYWcuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoICJmb2N1c0xpc3RlbmVyIiwgRm9jdXNMaXN0ZW5lclRhZy5jbGFzcyApOwotICAgICAgICByZWdpc3RlclRhZyggImtleUxpc3RlbmVyIiwgS2V5TGlzdGVuZXJUYWcuY2xhc3MgKTsKLQotICAgICAgICAvLyB0aGUgbW9kZWwgdGFncwotICAgICAgICByZWdpc3RlclRhZyggInRhYmxlTW9kZWwiLCBUYWJsZU1vZGVsVGFnLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCAidGFibGVNb2RlbENvbHVtbiIsIFRhYmxlTW9kZWxDb2x1bW5UYWcuY2xhc3MgKTsKLQotICAgICAgICAvLyB0aGUgYm9yZGVyIHRhZ3MuLi4KLSAgICAgICAgcmVnaXN0ZXJUYWcoICJldGNoZWRCb3JkZXIiLCBFdGNoZWRCb3JkZXJUYWcuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoICJlbXB0eUJvcmRlciIsIEVtcHR5Qm9yZGVyVGFnLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCAidGl0bGVkQm9yZGVyIiwgVGl0bGVkQm9yZGVyVGFnLmNsYXNzICk7Ci0gICAgICAgIC8vIEB0b2RvIHRoZSBvdGhlciBraW5kcyBvZiBib3JkZXJzLCBlbXB0eSwgYmV2ZWxsZWQsIGNvbXBvdW5kIGV0YwotCi0gICAgICAgIC8vIHRoZSBsYXlvdXQgdGFncy4uLgotCi0gICAgICAgIC8vIEhUTUwgc3R5bGUgdGFibGUsIHRyLCB0ZCBsYXlvdXRzCi0gICAgICAgIHJlZ2lzdGVyVGFnKCAidGFibGVMYXlvdXQiLCBUYWJsZUxheW91dFRhZy5jbGFzcyApOwotICAgICAgICByZWdpc3RlclRhZyggInRyIiwgVHJUYWcuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoICJ0ZCIsIFRkVGFnLmNsYXNzICk7Ci0KLSAgICAgICAgLy8gR3JpZEJhZ0xheW91dAotICAgICAgICByZWdpc3RlclRhZyggImdyaWRCYWdMYXlvdXQiLCBHcmlkQmFnTGF5b3V0VGFnLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCAiZ2JjIiwgR2JjVGFnLmNsYXNzICk7Ci0KLSAgICAgICAgLy8gQm9yZGVyTGF5b3V0Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCAiYm9yZGVyTGF5b3V0IiwgQm9yZGVyTGF5b3V0VGFnLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCAiYm9yZGVyQWxpZ24iLCBCb3JkZXJBbGlnblRhZy5jbGFzcyApOwotCi0gICAgICAgIC8vIERpYWxvZwotICAgICAgICByZWdpc3RlclRhZyggImRpYWxvZyIsIERpYWxvZ1RhZy5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKiBDcmVhdGVzIGEgbmV3IHNjcmlwdCB0byBleGVjdXRlIHRoZSBnaXZlbiB0YWcgbmFtZSBhbmQgYXR0cmlidXRlcyAqLwotICAgIHB1YmxpYyBUYWdTY3JpcHQgY3JlYXRlVGFnU2NyaXB0KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0gICAgICAgIFRhZ1NjcmlwdCBhbnN3ZXIgPSBzdXBlci5jcmVhdGVUYWdTY3JpcHQobmFtZSwgYXR0cmlidXRlcyk7Ci0gICAgICAgIGlmICggYW5zd2VyID09IG51bGwgKSB7Ci0gICAgICAgICAgICBmaW5hbCBGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KCBuYW1lICk7Ci0gICAgICAgICAgICBpZiAoIGZhY3RvcnkgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRhZ1NjcmlwdCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFRhZ0ZhY3RvcnkoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVGFnIGNyZWF0ZVRhZyhTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZmFjdG9yeSBpbnN0YW5jZW9mIFRhZ0ZhY3RvcnkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKFRhZ0ZhY3RvcnkpIGZhY3RvcnkpLmNyZWF0ZVRhZyhuYW1lLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50VGFnKGZhY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBGYWN0b3J5IG9mIHRoZSBTd2luZyBjb21wb25lbnQgZm9yIHRoZSBnaXZlbiBlbGVtZW50IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgRmFjdG9yeSBnZXRGYWN0b3J5KFN0cmluZyBlbGVtZW50TmFtZSkgewotICAgICAgICByZXR1cm4gKEZhY3RvcnkpIGdldEZhY3RvcnlNYXAoKS5nZXQoZWxlbWVudE5hbWUpOwotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFN0cmF0ZWd5IG1ldGhvZCBhbGxvd2luZyBkZXJpdmVkIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSByZWdpc3RyYXRpb24gYmVoYXZpb3VyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJGYWN0b3JpZXMoKSB7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoICJidXR0b24iLCBKQnV0dG9uLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoICJjaGVja0JveCIsIEpDaGVja0JveC5jbGFzcyApOwotICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCAiY2hlY2tCb3hNZW51SXRlbSIsIEpDaGVja0JveE1lbnVJdGVtLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoICJjb21ib0JveCIsIEpDb21ib0JveC5jbGFzcyApOwotICAgICAgICAvLyBob3cgdG8gYWRkIGNvbnRlbnQgdGhlcmUgPwotICAgICAgICAvLyBIYXZlIGEgQ29tYm9Cb3hNb2RlbCAoanVzdCBvbmUgc2hvdWxkIGhhdmUgYSBUYWJsZSBvciBUcmVlIE1vZGVsIG9iamVjdHMpID8KLSAgICAgICAgLy8gY2FuIHRoZSBlbGVtZW50IGNvbnRyb2wgaXQncyBjaGlsZHJlbiA/Ci0gICAgICAgIC8vIGJ1dCBjaGlsZHJlbiBzaG91bGQgYWxzbyBiZSBhYmxlIHRvIGJlIGFueSBjb21wb25lbnQgKGFzIFN3aW5nIGNvbXBzLiBhcmUgYWxsIGNvbnRhaW5lcikKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSggImRlc2t0b3BQYW5lIiwgSkRlc2t0b3BQYW5lLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoICJlZGl0b3JQYW5lIiwgSkVkaXRvclBhbmUuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSggImZpbGVDaG9vc2VyIiwgSkZpbGVDaG9vc2VyLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoICJmcmFtZSIsIEpGcmFtZS5jbGFzcyApOwotICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCAiaW50ZXJuYWxGcmFtZSIsIEpJbnRlcm5hbEZyYW1lLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoICJsYWJlbCIsIEpMYWJlbC5jbGFzcyApOwotICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCAibGlzdCIsIEpMaXN0LmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoICJtZW51IiwgSk1lbnUuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSggIm1lbnVCYXIiLCBKTWVudUJhci5jbGFzcyApOwotICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCAibWVudUl0ZW0iLCBKTWVudUl0ZW0uY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSggInBhbmVsIiwgSlBhbmVsLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoICJwYXNzd29yZEZpZWxkIiwgSlBhc3N3b3JkRmllbGQuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSggInBvcHVwTWVudSIsIEpQb3B1cE1lbnUuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSggInByb2dyZXNzQmFyIiwgSlByb2dyZXNzQmFyLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoICJyYWRpb0J1dHRvbiIsIEpSYWRpb0J1dHRvbi5jbGFzcyApOwotICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCAicmFkaW9CdXR0b25NZW51SXRlbSIsIEpSYWRpb0J1dHRvbk1lbnVJdGVtLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoICJvcHRpb25QYW5lIiwgSk9wdGlvblBhbmUuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSggInNjcm9sbFBhbmUiLCBKU2Nyb2xsUGFuZS5jbGFzcyApOwotICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCAic2VwYXJhdG9yIiwgSlNlcGFyYXRvci5jbGFzcyApOwotCi0gICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgKLSAgICAgICAgICAgICJzcGxpdFBhbmUiLAotICAgICAgICAgICAgbmV3IEZhY3RvcnkoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgSlNwbGl0UGFuZSBhbnN3ZXIgPSBuZXcgSlNwbGl0UGFuZSgpOwotICAgICAgICAgICAgICAgICAgICBhbnN3ZXIuc2V0TGVmdENvbXBvbmVudChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgYW5zd2VyLnNldFJpZ2h0Q29tcG9uZW50KG51bGwpOwotICAgICAgICAgICAgICAgICAgICBhbnN3ZXIuc2V0VG9wQ29tcG9uZW50KG51bGwpOwotICAgICAgICAgICAgICAgICAgICBhbnN3ZXIuc2V0Qm90dG9tQ29tcG9uZW50KG51bGwpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYW5zd2VyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLQotICAgICAgICAvLyBCb3ggcmVsYXRlZCBsYXlvdXQgY29tcG9uZW50cwotICAgICAgICByZWdpc3RlckZhY3RvcnkoCi0gICAgICAgICAgICAiaGJveCIsCi0gICAgICAgICAgICBuZXcgRmFjdG9yeSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQm94LmNyZWF0ZUhvcml6b250YWxCb3goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgKLSAgICAgICAgICAgICJ2Ym94IiwKLSAgICAgICAgICAgIG5ldyBGYWN0b3J5KCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBCb3guY3JlYXRlVmVydGljYWxCb3goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0KLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSggInRhYmJlZFBhbmUiLCBKVGFiYmVkUGFuZS5jbGFzcyApOwotICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCAidGFibGUiLCBKVGFibGUuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSggInRleHRBcmVhIiwgSlRleHRBcmVhLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoICJ0ZXh0RmllbGQiLCBKVGV4dEZpZWxkLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoICJ0b2dnbGVCdXR0b24iLCBKVG9nZ2xlQnV0dG9uLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoICJ0cmVlIiwgSlRyZWUuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSggInRvb2xCYXIiLCBKVG9vbEJhci5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGEgd2lkZ2V0IGZhY3RvcnkgZm9yIHRoZSBnaXZlbiBlbGVtZW50IG5hbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckZhY3RvcnkoU3RyaW5nIG5hbWUsIEZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBnZXRGYWN0b3J5TWFwKCkucHV0KG5hbWUsIGZhY3RvcnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGEgYmVhbiBmYWN0b3J5IGZvciB0aGUgZ2l2ZW4gZWxlbWVudCBuYW1lIGFuZCBjbGFzcwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyQmVhbkZhY3RvcnkoU3RyaW5nIG5hbWUsIENsYXNzIGJlYW5DbGFzcykgewotICAgICAgICByZWdpc3RlckZhY3RvcnkobmFtZSwgbmV3IEJlYW5GYWN0b3J5KGJlYW5DbGFzcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNYXAgZ2V0RmFjdG9yeU1hcCgpIHsKLSAgICAgICAgaWYgKCBmYWN0b3J5TWFwID09IG51bGwgKSB7Ci0gICAgICAgICAgICBmYWN0b3J5TWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIHJlZ2lzdGVyRmFjdG9yaWVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhY3RvcnlNYXA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9UYWJsZUxheW91dFRhZy5qYXZhIGIvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9UYWJsZUxheW91dFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2NjMWI2Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvVGFibGVMYXlvdXRUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5HcmlkQmFnTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkxheW91dE1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd2luZy5pbXBsLkNlbGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogQSBMYXlvdXQgdGFnIHdoaWNoIG1pbWlja3MgdGhlIHRhYmxlLCB0ciBhbmQgdGQgdGFncyBvZiBIVE1MLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS43ICQKLSAqLwotcHVibGljIGNsYXNzIFRhYmxlTGF5b3V0VGFnIGV4dGVuZHMgTGF5b3V0VGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTGF5b3V0VGFnU3VwcG9ydC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIGludCByb3dDb3VudDsKLQotICAgIHB1YmxpYyBUYWJsZUxheW91dFRhZygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbmV3IGNlbGwgdG8gdGhlIGN1cnJlbnQgZ3JpZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENlbGwoQ2VsbCBjZWxsKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICAvLyBmaW5kIHRoZSBwYXJlbnQgY29udGFpbmVyIGFuZCBhZGQgdGhlIGNvbXBvbmVudCB3aXRoIHRoZSBncmlkIGJhZyBjb25zdHJhaW50cwotICAgICAgICBhZGRMYXlvdXRDb21wb25lbnQoY2VsbC5nZXRDb21wb25lbnQoKSwgY2VsbC5nZXRDb25zdHJhaW50cygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHJvdyBpbmRleCBmb3IgY2hpbGQgPHRyPiB0YWdzCi0gICAgICovCi0gICAgcHVibGljIGludCBuZXh0Um93SW5kZXgoKSB7Ci0gICAgICAgIHJldHVybiByb3dDb3VudCsrOwotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhmaW5hbCBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICByb3dDb3VudCA9IDA7Ci0gICAgICAgIHN1cGVyLmRvVGFnKG91dHB1dCk7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgR3JpZEJhZ0xheW91dAotICAgICAqLwotICAgIHByb3RlY3RlZCBMYXlvdXRNYW5hZ2VyIGNyZWF0ZUxheW91dE1hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgR3JpZEJhZ0xheW91dCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvVGFibGVNb2RlbENvbHVtblRhZy5qYXZhIGIvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9UYWJsZU1vZGVsQ29sdW1uVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3N2FiMTUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9UYWJsZU1vZGVsQ29sdW1uVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZS5Vc2VCZWFuVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nLm1vZGVsLkV4cHJlc3Npb25UYWJsZUNvbHVtbjsKLQotLyoqCi0gKiBDcmVhdGVzIGEgZGVmYXVsdCBUYWJsZUNvbHVtbk1vZGVsLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS43ICQKLSAqLwotcHVibGljIGNsYXNzIFRhYmxlTW9kZWxDb2x1bW5UYWcgZXh0ZW5kcyBVc2VCZWFuVGFnIHsKLQotICAgIHB1YmxpYyBFeHByZXNzaW9uVGFibGVDb2x1bW4gZ2V0Q29sdW1uKCkgewotICAgICAgICByZXR1cm4gKEV4cHJlc3Npb25UYWJsZUNvbHVtbikgZ2V0QmVhbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzcyBnZXRBdHRyaWJ1dGVUeXBlKFN0cmluZyBuYW1lKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAobmFtZS5lcXVhbHMoInZhbHVlIikpIHsKLSAgICAgICAgICAgIHJldHVybiBFeHByZXNzaW9uLmNsYXNzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGVUeXBlKG5hbWUpOwotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQmVhbihTdHJpbmcgdmFyLCBPYmplY3QgYmVhbikgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIucHJvY2Vzc0JlYW4odmFyLCBiZWFuKTsKLQotICAgICAgICBUYWJsZU1vZGVsVGFnIHRhZyA9IChUYWJsZU1vZGVsVGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoIFRhYmxlTW9kZWxUYWcuY2xhc3MgKTsKLSAgICAgICAgaWYgKCB0YWcgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIlRoaXMgdGFnIG11c3QgYmUgbmVzdGVkIHdpdGhpbiBhIDx0YWJsZU1vZGVsPiB0YWciICk7Ci0gICAgICAgIH0KLSAgICAgICAgdGFnLmdldFRhYmxlTW9kZWwoKS5hZGRDb2x1bW4oIGdldENvbHVtbigpICk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENsYXNzIGdldERlZmF1bHRDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIEV4cHJlc3Npb25UYWJsZUNvbHVtbi5jbGFzczsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvVGFibGVNb2RlbFRhZy5qYXZhIGIvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9UYWJsZU1vZGVsVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYzE2OWUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9UYWJsZU1vZGVsVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSlRhYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmUuVXNlQmVhblRhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd2luZy5tb2RlbC5FeHByZXNzaW9uVGFibGVNb2RlbDsKLQotLyoqCi0gKiBDcmVhdGVzIGEgZGVmYXVsdCBUYWJsZU1vZGVsIHVzaW5nIG5lc3RlZCB0YWJsZUNvbHVtbiB0YWdzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS43ICQKLSAqLwotcHVibGljIGNsYXNzIFRhYmxlTW9kZWxUYWcgZXh0ZW5kcyBVc2VCZWFuVGFnIHsKLQotICAgIHB1YmxpYyBFeHByZXNzaW9uVGFibGVNb2RlbCBnZXRUYWJsZU1vZGVsKCkgewotICAgICAgICByZXR1cm4gKEV4cHJlc3Npb25UYWJsZU1vZGVsKSBnZXRCZWFuKCk7Ci0gICAgfQotCi0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0JlYW4oU3RyaW5nIHZhciwgT2JqZWN0IGJlYW4pIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnByb2Nlc3NCZWFuKHZhciwgYmVhbik7Ci0KLSAgICAgICAgQ29tcG9uZW50VGFnIHRhZyA9IChDb21wb25lbnRUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyggQ29tcG9uZW50VGFnLmNsYXNzICk7Ci0gICAgICAgIGlmICggdGFnID09IG51bGwgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICJUaGlzIHRhZyBtdXN0IGJlIG5lc3RlZCB3aXRoaW4gYSBKZWxseVN3aW5nIDx0YWJsZT4gdGFnIiApOwotICAgICAgICB9Ci0gICAgICAgIEV4cHJlc3Npb25UYWJsZU1vZGVsIG1vZGVsID0gZ2V0VGFibGVNb2RlbCgpOwotICAgICAgICBtb2RlbC5zZXRDb250ZXh0KGNvbnRleHQpOwotCi0gICAgICAgIE9iamVjdCBjb21wb25lbnQgPSB0YWcuZ2V0Q29tcG9uZW50KCk7Ci0gICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBKVGFibGUpIHsKLSAgICAgICAgICAgIEpUYWJsZSB0YWJsZSA9IChKVGFibGUpIGNvbXBvbmVudDsKLSAgICAgICAgICAgIHRhYmxlLnNldE1vZGVsKG1vZGVsKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIlRoaXMgdGFnIG11c3QgYmUgbmVzdGVkIHdpdGhpbiBhIEplbGx5U3dpbmcgPHRhYmxlPiB0YWciICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0RGVmYXVsdENsYXNzKCkgewotICAgICAgICByZXR1cm4gRXhwcmVzc2lvblRhYmxlTW9kZWwuY2xhc3M7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL1RkVGFnLmphdmEgYi9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL1RkVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDM5MDEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9UZFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHRhYnVsYXIgY2VsbCBpbnNpZGUgYSAmbHQ7dGwmZ3Q7IHRhZyBpbnNpZGUgYSAmbHQ7dGFibGVMYXlvdXQmZ3Q7Ci0gKiB0YWcgd2hpY2ggbWltaWNrcyB0aGUgJmx0O3RkJmd0OyBIVE1MIHRhZy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZFRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgaW1wbGVtZW50cyBDb250YWluZXJUYWcgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFRkVGFnLmNsYXNzKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGFsaWduOwotICAgIHByaXZhdGUgU3RyaW5nIHZhbGlnbjsKLSAgICBwcml2YXRlIGludCBjb2xzcGFuID0gMTsKLSAgICBwcml2YXRlIGludCByb3dzcGFuID0gMTsKLSAgICBwcml2YXRlIGJvb2xlYW4gY29sZmlsbCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiByb3dmaWxsID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgVGRUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gQ29udGFpbmVyVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGNoaWxkIGNvbXBvbmVudCB0byB0aGlzIHBhcmVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKENvbXBvbmVudCBjb21wb25lbnQsIE9iamVjdCBjb25zdHJhaW50cykgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gYWRkIG15IGNoaWxkIGNvbXBvbmVudCB0byB0aGUgbGF5b3V0IG1hbmFnZXIKLSAgICAgICAgVHJUYWcgdGFnID0gKFRyVGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoIFRyVGFnLmNsYXNzICk7Ci0gICAgICAgIGlmICh0YWcgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCAidGhpcyB0YWcgbXVzdCBiZSBuZXN0ZWQgd2l0aGluIGEgPHRyPiB0YWciICk7Ci0gICAgICAgIH0KLSAgICAgICAgdGFnLmFkZENlbGwoY29tcG9uZW50LCBjcmVhdGVDb25zdHJhaW50cygpKTsKLSAgICB9Ci0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhmaW5hbCBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0gICAgfQotCi0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBob3Jpem9udGFsIGFsaWdubWVudCB0byBhIGNhc2UgaW5zZW5zaXRpdmUgdmFsdWUgb2Yge0xFRlQsIENFTlRFUiwgUklHSFR9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWxpZ24oU3RyaW5nIGFsaWduKSB7Ci0gICAgICAgIHRoaXMuYWxpZ24gPSBhbGlnbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2ZXJ0aWNhbCBhbGlnbm1lbnQgdG8gYSBjYXNlIGluc2Vuc2l0aXZlIHZhbHVlIG9mIHtUT1AsIE1JRERMRSwgQk9UVE9NfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlnbihTdHJpbmcgdmFsaWduKSB7Ci0gICAgICAgIHRoaXMudmFsaWduID0gdmFsaWduOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgdGhhdCB0aGlzIGNlbGwgc2hvdWxkIHNwYW4uIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb2xzcGFuKGludCBjb2xzcGFuKSB7Ci0gICAgICAgIHRoaXMuY29sc3BhbiA9IGNvbHNwYW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIHJvd3MgdGhhdCB0aGlzIGNlbGwgc2hvdWxkIHNwYW4uIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSb3dzcGFuKGludCByb3dzcGFuKSB7Ci0gICAgICAgIHRoaXMucm93c3BhbiA9IHJvd3NwYW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29sZmlsbC4KLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbGZpbGwoKSB7Ci0gICAgICAgIHJldHVybiBjb2xmaWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJvd2ZpbGwuCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNSb3dmaWxsKCkgewotICAgICAgICByZXR1cm4gcm93ZmlsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29sdW1uIHNob3VsZCBhbGxvdyBpdHMgY29tcG9uZW50IHRvIHN0cmV0Y2ggdG8gZmlsbCB0aGUgc3BhY2UgYXZhaWxhYmxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29sZmlsbChib29sZWFuIGNvbGZpbGwpIHsKLSAgICAgICAgdGhpcy5jb2xmaWxsID0gY29sZmlsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgb3Igbm90IHRoaXMgcm93IHNob3VsZCBhbGxvdyBpdHMgY29tcG9uZW50IHRvIHN0cmV0Y2ggdG8gZmlsbCB0aGUgc3BhY2UgYXZhaWxhYmxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um93ZmlsbChib29sZWFuIHJvd2ZpbGwpIHsKLSAgICAgICAgdGhpcy5yb3dmaWxsID0gcm93ZmlsbDsKLSAgICB9Ci0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBjb25zdHJhaW50cyBvYmplY3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgR3JpZEJhZ0NvbnN0cmFpbnRzIGNyZWF0ZUNvbnN0cmFpbnRzKCkgewotICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgYW5zd2VyID0gbmV3IEdyaWRCYWdDb25zdHJhaW50cygpOwotICAgICAgICBhbnN3ZXIuYW5jaG9yID0gZ2V0QW5jaG9yKCk7Ci0gICAgICAgIGlmIChjb2xzcGFuIDwgMSkgewotICAgICAgICAgICAgY29sc3BhbiA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJvd3NwYW4gPCAxKSB7Ci0gICAgICAgICAgICByb3dzcGFuID0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNDb2xmaWxsKCkpICB7Ci0gICAgICAgICAgICBhbnN3ZXIuZmlsbCA9IGlzUm93ZmlsbCgpCi0gICAgICAgICAgICAgICAgPyBHcmlkQmFnQ29uc3RyYWludHMuQk9USAotICAgICAgICAgICAgICAgIDogR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhbnN3ZXIuZmlsbCA9IGlzUm93ZmlsbCgpCi0gICAgICAgICAgICAgICAgPyBHcmlkQmFnQ29uc3RyYWludHMuVkVSVElDQUwKLSAgICAgICAgICAgICAgICA6IEdyaWRCYWdDb25zdHJhaW50cy5OT05FOwotICAgICAgICB9Ci0gICAgICAgIGFuc3dlci53ZWlnaHR4ID0gMC4yOwotICAgICAgICBhbnN3ZXIud2VpZ2h0eSA9IDA7Ci0gICAgICAgIGFuc3dlci5ncmlkd2lkdGggPSBjb2xzcGFuOwotICAgICAgICBhbnN3ZXIuZ3JpZGhlaWdodCA9IHJvd3NwYW47Ci0gICAgICAgIHJldHVybiBhbnN3ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgR3JpZEJhZ0NvbnN0cmFpbnRzIGVudW1lcmF0aW9uIGZvciBhY2hvcgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgZ2V0QW5jaG9yKCkgewotICAgICAgICBib29sZWFuIGlzVG9wID0gInRvcCIuZXF1YWxzSWdub3JlQ2FzZSh2YWxpZ24pOwotICAgICAgICBib29sZWFuIGlzQm90dG9tID0gImJvdHRvbSIuZXF1YWxzSWdub3JlQ2FzZSh2YWxpZ24pOwotCi0gICAgICAgIGlmICgiY2VudGVyIi5lcXVhbHNJZ25vcmVDYXNlKGFsaWduKSkgewotICAgICAgICAgICAgaWYgKGlzVG9wKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGlzQm90dG9tKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdyaWRCYWdDb25zdHJhaW50cy5TT1VUSDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCJyaWdodCIuZXF1YWxzSWdub3JlQ2FzZShhbGlnbikpIHsKLSAgICAgICAgICAgIGlmIChpc1RvcCkgewotICAgICAgICAgICAgICAgIHJldHVybiBHcmlkQmFnQ29uc3RyYWludHMuTk9SVEhFQVNUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoaXNCb3R0b20pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR3JpZEJhZ0NvbnN0cmFpbnRzLlNPVVRIRUFTVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBHcmlkQmFnQ29uc3RyYWludHMuRUFTVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIGRlZmF1bHRzIHRvIGxlZnQKLSAgICAgICAgICAgIGlmIChpc1RvcCkgewotICAgICAgICAgICAgICAgIHJldHVybiBHcmlkQmFnQ29uc3RyYWludHMuTk9SVEhXRVNUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoaXNCb3R0b20pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR3JpZEJhZ0NvbnN0cmFpbnRzLlNPVVRIV0VTVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBHcmlkQmFnQ29uc3RyYWludHMuV0VTVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvVGl0bGVkQm9yZGVyVGFnLmphdmEgYi9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL1RpdGxlZEJvcmRlclRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmY2NjU3Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvVGl0bGVkQm9yZGVyVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmEuYXd0LkZvbnQ7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5Cb3JkZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLlRpdGxlZEJvcmRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIENyZWF0ZXMgYSB0aXRsZWQgYm9yZGVyLgotICogVGhlIGJvcmRlciB3aWxsIGVpdGhlciBiZSBleHBvcnRlZCBhcyBhIHZhcmlhYmxlIGRlZmluZWQgYnkgdGhlICd2YXInIGF0dHJpYnV0ZQotICogb3Igd2lsbCBiZSBzZXQgb24gdGhlIHBhcmVudCB3aWRnZXQncyBib3JkZXIgcHJvcGVydHkKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBUaXRsZWRCb3JkZXJUYWcgZXh0ZW5kcyBCb3JkZXJUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUaXRsZWRCb3JkZXJUYWcuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGl0bGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdGl0bGVKdXN0aWZpY2F0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlUG9zaXRpb247Ci0gICAgcHJpdmF0ZSBCb3JkZXIgYm9yZGVyOwotICAgIHByaXZhdGUgRm9udCBmb250OwotICAgIHByaXZhdGUgQ29sb3IgY29sb3I7Ci0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhmaW5hbCBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiwgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAoIHRpdGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCJ0aXRsZSIpOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmRvVGFnKG91dHB1dCk7Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29sb3Igb2YgdGhlIHRpdGxlIGZvciB0aGlzIGJvcmRlci4gQ2FuIGJlIHNldCB2aWEgYSBuZXN0ZWQgPGNvbG9yPiB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29sb3IoQ29sb3IgY29sb3IpIHsKLSAgICAgICAgdGhpcy5jb2xvciA9IGNvbG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEZvbnQgdG8gYmUgdXNlZCBieSB0aGUgdGl0bGUuIENhbiBiZSBzZXQgdmlhIGEgbmVzdGVkIDxmb250PiB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Rm9udChGb250IGZvbnQpIHsKLSAgICAgICAgdGhpcy5mb250ID0gZm9udDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0aXRsZSB0ZXh0IGZvciB0aGlzIGJvcmRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGp1c3RpZmljYXRpb24gb2YgdGhlIHRpdGxlLiBUaGUgU3RyaW5nIGlzIGNhc2UgaW5zZW5zaXRpdmUuCi0gICAgICogUG9zc2libGUgdmFsdWVzIGFyZSB7TEVGVCwgQ0VOVEVSLCBSSUdIVCwgTEVBRElORywgVFJBSUxJTkd9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGVKdXN0aWZpY2F0aW9uKFN0cmluZyB0aXRsZUp1c3RpZmljYXRpb24pIHsKLSAgICAgICAgdGhpcy50aXRsZUp1c3RpZmljYXRpb24gPSB0aXRsZUp1c3RpZmljYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIHRpdGxlLiBUaGUgU3RyaW5nIGlzIGNhc2UgaW5zZW5zaXRpdmUuCi0gICAgICogUG9zc2libGUgdmFsdWVzIGFyZSB7QUJPVkVfVE9QLCBUT1AsIEJFTE9XX1RPUCwgQUJPVkVfQk9UVE9NLCBCT1RUT00sIEJFTE9XX0JPVFRPTX0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZVBvc2l0aW9uKFN0cmluZyB0aXRsZVBvc2l0aW9uKSB7Ci0gICAgICAgIHRoaXMudGl0bGVQb3NpdGlvbiA9IHRpdGxlUG9zaXRpb247Ci0gICAgfQotCi0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBCb3JkZXIgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJvcmRlciBjcmVhdGVCb3JkZXIoKSB7Ci0gICAgICAgIGlmIChib3JkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHRpdGxlSnVzdGlmaWNhdGlvbiAhPSBudWxsICYmIHRpdGxlUG9zaXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBqdXN0aWZpY2F0aW9uID0gYXNUaXRsZUp1c3RpZmljYXRpb24odGl0bGVKdXN0aWZpY2F0aW9uKTsKLSAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBhc1RpdGxlUG9zaXRpb24odGl0bGVQb3NpdGlvbik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZm9udCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb2xvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQm9yZGVyRmFjdG9yeS5jcmVhdGVUaXRsZWRCb3JkZXIoYm9yZGVyLCB0aXRsZSwganVzdGlmaWNhdGlvbiwgcG9zaXRpb24sIGZvbnQsIGNvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihib3JkZXIsIHRpdGxlLCBqdXN0aWZpY2F0aW9uLCBwb3NpdGlvbiwgZm9udCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKGJvcmRlciwgdGl0bGUsIGp1c3RpZmljYXRpb24sIHBvc2l0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBCb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihib3JkZXIsIHRpdGxlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQm9yZGVyRmFjdG9yeS5jcmVhdGVUaXRsZWRCb3JkZXIodGl0bGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGVudW1lcmF0aW9uIGZvciB0aGUgdGl0bGUganVzdGlmaWNhdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgYXNUaXRsZUp1c3RpZmljYXRpb24oU3RyaW5nIHRleHQpIHsKLSAgICAgICAgaWYgKHRleHQuZXF1YWxzSWdub3JlQ2FzZSgiTEVGVCIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVGl0bGVkQm9yZGVyLkxFRlQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJDRU5URVIiKSkgewotICAgICAgICAgICAgcmV0dXJuIFRpdGxlZEJvcmRlci5DRU5URVI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJSSUdIVCIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVGl0bGVkQm9yZGVyLlJJR0hUOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRleHQuZXF1YWxzSWdub3JlQ2FzZSgiTEVBRElORyIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVGl0bGVkQm9yZGVyLkxFQURJTkc7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJUUkFJTElORyIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVGl0bGVkQm9yZGVyLlRSQUlMSU5HOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFRpdGxlZEJvcmRlci5ERUZBVUxUX0pVU1RJRklDQVRJT047Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBlbnVtZXJhdGlvbiBmb3IgdGhlIHRpdGxlIHBvc2l0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBhc1RpdGxlUG9zaXRpb24oU3RyaW5nIHRleHQpIHsKLSAgICAgICAgaWYgKHRleHQuZXF1YWxzSWdub3JlQ2FzZSgiQUJPVkVfVE9QIikpIHsKLSAgICAgICAgICAgIHJldHVybiBUaXRsZWRCb3JkZXIuQUJPVkVfVE9QOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRleHQuZXF1YWxzSWdub3JlQ2FzZSgiVE9QIikpIHsKLSAgICAgICAgICAgIHJldHVybiBUaXRsZWRCb3JkZXIuVE9QOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRleHQuZXF1YWxzSWdub3JlQ2FzZSgiQkVMT1dfVE9QIikpIHsKLSAgICAgICAgICAgIHJldHVybiBUaXRsZWRCb3JkZXIuQkVMT1dfVE9QOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRleHQuZXF1YWxzSWdub3JlQ2FzZSgiQUJPVkVfQk9UVE9NIikpIHsKLSAgICAgICAgICAgIHJldHVybiBUaXRsZWRCb3JkZXIuQUJPVkVfQk9UVE9NOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRleHQuZXF1YWxzSWdub3JlQ2FzZSgiQk9UVE9NIikpIHsKLSAgICAgICAgICAgIHJldHVybiBUaXRsZWRCb3JkZXIuQk9UVE9NOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRleHQuZXF1YWxzSWdub3JlQ2FzZSgiQkVMT1dfQk9UVE9NIikpIHsKLSAgICAgICAgICAgIHJldHVybiBUaXRsZWRCb3JkZXIuQkVMT1dfQk9UVE9NOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFRpdGxlZEJvcmRlci5ERUZBVUxUX1BPU0lUSU9OOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9UclRhZy5qYXZhIGIvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9UclRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWQ4MGJjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvVHJUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50czsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nLmltcGwuQ2VsbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgdGFidWxhciByb3cgaW5zaWRlIGEgJmx0O3RhYmxlTGF5b3V0Jmd0OyB0YWcgd2hpY2ggbWltaWNrcyB0aGUKLSAqICZsdDt0ciZndDsgSFRNTCB0YWcuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjcgJAotICovCi1wdWJsaWMgY2xhc3MgVHJUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUclRhZy5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIFRhYmxlTGF5b3V0VGFnIHRhYmxlTGF5b3V0VGFnOwotICAgIHByaXZhdGUgTGlzdCBjZWxscyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIGludCByb3dJbmRleDsKLQotICAgIHB1YmxpYyBUclRhZygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbmV3IGNlbGwgdG8gdGhpcyByb3cKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDZWxsKENvbXBvbmVudCBjb21wb25lbnQsIEdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50cykgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgY29uc3RyYWludHMuZ3JpZHggPSBjZWxscy5zaXplKCk7Ci0gICAgICAgIGNlbGxzLmFkZChuZXcgQ2VsbChjb25zdHJhaW50cywgY29tcG9uZW50KSk7Ci0gICAgfQotCi0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoZmluYWwgWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgdGFibGVMYXlvdXRUYWcgPSAoVGFibGVMYXlvdXRUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyggVGFibGVMYXlvdXRUYWcuY2xhc3MgKTsKLSAgICAgICAgaWYgKHRhYmxlTGF5b3V0VGFnID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggInRoaXMgdGFnIG11c3QgYmUgbmVzdGVkIHdpdGhpbiBhIDx0YWJsZUxheW91dD4gdGFnIiApOwotICAgICAgICB9Ci0gICAgICAgIHJvd0luZGV4ID0gdGFibGVMYXlvdXRUYWcubmV4dFJvd0luZGV4KCk7Ci0gICAgICAgIGNlbGxzLmNsZWFyKCk7Ci0KLSAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotCi0gICAgICAgIC8vIG5vdyBpdGVyYXRlIHRocm91Z2ggdGhlIHJvd3MgYW5kIGFkZCBlYWNoIG9uZSB0byB0aGUgbGF5b3V0Li4uCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGNlbGxzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIENlbGwgY2VsbCA9IChDZWxsKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBjID0gY2VsbC5nZXRDb25zdHJhaW50cygpOwotCi0gICAgICAgICAgICAvLyBhcmUgd2UgdGhlIGxhc3QgY2VsbCBpbiB0aGUgcm93Ci0gICAgICAgICAgICBpZiAoIGl0ZXIuaGFzTmV4dCgpICkgewotICAgICAgICAgICAgICAgIC8vIG5vdCBsYXN0IGluIHJvdwotICAgICAgICAgICAgICAgIGMuZ3JpZHdpZHRoID0gR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTEFUSVZFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZW5kIG9mIHJvdwotICAgICAgICAgICAgICAgIGMuZ3JpZHdpZHRoID0gR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGMuZ3JpZHkgPSByb3dJbmRleDsKLQotICAgICAgICAgICAgLy8gbm93IGxldHMgYWRkIHRoZSBjZWxsIHRvIHRoZSB0YWJsZQotICAgICAgICAgICAgdGFibGVMYXlvdXRUYWcuYWRkQ2VsbChjZWxsKTsKLSAgICAgICAgfQotICAgICAgICBjZWxscy5jbGVhcigpOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHJvdyBpbmRleCBvZiB0aGlzIHJvdwotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Um93SW5kZXgoKSB7Ci0gICAgICAgIHJldHVybiByb3dJbmRleDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvV2luZG93TGlzdGVuZXJUYWcuamF2YSBiL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvV2luZG93TGlzdGVuZXJUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYwYTQxMy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL1dpbmRvd0xpc3RlbmVyVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5TY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBDcmVhdGVzIGEgV2luZG93TGlzdGVuZXIgd2hpY2ggaXMgYXR0YWNoZWQgdG8gaXRzIHBhcmVudCB3aW5kb3cgY29udHJvbCB3aGljaCB3aWxsIGludm9rZQotICogbmFtZWQgSmVsbHkgc2NyaXB0cyBhcyB3aW5kb3cgZXZlbnRzIGFyZSBmaXJlZCwgb3Igd2lsbCBpbnZva2UgaXRzIGJvZHkgaWYgdGhlcmUgaXMgbm8gc2NyaXB0Ci0gKiBzcGVjaWZpZWQgZm9yIHRoZSBuYW1lZCBldmVudCB0eXBlLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS43ICQKLSAqLwotcHVibGljIGNsYXNzIFdpbmRvd0xpc3RlbmVyVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coV2luZG93TGlzdGVuZXJUYWcuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyOwotICAgIHByaXZhdGUgU2NyaXB0IGFjdGl2YXRlZDsKLSAgICBwcml2YXRlIFNjcmlwdCBjbG9zZWQ7Ci0gICAgcHJpdmF0ZSBTY3JpcHQgY2xvc2luZzsKLSAgICBwcml2YXRlIFNjcmlwdCBkZWFjdGl2YXRlZDsKLSAgICBwcml2YXRlIFNjcmlwdCBkZWljb25pZmllZDsKLSAgICBwcml2YXRlIFNjcmlwdCBpY29uaWZpZWQ7Ci0gICAgcHJpdmF0ZSBTY3JpcHQgb3BlbmVkOwotCi0gICAgcHVibGljIFdpbmRvd0xpc3RlbmVyVGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhmaW5hbCBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotCi0gICAgICAgIC8vIG5vdyBsZXRzIGFkZCB0aGlzIGFjdGlvbiB0byBpdHMgcGFyZW50IGlmIHdlIGhhdmUgb25lCi0gICAgICAgIENvbXBvbmVudFRhZyB0YWcgPSAoQ29tcG9uZW50VGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoIENvbXBvbmVudFRhZy5jbGFzcyApOwotICAgICAgICBpZiAoIHRhZyAhPSBudWxsICkgewotICAgICAgICAgICAgV2luZG93TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgV2luZG93TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2luZG93QWN0aXZhdGVkKFdpbmRvd0V2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaW52b2tlU2NyaXB0KCBvdXRwdXQsIGUsIGFjdGl2YXRlZCApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NlZChXaW5kb3dFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludm9rZVNjcmlwdCggb3V0cHV0LCBlLCBjbG9zZWQgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaW52b2tlU2NyaXB0KCBvdXRwdXQsIGUsIGNsb3NpbmcgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aW5kb3dEZWFjdGl2YXRlZChXaW5kb3dFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludm9rZVNjcmlwdCggb3V0cHV0LCBlLCBkZWFjdGl2YXRlZCApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd0RlaWNvbmlmaWVkKFdpbmRvd0V2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaW52b2tlU2NyaXB0KCBvdXRwdXQsIGUsIGRlaWNvbmlmaWVkICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2luZG93SWNvbmlmaWVkKFdpbmRvd0V2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaW52b2tlU2NyaXB0KCBvdXRwdXQsIGUsIGljb25pZmllZCApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd09wZW5lZChXaW5kb3dFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludm9rZVNjcmlwdCggb3V0cHV0LCBlLCBvcGVuZWQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgdGFnLmFkZFdpbmRvd0xpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gdXNlIHRvIGV4cG9zZSB0aGUgRXZlbnQgb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgU2NyaXB0IHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIHdpbmRvdyBpcyBhY3RpdmF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aXZhdGVkKFNjcmlwdCBhY3RpdmF0ZWQpIHsKLSAgICAgICAgdGhpcy5hY3RpdmF0ZWQgPSBhY3RpdmF0ZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgU2NyaXB0IHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIHdpbmRvdyBpcyBjbG9zZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xvc2VkKFNjcmlwdCBjbG9zZWQpIHsKLSAgICAgICAgdGhpcy5jbG9zZWQgPSBjbG9zZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgU2NyaXB0IHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIHdpbmRvdyBpcyBjbG9zaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsb3NpbmcoU2NyaXB0IGNsb3NpbmcpIHsKLSAgICAgICAgdGhpcy5jbG9zaW5nID0gY2xvc2luZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBTY3JpcHQgdG8gYmUgZXhlY3V0ZWQgd2hlbiB0aGUgd2luZG93IGlzIGRlYWN0aXZhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlYWN0aXZhdGVkKFNjcmlwdCBkZWFjdGl2YXRlZCkgewotICAgICAgICB0aGlzLmRlYWN0aXZhdGVkID0gZGVhY3RpdmF0ZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgU2NyaXB0IHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIHdpbmRvdyBpcyBkZWljb25pZmllZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWljb25pZmllZChTY3JpcHQgZGVpY29uaWZpZWQpIHsKLSAgICAgICAgdGhpcy5kZWljb25pZmllZCA9IGRlaWNvbmlmaWVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIFNjcmlwdCB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSB3aW5kb3cgaXMgaWNvbmlmaWVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEljb25pZmllZChTY3JpcHQgaWNvbmlmaWVkKSB7Ci0gICAgICAgIHRoaXMuaWNvbmlmaWVkID0gaWNvbmlmaWVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIFNjcmlwdCB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSB3aW5kb3cgaXMgb3BlbmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9wZW5lZChTY3JpcHQgb3BlbmVkKSB7Ci0gICAgICAgIHRoaXMub3BlbmVkID0gb3BlbmVkOwotICAgIH0KLQotCi0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHJvdGVjdGVkIHZvaWQgaW52b2tlU2NyaXB0KFhNTE91dHB1dCBvdXRwdXQsIFdpbmRvd0V2ZW50IGV2ZW50LCBTY3JpcHQgc2NyaXB0KSB7Ci0gICAgICAgIGlmICggdmFyICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAvLyBkZWZpbmUgYSB2YXJpYWJsZSBvZiB0aGUgZXZlbnQKLSAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUodmFyLCBldmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCBzY3JpcHQgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICBzY3JpcHQucnVuKGNvbnRleHQsIG91dHB1dCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gaW52b2tlIHRoZSBib2R5Ci0gICAgICAgICAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCAiQ2F1Z2h0IGV4Y2VwdGlvbiBwcm9jZXNzaW5nIHdpbmRvdyBldmVudDogIiArIGV2ZW50LCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvY29udmVydGVycy9Db2xvckNvbnZlcnRlci5qYXZhIGIvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9jb252ZXJ0ZXJzL0NvbG9yQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZDhmYjIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9jb252ZXJ0ZXJzL0NvbG9yQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nLmNvbnZlcnRlcnM7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5TeXN0ZW1Db2xvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuQ29udmVydGVyOwotCi0vKioKLSAqIEEgQ29udmVydGVyIHRoYXQgdHVybnMgU3RyaW5ncyBpbiB0aGUgZm9ybSAiI3V1dXV1dSIgKGFzIFJHQiB0cmlwbGUpCi0gKiBvciB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIHtAbGluayBDb2xvcn0tY29uc3RhbnRzIG9mIHRoZSBjbGFzcwotICoge0BsaW5rIENvbG9yfSBvciB7QGxpbmsgU3lzdGVtQ29sb3J9LgotICogICAgPHA+Ci0gKiAgICBUT0RPOiBwcm92aWRlIHN1cHBvcnQgb2YgQVJHQiBjb2xvcnMgYXMgd2VsbC48YnI+Ci0gKiBGdXR1cmU6IHByb3ZpZGUgc3VwcG9ydCBmb3IgY29sb3Itc3BhY2VzLCBpbmRleGVkIGNvbG9ycy4uLgotICogICAgICAgIChpbiBwYXJ0aWN1bGFyIHRoZW1lLWJhc2VkIGNvbG9ycykKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpwYXVsQGFjdGl2ZW1hdGgub3JnIj5QYXVsIExpYmJyZWNodDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogJAotICovCi1wdWJsaWMgY2xhc3MgQ29sb3JDb252ZXJ0ZXIgaW1wbGVtZW50cyBDb252ZXJ0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHVzYWdlVGV4dCA9Ci0gICAgICAgICJBIGNvbG9yIGlzIGVuY29kZWQgYXMgYSBqYXZhLmF3dC5Db2xvciBuYW1lIG9yIGEgI3h4eHh4eCB0cmlwbGUgb2YgaGV4LWJ5dGVzLiI7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGNvbnZlcnQoQ2xhc3MgdHlwZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcyA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAocy5sZW5ndGgoKSA8PSAxKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih1c2FnZVRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHMuY2hhckF0KDApID09ICcjJykgewotICAgICAgICAgICAgICAgIGlmIChzLmxlbmd0aCgpICE9IDcpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih1c2FnZVRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgY29sb3JWYWx1ZSA9IDA7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY29sb3JWYWx1ZSA9IEludGVnZXIucGFyc2VJbnQocy5zdWJzdHJpbmcoMSksIDE2KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvcihjb2xvclZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IHBhcnNlIFwiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIGFzIGFuIGhleGFkZWNpbWFsIG51bWJlcjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGEgY29sb3IgbmFtZQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNvdWxkIGl0IGJlIHRoaXMgaXMgYWxyZWFkeSBzb21ld2hlcmU6IGdldCB0aGUgdmFsdWUgb2YgIGEgc3RhdGljIGZpbmFsIGJ5IHN0cmluZwotICAgICAgICAgICAgICAgICAgICBGaWVsZCBmID0gU3lzdGVtQ29sb3IuY2xhc3MuZ2V0RmllbGQocyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFNb2RpZmllci5pc1N0YXRpYyhmLmdldE1vZGlmaWVycygpKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgIU1vZGlmaWVyLmlzRmluYWwoZi5nZXRNb2RpZmllcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFNb2RpZmllci5pc1B1YmxpYyhmLmdldE1vZGlmaWVycygpKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgIUNvbG9yLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZi5nZXRUeXBlKCkpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odXNhZ2VUZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKENvbG9yKSBmLmdldChTeXN0ZW1Db2xvci5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBwYXJzZSBcIiIgKyBzICsgIlwiIGFzIGEgY29sb3ItbmFtZTogIiArIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL2NvbnZlcnRlcnMvRGVidWdHcmFwaGljc0NvbnZlcnRlci5qYXZhIGIvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9jb252ZXJ0ZXJzL0RlYnVnR3JhcGhpY3NDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5YzNkYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL2NvbnZlcnRlcnMvRGVidWdHcmFwaGljc0NvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd2luZy5jb252ZXJ0ZXJzOwotCi1pbXBvcnQgamF2YXguc3dpbmcuRGVidWdHcmFwaGljczsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5Db252ZXJ0VXRpbHM7Ci0KLS8qKgotICogQSBDb252ZXJ0ZXIgdGhhdCB0dXJucyBTdHJpbmdzIGluIG9uZSBvZiB0aGUgY29uc3RhbnRzIG9mCi0gKiAgICB7QGxpbmsgRGVidWdHcmFwaGljc30gdG8gdGhlaXIgYXBwcm9wcmlhdGUgaW50ZWdlciBjb25zdGFudC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpwYXVsQGFjdGl2ZW1hdGgub3JnIj5QYXVsIExpYmJyZWNodDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogJAotICovCi1wdWJsaWMgY2xhc3MgRGVidWdHcmFwaGljc0NvbnZlcnRlciBpbXBsZW1lbnRzIENvbnZlcnRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdXNhZ2VUZXh0ID0KLSAgICAgICAgIkRlYnVnR3JhcGhpY3Mgb3B0aW9ucyBhcmUgc2V0IGFzIGEgXCJ8XCIgc2VwYXJhdGVkIGxpc3Qgb2Ygd29yZHMgdXNpbmcgb25lIG9mIHRoZSBjb25zdGFudHMgb2YgRGVidWdHcmFwaGljczogbG9nLCBmbGFzaCwgb3IgYnVmZmVyZWQuIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcigpIHsKLSAgICAgICAgQ29udmVydFV0aWxzLnJlZ2lzdGVyKAotICAgICAgICAgICAgbmV3IERlYnVnR3JhcGhpY3NDb252ZXJ0ZXIoKSwKLSAgICAgICAgICAgIGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKiogUGFydCBvZiB0aGUgQ29udmVydGVyIGludGVyZmFjZS4KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuQ29udmVydGVyI2NvbnZlcnQoamF2YS5sYW5nLkNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY29udmVydChDbGFzcyB0eXBlLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGNvbnZlcnQodmFsdWUpOwotICAgIH0KLSAgICAKLSAgICAvKiogVGhpcyBpcyBub3QgcGFydCBvZiB0aGUgY29udmVydGVyIGludGVyZmFjZSwgaXQncyBmb3IgdXNlIGJ5Ci0gICAgICogY2xhc3NlcyB0aGF0IGRvbid0IHVzZSBEZWJ1Z0dyYXBoaWNzQ29udmVydGVyIHRocm91Z2ggQmVhblV0aWxzLgotICAgICAqIEBwYXJhbSBmcm9tCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY29udmVydChPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSAwOwotICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0b2sgPQotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUudG9TdHJpbmcoKSwgIiwgXHR8IiwgZmFsc2UpOwotICAgICAgICAgICAgd2hpbGUgKHN0b2suaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRvayA9IHN0b2submV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0IHwgcmVjb2duaXplT3B0aW9uKHRvayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEludGVnZXIocmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IHJlY29nbml6ZU9wdGlvbihTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7Ci0KLSAgICAgICAgaWYgKCJsb2ciLmVxdWFscyh2YWx1ZSkgfHwgImxvZ19vcHRpb24iLmVxdWFscyh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBEZWJ1Z0dyYXBoaWNzLkxPR19PUFRJT047Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoImZsYXNoIi5lcXVhbHModmFsdWUpIHx8ICJmbGFzaF9vcHRpb24iLmVxdWFscyh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRGVidWdHcmFwaGljcy5GTEFTSF9PUFRJT047Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoImJ1ZmZlcmVkIi5lcXVhbHModmFsdWUpIHx8ICJidWZmZXJlZF9vcHRpb24iLmVxdWFscyh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBEZWJ1Z0dyYXBoaWNzLkJVRkZFUkVEX09QVElPTjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odXNhZ2VUZXh0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvY29udmVydGVycy9EaW1lbnNpb25Db252ZXJ0ZXIuamF2YSBiL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvY29udmVydGVycy9EaW1lbnNpb25Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlmMDFiYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL2NvbnZlcnRlcnMvRGltZW5zaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nLmNvbnZlcnRlcnM7Ci0KLWltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuQ29udmVydGVyOwotCi0vKioKLSAqIEEgQ29udmVydGVyIHRoYXQgdHVybnMgU3RyaW5ncyBpbiB0aGUgZm9ybSAid2lkdGgsIGhlaWdodCIgaW50byBEaW1lbnNpb24gb2JqZWN0cwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS43ICQKLSAqLwotcHVibGljIGNsYXNzIERpbWVuc2lvbkNvbnZlcnRlciBpbXBsZW1lbnRzIENvbnZlcnRlciB7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGNvbnZlcnQoQ2xhc3MgdHlwZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICggdmFsdWUgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gdmFsdWUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBkaW1lbnNpb25FbnVtID0gbmV3IFN0cmluZ1Rva2VuaXplciggdGV4dCwgIiwiICk7Ci0gICAgICAgICAgICBpbnQgd2lkdGggPSAwOwotICAgICAgICAgICAgaW50IGhlaWdodCA9IDA7Ci0gICAgICAgICAgICBpZiAoIGRpbWVuc2lvbkVudW0uaGFzTW9yZVRva2VucygpICkgewotICAgICAgICAgICAgICAgIHdpZHRoID0gcGFyc2VOdW1iZXIoIGRpbWVuc2lvbkVudW0ubmV4dFRva2VuKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICggZGltZW5zaW9uRW51bS5oYXNNb3JlVG9rZW5zKCkgKSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ID0gcGFyc2VOdW1iZXIoIGRpbWVuc2lvbkVudW0ubmV4dFRva2VuKCkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm93IGxldHMgcGFyc2UgdGhlIGRpbWVuc2lvbi4uLgotICAgICAgICAgICAgcmV0dXJuIG5ldyBEaW1lbnNpb24oIHdpZHRoLCBoZWlnaHQgKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IHBhcnNlTnVtYmVyKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHRleHQgPSB0ZXh0LnRyaW0oKTsKLSAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQodGV4dCk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9jb252ZXJ0ZXJzL1BvaW50Q29udmVydGVyLmphdmEgYi9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL2NvbnZlcnRlcnMvUG9pbnRDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1NzFjMC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL2NvbnZlcnRlcnMvUG9pbnRDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3dpbmcuY29udmVydGVyczsKLQotaW1wb3J0IGphdmEuYXd0LlBvaW50OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkNvbnZlcnRlcjsKLQotLyoqCi0gKiBBIENvbnZlcnRlciB0aGF0IHR1cm5zIFN0cmluZ3MgaW4gdGhlIGZvcm0gIngsIHkiIGludG8gUG9pbnQgb2JqZWN0cwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS43ICQKLSAqLwotcHVibGljIGNsYXNzIFBvaW50Q29udmVydGVyIGltcGxlbWVudHMgQ29udmVydGVyIHsKLQotICAgIHB1YmxpYyBPYmplY3QgY29udmVydChDbGFzcyB0eXBlLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKCB2YWx1ZSAhPSBudWxsICkgewotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSB2YWx1ZS50b1N0cmluZygpOwotICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHBvaW50RW51bSA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoIHRleHQsICIsIiApOwotICAgICAgICAgICAgaW50IHggPSAwOwotICAgICAgICAgICAgaW50IHkgPSAwOwotICAgICAgICAgICAgaWYgKCBwb2ludEVudW0uaGFzTW9yZVRva2VucygpICkgewotICAgICAgICAgICAgICAgIHggPSBwYXJzZU51bWJlciggcG9pbnRFbnVtLm5leHRUb2tlbigpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIHBvaW50RW51bS5oYXNNb3JlVG9rZW5zKCkgKSB7Ci0gICAgICAgICAgICAgICAgeSA9IHBhcnNlTnVtYmVyKCBwb2ludEVudW0ubmV4dFRva2VuKCkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm93IGxldHMgcGFyc2UgdGhlIFBvaW50Li4uCi0gICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50KCB4LCB5ICk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBwYXJzZU51bWJlcihTdHJpbmcgdGV4dCkgewotICAgICAgICB0ZXh0ID0gdGV4dC50cmltKCk7Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHRleHQpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvaW1wbC9DZWxsLmphdmEgYi9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL2ltcGwvQ2VsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWQ3MTIxLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvaW1wbC9DZWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nLmltcGw7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzOwotCi0vKioKLSAqIEEgc2ltcGxlIGNsYXNzIHRvIHJlcHJlc2VudCB0aGUgaW5mb3JtYXRpb24gZm9yIGEgc2luZ2xlIGNlbGwgaW4gYSB0YWJsZQotICogd2hlbiB1c2luZyB0aGUgR3JpZEJhZ0xheW91dAotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS43ICQKLSAqLwotcHVibGljIGNsYXNzIENlbGwgewotICAgIHByaXZhdGUgR3JpZEJhZ0NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzOwotICAgIHByaXZhdGUgQ29tcG9uZW50IGNvbXBvbmVudDsKLQotICAgIHB1YmxpYyBDZWxsKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBDZWxsKEdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50cywgQ29tcG9uZW50IGNvbXBvbmVudCkgewotICAgICAgICB0aGlzLmNvbnN0cmFpbnRzID0gY29uc3RyYWludHM7Ci0gICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbXBvbmVudC4KLSAgICAgKiBAcmV0dXJuIENvbXBvbmVudAotICAgICAqLwotICAgIHB1YmxpYyBDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkgewotICAgICAgICByZXR1cm4gY29tcG9uZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnN0cmFpbnRzLgotICAgICAqIEByZXR1cm4gR3JpZEJhZ0NvbnN0cmFpbnRzCi0gICAgICovCi0gICAgcHVibGljIEdyaWRCYWdDb25zdHJhaW50cyBnZXRDb25zdHJhaW50cygpIHsKLSAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbXBvbmVudC4KLSAgICAgKiBAcGFyYW0gY29tcG9uZW50IFRoZSBjb21wb25lbnQgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KENvbXBvbmVudCBjb21wb25lbnQpIHsKLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29uc3RyYWludHMuCi0gICAgICogQHBhcmFtIGNvbnN0cmFpbnRzIFRoZSBjb25zdHJhaW50cyB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50cyhHcmlkQmFnQ29uc3RyYWludHMgY29uc3RyYWludHMpIHsKLSAgICAgICAgdGhpcy5jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9pbXBsL0dyaWRCYWdDb25zdHJhaW50QmVhbi5qYXZhIGIvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9pbXBsL0dyaWRCYWdDb25zdHJhaW50QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDI1MzAyLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvaW1wbC9HcmlkQmFnQ29uc3RyYWludEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nLmltcGw7Ci0KLWltcG9ydCBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHM7Ci1pbXBvcnQgamF2YS5hd3QuSW5zZXRzOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNpbXBsZSAiYmVhbi13cmFwcGVyIiBmb3IgdGhlIHtAbGluayBHcmlkQmFnQ29uc3RyYWludHN9IGNsYXNzCi0gKiB3aGljaCBhbHNvIHRyYWNrcyB3ZXRoZXIgdmFsdWVzIGFyZSBzZXQgYWxsb3dpbmcgaW5oZXJpdGFuY2UKLSAqICAgICh1c2luZyB7QGxpbmsgc2V0QmFzZWRPbn0uCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86cGF1bEBhY3RpdmVtYXRoLm9yZyI+UGF1bCBMaWJicmVjaHQ8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246ICQKLSAqLwotcHVibGljIGNsYXNzIEdyaWRCYWdDb25zdHJhaW50QmVhbiBleHRlbmRzIEdyaWRCYWdDb25zdHJhaW50cyB7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZ3JpZHhTZXQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZ3JpZHlTZXQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZ3JpZHdpZHRoU2V0ID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGdyaWRoZWlnaHRTZXQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gd2VpZ2h0eFNldCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiB3ZWlnaHR5U2V0ID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlwYWR4U2V0ID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlwYWR5U2V0ID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGFuY2hvclNldCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBmaWxsU2V0ID0gZmFsc2U7Ci0KLSAgICAvKiogTG9nZ2luZyBvdXRwdXQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coR3JpZEJhZ0NvbnN0cmFpbnRCZWFuLmNsYXNzKTsKLQotICAgIC8qKiBlcnJvciBtZXNzYWdlICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElMTEVHQUxfQU5DSE9SX01TRyA9ICJBbmNob3IgbXVzdCBiZSBvbmUgb2YgIHRoZSBHcmlkQmFnTGF5b3V0IGNvbnN0YW50cyBmb3IgdGhlIGN1cnJlbnQgSmF2YSB2ZXJzaW9uLiI7Ci0KLSAgICBwdWJsaWMgR3JpZEJhZ0NvbnN0cmFpbnRCZWFuKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0R3JpZHgoKSB7Ci0gICAgICAgIHJldHVybiBncmlkeDsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0R3JpZHgoaW50IGdyaWR4KSB7Ci0gICAgICAgIHRoaXMuZ3JpZHggPSBncmlkeDsKLSAgICAgICAgdGhpcy5ncmlkeFNldCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRHcmlkeSgpIHsKLSAgICAgICAgcmV0dXJuIGdyaWR5OwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRHcmlkeShpbnQgZ3JpZHkpIHsKLSAgICAgICAgdGhpcy5ncmlkeSA9IGdyaWR5OwotICAgICAgICB0aGlzLmdyaWR5U2V0ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEdyaWR3aWR0aCgpIHsKLSAgICAgICAgcmV0dXJuIGdyaWR3aWR0aDsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0R3JpZHdpZHRoKGludCBncmlkd2lkdGgpIHsKLSAgICAgICAgdGhpcy5ncmlkd2lkdGggPSBncmlkd2lkdGg7Ci0gICAgICAgIHRoaXMuZ3JpZHdpZHRoU2V0ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEdyaWRoZWlnaHQoKSB7Ci0gICAgICAgIHJldHVybiBncmlkaGVpZ2h0OwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRHcmlkaGVpZ2h0KGludCBncmlkaGVpZ2h0KSB7Ci0gICAgICAgIHRoaXMuZ3JpZGhlaWdodCA9IGdyaWRoZWlnaHQ7Ci0gICAgICAgIHRoaXMuZ3JpZGhlaWdodFNldCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSBnZXRXZWlnaHR4KCkgewotICAgICAgICByZXR1cm4gd2VpZ2h0eDsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0V2VpZ2h0eChkb3VibGUgd2VpZ2h0eCkgewotICAgICAgICB0aGlzLndlaWdodHggPSB3ZWlnaHR4OwotICAgICAgICB0aGlzLndlaWdodHhTZXQgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBkb3VibGUgZ2V0V2VpZ2h0eSgpIHsKLSAgICAgICAgcmV0dXJuIHdlaWdodHk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldFdlaWdodHkoZG91YmxlIHdlaWdodHkpIHsKLSAgICAgICAgdGhpcy53ZWlnaHR5ID0gd2VpZ2h0eTsKLSAgICAgICAgdGhpcy53ZWlnaHR5U2V0ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldElwYWR4KCkgewotICAgICAgICByZXR1cm4gaXBhZHg7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldElwYWR4KGludCBpcGFkeCkgewotICAgICAgICB0aGlzLmlwYWR4ID0gaXBhZHg7Ci0gICAgICAgIHRoaXMuaXBhZHhTZXQgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0SXBhZHkoKSB7Ci0gICAgICAgIHJldHVybiBpcGFkeTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0SXBhZHkoaW50IGlwYWR5KSB7Ci0gICAgICAgIHRoaXMuaXBhZHkgPSBpcGFkeTsKLSAgICAgICAgdGhpcy5pcGFkeVNldCA9IHRydWU7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogcHJvdmlkZSBiZXR0ZXIuIGluc2V0c3RvcCwgaW5zZXRzYm90dG9tID8/Ci0gICAgcHVibGljIEluc2V0cyBnZXRJbnNldHMoKSB7Ci0gICAgICAgIHJldHVybiBpbnNldHM7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldEluc2V0cyhJbnNldHMgaW5zZXRzKSB7Ci0gICAgICAgIHRoaXMuaW5zZXRzID0gaW5zZXRzOwotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIHRoZSBsb3dlci1jYXNlIHZhcmlhbnQgb2YgdGhlIGNvbnN0YW50LW5hbWUKLSAgICAgICAgKiAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdG9yZWQge0BsaW5rICNhbmNob3J9IGF0dHJpYnV0ZS4KLSAgICAgICAgKgotICAgICAgICAqICAgIEBzZWUgICAgI2FuY2hvcgotICAgICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5jaG9yKCkgewotICAgICAgICBzd2l0Y2ggKHRoaXMuYW5jaG9yKSB7Ci0gICAgICAgICAgICBjYXNlIENFTlRFUiA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJjZW50ZXIiOwotICAgICAgICAgICAgY2FzZSBOT1JUSCA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJub3J0aCI7Ci0gICAgICAgICAgICBjYXNlIE5PUlRIRUFTVCA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJub3J0aGVhc3QiOwotICAgICAgICAgICAgY2FzZSBFQVNUIDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImVhc3QiOwotICAgICAgICAgICAgY2FzZSBTT1VUSEVBU1QgOgotICAgICAgICAgICAgICAgIHJldHVybiAic291dGhlYXN0IjsKLSAgICAgICAgICAgIGNhc2UgU09VVEggOgotICAgICAgICAgICAgICAgIHJldHVybiAic291dGgiOwotICAgICAgICAgICAgY2FzZSBTT1VUSFdFU1QgOgotICAgICAgICAgICAgICAgIHJldHVybiAic291dGh3ZXN0IjsKLSAgICAgICAgICAgIGNhc2UgV0VTVCA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ3ZXN0IjsKLSAgICAgICAgICAgIGNhc2UgTk9SVEhXRVNUIDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIm5vcnRod2VzdCI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGhpcy5hbmNob3IgPT0gZ2V0QnlSZWZsZWN0aW9uKCJMSU5FX1NUQVJUIikpCi0gICAgICAgICAgICByZXR1cm4gImxpbmVfc3RhcnQiOwotICAgICAgICBlbHNlIGlmICh0aGlzLmFuY2hvciA9PSBnZXRCeVJlZmxlY3Rpb24oIkxJTkVfRU5EIikpCi0gICAgICAgICAgICByZXR1cm4gImxpbmVfZW5kIjsKLSAgICAgICAgZWxzZSBpZiAodGhpcy5hbmNob3IgPT0gZ2V0QnlSZWZsZWN0aW9uKCJQQUdFX1NUQVJUIikpCi0gICAgICAgICAgICByZXR1cm4gInBhZ2Vfc3RhcnQiOwotICAgICAgICBlbHNlIGlmICh0aGlzLmFuY2hvciA9PSBnZXRCeVJlZmxlY3Rpb24oIlBBR0VfRU5EIikpCi0gICAgICAgICAgICByZXR1cm4gInBhZ2VfZW5kIjsKLSAgICAgICAgZWxzZSBpZiAodGhpcy5hbmNob3IgPT0gZ2V0QnlSZWZsZWN0aW9uKCJGSVJTVF9MSU5FX1NUQVJUIikpCi0gICAgICAgICAgICByZXR1cm4gImZpcnN0X2xpbmVfc3RhcnQiOwotICAgICAgICBlbHNlIGlmICh0aGlzLmFuY2hvciA9PSBnZXRCeVJlZmxlY3Rpb24oIkZJUlNUX0xJTkVfRU5EIikpCi0gICAgICAgICAgICByZXR1cm4gImZpcnN0X2xpbmVfZW5kIjsKLSAgICAgICAgZWxzZSBpZiAodGhpcy5hbmNob3IgPT0gZ2V0QnlSZWZsZWN0aW9uKCJMQVNUX0xJTkVfU1RBUlQiKSkKLSAgICAgICAgICAgIHJldHVybiAibGFzdF9saW5lX3N0YXJ0IjsKLSAgICAgICAgZWxzZSBpZiAodGhpcy5hbmNob3IgPT0gIGdldEJ5UmVmbGVjdGlvbigiTEFTVF9MSU5FX0VORCIpKQotICAgICAgICAgICAgcmV0dXJuICJsYXN0X2xpbmVfZW5kIjsKLQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKElMTEVHQUxfQU5DSE9SX01TRyk7Ci0gICAgfQotCi0gICAgLyoqIEFjY2VwdHMgb25lIG9mIHRoZSBzdHJpbmdzIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgY29uc3RhbnRzCi0gICAgICAgICogYW5kIHNldHMgdGhlIHtAbGluayAjYW5jaG9yfSB2YWx1ZSBhY2NvcmRpbmdseS4KLSAgICAgICAgKiAgICBUaGUgYWNjZXB0ZWQgc3RyaW5ncyBhcmUgY2FzZS1pbnNlbnNpdGl2ZS4KLSAgICAgICAgKgotICAgICAgICAqICAgIEBzZWUgI2FuY2hvcgotICAgICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFuY2hvcihTdHJpbmcgYW5jaG9yU3RyaW5nKSB7Ci0gICAgICAgIFN0cmluZyBsY0FuY2hvclN0cmluZyA9IGFuY2hvclN0cmluZy50b0xvd2VyQ2FzZSgpOwotICAgICAgICBpZiAobGNBbmNob3JTdHJpbmcuZXF1YWxzKCJjZW50ZXIiKSkKLSAgICAgICAgICAgIHRoaXMuYW5jaG9yID0gQ0VOVEVSOwotICAgICAgICBlbHNlIGlmIChsY0FuY2hvclN0cmluZy5lcXVhbHMoIm5vcnRoIikpCi0gICAgICAgICAgICB0aGlzLmFuY2hvciA9IE5PUlRIOwotICAgICAgICBlbHNlIGlmIChsY0FuY2hvclN0cmluZy5lcXVhbHMoIm5vcnRoZWFzdCIpKQotICAgICAgICAgICAgdGhpcy5hbmNob3IgPSBOT1JUSEVBU1Q7Ci0gICAgICAgIGVsc2UgaWYgKGxjQW5jaG9yU3RyaW5nLmVxdWFscygiZWFzdCIpKQotICAgICAgICAgICAgdGhpcy5hbmNob3IgPSBFQVNUOwotICAgICAgICBlbHNlIGlmIChsY0FuY2hvclN0cmluZy5lcXVhbHMoInNvdXRoZWFzdCIpKQotICAgICAgICAgICAgdGhpcy5hbmNob3IgPSBTT1VUSEVBU1Q7Ci0gICAgICAgIGVsc2UgaWYgKGxjQW5jaG9yU3RyaW5nLmVxdWFscygic291dGgiKSkKLSAgICAgICAgICAgIHRoaXMuYW5jaG9yID0gU09VVEg7Ci0gICAgICAgIGVsc2UgaWYgKGxjQW5jaG9yU3RyaW5nLmVxdWFscygic291dGh3ZXN0IikpCi0gICAgICAgICAgICB0aGlzLmFuY2hvciA9IFNPVVRIV0VTVDsKLSAgICAgICAgZWxzZSBpZiAobGNBbmNob3JTdHJpbmcuZXF1YWxzKCJ3ZXN0IikpCi0gICAgICAgICAgICB0aGlzLmFuY2hvciA9IFdFU1Q7Ci0gICAgICAgIGVsc2UgaWYgKGxjQW5jaG9yU3RyaW5nLmVxdWFscygibm9ydGh3ZXN0IikpCi0gICAgICAgICAgICB0aGlzLmFuY2hvciA9IE5PUlRIV0VTVDsKLSAgICAgICAgZWxzZSBpZiAobGNBbmNob3JTdHJpbmcuZXF1YWxzKCJwYWdlX3N0YXJ0IikpCi0gICAgICAgICAgICB0aGlzLmFuY2hvciA9IGdldEJ5UmVmbGVjdGlvbigiUEFHRV9TVEFSVCIpOwotICAgICAgICBlbHNlIGlmIChsY0FuY2hvclN0cmluZy5lcXVhbHMoInBhZ2VfZW5kIikpCi0gICAgICAgICAgICB0aGlzLmFuY2hvciA9IGdldEJ5UmVmbGVjdGlvbigiUEFHRV9FTkQiKTsKLSAgICAgICAgZWxzZSBpZiAobGNBbmNob3JTdHJpbmcuZXF1YWxzKCJsaW5lX3N0YXJ0IikpCi0gICAgICAgICAgICB0aGlzLmFuY2hvciA9IGdldEJ5UmVmbGVjdGlvbigiTElORV9TVEFSVCIpOwotICAgICAgICBlbHNlIGlmIChsY0FuY2hvclN0cmluZy5lcXVhbHMoImxpbmVfZW5kIikpCi0gICAgICAgICAgICB0aGlzLmFuY2hvciA9IGdldEJ5UmVmbGVjdGlvbigiTElORV9FTkQiKTsKLSAgICAgICAgZWxzZSBpZiAobGNBbmNob3JTdHJpbmcuZXF1YWxzKCJmaXJzdF9saW5lX3N0YXJ0IikpCi0gICAgICAgICAgICB0aGlzLmFuY2hvciA9IGdldEJ5UmVmbGVjdGlvbigiRklSU1RfTElORV9TVEFSVCIpOwotICAgICAgICBlbHNlIGlmIChsY0FuY2hvclN0cmluZy5lcXVhbHMoImZpcnN0X2xpbmVfZW5kIikpCi0gICAgICAgICAgICB0aGlzLmFuY2hvciA9IGdldEJ5UmVmbGVjdGlvbigiRklSU1RfTElORV9FTkQiKTsKLSAgICAgICAgZWxzZSBpZiAobGNBbmNob3JTdHJpbmcuZXF1YWxzKCJsYXN0X2xpbmVfZW5kIikpCi0gICAgICAgICAgICB0aGlzLmFuY2hvciA9IGdldEJ5UmVmbGVjdGlvbigiTEFTVF9MSU5FX0VORCIpOwotICAgICAgICBlbHNlIGlmIChsY0FuY2hvclN0cmluZy5lcXVhbHMoImxhc3RfbGluZV9zdGFydCIpKQotICAgICAgICAgICAgdGhpcy5hbmNob3IgPSBnZXRCeVJlZmxlY3Rpb24oIkxBU1RfTElORV9TVEFSVCIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBbmNob3IgbXVzdCBiZSB0aGUgbmFtZSBvZiBvbmUgb2YgIHRoZSBHcmlkQmFnTGF5b3V0Q29uc3RhbnRzIChjYXNlIGRvZXNuJ3QgbWF0dGVyKTogY2VudGVyLCBub3J0aCwgbm9ydGhlYXN0LCBlYXN0LCBzb3V0aGVhc3QsIHNvdXRoLCBzb3V0aHdlc3QsIHdlc3QsIG9yIG5vcnRod2VzdC4iKTsKLSAgICAgICAgdGhpcy5hbmNob3JTZXQgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIHRoZSBsb3dlci1jYXNlIHZhcmlhbnQgb2YgdGhlIGNvbnN0YW50LW5hbWUKLSAgICAgICAgKiAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdG9yZWQge0BsaW5rICNmaWxsfSBhdHRyaWJ1dGUuCi0gICAgICAgICoKLSAgICAgICAgKiAgICBAc2VlICAgICNmaWxsCi0gICAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGaWxsKCkgewotICAgICAgICBzd2l0Y2ggKGZpbGwpIHsKLSAgICAgICAgICAgIGNhc2UgTk9ORSA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJub25lIjsKLSAgICAgICAgICAgIGNhc2UgSE9SSVpPTlRBTCA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJob3Jpem9udGFsIjsKLSAgICAgICAgICAgIGNhc2UgVkVSVElDQUwgOgotICAgICAgICAgICAgICAgIHJldHVybiAidmVydGljYWwiOwotICAgICAgICAgICAgY2FzZSBCT1RIIDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImJvdGgiOwotICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmlsbCBtdXN0IGJlIHRoZSBuYW1lIG9mIG9uZSBvZiAgdGhlIEdyaWRCYWdMYXlvdXRDb25zdGFudHM6IE5PTkUsIEhPUklaT05UQUwsIFZFUlRJQ0FMLCBCT1RILiIpOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKiBBY2NlcHRzIG9uZSBvZiB0aGUgc3RyaW5ncyB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGNvbnN0YW50cwotICAgICAgICAqIGFuZCBzZXRzIHRoZSB7QGxpbmsgI2ZpbGx9IHZhbHVlIGFjY29yZGluZ2x5LgotICAgICAgICAqICAgIFRoZSBhY2NlcHRlZCBzdHJpbmdzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLgotICAgICAgICAqCi0gICAgICAgICogICAgQHNlZSAjZmlsbAotICAgICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbGwoU3RyaW5nIGZpbGxTdHJpbmcpIHsKLSAgICAgICAgU3RyaW5nIGxjRmlsbFN0cmluZyA9IGZpbGxTdHJpbmcudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgaWYgKGxjRmlsbFN0cmluZy5lcXVhbHMoIm5vbmUiKSkKLSAgICAgICAgICAgIHRoaXMuZmlsbCA9IE5PTkU7Ci0gICAgICAgIGVsc2UgaWYgKGxjRmlsbFN0cmluZy5lcXVhbHMoImhvcml6b250YWwiKSkKLSAgICAgICAgICAgIHRoaXMuZmlsbCA9IEhPUklaT05UQUw7Ci0gICAgICAgIGVsc2UgaWYgKGxjRmlsbFN0cmluZy5lcXVhbHMoInZlcnRpY2FsIikpCi0gICAgICAgICAgICB0aGlzLmZpbGwgPSBWRVJUSUNBTDsKLSAgICAgICAgZWxzZSBpZiAobGNGaWxsU3RyaW5nLmVxdWFscygiYm90aCIpKQotICAgICAgICAgICAgdGhpcy5maWxsID0gQk9USDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmlsbCBtdXN0IGJlIHRoZSBuYW1lIG9mIG9uZSBvZiAgdGhlIEdyaWRCYWdMYXlvdXRDb25zdGFudHMgKGNhc2UgZG9lcyBub3QgbWF0dGVyKTogTk9ORSwgSE9SSVpPTlRBTCwgVkVSVElDQUwsIEJPVEguIik7Ci0gICAgICAgIHRoaXMuZmlsbFNldCA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqIFJlYWRzIHRoZSB2YWx1ZXMgaW4gdGhlIGdpdmVuIGdyaWQtYmFnLWNvbnN0cmFpbnQtYmVhbiB0aGF0IGFyZSBzZXQgYW5kIHNldHMKLSAgICAgICAgKiB0aGVtIGluIHRoaXMgb2JqZWN0IGlmIHRoZXkgaGF2ZSBub3QgYmVlbiBzZXQgeWV0LgotICAgICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VkT24oR3JpZEJhZ0NvbnN0cmFpbnRCZWFuIGZyb20pIHsKLSAgICAgICAgaWYgKCFncmlkeFNldCAmJiBmcm9tLmdyaWR4U2V0KSB7Ci0gICAgICAgICAgICBncmlkeCA9IGZyb20uZ3JpZHg7Ci0gICAgICAgICAgICB0aGlzLmdyaWR4U2V0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWdyaWR5U2V0ICYmIGZyb20uZ3JpZHlTZXQpIHsKLSAgICAgICAgICAgIGdyaWR5ID0gZnJvbS5ncmlkeTsKLSAgICAgICAgICAgIHRoaXMuZ3JpZHlTZXQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZ3JpZHdpZHRoU2V0ICYmIGZyb20uZ3JpZHdpZHRoU2V0KSB7Ci0gICAgICAgICAgICBncmlkd2lkdGggPSBmcm9tLmdyaWR3aWR0aDsKLSAgICAgICAgICAgIHRoaXMuZ3JpZHdpZHRoU2V0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWdyaWRoZWlnaHRTZXQgJiYgZnJvbS5ncmlkaGVpZ2h0U2V0KSB7Ci0gICAgICAgICAgICBncmlkaGVpZ2h0ID0gZnJvbS5ncmlkaGVpZ2h0OwotICAgICAgICAgICAgdGhpcy5ncmlkaGVpZ2h0U2V0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXdlaWdodHhTZXQgJiYgZnJvbS53ZWlnaHR4U2V0KSB7Ci0gICAgICAgICAgICB3ZWlnaHR4ID0gZnJvbS53ZWlnaHR4OwotICAgICAgICAgICAgdGhpcy53ZWlnaHR4U2V0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXdlaWdodHlTZXQgJiYgZnJvbS53ZWlnaHR5U2V0KSB7Ci0gICAgICAgICAgICB3ZWlnaHR5ID0gZnJvbS53ZWlnaHR5OwotICAgICAgICAgICAgdGhpcy53ZWlnaHR5U2V0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWlwYWR4U2V0ICYmIGZyb20uaXBhZHhTZXQpIHsKLSAgICAgICAgICAgIGlwYWR4ID0gZnJvbS5pcGFkeDsKLSAgICAgICAgICAgIHRoaXMuaXBhZHhTZXQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghaXBhZHlTZXQgJiYgZnJvbS5pcGFkeVNldCkgewotICAgICAgICAgICAgaXBhZHkgPSBmcm9tLmlwYWR5OwotICAgICAgICAgICAgdGhpcy5pcGFkeVNldCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFmaWxsU2V0ICYmIGZyb20uZmlsbFNldCkgewotICAgICAgICAgICAgZmlsbCA9IGZyb20uZmlsbDsKLSAgICAgICAgICAgIHRoaXMuZmlsbFNldCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFhbmNob3JTZXQgJiYgZnJvbS5hbmNob3JTZXQpIHsKLSAgICAgICAgICAgIGFuY2hvciA9IGZyb20uYW5jaG9yOwotICAgICAgICAgICAgdGhpcy5hbmNob3JTZXQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJHcmlkQmFnQ29uc3RyYWludEJlYW5bIgotICAgICAgICAgICAgKyAiZ3JpZHg9IgotICAgICAgICAgICAgKyBncmlkeAotICAgICAgICAgICAgKyAiLCBncmlkeT0iCi0gICAgICAgICAgICArIGdyaWR5Ci0gICAgICAgICAgICArICIsIGdyaWR3aWR0aD0iCi0gICAgICAgICAgICArIGdyaWR3aWR0aAotICAgICAgICAgICAgKyAiLCBncmlkaGVpZ2h0PSIKLSAgICAgICAgICAgICsgZ3JpZGhlaWdodAotICAgICAgICAgICAgKyAiLCB3ZWlnaHR4PSIKLSAgICAgICAgICAgICsgd2VpZ2h0eAotICAgICAgICAgICAgKyAiLCB3ZWlnaHR5PSIKLSAgICAgICAgICAgICsgd2VpZ2h0eQotICAgICAgICAgICAgKyAiLCBpcGFkeD0iCi0gICAgICAgICAgICArIGlwYWR4Ci0gICAgICAgICAgICArICIsIGlwYWR5PSIKLSAgICAgICAgICAgICsgaXBhZHkKLSAgICAgICAgICAgICsgIiwgYW5jaG9yPSIKLSAgICAgICAgICAgICsgZ2V0QW5jaG9yKCkKLSAgICAgICAgICAgICsgIiwgZmlsbD0iCi0gICAgICAgICAgICArIGdldEZpbGwoKQotICAgICAgICAgICAgKyAiLCBpbnNldHM9IgotICAgICAgICAgICAgKyBpbnNldHMKLSAgICAgICAgICAgICsgIl0iOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldEJ5UmVmbGVjdGlvbihTdHJpbmcgZmllbGQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpZWxkIGYgPSBnZXRDbGFzcygpLmdldEZpZWxkKGZpZWxkKTsKLSAgICAgICAgICAgIEludGVnZXIgcnYgPSAoSW50ZWdlcikgZi5nZXQodGhpcyk7Ci0gICAgICAgICAgICByZXR1cm4gcnYuaW50VmFsdWUoKTsKLSAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihJTExFR0FMX0FOQ0hPUl9NU0cpOwotICAgICAgICB9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKElMTEVHQUxfQU5DSE9SX01TRyk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKElMTEVHQUxfQU5DSE9SX01TRyk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihJTExFR0FMX0FOQ0hPUl9NU0cpOwotICAgICAgICB9Ci0gICAgfQotCi19IC8vIGNsYXNzIEdyaWRCYWdDb25zdHJhaW50c0JlYW4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvaW1wbC9wYWNrYWdlLmh0bWwgYi9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL2ltcGwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWFiY2ViLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvaW1wbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci0KLSAgPHA+Ci0gIAlJbXBsZW1lbnRhdGlvbiBjbGFzc2VzIGZvciB0aGUgSmVsbHlTd2luZyBsaWJyYXJ5Ci0gIDwvcD4KLSAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL21vZGVsL0V4cHJlc3Npb25UYWJsZUNvbHVtbi5qYXZhIGIvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9tb2RlbC9FeHByZXNzaW9uVGFibGVDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2MzhhYS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL21vZGVsL0V4cHJlc3Npb25UYWJsZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3dpbmcubW9kZWw7Ci0KLWltcG9ydCBqYXZheC5zd2luZy50YWJsZS5UYWJsZUNvbHVtbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBjb2x1bW4gaW4gYW4gRXhwcmVzc2lvblRhYmxlCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjcgJAotICovCi1wdWJsaWMgY2xhc3MgRXhwcmVzc2lvblRhYmxlQ29sdW1uIGV4dGVuZHMgVGFibGVDb2x1bW4gewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKCBFeHByZXNzaW9uVGFibGVDb2x1bW4uY2xhc3MgKTsKLQotICAgIHByaXZhdGUgRXhwcmVzc2lvbiB2YWx1ZTsKLSAgICBwcml2YXRlIENsYXNzIHR5cGUgPSBPYmplY3QuY2xhc3M7Ci0KLSAgICBwdWJsaWMgRXhwcmVzc2lvblRhYmxlQ29sdW1uKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIlt2YWx1ZToiICsgdmFsdWUgKyAiXSI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXZhbHVhdGVzIHRoZSB2YWx1ZSBvZiBhIGNlbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlVmFsdWUoRXhwcmVzc2lvblRhYmxlTW9kZWwgbW9kZWwsIE9iamVjdCByb3csIGludCByb3dJbmRleCwgaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAvLyBsZXRzIHB1dCB0aGUgdmFsdWVzIGluIHRoZSBjb250ZXh0Ci0gICAgICAgIEplbGx5Q29udGV4dCBjb250ZXh0ID0gbW9kZWwuZ2V0Q29udGV4dCgpOwotICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKCJyb3dzIiwgbW9kZWwuZ2V0Um93cygpKTsKLSAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSgiY29sdW1ucyIsIG1vZGVsLmdldENvbHVtbkxpc3QoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoInJvdyIsIHJvdyk7Ci0gICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoInJvd0luZGV4IiwgbmV3IEludGVnZXIocm93SW5kZXgpKTsKLSAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSgiY29sdW1uSW5kZXgiLCBuZXcgSW50ZWdlcihjb2x1bW5JbmRleCkpOwotCi0gICAgICAgIC8vIG5vdyBsZXRzIGludm9rZSB0aGUgZXhwcmVzc2lvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmV2YWx1YXRlUmVjdXJzZShjb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cud2FybiggIkNhdWdodCBleGNlcHRpb246ICIgKyBlICsgIiBldmFsdWF0aW5nOiAiICsgdmFsdWUsIGUgKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb2x1bW4gdHlwZS4KLSAgICAgKiBAcmV0dXJuIENsYXNzCi0gICAgICovCi0gICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGV4cHJlc3Npb24gdXNlZCB0byBleHRyYWN0IHRoZSB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIEV4cHJlc3Npb24KLSAgICAgKi8KLSAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGV4cHJlc3Npb24gdXNlZCB0byBleHRyYWN0IHRoZSB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKENsYXNzIHR5cGUpIHsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKEV4cHJlc3Npb24gdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9tb2RlbC9FeHByZXNzaW9uVGFibGVNb2RlbC5qYXZhIGIvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9tb2RlbC9FeHByZXNzaW9uVGFibGVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmQ2N2U0Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvbW9kZWwvRXhwcmVzc2lvblRhYmxlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLkFic3RyYWN0VGFibGVNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy50YWJsZS5EZWZhdWx0VGFibGVDb2x1bW5Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy50YWJsZS5UYWJsZUNvbHVtbk1vZGVsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5Q29udGV4dDsKLQotLyoqCi0gKiBBIFN3aW5nIFRhYmxlTW9kZWwgdGhhdCB1c2VzIGEgTGlzdCBvZiByb3dzIHdpdGggcGx1Z2dhYmxlIEV4cHJlc3Npb25zCi0gKiB0byBldmFsdWF0ZSB0aGUgdmFsdWUgb2YgdGhlIGNlbGxzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjcgJAotICovCi1wdWJsaWMgY2xhc3MgRXhwcmVzc2lvblRhYmxlTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwgewotCi0gICAgcHJpdmF0ZSBKZWxseUNvbnRleHQgY29udGV4dDsKLSAgICBwcml2YXRlIExpc3Qgcm93cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIE15VGFibGVDb2x1bW5Nb2RlbCBjb2x1bW5Nb2RlbCA9IG5ldyBNeVRhYmxlQ29sdW1uTW9kZWwoKTsKLQotICAgIHB1YmxpYyBFeHByZXNzaW9uVGFibGVNb2RlbCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb2x1bW4gZGVmaW5pdGlvbnMuCi0gICAgICogQHJldHVybiBMaXN0Ci0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0Q29sdW1uTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbHVtbk1vZGVsLmdldENvbHVtbkxpc3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBUYWJsZUNvbHVtbk1vZGVsCi0gICAgICovCi0gICAgcHVibGljIFRhYmxlQ29sdW1uTW9kZWwgZ2V0Q29sdW1uTW9kZWwoKSB7Ci0gICAgICAgIHJldHVybiBjb2x1bW5Nb2RlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbmV3IGNvbHVtbiBkZWZpbml0aW9uIHRvIHRoZSB0YWJsZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENvbHVtbihFeHByZXNzaW9uVGFibGVDb2x1bW4gY29sdW1uKSB7Ci0gICAgICAgIGNvbHVtbk1vZGVsLmFkZENvbHVtbihjb2x1bW4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBjb2x1bW4gZGVmaW5pdGlvbiBmcm9tIHRoZSB0YWJsZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNvbHVtbihFeHByZXNzaW9uVGFibGVDb2x1bW4gY29sdW1uKSB7Ci0gICAgICAgIGNvbHVtbk1vZGVsLnJlbW92ZUNvbHVtbihjb2x1bW4pOwotICAgIH0KLQotCi0gICAgLy8gVGFibGVNb2RlbCBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgaW50IGdldFJvd0NvdW50KCkgewotICAgICAgICByZXR1cm4gcm93cy5zaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb2x1bW5Db3VudCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbHVtbk1vZGVsLmdldENvbHVtbkNvdW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBjb2x1bW5JbmRleCkgewotICAgICAgICBTdHJpbmcgYW5zd2VyID0gbnVsbDsKLSAgICAgICAgaWYgKGNvbHVtbkluZGV4IDwgMCB8fCBjb2x1bW5JbmRleCA+PSBjb2x1bW5Nb2RlbC5nZXRDb2x1bW5Db3VudCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5zd2VyOwotICAgICAgICB9Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGNvbHVtbk1vZGVsLmdldENvbHVtbihjb2x1bW5JbmRleCkuZ2V0SGVhZGVyVmFsdWUoKTsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbnN3ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZUF0KGludCByb3dJbmRleCwgaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIE9iamVjdCBhbnN3ZXIgPSBudWxsOwotICAgICAgICBpZiAocm93SW5kZXggPCAwIHx8IHJvd0luZGV4ID49IHJvd3Muc2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5zd2VyOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb2x1bW5JbmRleCA8IDAgfHwgY29sdW1uSW5kZXggPj0gY29sdW1uTW9kZWwuZ2V0Q29sdW1uQ291bnQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICAgICAgfQotICAgICAgICBPYmplY3Qgcm93ID0gcm93cy5nZXQocm93SW5kZXgpOzsKLSAgICAgICAgRXhwcmVzc2lvblRhYmxlQ29sdW1uIGNvbHVtbiA9IChFeHByZXNzaW9uVGFibGVDb2x1bW4pIGNvbHVtbk1vZGVsLmdldENvbHVtbihjb2x1bW5JbmRleCk7Ci0gICAgICAgIGlmIChyb3cgPT0gbnVsbCB8fCBjb2x1bW4gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29sdW1uLmV2YWx1YXRlVmFsdWUodGhpcywgcm93LCByb3dJbmRleCwgY29sdW1uSW5kZXgpOwotICAgIH0KLQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHJvd3MuCi0gICAgICogQHJldHVybiBMaXN0Ci0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0Um93cygpIHsKLSAgICAgICAgcmV0dXJuIHJvd3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbGlzdCBvZiByb3dzLgotICAgICAqIEBwYXJhbSByb3dzIFRoZSByb3dzIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvd3MoTGlzdCByb3dzKSB7Ci0gICAgICAgIHRoaXMucm93cyA9IHJvd3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGV4dC4KLSAgICAgKiBAcmV0dXJuIEplbGx5Q29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBKZWxseUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29udGV4dC4KLSAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KEplbGx5Q29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTXlUYWJsZUNvbHVtbk1vZGVsIGV4dGVuZHMgRGVmYXVsdFRhYmxlQ29sdW1uTW9kZWwgewotICAgICAgICBwdWJsaWMgTGlzdCBnZXRDb2x1bW5MaXN0KCkgewotICAgICAgICAgICAgcmV0dXJuIHRhYmxlQ29sdW1uczsKLSAgICAgICAgfQotICAgIH07Ci0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9tb2RlbC9wYWNrYWdlLmh0bWwgYi9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL21vZGVsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEwMmM4Mi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL21vZGVsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08L2hlYWQ+Ci08Ym9keT4KLQotICA8cD4KLSAgCVN3aW5nIG1vZGVsIGltcGxlbWVudGF0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggSmVsbHlTd2luZwotICA8L3A+Ci0gIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd2luZy9wYWNrYWdlLmh0bWwgYi9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkZTk5Mi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3aW5nL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08L2hlYWQ+Ci08Ym9keT4KLQotICA8cD4KLSAgCVRoZSBKZWxseVN3aW5nIExpYnJhcnkgd2hpY2ggaXMgYSBKZWxseSBMaWJyYXJ5IGZvciBjcmVhdGluZyBSaWNoIFVzZXIgSW50ZXJmYWNlcyAKLSAgCXVzaW5nIFN3aW5nIHZpYSBYTUwgbWFya3VwIChhIEplbGx5IHNjcmlwdCkKLSAgPC9wPgotICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvQmFzZUplbGx5VGVzdC5qYXZhIGIvamVsbHktdGFncy9zd2luZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9CYXNlSmVsbHlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMzE4YTYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd2luZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9CYXNlSmVsbHlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqCi0gKiBAYXV0aG9yIFJvZG5leSBXYWxkaG9mZgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjIgJCAkRGF0ZTogMjAwNC8wOS8wOSAxMjoxNjo1OSAkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlSmVsbHlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIEJhc2VKZWxseVRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgamVsbHkgPSBuZXcgSmVsbHkoKTsKLSAgICAgICAgY29udGV4dCA9IG5ldyBKZWxseUNvbnRleHQoKTsKLSAgICAgICAgeG1sT3V0cHV0ID0gWE1MT3V0cHV0LmNyZWF0ZUR1bW15WE1MT3V0cHV0KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXBTY3JpcHQoU3RyaW5nIHNjcmlwdG5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVUkwgdXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKHNjcmlwdG5hbWUpOwotICAgICAgICBpZihudWxsID09IHVybCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgSmVsbHkgc2NyaXB0OiAiICsgc2NyaXB0bmFtZQotICAgICAgICAgICAgICAgICsgIiBpbiBwYWNrYWdlIG9mIGNsYXNzOiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLSAgICAgICAgamVsbHkuc2V0VXJsKHVybCk7Ci0KLSAgICAgICAgU3RyaW5nIGV4dHVybCA9IHVybC50b0V4dGVybmFsRm9ybSgpOwotICAgICAgICBpbnQgbGFzdFNsYXNoID0gZXh0dXJsLmxhc3RJbmRleE9mKCIvIik7Ci0gICAgICAgIFN0cmluZyBleHRCYXNlID0gZXh0dXJsLnN1YnN0cmluZygwLGxhc3RTbGFzaCsxKTsKLSAgICAgICAgVVJMIGJhc2V1cmwgPSBuZXcgVVJMKGV4dEJhc2UpOwotICAgICAgICBjb250ZXh0LnNldEN1cnJlbnRVUkwoYmFzZXVybCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEplbGx5IGdldEplbGx5KCkgewotICAgICAgICByZXR1cm4gamVsbHk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEplbGx5Q29udGV4dCBnZXRKZWxseUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBjb250ZXh0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBYTUxPdXRwdXQgZ2V0WE1MT3V0cHV0KCkgewotICAgICAgICByZXR1cm4geG1sT3V0cHV0OwotICAgIH0KLQotICAgIHByaXZhdGUgSmVsbHkgamVsbHkgPSBudWxsOwotICAgIHByaXZhdGUgSmVsbHlDb250ZXh0IGNvbnRleHQgPSBudWxsOwotICAgIHByaXZhdGUgWE1MT3V0cHV0IHhtbE91dHB1dCA9IG51bGw7Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2RlbW9zL0hvbWVwYWdlQnVpbGRlci5qYXZhIGIvamVsbHktdGFncy9zd2luZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZGVtb3MvSG9tZXBhZ2VCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZDNmMzYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd2luZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZGVtb3MvSG9tZXBhZ2VCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZGVtb3M7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnN3aW5nLkJveExheW91dDsKLWltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpFZGl0b3JQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxpc3Q7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0RmllbGQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLS8qKgotICogQSBzYW1wbGUgU3dpbmcgcHJvZ3JhbSB0aGF0IGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIEplbGx5IGFzIGEgdGVtcGxhdGluZyBtZWNoYW5pc20KLSAqCi0gKiBAYXV0aG9yIE90dG8gdm9uIFdhY2h0ZXIKLSAqLwotcHVibGljIGNsYXNzIEhvbWVwYWdlQnVpbGRlciBleHRlbmRzIEpQYW5lbCB7Ci0KLSAgICBKVGV4dEZpZWxkIG5hbWVGaWVsZDsKLSAgICBKVGV4dEZpZWxkIHVybEZpZWxkOwotICAgIEpUZXh0RmllbGQgYWRkRmllbGQ7Ci0gICAgSlRleHRGaWVsZCBjb2xvckZpZWxkOwotICAgIEpDb21ib0JveCB0ZW1wbGF0ZUxpc3Q7Ci0gICAgSkxpc3QgaW50ZXJlc3RMaXN0OwotICAgIERlZmF1bHRMaXN0TW9kZWwgbGlzdE1vZGVsOwotCi0KLSAgICBwdWJsaWMgSG9tZXBhZ2VCdWlsZGVyKCkgewotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgSG9tZXBhZ2UgQnVpbGRlciIpOwotCi0gICAgICAgIEpQYW5lbCBsZWZ0UGFuZWwgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgIGxlZnRQYW5lbC5zZXRMYXlvdXQobmV3IEJveExheW91dChsZWZ0UGFuZWwsIEJveExheW91dC5ZX0FYSVMpKTsKLQotICAgICAgICBsZWZ0UGFuZWwuYWRkKG5ldyBKTGFiZWwoIk5hbWU6IikpOwotCi0gICAgICAgIG5hbWVGaWVsZD0gbmV3IEpUZXh0RmllbGQoIkphbWVzIEJvbmQiKTsKLSAgICAgICAgbGVmdFBhbmVsLmFkZChuYW1lRmllbGQpOwotCi0gICAgICAgIGxlZnRQYW5lbC5hZGQobmV3IEpMYWJlbCgiRmF2b3JpdGUgQ29sb3I6IikpOwotCi0gICAgICAgIGNvbG9yRmllbGQgPSBuZXcgSlRleHRGaWVsZCgiIzAwNzAwNyIpOwotICAgICAgICBsZWZ0UGFuZWwuYWRkKGNvbG9yRmllbGQpOwotCi0gICAgICAgIGxlZnRQYW5lbC5hZGQobmV3IEpMYWJlbCgiUGljdHVyZSBVUkw6IikpOwotCi0gICAgICAgIHVybEZpZWxkID0gbmV3IEpUZXh0RmllbGQoImh0dHA6Ly93d3cuaWFuZmxlbWluZy5vcmcvMDA3bmV3cy9pbWFnZXMzL2MyMDAyX3BpZXJjZTEuanBnIik7Ci0gICAgICAgIGxlZnRQYW5lbC5hZGQodXJsRmllbGQpOwotCi0gICAgICAgIGxlZnRQYW5lbC5hZGQobmV3IEpMYWJlbCgiQ2hvb3NlIHRlbXBsYXRlOiIpKTsKLQotICAgICAgICB0ZW1wbGF0ZUxpc3QgPSBuZXcgSkNvbWJvQm94KG5ldyBTdHJpbmdbXSB7InRlbXBsYXRlMS5qZWxseSIsInRlbXBsYXRlMi5qZWxseSJ9KTsKLSAgICAgICAgbGVmdFBhbmVsLmFkZCh0ZW1wbGF0ZUxpc3QpOwotCi0vLyAgICAgICAgSlBhbmVsIHJpZ2h0UGFuZWwgPSBuZXcgSlBhbmVsKCk7Ci0vLyAgICAgICAgcmlnaHRQYW5lbC5zZXRMYXlvdXQobmV3IEJveExheW91dChyaWdodFBhbmVsLCBCb3hMYXlvdXQuWV9BWElTKSk7Ci0KLSAgICAgICAgbGVmdFBhbmVsLmFkZChuZXcgSkxhYmVsKCJBZGQgYSBIb2JieToiKSk7Ci0KLSAgICAgICAgYWRkRmllbGQgPSBuZXcgSlRleHRGaWVsZCgpOwotICAgICAgICBsZWZ0UGFuZWwuYWRkKGFkZEZpZWxkKTsKLQotICAgICAgICBKQnV0dG9uIGFkZEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJBZGQgPj4+Iik7Ci0gICAgICAgIGFkZEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGxpc3RNb2RlbC5hZGRFbGVtZW50KGFkZEZpZWxkLmdldFRleHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBsZWZ0UGFuZWwuYWRkKGFkZEJ1dHRvbik7Ci0KLSAgICAgICAgbGlzdE1vZGVsID0gbmV3IERlZmF1bHRMaXN0TW9kZWwoKTsKLSAgICAgICAgbGlzdE1vZGVsLmFkZEVsZW1lbnQoIktpbGxpbmcgYmFkIGd1eXMiKTsKLSAgICAgICAgbGlzdE1vZGVsLmFkZEVsZW1lbnQoIldyZWNraW5nIGNhcnMiKTsKLSAgICAgICAgbGlzdE1vZGVsLmFkZEVsZW1lbnQoIkVhdGluZyBqZWxseSIpOwotICAgICAgICBpbnRlcmVzdExpc3QgPSBuZXcgSkxpc3QobGlzdE1vZGVsKTsKLQotCi0gICAgICAgIEpCdXR0b24gc3VibWl0ID0gbmV3IEpCdXR0b24oIkJ1aWxkIGFuZCBwcmV2aWV3IHlvdXIgcGFnZSEiKTsKLSAgICAgICAgc3VibWl0LmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRQYWdlKHRlbXBsYXRlTGlzdC5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpLG5ldyBKZWxseUNvbnRleHQoKSk7Ci0gICAgICAgICAgICAgICAgc2hvd1BhZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gTGF5b3V0IHRoZSBkZW1vCi0gICAgICAgIHNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOwotICAgICAgICBhZGQoc3VibWl0LCBCb3JkZXJMYXlvdXQuU09VVEgpOwotICAgICAgICBhZGQobGVmdFBhbmVsLCBCb3JkZXJMYXlvdXQuV0VTVCk7Ci0gICAgICAgIGFkZChuZXcgSlNjcm9sbFBhbmUoaW50ZXJlc3RMaXN0KSwgQm9yZGVyTGF5b3V0LkVBU1QpOwotICAgICAgICBzZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigyMCwyMCwyMCwyMCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJ1aWxkUGFnZShTdHJpbmcgdGVtcGxhdGUsIEplbGx5Q29udGV4dCBjdHgpIHsKLQotLy8gICAgICAgIHRyeSB7Ci0vLwotLy8gICAgICAgIEVtYmVkZGVkIGVtYmVkZGVkID0gbmV3IEVtYmVkZGVkKCk7Ci0vLyAgICAgICAgZW1iZWRkZWQuc2V0T3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJvdXQuaHRtbCIpKTsKLS8vICAgICAgICAvL2VtYmVkZGVkLnNldFZhcmlhYmxlKCJzb21lLXZhciIsInNvbWUtb2JqZWN0Iik7Ci0vLwotLy8gICAgICAgIGVtYmVkZGVkLnNldFNjcmlwdCgiZmlsZTovLy9hbm9uY3ZzL2pha2FydGEtY29tbW9ucy1zYW5kYm94L2plbGx5L3NhbXBsZS5qZWxseSIpOwotLy8gICAgICAgIC8vb3Igb25lIGNhbiBkby4KLS8vICAgICAgICAvL2VtYmVkZGVkLnNldFNjcmlwdChzY3JpcHRBc0lucHV0U3RyZWFtKTsKLS8vCi0vLyAgICAgICAgYm9vbGVhbiBiU3RhdHVzPWVtYmVkZGVkLmV4ZWN1dGUoKTsKLS8vICAgICAgICBpZighYlN0YXR1cykgLy9pZiBlcnJvcgotLy8gICAgICAgIHsKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZW1iZWRkZWQuZ2V0RXJyb3JNc2coKSk7Ci0vLyAgICAgICAgfQotLy8KLS8vICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotLy8gICAgICAgIH0KLQotCi0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSgiZGVtb3BhZ2UuaHRtbCIpOwotCi0gICAgICAgICAgICBKZWxseUNvbnRleHQgY29udGV4dCA9IG5ldyBKZWxseUNvbnRleHQoKTsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoIm5hbWUiLG5hbWVGaWVsZC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSgiYmFja2dyb3VuZCIsY29sb3JGaWVsZC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSgidXJsIix1cmxGaWVsZC5nZXRUZXh0KCkpOwotCi0gICAgICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGl0ZW1zID0gbGlzdE1vZGVsLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlbXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICB2LmFkZChpdGVtcy5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoImhvYmJpZXMiLCB2KTsKLQotICAgICAgICAgICAgWE1MT3V0cHV0IHhtbE91dHB1dCA9IFhNTE91dHB1dC5jcmVhdGVYTUxPdXRwdXQob3V0cHV0KTsKLSAgICAgICAgICAgIGNvbnRleHQucnVuU2NyaXB0KCByZXNvbHZlVVJMKCJzcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZGVtb3MvIit0ZW1wbGF0ZSksIHhtbE91dHB1dCApOwotICAgICAgICAgICAgeG1sT3V0cHV0LmZsdXNoKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbmlzaGVkIG1lcmdpbmcgdGVtcGxhdGUiKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgdm9pZCBzaG93UGFnZSgpIHsKLQotICAgICAgICAvL29wZW4gbmV3IHdpbmRvdwotICAgICAgICBKRnJhbWUgZnJhbWUgPSBuZXcgSkZyYW1lKCJZb3VyIEhvbWVwYWdlIik7Ci0KLSAgICAgICAgLy9hZGQgaHRtbCBwYW5lCi0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICBVUkwgdXJsID0gcmVzb2x2ZVVSTCgiZGVtb3BhZ2UuaHRtbCIpOwotICAgICAgICAgIEpFZGl0b3JQYW5lIGh0bWxQYW5lID0gbmV3IEpFZGl0b3JQYW5lKHVybCk7Ci0gICAgICAgICAgaHRtbFBhbmUuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgICAgICAgIGZyYW1lLnNldENvbnRlbnRQYW5lKG5ldyBKU2Nyb2xsUGFuZShodG1sUGFuZSkpOwotCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3IgZGlzcGxheWluZyBwYWdlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmcmFtZS5wYWNrKCk7Ci0gICAgICAgIGZyYW1lLnNldFNpemUoNTAwLDUwMCk7Ci0gICAgICAgIGZyYW1lLnNldFZpc2libGUodHJ1ZSk7Ci0KLSAgICB9Ci0KLSAgICAgLyoqKgotICAgICAgKiBAcmV0dXJuIHRoZSBVUkwgZm9yIHRoZSByZWxhdGl2ZSBmaWxlIG5hbWUgb3IgYWJzb2x1dGUgVVJMCi0gICAgICAqLwotICAgIHByb3RlY3RlZCBVUkwgcmVzb2x2ZVVSTChTdHJpbmcgbmFtZSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShuYW1lKTsKLSAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgcmV0dXJuIGZpbGUudG9VUkwoKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBuZXcgVVJMKG5hbWUpOwotICAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBzW10pIHsKLSAgICAgICAgSkZyYW1lIGZyYW1lID0gbmV3IEpGcmFtZSgiSG9tZXBhZ2UgQnVpbGRlciIpOwotCi0gICAgICAgIGZyYW1lLmFkZFdpbmRvd0xpc3RlbmVyKG5ldyBXaW5kb3dBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7U3lzdGVtLmV4aXQoMCk7fQotICAgICAgICB9KTsKLQotICAgICAgICBmcmFtZS5zZXRDb250ZW50UGFuZShuZXcgSG9tZXBhZ2VCdWlsZGVyKCkpOwotICAgICAgICBmcmFtZS5wYWNrKCk7Ci0gICAgICAgIGZyYW1lLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZGVtb3MvaG9tZXBhZ2VCdWlsZGVyLmplbGx5IGIvamVsbHktdGFncy9zd2luZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZGVtb3MvaG9tZXBhZ2VCdWlsZGVyLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWYzOTcyLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2RlbW9zL2hvbWVwYWdlQnVpbGRlci5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGo6amVsbHkgCi0gICAgeG1sbnM6aj0iamVsbHk6Y29yZSIgCi0gICAgeG1sbnM9ImplbGx5OnN3aW5nIiA+Ci0KLSAgICA8IS0tIGNyZWF0ZSB0aGUgZ2VuZXJhdGUgcGFnZSBhY3Rpb24gLS0+Ci0KLSAgICA8YWN0aW9uIHZhcj0iY3JlYXRlUGFnZUFjdGlvbiIgbmFtZT0iQnVpbGQgYW5kIHByZXZpZXcgeW91ciBwYWdlISI+Ci0gICAgICAgIDxqOnNldCB2YXI9Im5hbWUiIHZhbHVlPSIke25hbWVGaWVsZC50ZXh0fSIvPgotICAgICAgICA8ajpzZXQgdmFyPSJiYWNrZ3JvdW5kIiB2YWx1ZT0iJHtjb2xvckZpZWxkLnRleHR9Ii8+Ci0gICAgICAgIDxqOnNldCB2YXI9InVybCIgdmFsdWU9IiR7cGljdHVyZUZpZWxkLnRleHR9Ii8+Ci0gICAgICAgIDxqOnNldCB2YXI9ImhvYmJpZXMiIHZhbHVlPSIke2hvYmJ5TW9kZWwudG9BcnJheSgpfSIvPgotICAgICAgICA8ajpzZXQgdmFyPSJ0ZW1wbGF0ZSIgdmFsdWU9IiR7dGVtcGxhdGVGaWVsZC5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpfSIvPgotICAgICAgICAKLSAgICAgICAgbmFtZSA9ICR7bmFtZX0KLSAgICAgICAgYmFja2dyb3VuZCA9ICR7YmFja2dyb3VuZH0KLSAgICAgICAgdXJsID0gJHt1cmx9Ci0gICAgICAgIGhvYmJpZXMgPSAke2hvYmJpZXN9Ci0gICAgICAgIHRlbXBsYXRlID0gJHt0ZW1wbGF0ZX0KLSAgICAgICAgCi0gICAgICAgIDxqOmZpbGUgbmFtZT0iZGVtb3BhZ2UuaHRtbCIgb3V0cHV0TW9kZT0iaHRtbCI+Ci0gICAgICAgICAgICA8ajppbmNsdWRlIHVyaT0iJHt0ZW1wbGF0ZX0iLz4KLSAgICAgICAgPC9qOmZpbGU+Ci0KLSAgICAgICAgPGZyYW1lIHZhcj0ic2hvd1BhZ2VGcmFtZSIgc2l6ZT0iNTAwLDYwMCIgbG9jYXRpb249IjIwMCwyMDAiIHRpdGxlPSJZb3VyIEhvbWVwYWdlIj4KLSAgICAgICAgICAgIDxzY3JvbGxQYW5lPgotICAgICAgICAgICAgICAgIDxlZGl0b3JQYW5lIHBhZ2U9IiR7Y29udGV4dC5nZXRSZXNvdXJjZSgnL2RlbW9wYWdlLmh0bWwnKS50b1N0cmluZygpfSIgZWRpdGFibGU9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L3Njcm9sbFBhbmU+Ci0gICAgICAgIDwvZnJhbWU+Ci0gICAgICAgICR7c2hvd1BhZ2VGcmFtZS5zaG93KCl9Ci0gICAgPC9hY3Rpb24+Ci0KLQotICAgIDwhLS0gY3JlYXRlIHRoZSBGcmFtZSAtLT4KLSAgICAKLSAgPGZyYW1lIHZhcj0iZnJhbWUiIHRpdGxlPSJIb21lcGFnZSBCdWlsZGVyIiBsb2NhdGlvbj0iMTAwLDEwMCIgc2l6ZT0iODAwLDQwMCI+Ci0gICAgICAgIDxwYW5lbD4KLQotPCEtLSB1bmNvbW1lbnQgdGhpcyB3aGVuIHdlJ3ZlIGltcGxlbWVudGVkIGVtcHR5Qm9yZGVyCi0gICAgCi0gICAgICAgICAgICA8ZW1wdHlCb3JkZXIgdG9wPSIyMCIgbGVmdD0iMjAiIGJvdHRvbT0iMjAiIHJpZ2h0PSIyMCIgLz4gICAgICAgICAgICAKLS0tPiAgICAgICAgCi0gICAgICAgICAgICA8Ym9yZGVyTGF5b3V0PiAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8Ym9yZGVyQWxpZ24gYWxpZ249Indlc3QiPgotICAgICAgICAgICAgICAgICAgPHZib3g+Ci0gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHRleHQ9Ik5hbWU6Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgPHRleHRGaWVsZCB2YXI9Im5hbWVGaWVsZCIgdGV4dD0iSmFtZXMgQm9uZCIvPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHRleHQ9IkZhdm91cml0ZSBDb2xvcjoiLz4KLSAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZpZWxkIHZhcj0iY29sb3JGaWVsZCIgdGV4dD0iIzAwNzAwNyIvPgotICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCB0ZXh0PSJQaWN0dXJlIFVSTDo6Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgPHRleHRGaWVsZCB2YXI9InBpY3R1cmVGaWVsZCIgdGV4dD0iaHR0cDovL3d3dy5pYW5mbGVtaW5nLm9yZy8wMDduZXdzL2ltYWdlczMvYzIwMDJfcGllcmNlMS5qcGciLz4KLSAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgdGV4dD0iQ2hvb3NlIHRlbXBsYXRlOjoiLz4KLSAgICAgICAgICAgICAgICAgICAgICA8Y29tYm9Cb3ggdmFyPSJ0ZW1wbGF0ZUZpZWxkIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgJHt0ZW1wbGF0ZUZpZWxkLmFkZEl0ZW0oJ3RlbXBsYXRlMS5qZWxseScpfQotICAgICAgICAgICAgICAgICAgICAgICR7dGVtcGxhdGVGaWVsZC5hZGRJdGVtKCd0ZW1wbGF0ZTIuamVsbHknKX0KLSAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgdGV4dD0iQWRkIGEgSG9iYnk6Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgPHRleHRGaWVsZCB2YXI9ImhvYmJ5RmllbGQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8YWN0aW9uIG5hbWU9IkFkZCA+Pj4iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtob2JieU1vZGVsLmFkZEVsZW1lbnQoaG9iYnlGaWVsZC50ZXh0KX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KLSAgICAgICAgICAgICAgICAgIDwvdmJveD4KLSAgICAgICAgICAgICAgICA8L2JvcmRlckFsaWduPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDxib3JkZXJBbGlnbiBhbGlnbj0iZWFzdCI+ICAgICAgCi0gICAgICAgICAgICAgICAgICA8c2Nyb2xsUGFuZT4KLSAgICAgICAgICAgICAgICAgICAgICA8ajp1c2VCZWFuIGNsYXNzPSJqYXZheC5zd2luZy5EZWZhdWx0TGlzdE1vZGVsIiB2YXI9ImhvYmJ5TW9kZWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0IG1vZGVsPSIke2hvYmJ5TW9kZWx9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAke2hvYmJ5TW9kZWwuYWRkRWxlbWVudCgnS2lsbGluZyBiYWQgZ3V5cycpfQotICAgICAgICAgICAgICAgICAgICAgICAgJHtob2JieU1vZGVsLmFkZEVsZW1lbnQoJ1dyZWNraW5nIGNhcnMnKX0KLSAgICAgICAgICAgICAgICAgICAgICAgICR7aG9iYnlNb2RlbC5hZGRFbGVtZW50KCdFYXRpbmcgamVsbHknKX0KLSAgICAgICAgICAgICAgICAgIDwvc2Nyb2xsUGFuZT4KLSAgICAgICAgICAgICAgICA8L2JvcmRlckFsaWduPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDxib3JkZXJBbGlnbiBhbGlnbj0ic291dGgiPiAgICAgIAotICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBhY3Rpb249IiR7Y3JlYXRlUGFnZUFjdGlvbn0iLz4KLSAgICAgICAgICAgICAgICA8L2JvcmRlckFsaWduPgotICAgICAgICAgICAgPC9ib3JkZXJMYXlvdXQ+Ci0gICAgICAgIDwvcGFuZWw+Ci0gICAgPC9mcmFtZT4KLQotICAgICR7ZnJhbWUuc2hvdygpfQotCi08L2o6amVsbHk+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3aW5nL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9kZW1vcy90ZW1wbGF0ZTEuamVsbHkgYi9qZWxseS10YWdzL3N3aW5nL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9kZW1vcy90ZW1wbGF0ZTEuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMDg3ODEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd2luZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZGVtb3MvdGVtcGxhdGUxLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqOmplbGx5IHRyaW09ImZhbHNlIiB4bWxuczpqPSJqZWxseTpjb3JlIj4KLQotICA8aHRtbD4KLSAgCi0gICAgICA8aGVhZD4KLSAgICA8dGl0bGU+JHtuYW1lfSdzIFBhZ2U8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICAKLSAgICA8Ym9keSBiZ2NvbG9yPSIke2JhY2tncm91bmR9IiB0ZXh0PSIjRkZGRkZGIj4KLQotICAgIDxoMT4ke25hbWV9J3MgSG9tZXBhZ2U8L2gxPgotICAgIAotICAgIDxpbWcgc3JjPSIke3VybH0iLz4KLSAgICAKLSAgICA8aDI+TXkgSG9iYmllczwvaDI+Ci0gICAgCi0gICAgPHVsPgotICAgIAotICAgIDxqOmZvckVhY2ggaXRlbXM9IiR7aG9iYmllc30iIHZhcj0iaSI+Ci0gICAgICAgIDxsaT4ke2l9PC9saT4KLSAgICA8L2o6Zm9yRWFjaD4KLSAgICAKLSAgICA8L3VsPgotICAgIAotICAgIDwvYm9keT4KLQotICA8L2h0bWw+Ci0gIAotPC9qOmplbGx5PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZGVtb3MvdGVtcGxhdGUyLmplbGx5IGIvamVsbHktdGFncy9zd2luZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZGVtb3MvdGVtcGxhdGUyLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjEyZDk5Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2RlbW9zL3RlbXBsYXRlMi5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseSB0cmltPSJmYWxzZSIgeG1sbnM6aj0iamVsbHk6Y29yZSI+Ci0KLSAgPGh0bWw+Ci0gIAotICAgICAgPGhlYWQ+Ci0gICAgPHRpdGxlPiR7bmFtZX0ncyBQYWdlPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgCi0gICAgPGJvZHkgYmdjb2xvcj0iJHtiYWNrZ3JvdW5kfSIgdGV4dD0iI0ZGRkYwMCI+Ci0gICAgCi0gICAgPHRhYmxlPgotICAgIDx0cj4KLSAgICA8dGQ+Ci0gICAgPGltZyBzcmM9IiR7dXJsfSIvPgotICAgIDwvdGQ+Ci0KLSAgICA8dGQ+Ci0gICAgPGgxPldlbGNvbWUgdG8gbXkgSG9tZXBhZ2UhPC9oMT4KLSAgICAgICAgCi0gICAgPHA+Ci0gICAgSGksIEknbSAke25hbWV9LiAgVGhlc2UgYXJlIG15IGhvYmJpZXM6Ci0gICAgPC9wPgotICAgICAgICAKLSAgICA8b2w+Ci0gICAgCi0gICAgPGo6Zm9yRWFjaCBpdGVtcz0iJHtob2JiaWVzfSIgdmFyPSJpIj4KLSAgICAgICAgPGxpPiR7aX08L2xpPgotICAgIDwvajpmb3JFYWNoPgotICAgIAotICAgIDwvb2w+Ci0gICAgPC90ZD4KLSAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgCi0gICAgPC9ib2R5PgotCi0gIDwvaHRtbD4KLSAgCi08L2o6amVsbHk+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3aW5nL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9zd2luZy9NeVRhYmxlTW9kZWwuamF2YSBiL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3N3aW5nL015VGFibGVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWIzYzMwLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3N3aW5nL015VGFibGVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuQWJzdHJhY3RUYWJsZU1vZGVsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogQSBzYW1wbGUgdGFibGUgbW9kZWwKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBNeVRhYmxlTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE15VGFibGVNb2RlbC5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgTXlUYWJsZU1vZGVsKCkgewotICAgIH0KLQotCi0gICAgZmluYWwgU3RyaW5nW10gY29sdW1uTmFtZXMgPSB7Ci0gICAgICAgICJGaXJzdCBOYW1lIiwKLSAgICAgICAgIkxhc3QgTmFtZSIsCi0gICAgICAgICJTcG9ydCIsCi0gICAgICAgICIjIG9mIFllYXJzIiwKLSAgICAgICAgIlZlZ2V0YXJpYW4iCi0gICAgfTsKLSAgICBmaW5hbCBPYmplY3RbXVtdIGRhdGEgPSB7Ci0gICAgICAgIHsiTWFyeSIsICJDYW1waW9uZSIsCi0gICAgICAgICAiU25vd2JvYXJkaW5nIiwgbmV3IEludGVnZXIoNSksIG5ldyBCb29sZWFuKGZhbHNlKX0sCi0gICAgICAgIHsiQWxpc29uIiwgIkh1bWwiLAotICAgICAgICAgIlJvd2luZyIsIG5ldyBJbnRlZ2VyKDMpLCBuZXcgQm9vbGVhbih0cnVlKX0sCi0gICAgICAgIHsiS2F0aHkiLCAiV2FscmF0aCIsCi0gICAgICAgICAiQ2hhc2luZyB0b2RkbGVycyIsIG5ldyBJbnRlZ2VyKDIpLCBuZXcgQm9vbGVhbihmYWxzZSl9LAotICAgICAgICB7Ik1hcmsiLCAiQW5kcmV3cyIsCi0gICAgICAgICAiU3BlZWQgcmVhZGluZyIsIG5ldyBJbnRlZ2VyKDIwKSwgbmV3IEJvb2xlYW4odHJ1ZSl9LAotICAgICAgICB7IkFuZ2VsYSIsICJMaWgiLAotICAgICAgICAgIlRlYWNoaW5nIGhpZ2ggc2Nob29sIiwgbmV3IEludGVnZXIoNCksIG5ldyBCb29sZWFuKGZhbHNlKX0KLSAgICAgICAgfTsKLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBjb2x1bW5OYW1lcy5sZW5ndGg7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRSb3dDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIGRhdGEubGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgY29sKSB7Ci0gICAgICAgIHJldHVybiBjb2x1bW5OYW1lc1tjb2xdOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChpbnQgcm93LCBpbnQgY29sKSB7Ci0gICAgICAgIHJldHVybiBkYXRhW3Jvd11bY29sXTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEpUYWJsZSB1c2VzIHRoaXMgbWV0aG9kIHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCByZW5kZXJlci8KLSAgICAgKiBlZGl0b3IgZm9yIGVhY2ggY2VsbC4gIElmIHdlIGRpZG4ndCBpbXBsZW1lbnQgdGhpcyBtZXRob2QsCi0gICAgICogdGhlbiB0aGUgbGFzdCBjb2x1bW4gd291bGQgY29udGFpbiB0ZXh0ICgidHJ1ZSIvImZhbHNlIiksCi0gICAgICogcmF0aGVyIHRoYW4gYSBjaGVjayBib3guCi0gICAgICovCi0gICAgcHVibGljIENsYXNzIGdldENvbHVtbkNsYXNzKGludCBjKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUF0KDAsIGMpLmdldENsYXNzKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBEb24ndCBuZWVkIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZCB1bmxlc3MgeW91ciB0YWJsZSdzCi0gICAgICogZWRpdGFibGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDZWxsRWRpdGFibGUoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICAvL05vdGUgdGhhdCB0aGUgZGF0YS9jZWxsIGFkZHJlc3MgaXMgY29uc3RhbnQsCi0gICAgICAgIC8vbm8gbWF0dGVyIHdoZXJlIHRoZSBjZWxsIGFwcGVhcnMgb25zY3JlZW4uCi0gICAgICAgIGlmIChjb2wgPCAyKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogRG9uJ3QgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdW5sZXNzIHlvdXIgdGFibGUncwotICAgICAqIGRhdGEgY2FuIGNoYW5nZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZUF0KE9iamVjdCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2V0dGluZyB2YWx1ZSBhdCAiICsgcm93ICsgIiwiICsgY29sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHRvICIgKyB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAoYW4gaW5zdGFuY2Ugb2YgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmFsdWUuZ2V0Q2xhc3MoKSArICIpIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGF0YVswXVtjb2xdIGluc3RhbmNlb2YgSW50ZWdlcgotICAgICAgICAgICAgICAgICYmICEodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSkgewotICAgICAgICAgICAgLy9XaXRoIEpGQy9Td2luZyAxLjEgYW5kIEpESyAxLjIsIHdlIG5lZWQgdG8gY3JlYXRlCi0gICAgICAgICAgICAvL2FuIEludGVnZXIgZnJvbSB0aGUgdmFsdWU7IG90aGVyd2lzZSwgdGhlIGNvbHVtbgotICAgICAgICAgICAgLy9zd2l0Y2hlcyB0byBjb250YWluIFN0cmluZ3MuICBTdGFydGluZyB3aXRoIHYgMS4zLAotICAgICAgICAgICAgLy90aGUgdGFibGUgYXV0b21hdGljYWxseSBjb252ZXJ0cyB2YWx1ZSB0byBhbiBJbnRlZ2VyLAotICAgICAgICAgICAgLy9zbyB5b3Ugb25seSBuZWVkIHRoZSBjb2RlIGluIHRoZSAnZWxzZScgcGFydCBvZiB0aGlzCi0gICAgICAgICAgICAvLydpZicgYmxvY2suCi0gICAgICAgICAgICAvL1hYWDogU2VlIFRhYmxlRWRpdERlbW8uamF2YSBmb3IgYSBiZXR0ZXIgc29sdXRpb24hISEKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGF0YVtyb3ddW2NvbF0gPSBuZXcgSW50ZWdlcih2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBmaXJlVGFibGVDZWxsVXBkYXRlZChyb3csIGNvbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvciggIlRoZSBcIiIgKyBnZXRDb2x1bW5OYW1lKGNvbCkKLSAgICAgICAgICAgICAgICAgICAgKyAiXCIgY29sdW1uIGFjY2VwdHMgb25seSBpbnRlZ2VyIHZhbHVlcy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRhdGFbcm93XVtjb2xdID0gdmFsdWU7Ci0gICAgICAgICAgICBmaXJlVGFibGVDZWxsVXBkYXRlZChyb3csIGNvbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3N3aW5nL1Rlc3RDb252ZXJ0ZXJzLmphdmEgYi9qZWxseS10YWdzL3N3aW5nL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9zd2luZy9UZXN0Q29udmVydGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDM4NjEwLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3N3aW5nL1Rlc3RDb252ZXJ0ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247Ci1pbXBvcnQgamF2YS5hd3QuUG9pbnQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuQ29udmVydFV0aWxzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3dpbmcuU3dpbmdUYWdMaWJyYXJ5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogVGVzdHMgdGhlIFN3aW5nIGNvbnZlcnRlcnMKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0Q29udmVydGVycyBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUZXN0Q29udmVydGVycy5jbGFzcyk7Ci0KLSAgICAvKiogRGVsdGEgdXNlZCB0byBjb21wYXJlIGRvdWJsZXMgKi8KLSAgICBkb3VibGUgZGVsdGEgPSAwLjAwMDAwMDE7Ci0KLSAgICAvLyBmb3JjZSB0aGUgU3dpbmcgY29udmVydGVycyB0byBiZSBsb2FkZWQKLSAgICBTd2luZ1RhZ0xpYnJhcnkgZHVtbXkgPSBuZXcgU3dpbmdUYWdMaWJyYXJ5KCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGVzdENvbnZlcnRlcnMuY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0Q29udmVydGVycyhTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdERpbWVuc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RGltZW5zaW9uKCIxMDAsIDIwMCIsIG5ldyBEaW1lbnNpb24oMTAwLCAyMDApKTsKLSAgICAgICAgYXNzZXJ0RGltZW5zaW9uKCIxMDAiLCBuZXcgRGltZW5zaW9uKDEwMCwgMCkpOwotICAgICAgICBhc3NlcnREaW1lbnNpb24oIiAxMDAgICwgIDIwMCAgIiwgbmV3IERpbWVuc2lvbigxMDAsIDIwMCkpOwotICAgICAgICBhc3NlcnREaW1lbnNpb24oIiAwICAsICAyMDAgICIsIG5ldyBEaW1lbnNpb24oMCwgMjAwKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvaW50cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRQb2ludCgiMTAwLCAyMDAiLCBuZXcgUG9pbnQoMTAwLCAyMDApKTsKLSAgICAgICAgYXNzZXJ0UG9pbnQoIjEwMCIsIG5ldyBQb2ludCgxMDAsIDApKTsKLSAgICAgICAgYXNzZXJ0UG9pbnQoIiAxMDAgICwgIDIwMCAgIiwgbmV3IFBvaW50KDEwMCwgMjAwKSk7Ci0gICAgICAgIGFzc2VydFBvaW50KCIgMCAgLCAgMjAwICAiLCBuZXcgUG9pbnQoMCwgMjAwKSk7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0UG9pbnQoU3RyaW5nIGV4cHJlc3Npb24sIFBvaW50IGV4cGVjdGVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IGFuc3dlciA9IENvbnZlcnRVdGlscy5jb252ZXJ0KGV4cHJlc3Npb24sIFBvaW50LmNsYXNzICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlJldHVybmVkIHR5cGU6ICIrICBhbnN3ZXIuZ2V0Q2xhc3MoKSArICIgaXMtYSBQb2ludCIsIGFuc3dlciBpbnN0YW5jZW9mIFBvaW50ICk7Ci0KLSAgICAgICAgUG9pbnQgdmFsdWUgPSAoUG9pbnQpIGFuc3dlcjsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJ4IiwgZXhwZWN0ZWQuZ2V0WCgpLCB2YWx1ZS5nZXRYKCksIGRlbHRhICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggInkiLCBleHBlY3RlZC5nZXRZKCksIHZhbHVlLmdldFkoKSwgZGVsdGEgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIGV4cGVjdGVkLCB2YWx1ZSApOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydERpbWVuc2lvbihTdHJpbmcgZXhwcmVzc2lvbiwgRGltZW5zaW9uIGV4cGVjdGVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IGFuc3dlciA9IENvbnZlcnRVdGlscy5jb252ZXJ0KGV4cHJlc3Npb24sIERpbWVuc2lvbi5jbGFzcyApOwotCi0gICAgICAgIGFzc2VydFRydWUoICJSZXR1cm5lZCB0eXBlOiAiKyAgYW5zd2VyLmdldENsYXNzKCkgKyAiIGlzLWEgRGltZW5zaW9uIiwgYW5zd2VyIGluc3RhbmNlb2YgRGltZW5zaW9uICk7Ci0KLSAgICAgICAgRGltZW5zaW9uIHZhbHVlID0gKERpbWVuc2lvbikgYW5zd2VyOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggIndpZHRoIiwgZXhwZWN0ZWQuZ2V0V2lkdGgoKSwgdmFsdWUuZ2V0V2lkdGgoKSwgZGVsdGEgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiaGVpZ2h0IiwgZXhwZWN0ZWQuZ2V0SGVpZ2h0KCksIHZhbHVlLmdldEhlaWdodCgpLCBkZWx0YSApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggZXhwZWN0ZWQsIHZhbHVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvc3dpbmcvVGVzdFN3aW5nVGFncy5qYXZhIGIvamVsbHktdGFncy9zd2luZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvc3dpbmcvVGVzdFN3aW5nVGFncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2ExNzM0Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3N3aW5nL1Rlc3RTd2luZ1RhZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5Db250YWluZXI7Ci1pbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOwotaW1wb3J0IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50czsKLWltcG9ydCBqYXZhLmF3dC5HcmlkQmFnTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0Lkluc2V0czsKLWltcG9ydCBqYXZhLmF3dC5Qb2ludDsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5zd2luZy5CdXR0b25Hcm91cDsKLWltcG9ydCBqYXZheC5zd2luZy5EZWJ1Z0dyYXBoaWNzOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5TY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGVzdC5CYXNlSmVsbHlUZXN0OwotCi0vKiogVGVzdHMgbWFueSBzd2luZyB0YWdzIGZvciBiYXNpYyBmdW5jdGlvbmFsaXR5LgotICogQGF1dGhvciBIYW5zIEdpbGRlCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVGVzdFN3aW5nVGFncyBleHRlbmRzIEJhc2VKZWxseVRlc3QgewotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgVGVzdFN3aW5nVGFncyhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShUZXN0U3dpbmdUYWdzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKiogVGVzdHMgc29tZSBiYXNpYyBTd2luZyB0YWcgZnVuY3Rpb25zIGxpa2UgY3JlYXRpbmcgY29tcG9uZW50cwotICAgICAqICwgYWRkaW5nIHRoZW0gdG8gdGhlIHBhcmVudCBjb250YWluZXIgYW5kIHNldHRpbmcgYmVhbiB2YWx1ZXMuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNDb21wb25lbnRGdW5jdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc0FXVEF2YWlsYWJsZSgpKSByZXR1cm47Ci0gICAgICAgIHJ1blN3aW5nU2NyaXB0KCJ0ZXN0LnNpbXBsZSIpOwotICAgICAgICBKZWxseUNvbnRleHQgY29udGV4dCA9IGdldEplbGx5Q29udGV4dCgpOwotICAgICAgICBKRnJhbWUgZnJhbWUgPSAoSkZyYW1lKSBjb250ZXh0LmdldFZhcmlhYmxlKCJmcmFtZSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IERpbWVuc2lvbigxMDAsMTAwKSwgZnJhbWUuZ2V0U2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgyMDAsMjAwKSwgZnJhbWUuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIEpQYW5lbCBwYW5lbCA9IChKUGFuZWwpIGNvbXBvbmVudEJ5TmFtZShmcmFtZS5nZXRDb250ZW50UGFuZSgpLCAicGFuZWwiKTsKLSAgICAgICAgSkJ1dHRvbiBidXR0b24gPSAoSkJ1dHRvbikgY29tcG9uZW50QnlOYW1lKHBhbmVsLCAiYnV0dG9uIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYnV0dG9uKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDb2xvcigweDExLDB4MjIsMHgzMyksIGJ1dHRvbi5nZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENvbG9yKDB4NDQsMHg1NSwweDY2KSwgYnV0dG9uLmdldEZvcmVncm91bmQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhEZWJ1Z0dyYXBoaWNzLkZMQVNIX09QVElPTnxEZWJ1Z0dyYXBoaWNzLkxPR19PUFRJT04sIHBhbmVsLmdldERlYnVnR3JhcGhpY3NPcHRpb25zKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoRGVidWdHcmFwaGljcy5CVUZGRVJFRF9PUFRJT04sIGJ1dHRvbi5nZXREZWJ1Z0dyYXBoaWNzT3B0aW9ucygpKTsKLSAgICB9Ci0KLSAgICAvKiogVGVzdHMgdGhlIEdyaWRiYWdMYXlvdXQgdGFncywgbWFraW5nIHN1cmUgdGhhdCB0aGUgY29uc3RyYWludHMgYXJlCi0gICAgICogc2V0IHByb3Blcmx5IGluY2x1ZGluZyBpbmhlcml0YW5jZSBhbmQgYmFzZWRPbi4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHcmlkQmFnQmFzaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc0FXVEF2YWlsYWJsZSgpKSByZXR1cm47Ci0gICAgICAgIHJ1blN3aW5nU2NyaXB0KCJ0ZXN0LmdiYyIpOwotICAgICAgICBKZWxseUNvbnRleHQgY29udGV4dCA9IGdldEplbGx5Q29udGV4dCgpOwotICAgICAgICBKRnJhbWUgZnJhbWUgPSAoSkZyYW1lKSBjb250ZXh0LmdldFZhcmlhYmxlKCJmcmFtZSIpOwotICAgICAgICBKQnV0dG9uIGJ1dHRvbiA9IChKQnV0dG9uKSBjb21wb25lbnRCeU5hbWUoZnJhbWUuZ2V0Q29udGVudFBhbmUoKSwgImJ1dHRvbiIpOwotICAgICAgICBKQnV0dG9uIGJ1dHRvbjIgPSAoSkJ1dHRvbikgY29tcG9uZW50QnlOYW1lKGZyYW1lLmdldENvbnRlbnRQYW5lKCksICJidXR0b24yIik7Ci0gICAgICAgIEdyaWRCYWdMYXlvdXQgbGF5b3V0ID0gKEdyaWRCYWdMYXlvdXQpIGZyYW1lLmdldENvbnRlbnRQYW5lKCkuZ2V0TGF5b3V0KCk7Ci0gICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50cyA9IGxheW91dC5nZXRDb25zdHJhaW50cyhidXR0b24pOwotCi0gICAgICAgIC8vIHRoaXMgaXMgZmFpbGluZwotICAgICAgICBhc3NlcnRFcXVhbHMoR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRILGNvbnN0cmFpbnRzLmFuY2hvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhHcmlkQmFnQ29uc3RyYWludHMuVkVSVElDQUwsIGNvbnN0cmFpbnRzLmZpbGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgY29uc3RyYWludHMuZ3JpZGhlaWdodCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBjb25zdHJhaW50cy5ncmlkd2lkdGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgY29uc3RyYWludHMuZ3JpZHgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNSwgY29uc3RyYWludHMuZ3JpZHkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNywgY29uc3RyYWludHMuaXBhZHgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoOCwgY29uc3RyYWludHMuaXBhZHkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMC4zLCBjb25zdHJhaW50cy53ZWlnaHR4LCAwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnNldHMoMSwyLDMsNCksIGNvbnN0cmFpbnRzLmluc2V0cyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLjYsIGNvbnN0cmFpbnRzLndlaWdodHksIDApOwotCi0gICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50czIgPSBsYXlvdXQuZ2V0Q29uc3RyYWludHMoYnV0dG9uMik7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBjb25zdHJhaW50czIuZ3JpZHgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY29uc3RyYWludHMyLmdyaWR5KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNvbnN0cmFpbnRzMi5pcGFkeCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg5LCBjb25zdHJhaW50czIuaXBhZHkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEluc2V0cygzLDQsNSw2KSwgY29uc3RyYWludHMyLmluc2V0cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdyaWRCYWcxNCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWlzQVdUQXZhaWxhYmxlKCkpIHJldHVybjsKLSAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIikuc3RhcnRzV2l0aCgiMS40IikpIHsKLSAgICAgICAgICAgIHJ1blN3aW5nU2NyaXB0KCJ0ZXN0LmdiYzE0Iik7Ci0gICAgICAgICAgICBKZWxseUNvbnRleHQgY29udGV4dCA9IGdldEplbGx5Q29udGV4dCgpOwotICAgICAgICAgICAgSkZyYW1lIGZyYW1lID0gKEpGcmFtZSkgY29udGV4dC5nZXRWYXJpYWJsZSgiZnJhbWUiKTsKLSAgICAgICAgICAgIEpCdXR0b24gYnV0dG9uID0gKEpCdXR0b24pIGNvbXBvbmVudEJ5TmFtZShmcmFtZS5nZXRDb250ZW50UGFuZSgpLCAiYnV0dG9uIik7Ci0gICAgICAgICAgICBHcmlkQmFnTGF5b3V0IGxheW91dCA9IChHcmlkQmFnTGF5b3V0KSBmcmFtZS5nZXRDb250ZW50UGFuZSgpLmdldExheW91dCgpOwotICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzID0gbGF5b3V0LmdldENvbnN0cmFpbnRzKGJ1dHRvbik7Ci0gICAgICAgICAgICAvL25vdGUgdGhhdCAyMSBpcyB0aGUgSkRLIDEuNCB2YWx1ZSBvZiBHcmlkQmFnQ29uc3RyYWludC5MSU5FX1NUQVJUCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjEsY29uc3RyYWludHMuYW5jaG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcmlkQmFnRmFpbCgpewotICAgICAgICBpZiAoIWlzQVdUQXZhaWxhYmxlKCkpIHJldHVybjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJ1blN3aW5nU2NyaXB0KCJ0ZXN0LmdiY0JhZCIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9zdWNjZXNzCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiBmb3IgYSBiYWQgR0JDIGFuY2hvciIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCdXR0b25Hcm91cCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWlzQVdUQXZhaWxhYmxlKCkpIHJldHVybjsKLSAgICAgICAgcnVuU3dpbmdTY3JpcHQoInRlc3QuYnV0dG9uR3JvdXAiKTsKLSAgICAgICAgSmVsbHlDb250ZXh0IGNvbnRleHQgPSBnZXRKZWxseUNvbnRleHQoKTsKLSAgICAgICAgQnV0dG9uR3JvdXAgYmcgPSAoQnV0dG9uR3JvdXApIGNvbnRleHQuZ2V0VmFyaWFibGUoImJnIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBiZy5nZXRCdXR0b25Db3VudCgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChiZy5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRCZWFuUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc0FXVEF2YWlsYWJsZSgpKSByZXR1cm47Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBydW5Td2luZ1NjcmlwdCgidGVzdC5pbnZhbGlkUHJvcGVydHkiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vc3VjY2VzcwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24gZHVlIHRvIGFuIGludmFsaWQgYmVhbiBwcm9wZXJ0eS4iKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBydW5Td2luZ1NjcmlwdChTdHJpbmcgdGVzdE5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRVcFNjcmlwdCgic3dpbmdUYWdzLmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBnZXRKZWxseSgpLmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGVzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuc2V0VmFyaWFibGUodGVzdE5hbWUsQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgc2NyaXB0LnJ1bihnZXRKZWxseUNvbnRleHQoKSxnZXRYTUxPdXRwdXQoKSk7Ci0gICAgfQotCi0gICAgLyoqIFNlYXJjaGVzIGEgY29udGFpbmVyIGZvciBhIGNvbXBvbmVudCB3aXRoIGEgZ2l2ZW4gbmFtZS4gU2VhcmNoZXMgb25seQotICAgICAqIHRoZSBpbW1lZGlhdGUgY29udGFpbmVyLCBub3QgY2hpbGQgY29udGFpbmVycy4KLSAgICAgKiBAcGFyYW0gY29udGFpbmVyIHRoZSBDb250YWluZXIgdG8gc2VhcmNoIGluCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gbG9vayBmb3IKLSAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBjb21wb25lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZSBuYW1lIGlzbid0IGZvdW5kCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBDb21wb25lbnQgY29tcG9uZW50QnlOYW1lKENvbnRhaW5lciBjb250YWluZXIsIFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICBDb21wb25lbnRbXSBjb21wb25lbnRzID0gY29udGFpbmVyLmdldENvbXBvbmVudHMoKTsKLQotICAgICAgICBmb3IgKGludCBpPTA7aTxjb21wb25lbnRzLmxlbmd0aDtpKyspIHsKLSAgICAgICAgICAgIENvbXBvbmVudCBjb21wb25lbnQgPSBjb21wb25lbnRzW2ldOwotICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkNvbXBvbmVudCAiICsgbmFtZSArICIgbm90IGZvdW5kIGluIGNvbnRhaW5lciAiICsgY29udGFpbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgd2UgYXJlIHJ1bm5pbmcgd2l0aCBBV1QgcHJlc2VudAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0FXVEF2YWlsYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuICFCb29sZWFuLmdldEJvb2xlYW4oImphdmEuYXd0LmhlYWRsZXNzIik7Ci0gICAgfQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlLkJhc2VKZWxseVRlc3QjZ2V0WE1MT3V0cHV0KCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWE1MT3V0cHV0IGdldFhNTE91dHB1dCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBYTUxPdXRwdXQuY3JlYXRlWE1MT3V0cHV0KFN5c3RlbS5vdXQpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvc3dpbmcvYWJvdXQuamVsbHkgYi9qZWxseS10YWdzL3N3aW5nL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9zd2luZy9hYm91dC5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxYjAzMS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3aW5nL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9zd2luZy9hYm91dC5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseSAKLSAgICB4bWxuczpqPSJqZWxseTpjb3JlIiAKLSAgICB4bWxucz0iamVsbHk6c3dpbmciIAotICAgIHhtbG5zOmxvZz0iamVsbHk6bG9nIj4KLQotICAgIDxqOnNldCB2YXI9InRleHQiPgotVGhpcyBpcyBhbiBleGFtcGxlIG9mIHRoZSBraW5kIG9mIFJpY2ggVXNlciBJbnRlcmZhY2UgeW91IGNhbiBjcmVhdGUKLXVzaW5nIEplbGx5U3dpbmcuCi0KLVRoZSB3aG9sZSB1c2VyIGludGVyZmFjZSBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIFhNTCB3aGljaCBjYW4gdGhlbiBiZQotZXhlY3V0ZWQgdXNpbmcgSmVsbHkuCi0KLVRoZXJlIGlzIHN1cHBvcnQgZm9yIGFsbCB0aGUgbWFpbiBTd2luZyBjb250cm9scyBhcyB3ZWxsIGFzIGN1c3RvbSBjb250cm9scy4KLUNvbmZpZ3VyZSB5b3VyIHZpZXdzIHVzaW5nIFhNTCB0ZWNobmlxdWVzIHN1Y2ggYXMgWFNMVCBvciBKZWxseSwgdGhlbiAKLXBsdWcgaW4geW91ciBvd24gbW9kZWxzIG9yIGNyZWF0ZSBuZXcgbW9kZWxzIGR5bmFtaWNhbGx5IHVzaW5nIEplbGx5LiAgICAgICAgCi0gICAgPC9qOnNldD4KLSAgICAKLSAgICA8b3B0aW9uUGFuZSB2YXI9Im9wdGlvblBhbmUiIG1lc3NhZ2U9IiR7dGV4dH0iLz4KLSAgICAKLSAgICA8ajpzZXQgdmFyPSJkaWFsb2ciIHZhbHVlPSIke29wdGlvblBhbmUuY3JlYXRlRGlhbG9nKGZyYW1lLCAnQWJvdXQgSmVsbHlTd2luZycpfSIvPgotICAgICR7ZGlhbG9nLnNob3coKX0KLSAgICAKLTwvajpqZWxseT4KLQotCi0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3N3aW5nL2V4YW1wbGUuamVsbHkgYi9qZWxseS10YWdzL3N3aW5nL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9zd2luZy9leGFtcGxlLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmFmMTE5Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3N3aW5nL2V4YW1wbGUuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqOmplbGx5IAotICAgIHhtbG5zOmo9ImplbGx5OmNvcmUiIAotICAgIHhtbG5zPSJqZWxseTpzd2luZyIgCi0gICAgeG1sbnM6bG9nPSJqZWxseTpsb2ciCi0gICAgeG1sbnM6ZGVmaW5lPSJqZWxseTpkZWZpbmUiPgotCi0gIDxhY3Rpb24gdmFyPSJmb29BY3Rpb24iIG5hbWU9IkZvbyIgdG9vbHRpcD0ic29tZSB0ZXh0Ij4KLSAgICAgIDxsb2c6aW5mbz5KdXN0IGV2YWx1YXRlZCB0aGUgZm9vIGFjdGlvbiE8L2xvZzppbmZvPgotICA8L2FjdGlvbj4KLQotICA8Zm9udCB2YXI9ImJpZ2ZvbnQiIG5hbWU9ImhlbHZldGljYSIgZmFtaWx5PSJoZWx2ZXRpY2EiIHNpemU9IiR7MjB9Ii8+Ci0KLSAgICA8ZGVmaW5lOnNjcmlwdCB2YXI9Im9uQ2xvc2luZyI+Ci0gICAgPGxvZzppbmZvPlRoZSBmcmFtZSBpcyBjbG9zaW5nIHZpYSBldmVudDogJHtldmVudH08L2xvZzppbmZvPgotICA8L2RlZmluZTpzY3JpcHQ+Ci0gIAotICA8ZnJhbWUgdGl0bGU9IlRoaXMgaXMgYSBmcmFtZSIgdmFyPSJmcmFtZSIgbG9jYXRpb249IjEwMCwxMDAiIHNpemU9IjgwMCw0MDAiPgotICAgICAgPGZvbnQgZmFtaWx5PSJoZWx2ZXRpY2EiIHNpemU9IjE0Ii8+Ci0gICAgPG1lbnVCYXI+Ci0gICAgICA8bWVudSB0ZXh0PSJGaWxlIj4KLSAgICAgICAgPG1lbnVJdGVtPgotICAgICAgICAgIDxhY3Rpb24gbmFtZT0iTmV3Ij4KLSAgICAgICAgICAgICAgPGxvZzppbmZvPmNsaWNrZWQgb24gdGhlIE5ldyBtZW51IGl0ZW0hPC9sb2c6aW5mbz4KLSAgICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgPC9tZW51SXRlbT4KLSAgICAgICAgPG1lbnVJdGVtPgotICAgICAgICAgIDxhY3Rpb24gbmFtZT0iT3BlbiI+Ci0gICAgICAgICAgICAgIDxsb2c6aW5mbz5Qb3B1cCBhIGZpbGUgZGlhbG9nITwvbG9nOmluZm8+Ci0gICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgIDwvbWVudUl0ZW0+Ci0gICAgICAgIDxtZW51SXRlbSB0ZXh0PSJTYXZlIiBlbmFibGVkPSJmYWxzZSIgLz4KLSAgICAgICAgPHNlcGFyYXRvci8+Ci0gICAgICAgIDxtZW51SXRlbSB0ZXh0PSJQcm9wZXJ0aWVzIiBmb250PSIke2JpZ2ZvbnR9Ii8+Ci0gICAgICAgIDxtZW51SXRlbSBhY3Rpb249IiR7Zm9vQWN0aW9ufSIvPgotICAgICAgPC9tZW51PgotICAgICAgPG1lbnUgdGV4dD0iRGVtbyI+Ci0gICAgICAgIDxtZW51SXRlbT4KLSAgICAgICAgICA8YWN0aW9uIG5hbWU9IkdyaWRCYWdMYXlvdXQgZGVtbyI+Ci0gICAgICAgICAgICAgIDxsb2c6aW5mbz5hYm91dCB0byBydW4gdGhlIEdyaWRCYWdMYXlvdXQgZGVtby4uLjwvbG9nOmluZm8+Ci0gICAgICAgICAgICAgIDxqOmluY2x1ZGUgdXJpPSJncmlkQmFnRGVtby5qZWxseSIvPgotICAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICA8L21lbnVJdGVtPgotICAgICAgPC9tZW51PgotICAgICAgPG1lbnUgdGV4dD0iUnVuIj4KLSAgICAgICAgPG1lbnVJdGVtPgotICAgICAgICAgIDxhY3Rpb24gbmFtZT0iUnVuIGEgSmVsbHkgc2NyaXB0Ij4KLSAgICAgICAgICAgICAgPGxvZzppbmZvPmFib3V0IHRvIG9wZW4gdGhlIEplbGx5IHNjcmlwdCBydW5uZXIuLi48L2xvZzppbmZvPgotICAgICAgICAgICAgICA8ajppbmNsdWRlIHVyaT0icnVuLmplbGx5Ii8+Ci0gICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgIDwvbWVudUl0ZW0+Ci0gICAgICA8L21lbnU+Ci0gICAgICA8bWVudSB0ZXh0PSJIZWxwIj4KLSAgICAgICAgPG1lbnVJdGVtPgotICAgICAgICAgIDxhY3Rpb24gbmFtZT0iQWJvdXQiPgotICAgICAgICAgICAgICA8bG9nOmluZm8+YWJvdXQgdG8gZGlzcGxheSB0aGUgYWJvdXQgZGlhbG9nLi4uPC9sb2c6aW5mbz4KLSAgICAgICAgICAgICAgPGo6aW5jbHVkZSB1cmk9ImFib3V0LmplbGx5Ii8+Ci0gICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgIDwvbWVudUl0ZW0+Ci0gICAgICA8L21lbnU+Ci0gICAgPC9tZW51QmFyPgotICAgIAotICAgICAgICA8c3BsaXRQYW5lPiAgICAKLSAgICAgIDxwYW5lbD4KLSAgICAgICAgICA8dGl0bGVkQm9yZGVyIHRpdGxlPSJTYW1wbGUgQm9yZGVyIFRpdGxlIi8+Ci0gICAgICAgICAgPHRhYmxlTGF5b3V0PgotICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxsYWJlbCB0ZXh0PSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPiAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0RmllbGQgdGV4dD0iSmFtZXMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgICA8bGFiZWwgdGV4dD0iTG9jYXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgICAgPHRleHRGaWVsZCB0ZXh0PSJMb25kb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGFsaWduPSJjZW50ZXIiPgotICAgICAgICAgICAgICAgICAgICAgIDxwYW5lbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxhY3Rpb24gbmFtZT0iT0siPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvZzppbmZvPkNsaWNrZWQgb24gdGhlIE9LIGJ1dHRvbjwvbG9nOmluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGFjdGlvbj0iJHtmb29BY3Rpb259Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYW5lbD4gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPC90YWJsZUxheW91dD4KLSAgICAgIDwvcGFuZWw+Ci0gICAgICA8c2Nyb2xsUGFuZT4KLSAgICAgICAgICA8IS0tIHRoaXMgdGFnIGNhbiBzZXQgcHJvcGVydGllcyBvbiB0aGUgYmVhbiBtb2RlbCB0b28gLS0+Ci0gICAgICAgIDxqOnVzZUJlYW4gdmFyPSJ0YWJsZU1vZGVsIiBjbGFzcz0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnN3aW5nLk15VGFibGVNb2RlbCIvPgotICAgICAgICA8dGFibGUgbW9kZWw9IiR7dGFibGVNb2RlbH0iLz4KLSAgICAgIDwvc2Nyb2xsUGFuZT4KLSAgICA8L3NwbGl0UGFuZT4KLSAgICAKLSAgICA8d2luZG93TGlzdGVuZXIgdmFyPSJldmVudCIgY2xvc2luZz0iJHtvbkNsb3Npbmd9Ii8+Ci0gIDwvZnJhbWU+Ci0gIAotICAke2ZyYW1lLnNob3coKX0KLSAgCi08L2o6amVsbHk+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3aW5nL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9zd2luZy9ncmlkQmFnRGVtby5qZWxseSBiL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3N3aW5nL2dyaWRCYWdEZW1vLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU5ZGE4Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3N3aW5nL2dyaWRCYWdEZW1vLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseSAKLSAgICB4bWxuczpqPSJqZWxseTpjb3JlIiAKLSAgICB4bWxucz0iamVsbHk6c3dpbmciIAotICAgIHhtbG5zOmxvZz0iamVsbHk6bG9nIgotICAgIHhtbG5zOmRlZmluZT0iamVsbHk6ZGVmaW5lIgotICAgIHhtbG5zOmJzaD0iamVsbHk6YmVhbnNoZWxsIj4KLQotICAgICAgICA8IS0tIAotICAgICAgICAgICAgVE9ETzoKLSAgICAgICAgICAgICAgICAtIGFuIGluc2V0cyB0YWcgKENWUyA/KQotICAgICAgICAgICAgICAgIC0gc29tZSBGb250IHN1cHBvcnQgKENWUyA/KQotICAgICAgICAgICAgICAgIC0gaW5jb3Jwb3JhdGUgQ29sbGFwc2FibGVQYW5lbAotICAgICAgICAgICAgICAgIC0gZHJhZ2FibGUgTGFiZWwgd2l0aCBzdWJjbGFzcyBJdGVtVGl0bGVMYWJlbAotICAgICAgICAgICAgICAgIC0gQ29sbGFwc2FibGVQYW5lbCBpbXBsZW1lbnRpbmcgRHJvcFRhcmdldCAob3IgYXBwcm9hY2hlciBhdCBsZWFzdCkKLSAgICAgICAgICAgICAgICAtIGFkZGluZyByZWxhdGlvbnMKLSAgICAgICAgICAgICAgICAtIERDIHBhbmUgKGxhdGVyIHdpdGggaW5oZXJpdGFuY2UpCi0gICAgICAgICAgICAgICAgLSBSZWxhdGlvbnMgUGFuZSB3aXRoIGRyb3AKLSAgICAgICAgICAgIC0tPgotICA8ZGVmaW5lOnNjcmlwdCB2YXI9Im9uQ2xvc2luZyI+Ci0gICAgPGxvZzppbmZvPlRoZSBmcmFtZSBpcyBjbG9zaW5nIHZpYSBldmVudDogJHtldmVudH08L2xvZzppbmZvPgotICA8L2RlZmluZTpzY3JpcHQ+Ci0gIAotICA8ZnJhbWUgdGl0bGU9Ik1ldGFkYXRhIHN0YXJ0IG9mIHBhbmUgZm9yIGEgZGVmaW5pdGlvbiIgdmFyPSJmcmFtZSIgbG9jYXRpb249IjEwMCwxMDAiIHNpemU9IjgwMCw0MDAiPgotICAgIAotICAgICAgPHBhbmVsIG5hbWU9Im1ldGFkYXRhLXBhbmVsIj4KLSAgICAgICAgICAgICAgICA8Z3JpZEJhZ0xheW91dD4KLSAgICAgICAgICAgICAgICAgICAgPGdiYyBncmlkeD0iMCIgZ3JpZHk9IjAiIGlwYWR4PSIyMCIgZmlsbD0iaG9yaXpvbnRhbCI+IAotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBwcmVmZXIgYSB0aXRsZSA/PyBkbmQgbWF5IGJlIGhhcmRlciAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwYW5lbCBuYW1lPSJoZWFkLXBhbmVsIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCB0ZXh0PSJEZWZpbml0aW9uOiBEZWZpbml0aW9uIG9mIGEgbWV0cmljcyIvPjwhLS0gbmVlZCBmb250cyAhIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0aGlzIHNob3VsZCBiZSBhIGRyYWdnYWJsZSBsYWJlbCwgYmVpbmcgdGhlIHNvdXJjZSB0byBkcm9wIGEgcmVsYXRpb24gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3BhbmVsPgotICAgICAgICAgICAgICAgICAgICA8L2diYz4KLSAgICAgICAgICAgICAgICAgICAgPGdiYyBncmlkeD0iMCIgZ3JpZHk9IjEiIGZpbGw9ImJvdGgiPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBjb25zdHJhaW50cyB2YXJpYWJsZSBkZWZpbml0aW9ucy4uLiBmb3IgbGF0ZXIgdXNlLCBpbiB0aGUgY2hpbGRyZW4gb2YgdGhlIGNlbnRlciBlbGVtZW50IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnYmMgdmFyPSJsYWJlbENvbnN0cmFpbnRzIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHg9IjAiIHdlaWdodHk9IjAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBhZHg9IjUiIGlwYWR5PSIyIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvcj0id2VzdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9Im5vbmUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z2JjIHZhcj0icG9wX3VwX2NvbnN0cmFpbnRzIiBiYXNlZE9uPSIke2xhYmVsQ29uc3RyYWludHN9IiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHg9IjEiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvcj0iZWFzdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncmlkQmFnTGF5b3V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z2JjIGdyaWR5PSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYW5lbCBuYW1lPSJkY19tZXRhZGF0YSI+PCEtLSBzaG91bGQgYmUgYSBjb2xsYXBhc2JsZSBwYW5lbCAhISAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgdGV4dD0iLi4uIHN0aWxsIHRvZG8uLi4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFuZWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ2JjPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z2JjIGdyaWR5PSIxIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYW5lbCBuYW1lPSJwZWRhZ29naWNhbCBtZXRhZGF0YSI+PCEtLSBzaG91bGQgYmUgYSBjb2xsYXBhc2JsZSBwYW5lbCAhISAtLT48Z3JpZEJhZ0xheW91dD4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnYmMgZ3JpZHg9IjAiIGdyaWR5PSIwIiBiYXNlZE9uPSIke2xhYmVsQ29uc3RyYWludHN9Ij48bGFiZWwgdGV4dD0iRGlmZmljdWx0eToiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nYmM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnYmMgZ3JpZHg9IjEiIGdyaWR5PSIwIiBiYXNlZE9uPSIke3BvcF91cF9jb25zdHJhaW50c30iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbWJvQm94IG5hbWU9ImNvbWJvWmVybyIgdmFyPSJjb21ib1plcm8iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Y29tYm9aZXJvLmFkZEl0ZW0oImVhc3kiKX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Y29tYm9aZXJvLmFkZEl0ZW0oImZhaXIiKX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Y29tYm9aZXJvLmFkZEl0ZW0oImRpZmZpY3VsdCIpfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtjb21ib1plcm8uc2V0U2VsZWN0ZWRJbmRleCgxKX0kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2diYz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnYmMgZ3JpZHg9IjAiIGdyaWR5PSIxIiBiYXNlZE9uPSIke2xhYmVsQ29uc3RyYWludHN9Ij48bGFiZWwgdGV4dD0iQWJzdHJhY3RuZXNzOiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2diYz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdiYyBncmlkeD0iMSIgZ3JpZHk9IjEiIGJhc2VkT249IiR7cG9wX3VwX2NvbnN0cmFpbnRzfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29tYm9Cb3ggbmFtZT0iYyIgdmFyPSJjIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2MuYWRkSXRlbSgiY29uY3JldGUiKX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Yy5hZGRJdGVtKCJtZWRpdW0iKX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Yy5hZGRJdGVtKCJhYnN0cmFjdCIpfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtjLnNldFNlbGVjdGVkSW5kZXgoMSl9JAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nYmM+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z2JjIGdyaWR4PSIyIiBncmlkeT0iMCIgYmFzZWRPbj0iJHtsYWJlbENvbnN0cmFpbnRzfSIgZ3JpZGhlaWdodD0iMiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwYWR4PSIxMCI+PHBhbmVsIG5hbWU9ImJsYW5rIi8+PC9nYmM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdiYyBncmlkeD0iMyIgZ3JpZHk9IjAiIGJhc2VkT249IiR7bGFiZWxDb25zdHJhaW50c30iPjxsYWJlbCB0ZXh0PSJMZWFybmluZy1jb250ZXh0OiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2diYz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdiYyBncmlkeD0iNCIgZ3JpZHk9IjAiIGJhc2VkT249IiR7cG9wX3VwX2NvbnN0cmFpbnRzfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29tYm9Cb3ggbmFtZT0iYyIgdmFyPSJjIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2MuYWRkSXRlbSgicHJpbWFyeS1lZHVjYXRpb24iKX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Yy5hZGRJdGVtKCJzZWNvbmRhcnktZWR1Y2F0aW9uIil9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2MuYWRkSXRlbSgiaGlnaGVyLWVkdWNhdGlvbiIpfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtjLmFkZEl0ZW0oInVuaXZlcnNpdHktZmlyc3QtY3ljbGUiKX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Yy5hZGRJdGVtKCJ1bml2ZXJzaXR5LXNlY29uZC1jeWNsZSIpfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtjLmFkZEl0ZW0oInVuaXZlcnNpdHktcG9zdGdyYWR1YXRlIil9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2MuYWRkSXRlbSgidGVjaG5pY2FsLXNjaG9vbC1maXJzdC1jeWNsZSIpfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtjLmFkZEl0ZW0oInRlY2huaWNhbC1zY2hvb2wtc2Vjb25kLWN5Y2xlIil9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2MuYWRkSXRlbSgicHJvZmVzc2lvbmFsLWZvcm1hdGlvbiIpfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtjLmFkZEl0ZW0oImNvbnRpbnVvdXMtZm9ybWF0aW9uIil9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2diYz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnYmMgZ3JpZHg9IjMiIGdyaWR5PSIxIiBiYXNlZE9uPSIke2xhYmVsQ29uc3RyYWludHN9Ij48bGFiZWwgdGV4dD0iRmllbGQ6Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ2JjPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z2JjIGdyaWR4PSI0IiBncmlkeT0iMSIgYmFzZWRPbj0iJHtwb3BfdXBfY29uc3RyYWludHN9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb21ib0JveCBuYW1lPSJjIiB2YXI9ImMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Yy5hZGRJdGVtKCJtYXRoZW1hdGljcyIpfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtjLmFkZEl0ZW0oInN0YXRpc3RpY3MiKX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Yy5hZGRJdGVtKCJlbmdpbmVlcmluZyIpfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtjLmFkZEl0ZW0oInBzeWNob2xvZ3kiKX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Yy5hZGRJdGVtKCJiaW9sb2d5Iil9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2MuYWRkSXRlbSgiY2hlbWlzdHJ5Iil9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2MuYWRkSXRlbSgicGh5c2ljcyIpfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtjLmFkZEl0ZW0oImNvbXB1dGVyLXNjaWVuY2UiKX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Yy5hZGRJdGVtKCJlY29ub215Iil9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2MuYWRkSXRlbSgiaGlzdG9yaWNhbCIpfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtjLmFkZEl0ZW0oIm90aGVyIil9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2diYz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyaWRCYWdMYXlvdXQ+PC9wYW5lbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nYmM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmlkQmFnTGF5b3V0PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nYmM+Ci0gICAgICAgICAgICAgICAgICAgIDxnYmMgZ3JpZHg9IjAiIGdyaWR5PSIyIiBmaWxsPSJob3Jpem9udGFsIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gd291bGQgbmVlZCBhIHNlcGFyYXRvciBoZXJlLiIgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2diYz4KLSAgICAgICAgICAgICAgICA8L2dyaWRCYWdMYXlvdXQ+Ci0gICAgICA8L3BhbmVsPgotICAgIAotICAgIDx3aW5kb3dMaXN0ZW5lciB2YXI9ImV2ZW50IiBjbG9zaW5nPSIke29uQ2xvc2luZ30iLz4KLSAgPC9mcmFtZT4KLSAgJHtmcmFtZS5zaG93KCl9IAotCi08L2o6amVsbHk+Ci0KLQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3aW5nL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9zd2luZy9ydW4uamVsbHkgYi9qZWxseS10YWdzL3N3aW5nL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9zd2luZy9ydW4uamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NTc3MTcuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd2luZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvc3dpbmcvcnVuLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqOmplbGx5IAotICAgIHhtbG5zOmo9ImplbGx5OmNvcmUiIAotICAgIHhtbG5zPSJqZWxseTpzd2luZyIgCi0gICAgeG1sbnM6bG9nPSJqZWxseTpsb2ciPgotCi0gICAgPCEtLSBkZWZhdWx0IHdvcmtpbmcgZGlyZWN0b3J5IHRvIHN3aW5nIGV4YW1wbGVzIC0tPiAgICAgICAgCi0gICAgPGo6aWYgdGVzdD0iJHtlbXB0eSB3b3JraW5nLmRpcn0iPgotICAgICAgICA8ajpzZXQgdmFyPSJ3b3JraW5nLmRpciIgdmFsdWU9InNyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9zd2luZyIvPgotICAgIDwvajppZj4KLQotICAgIDwhLS0gYWN0aW9uIHRvIGNob29zZSBhIGZpbGUgLS0+Ci0gICAgPGFjdGlvbiB2YXI9ImNob29zZUZpbGVBY3Rpb24iIG5hbWU9Ii4uLiI+ICAgICAgICAgICAgCi0gICAgICAgIDxmaWxlQ2hvb3NlciB2YXI9ImNob29zZXIiIGN1cnJlbnREaXJlY3Rvcnk9IiR7d29ya2luZy5kaXJ9Ii8+Ci0gICAgICAgIAotICAgICAgICAke2Nob29zZXIuc2hvd0RpYWxvZyhmcmFtZSwgJ0Nob29zZSBKZWxseSBmaWxlJyl9Ci0gICAgCi0gICAgICAgIDxqOnNldCB2YXI9ImZpbGUiIHZhbHVlPSIke2Nob29zZXIuc2VsZWN0ZWRGaWxlfSIvPgotICAgICAgICA8ajppZiB0ZXN0PSIke2ZpbGUgIT0gbnVsbH0iPgotICAgICAgICAgICAgPGo6c2V0IHRhcmdldD0iJHtzY3JpcHRGaWVsZH0iIHByb3BlcnR5PSJ0ZXh0IiB2YWx1ZT0iJHtmaWxlLnRvVVJMKCkudG9TdHJpbmcoKX0iLz4KLSAgICAgICAgPC9qOmlmPgotICAgIDwvYWN0aW9uPgotCi0KLSAgICA8IS0tIGNyZWF0ZSB0aGUgZnJhbWUgLS0+Ci0gICAgPGZyYW1lIHZhcj0iZnJhbWUiIHNpemU9IjQwMCwxNTAiIGxvY2F0aW9uPSIyMDAsMjAwIiB0aXRsZT0iSmVsbHkgUnVubmVyIj4KLSAgICAgICAgPHBhbmVsPgotICAgICAgICAgIDx0YWJsZUxheW91dD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY29sZmlsbD0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGFuZWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJvcmRlckxheW91dCBoZ2FwPSIyIiB2Z2FwPSIyIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJvcmRlckFsaWduIGFsaWduPSJ3ZXN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgdGV4dD0iU2NyaXB0IHRvIHJ1bjoiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ib3JkZXJBbGlnbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxib3JkZXJBbGlnbiBhbGlnbj0iY2VudGVyIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGaWVsZCB2YXI9InNjcmlwdEZpZWxkIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYm9yZGVyQWxpZ24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Ym9yZGVyQWxpZ24gYWxpZ249ImVhc3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGFjdGlvbj0iJHtjaG9vc2VGaWxlQWN0aW9ufSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2JvcmRlckFsaWduPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2JvcmRlckxheW91dD4KLSAgICAgICAgICAgICAgICAgICAgICA8L3BhbmVsPgotICAgICAgICAgICAgICAgICAgICA8L3RkPiAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4KLSAgICAgICAgICAgICAgICAgICAgPHBhbmVsPgotICAgICAgICAgICAgICAgICAgICA8YnV0dG9uPgotICAgICAgICAgICAgICAgICAgICAgIDxhY3Rpb24gbmFtZT0iUnVuIFNjcmlwdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9nOmluZm8+YWJvdXQgdG8gcnVuICR7ZmlsZX08L2xvZzppbmZvPiAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqOmluY2x1ZGUgdXJpPSIke3NjcmlwdEZpZWxkLnRleHR9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFuZWw+ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwvdGQ+ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZUxheW91dD4KLSAgICA8L3BhbmVsPgotICAgIDwvZnJhbWU+Ci0KLSAgICAke2ZyYW1lLnNldFZpc2libGUodHJ1ZSl9Ci0KLTwvajpqZWxseT4KLQotCi0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3N3aW5nL3Nob3dWYXJpYWJsZXMuamVsbHkgYi9qZWxseS10YWdzL3N3aW5nL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9zd2luZy9zaG93VmFyaWFibGVzLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjkxODc3Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3N3aW5nL3Nob3dWYXJpYWJsZXMuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGo6amVsbHkgCi0gICAgeG1sbnM6aj0iamVsbHk6Y29yZSIgCi0gICAgeG1sbnM9ImplbGx5OnN3aW5nIiAKLSAgICB4bWxuczpsb2c9ImplbGx5OmxvZyI+Ci0KLSAgICA8IS0tIGxldHMgY3JlYXRlIHRoZSBtb2RlbCAtLT4KLSAgICA8ajp1c2VMaXN0IHZhcj0ibGlzdCIgaXRlbXM9IiR7Y29udGV4dC5nZXRWYXJpYWJsZU5hbWVzKCl9Ii8+Ci0KLSAgICA8bG9nOmluZm8+Q3JlYXRlZCBsaXN0ICR7bGlzdH08L2xvZzppbmZvPgotICAgICAgICAKLSAgICA8IS0tIGNyZWF0ZSB0aGUgZGlhbG9nIC0tPgotICAgIDxkaWFsb2cgdmFyPSJkaWFsb2ciIHNpemU9IjQwMCwxNTAiIGxvY2F0aW9uPSIyMDAsMjAwIiB0aXRsZT0iVmFyaWFibGVzIj4KLSAgICAgICAgPHNjcm9sbFBhbmU+Ci0gICAgICAgICAgPHRhYmxlPgotICAgICAgICAgICAgICAgIDx0YWJsZU1vZGVsIHJvd3M9IiR7bGlzdH0iPgotICAgICAgICAgICAgICAgICAgICA8dGFibGVNb2RlbENvbHVtbiBoZWFkZXJWYWx1ZT0iSUQiIHZhbHVlPSIke3Jvd0luZGV4fSIvPgotICAgICAgICAgICAgICAgICAgICA8dGFibGVNb2RlbENvbHVtbiBoZWFkZXJWYWx1ZT0iTmFtZSIgdmFsdWU9IiR7cm93fSIvPgotICAgICAgICAgICAgICAgICAgICA8dGFibGVNb2RlbENvbHVtbiBoZWFkZXJWYWx1ZT0iVmFsdWUiIHZhbHVlPSIke2NvbnRleHQuZ2V0VmFyaWFibGUocm93KX0iLz4KLSAgICAgICAgICAgICAgICAgICAgPHRhYmxlTW9kZWxDb2x1bW4gaGVhZGVyVmFsdWU9IlR5cGUiIHZhbHVlPSIke2NvbnRleHQuZ2V0VmFyaWFibGUocm93KS5nZXRDbGFzcygpLmdldE5hbWUoKX0iLz4KLSAgICAgICAgICAgICAgICA8L3RhYmxlTW9kZWw+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgPC9zY3JvbGxQYW5lPgotICAgIDwvZGlhbG9nPgotCi0gICAgJHtkaWFsb2cuc2V0VmlzaWJsZSh0cnVlKX0KLQotPC9qOmplbGx5PgotCi0KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvc3dpbmcvc3dpbmdUYWdzLmplbGx5IGIvamVsbHktdGFncy9zd2luZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvc3dpbmcvc3dpbmdUYWdzLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTZmOTU3Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3N3aW5nL3N3aW5nVGFncy5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPGo6amVsbHkgCi0gICAgeG1sbnM6aj0iamVsbHk6Y29yZSIgCi0gICAgeG1sbnM9ImplbGx5OnN3aW5nIj4KLQkKLSAgICA8IS0tZm9yIHRoZSBiYXNpYyBjb21wb25lbnQgYXNzZW1ibHktLT4KLSAgICA8ajppZiB0ZXN0PSIke3Rlc3Quc2ltcGxlfSI+Ci0gICAgICAgIDxmcmFtZSBuYW1lPSJmcmFtZSIgdmFyPSJmcmFtZSIgc2l6ZT0iMTAwLDEwMCIgbG9jYXRpb249IjIwMCwyMDAiPgotICAgICAgICAgICAgPHBhbmVsIG5hbWU9InBhbmVsIiBkZWJ1Z0dyYXBoaWNzPSJsb2d8Zmxhc2giPgotICAgICAgICAgICAgICAgIDxidXR0b24gbmFtZT0iYnV0dG9uIiBiYWNrZ3JvdW5kPSIjMTEyMjMzIiBmb3JlZ3JvdW5kPSIjNDQ1NTY2IiBkZWJ1Z0dyYXBoaWNzT3B0aW9ucz0iYnVmZmVyZWQiLz4KLSAgICAgICAgICAgIDwvcGFuZWw+Ci0gICAgICAgIDwvZnJhbWU+Ci0gICAgPC9qOmlmPgotICAgIAotICAgIDwhLS1mb3IgdGhlIEdyaWRCYWcgdGVzdC0tPgotICAgIDxqOmlmIHRlc3Q9IiR7dGVzdC5nYmN9Ij4KLSAgICAgICAgPGZyYW1lIG5hbWU9ImZyYW1lIiB2YXI9ImZyYW1lIj4KLSAgICAgICAgICAgIDxncmlkQmFnTGF5b3V0PgotICAgICAgICAgICAgICAgIDxnYmMgYW5jaG9yPSJub3J0aCIgZmlsbD0idmVydGljYWwiIGdyaWRoZWlnaHQ9IjMiIAotICAgICAgICAgICAgICAgICAgICBncmlkd2lkdGg9IjIiIGdyaWR4PSI0IiBncmlkeT0iNSIgaW5zZXRzPSIxLDIsMyw0IgotICAgICAgICAgICAgICAgICAgICBpcGFkeD0iNyIgaXBhZHk9IjgiIHdlaWdodHg9Ii4zIiB3ZWlnaHR5PSIuNiI+Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG5hbWU9ImJ1dHRvbiIvPgotICAgICAgICAgICAgICAgIDwvZ2JjPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDxnYmMgZ3JpZHg9IjEiIGdyaWR5PSIyIiBpbnNldHM9IjMsNCw1LDYiCi0gICAgICAgICAgICAgICAgICAgIGlwYWR4PSI4IiBpcGFkeT0iOSI+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDxnYmMgaXBhZHg9IjIiPgotICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuYW1lPSJidXR0b24yIiAvPgotICAgICAgICAgICAgICAgICAgICA8L2diYz4KLSAgICAgICAgICAgICAgICA8L2diYz4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwvZ3JpZEJhZ0xheW91dD4KLSAgICAgICAgPC9mcmFtZT4KLSAgICA8L2o6aWY+Ci0gICAgCi0gICAgPCEtLWZvciB0aGUgR3JpZEJhZyAxLjQgdGVzdC0tPgotICAgIDxqOmlmIHRlc3Q9IiR7dGVzdC5nYmMxNH0iPgotICAgICAgICA8ZnJhbWUgbmFtZT0iZnJhbWUiIHZhcj0iZnJhbWUiPgotICAgICAgICAgICAgPGdyaWRCYWdMYXlvdXQ+Ci0gICAgICAgICAgICAgICAgPGdiYyBhbmNob3I9ImxpbmVfc3RhcnQiPgotICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG5hbWU9ImJ1dHRvbiIvPgotICAgICAgICAgICAgICAgIDwvZ2JjPgotICAgICAgICAgICAgPC9ncmlkQmFnTGF5b3V0PgotICAgICAgICA8L2ZyYW1lPgotICAgIDwvajppZj4KLSAgICAKLSAgICA8IS0tZm9yIHRoZSBHcmlkQmFnIGludmFsaWQgYW5jaG9yIHRlc3QtLT4KLSAgICA8ajppZiB0ZXN0PSIke3Rlc3QuZ2JjQmFkfSI+Ci0gICAgICAgIDxmcmFtZSBuYW1lPSJmcmFtZSIgdmFyPSJmcmFtZSI+Ci0gICAgICAgICAgICA8Z3JpZEJhZ0xheW91dD4KLSAgICAgICAgICAgICAgICA8Z2JjIGFuY2hvcj0iZm9vIj4KLSAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuYW1lPSJidXR0b24iLz4KLSAgICAgICAgICAgICAgICA8L2diYz4KLSAgICAgICAgICAgIDwvZ3JpZEJhZ0xheW91dD4KLSAgICAgICAgPC9mcmFtZT4KLSAgICA8L2o6aWY+Ci0KLSAgICA8IS0tZm9yIHRoZSBCdXR0b25Hcm91cCB0ZXN0LS0+Ci0gICAgPGo6aWYgdGVzdD0iJHt0ZXN0LmJ1dHRvbkdyb3VwfSI+Ci0gICAgICAgIDxmcmFtZSBuYW1lPSJmcmFtZSIgdmFyPSJmcmFtZSI+Ci0gICAgICAgICAgICA8YnV0dG9uR3JvdXAgdmFyPSJiZyI+Ci0gICAgICAgICAgICAgICAgPGNoZWNrQm94IG5hbWU9ImNiMSIvPgotCQkJCTxjaGVja0JveCBuYW1lPSJjYjIiIHNlbGVjdGVkPSJ0cnVlIi8+Ci0JCQkJPGNoZWNrQm94IG5hbWU9ImNiMyIvPgotICAgICAgICAgICAgPC9idXR0b25Hcm91cD4KLSAgICAgICAgPC9mcmFtZT4KLSAgICA8L2o6aWY+Ci0gICAgCi0JPCEtLXRyaWVzIHRvIHNldCBhIGJlYW4gcHJvcGVydHkgdGhhdCBkb2Vzbid0IGV4aXN0LS0+Ci0gICAgPGo6aWYgdGVzdD0iJHt0ZXN0LmludmFsaWRQcm9wZXJ0eX0iPgotICAgICAgICA8ZnJhbWUgbmFtZT0iZnJhbWUiIHZhcj0iZnJhbWUiIHNpemU9IjEwMCwxMDAiIGxvY2F0aW9uPSIyMDAsMjAwIiBmb289ImJhciI+Ci0gICAgICAgICAgICA8cGFuZWwgbmFtZT0icGFuZWwiPgotICAgICAgICAgICAgPC9wYW5lbD4KLSAgICAgICAgPC9mcmFtZT4KLSAgICA8L2o6aWY+Ci0JCi08L2o6amVsbHk+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3aW5nL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9zd2luZy93aXphcmQuamVsbHkgYi9qZWxseS10YWdzL3N3aW5nL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9zd2luZy93aXphcmQuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MzA5NTQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd2luZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvc3dpbmcvd2l6YXJkLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqOmplbGx5IAotICAgIHhtbG5zOmo9ImplbGx5OmNvcmUiIAotICAgIHhtbG5zPSJqZWxseTpzd2luZyIgCi0gICAgeG1sbnM6bG9nPSJqZWxseTpsb2ciCi0gICAgeG1sbnM6dz0iamVsbHk6d2Vya3oiPgotCi0gICAgPHc6dXNlR29hbHMgdmFyPSJnb2FsTWFwIi8+Ci0KLSAgICA8IS0tIGFjdGlvbiB0byBjaG9vc2UgYSBmaWxlIC0tPgotICAgIDxhY3Rpb24gdmFyPSJhdHRhaW5Hb2FsQWN0aW9uIiBuYW1lPSIuLi4iPiAgICAgICAgICAgIAotICAgIDwvYWN0aW9uPgotCi0KLSAgICA8IS0tIGNyZWF0ZSB0aGUgZnJhbWUgLS0+Ci0gICAgPGZyYW1lIHZhcj0iZnJhbWUiIHNpemU9IjQwMCwxNTAiIGxvY2F0aW9uPSIyMDAsMjAwIiB0aXRsZT0iTWF2ZW4gV2l6YXJkIj4KLSAgICA8bWVudUJhcj4KLSAgICAgIDxtZW51IHRleHQ9IlJ1biI+Ci0gICAgICAgICAgICAgICAgPGo6Zm9yRWFjaCB2YXI9Imdyb3VwRW50cnkiIGl0ZW1zPSIke2dvYWxNYXAuZW50cnlTZXQoKX0iPiAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPG1lbnUgdGV4dD0iJHtncm91cEVudHJ5LmtleX0iPgotICAgICAgICAgICAgICAgICAgICAgICAgPGo6Zm9yRWFjaCB2YXI9ImdvYWxFbnRyeSIgaXRlbXM9IiR7Z3JvdXBFbnRyeS52YWx1ZS5lbnRyeVNldCgpfSI+ICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGdpdmUgZWFjaCBtZW51IGl0ZW0gaXRzIG93biBzY29wZSB0aGVuIHRoZXkgaGF2ZSB0aGVpciBvd24gZ29hbCBuYW1lcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ajpzY29wZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGo6c2V0IHZhcj0iZ29hbE5hbWUiIHZhbHVlPSIke2dvYWxFbnRyeS52YWx1ZS5uYW1lfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1lbnVJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFjdGlvbiBuYW1lPSIke2dvYWxFbnRyeS5rZXl9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9nOmluZm8+QWJvdXQgdG8gaW52b2tlIHRoZSAke2dvYWxOYW1lfSBnb2FsITwvbG9nOmluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHc6YXR0YWluR29hbCBuYW1lPSIke2dvYWxOYW1lfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWVudUl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qOnNjb3BlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9qOmZvckVhY2g+Ci0gICAgICAgICAgICAgICAgICAgIDwvbWVudT4KLSAgICAgICAgICAgICAgICA8L2o6Zm9yRWFjaD4KLSAgICAgICAgICAgIDwvbWVudT4KLSAgICA8L21lbnVCYXI+Ci0gICAgICAgIDxwYW5lbD4KLSAgICA8L3BhbmVsPgotICAgIDwvZnJhbWU+Ci0KLSAgICAke2ZyYW1lLnNldFZpc2libGUodHJ1ZSl9Ci0KLTwvajpqZWxseT4KLQotCi0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3dpbmcveGRvY3MvY2hhbmdlcy54bWwgYi9qZWxseS10YWdzL3N3aW5nL3hkb2NzL2NoYW5nZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDgzYzY2Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcveGRvY3MvY2hhbmdlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tIAotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotIC0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5DaGFuZ2VzPC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0gIDxib2R5PgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMS1TTkFQU0hPVCIgZGF0ZT0iaW4gQ1ZTIj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJmaXgiIGlzc3VlPSJKRUxMWS0xMCIgZHVlLXRvPSJIYW5zIEdpbGRlIj5KZWxseVN3aW5nIHNob3VsZCBiZSBzdHJpY3Qgb24gdGhlIGF0dHJpYnV0ZSBuYW1lcyBpdCB1c2VzLjwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgICAKLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjAiIGRhdGU9IjIwMDQtMDktMTIiPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImFkZCIgaXNzdWU9IkpFTExZLTEzMyIgZHVlLXRvPSJIYW5zIEdpbGRlIj5Db21wb25lbnRUYWcgbWV0aG9kcyBzaG91bGQgdGhyb3cgSmVsbHlUYWdFeGNlcHRpb24uPC9hY3Rpb24+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0iYWRkIiBpc3N1ZT0iSkVMTFktMTMyIiBkdWUtdG89IkhhbnMgR2lsZGUiPkJ1dHRvbkdyb3VwIHRhZyBpcyBicm9rZW4uPC9hY3Rpb24+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0iYWRkIiBpc3N1ZT0iSkVMTFktMTE0Ij5BY3Rpb24gdGFnIGlnbm9yZXMgZW5hYmxlZCBwcm9wZXJ0eS48L2FjdGlvbj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJhZGQiIGlzc3VlPSJKRUxMWS0xMzEiIGR1ZS10bz0iSGFucyBHaWxkZSI+VW5pdCB0ZXN0cyBmb3Igc3dpbmcgdGFnIGxpYi48L2FjdGlvbj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJmaXgiIGlzc3VlPSJKRUxMWS0xMjgiIGR1ZS10bz0iSGFucyBHaWxkZSI+TGF5b3V0IGNvbnN0cmFpbnRzIGRvbid0IHdvcmsgd2l0aCBSb290UGFuZUNvbnRhaW5lciBjbGFzc2VzLjwvYWN0aW9uPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImZpeCIgaXNzdWU9IkpFTExZLTEyOSIgZHVlLXRvPSJIYW5zIEdpbGRlIj5GaXggZXJyb3IgbWVzc2FnZSBmb3IgYmFkIG5lc3Rpbmcgb2YgR2JjIGFuZCBCb3JkZXJBbGlnbiB0YWdzLjwvYWN0aW9uPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImZpeCIgaXNzdWU9IkpFTExZLTkyIiBkdWUtdG89IlJvYmVydCBNY0ludG9zaCI+QWRkIEVtcHR5Qm9yZGVyIHRhZy48L2FjdGlvbj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJmaXgiIGlzc3VlPSJKRUxMWS05MyIgZHVlLXRvPSJSb2JlcnQgTWNJbnRvc2giPkFkZCBFdGNoZWRCb3JkZXIgdGFnLjwvYWN0aW9uPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImZpeCI+RW5zdXJlIEpESyAxLjMgY29tcGF0aWJpbGl0eS48L2FjdGlvbj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJmaXgiIGlzc3VlPSJKRUxMWS0xMzAiIGR1ZS10bz0iSGFucyBHaWxkZSI+SGFuZGxlIEpESyAxLjQgR3JpZGJhZ0NvbnN0cmFpbnRzIHVzaW5nIHJlZmxlY3Rpb248L2FjdGlvbj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJmaXgiIGlzc3VlPSJKRUxMWS0xMjIiIGR1ZS10bz0iSGFucyBHaWxkZSI+Q29tcG9uZW50VGFnIHNob3VsZCBjbGVhciBpdCdzIGJlYW4gcmVmZXJlbmNlIGFmdGVyIGRvVGFnPC9hY3Rpb24+Ci0gICAgPC9yZWxlYXNlPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd2luZy94ZG9jcy9pbmRleC54bWwgYi9qZWxseS10YWdzL3N3aW5nL3hkb2NzL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3NzkyNC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3aW5nL3hkb2NzL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkplbGx5U3dpbmc8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0KLSAgPGJvZHk+Ci0gICAgPHNlY3Rpb24gbmFtZT0iSmVsbHlTd2luZyI+IAotICAgICAgPHA+Ci0gICAgICAgIEplbGx5U3dpbmcgaXMgYSBzaW1wbGUgSmVsbHkgdGFnLWxpYnJhcnkgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY3JlYXRlIFN3aW5nIHVzZXIgaW50ZXJmYWNlcy4KLSAgICAgICAgSXQgYWxsb3dzIFhNTCBkb2N1bWVudHMgKEplbGx5IHNjcmlwdHMpIHRvIGJlIHVzZWQgdG8gZGVmaW5lIHRoZSBsYXlvdXQgYW5kIHJlbmRlcmluZyBvZiBTd2luZyAKLSAgICAgICAgZnJvbnQgZW5kcyB3aGljaCBhdm9pZHMgbG90cyBvZiBtdW5kYW5lIEphdmEgY29kaW5nLCB1c2luZyBtYXJrdXAgdG8gZGVmaW5lIHRoZSB2aWV3IAotICAgICAgICBvZiB5b3VyIGZyb250IGVuZCBhbmQgYWxsb3dpbmcgeW91IHRvIGJpbmQgdG8gSmF2YSBjb2RlIGZvciB0aGUgYnVzaW5lc3Mgb2JqZWN0cyBhbmQgbW9kZWxzLiAKLSAgICAgIDwvcD4KLSAgICAgIDxwPgotICAgICAgICBUaGlzIG1lY2hhbmlzbSB1c2VzIHNlcGVyYXRpb24gb2YgY29uY2VybnMgYW5kIE1WQyBpZGVhcyBmcm9tIHdlYiBhcHBsaWNhdGlvbnMsIGFsbG93aW5nIHRoZSByZW5kZXJpbmcKLSAgICAgICAgb2YgeW91ciBTd2luZyBmcm9udCBlbmQgdG8gYmUgZWFzaWx5IHRyYW5zZm9ybWVkIChzaW5jZSBpdHMgWE1MKSBpbnRvIGRpZmZlcmVudCBzdHlsZXMgd2hpbGUgbGVhdmluZyB5b3VyCi0gICAgICAgIG1vZGVsIGFuZCBidXNpbmVzcyBvYmplY3RzIHVudG91Y2hlZC4gSXQgYWxzbyBhbGxvd3MgZGlmZmVyZW50IHZpZXdzIHRvIGJlIGNvbnN0cnVjdGVkIGluZGVwZW5kZW50bHkgb2YgeW91ciBtb2RlbHMuCi0gICAgICA8L3A+Ci0gICAgICA8cD4KLSAgICAgICAgVGhlcmUgaXMgYW4gZXhhbXBsZSBKZWxseVN3aW5nIHNjcmlwdAotICAgICAgICA8YSBocmVmPSJodHRwOi8vY3ZzLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvamFrYXJ0YS1jb21tb25zL2plbGx5L2plbGx5LXRhZ3Mvc3dpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3N3aW5nL2V4YW1wbGUuamVsbHk/cmV2PUhFQUQiPmhlcmU8L2E+Ci0gICAgICA8L3A+Ci0gICAgICA8cD4KLSAgICAgICAgVG8gdHJ5IHJ1bm5pbmcgdGhlIGV4YW1wbGUgdHlwZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgdGhlbiB5b3Ugc2hvdWxkIHNlZSBhIGZ1bGwgU3dpbmcgdXNlciBpbnRlcmZhY2UgCi0gICAgICAgIGFwcGVhciB3aXRoIHB1bGwgZG93biBtZW51cywgYSBzcGxpdHRlciBwYW5lLCBhIGZvcm0sIGVudHJ5IGZpZWxkcywgYnV0dG9ucyBhbmQgYSB0YWJsZS4KLSAgICAgICAgKHlvdSBzaG91bGQgcnVuIHRoaXMgZnJvbSB3aXRoaW4gdGhlIDxjb2RlPltqZWxseS1ob21lXS9qZWxseS10YWdzL3N3aW5nPC9jb2RlPikuCi0gICAgICA8L3A+Ci0gICAgICA8c291cmNlPm1hdmVuIGRlbW86c3dpbmc8L3NvdXJjZT4KLSAgICAgIDxwPgotICAgICAgICBUaGlzIGV4YW1wbGUgZXZlbiBzaG93cyB0aGF0IHNpbXBsZSBhY3Rpb25zIGNhbiBiZSBjb2RlZCBpbiBKZWxseSBzY3JpcHQgdG9vISBUaG91Z2ggdHlwaWNhbGx5IG1vc3QKLSAgICAgICAgY29tcGxleCBsb2dpYyBhbmQgbW9kZWxzIChzdWNoIGFzIFRhYmxlTW9kZWwsIFRyZWVNb2RlbCkgc2hvdWxkIGJlIHdyaXR0ZW4gaW4gSmF2YSBjb2RlLgotICAgICAgICBUaGVuIEplbGx5IHNjcmlwdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgdGhlIHZpZXcgYW5kIGJpbmQgaW4gdGhlIG1vZGVscy4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gICAgCi0gICAgPHNlY3Rpb24gbmFtZT0iSmVsbHlSdW5uZXIiPiAKLSAgICAgIDxwPgotICAgICAgICBKZWxseVJ1bm5lciBpcyBhIHNpbXBsZSBleGFtcGxlIFN3aW5nIHVzZXIgaW50ZXJmYWNlIHdyaXR0ZW4gd2l0aCBKZWxseVN3aW5nLgotICAgICAgICBZb3UgY2FuIHZpZXcgdGhlIHNvdXJjZSB0byBpdAotICAgICAgICA8YSBocmVmPSJodHRwOi8vY3ZzLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvamFrYXJ0YS1jb21tb25zL2plbGx5L2plbGx5LXRhZ3Mvc3dpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3N3aW5nL3J1bi5qZWxseT9yZXY9SEVBRCI+aGVyZTwvYT4KLSAgICAgIDwvcD4KLSAgICAgIDxwPgotICAgICAgICBJZiB5b3UgaW52b2tlIGl0IHZpYSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgeW91IHdpbGwgZ2V0IGEgc21hbGwgU3dpbmcgVUkgdGhhdCBhbGxvd3MgeW91IHRvCi0gICAgICAgIGNob29zZSBKZWxseSBzY3JpcHRzIHRvIGludm9rZSwgd2l0aGluIHRoZSBjdXJyZW50IEpWTS4KLSAgICAgIDwvcD4KLSAgICAgIDxzb3VyY2U+IG1hdmVuIGplbGx5OnJ1bm5lcjwvc291cmNlPgotICAgICAgPHA+Ci0gICAgICAgIFRoaXMgbWFrZXMgZGV2ZWxvcGluZyBKZWxseSBzY3JpcHRzIGFuZCBKZWxseVN3aW5nIHNjcmlwdHMgaW4gcGFydGljdWxhciwgbXVjaCBtb3JlIFJBRC1saWtlLgotICAgICAgICBZb3UgY2FuIGtlZXAgSmVsbHlSdW5uZXIgb3BlbiwgZWRpdCBhIEplbGx5IHNjcmlwdCBhbmQganVzdCBoaXQgdGhlICdSdW4nIGJ1dHRvbiBhbmQgdGhlCi0gICAgICAgIHNjcmlwdCBleGVjdXRlcyBpbnN0YW50YW5lb3VzbHksIHRoZXJlJ3Mgbm8gd2FpdGluZyBmb3IgYSBKVk0gdG8gc3RhcnR1cC4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gICAgCi0gICAgPHNlY3Rpb24gbmFtZT0iQ29tcGFyaW5nIEplbGx5U3dpbmcgd2l0aCBKYXZhIGNvZGUgZm9yIFN3aW5nIj4gCi0gICAgICA8cD4KLSAgICAgICAgVGhlcmUncyBhIHNpbXBsZSBkZW1vIHdyaXR0ZW4gYnkgT3R0byB2b24gV2FjaHRlciB3aGljaCBkZW1vbnN0cmF0ZXMgaG93IEplbGx5IGNhbiBiZSB1c2VkCi0gICAgICAgIGZvciB0ZW1wbGF0aW5nIEhUTUwuCi0gICAgICA8L3A+Ci0gICAgICA8cD4KLSAgICAgICAgVGhlIGRlbW8gd2FzIG9yaWduYWxseSB3cml0dGVuIGluCi0gICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jdnMuYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9qYWthcnRhLWNvbW1vbnMvamVsbHkvamVsbHktdGFncy9zd2luZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZGVtb3MvSG9tZXBhZ2VCdWlsZGVyLmphdmE/cmV2PUhFQUQiPkphdmEgY29kZTwvYT4KLSAgICAgICAgIAotICAgICAgICB0byBpbXBsZW1lbnQgYSBzaW1wbGUgU3dpbmcgVUkKLSAgICAgICAgQXMgYW4gZXhwZXJpbWVudCB0aGUgc2FtZSBTd2luZyB1c2VyIGludGVyZmFjZSBoYXMgYmVlbiB3cml0dGVuIAotICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jdnMuYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9qYWthcnRhLWNvbW1vbnMvamVsbHkvamVsbHktdGFncy9zd2luZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZGVtb3MvaG9tZXBhZ2VCdWlsZGVyLmplbGx5P3Jldj1IRUFEIj5hcyBhIEplbGx5U2NyaXB0PC9hPgotICAgICAgICBhcyB3ZWxsLgotICAgICAgICBXaGlsZSB0aGlzIGlzIGEgZmFpcmx5IHNpbXBsZSBTd2luZyBVSSBhbmQgbm90IGEgcGFydGljdWxhcmx5IGdyZWF0IGV4YW1wbGUgb2YgdGhlIHBvd2VyIG9mIEplbGx5U3dpbmcsCi0gICAgICAgIGl0IGRvZXMgaGlnaGxpZ2h0IHRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGFwcHJhY2hlcy4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gICAgCi0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3dpbmcveGRvY3MvbmF2aWdhdGlvbi54bWwgYi9qZWxseS10YWdzL3N3aW5nL3hkb2NzL25hdmlnYXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWI3NDYzLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3dpbmcveGRvY3MvbmF2aWdhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IG5hbWU9IkplbGx5U3dpbmciPgotCi0gIDx0aXRsZT5KZWxseSBTd2luZzwvdGl0bGU+Ci0gIAotICA8Ym9keT4KLSAgICA8bWVudSBuYW1lPSJKZWxseVN3aW5nIj4KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICAgICAgICAgICBocmVmPSIvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iVGFncyIgICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWdzLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3d0Ly5jdnNpZ25vcmUgYi9qZWxseS10YWdzL3N3dC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGQzMWY3Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3d0Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLW1hdmVuLmxvZwotdGFyZ2V0Ci12ZWxvY2l0eS5sb2cKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3d0L2J1aWxkLnhtbCBiL2plbGx5LXRhZ3Mvc3d0L2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVmZmM2Mi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3dC9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLWJ1aWxkLnhtbCBnZW5lcmF0ZWQgYnkgbWF2ZW4gZnJvbSBwcm9qZWN0LnhtbCB2ZXJzaW9uIDEuMC1TTkFQU0hPVAotICBvbiBkYXRlIE1heSAyNCAyMDA0LCB0aW1lIDIzMDEtLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImphciIgbmFtZT0iY29tbW9ucy1qZWxseS10YWdzLXN3dCIgYmFzZWRpcj0iLiI+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkZWZhdWx0dGFyZ2V0ZGlyIiB2YWx1ZT0idGFyZ2V0Ij4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYmRpciIgdmFsdWU9InRhcmdldC9saWIiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC9jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cmVwb3J0ZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtcmVwb3J0cyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0ZGlyIiB2YWx1ZT0iZGlzdCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jZGlyIiB2YWx1ZT0iZGlzdC9kb2NzL2FwaSI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJmaW5hbC5uYW1lIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLXN3dC0xLjAtU05BUFNIT1QiPgotICA8L3Byb3BlcnR5PgotICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlc2NyaXB0aW9uPSJvIEluaXRpYWxpemVzIHNvbWUgcHJvcGVydGllcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im5vZ2V0Ij4KLSAgICAgIDxlcXVhbHMgYXJnMj0ib25seSIgYXJnMT0iJHtidWlsZC5zeXNjbGFzc3BhdGh9Ij4KLSAgICAgIDwvZXF1YWxzPgotICAgIDwvY29uZGl0aW9uPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXNjcmlwdGlvbj0ibyBDb21waWxlIHRoZSBjb2RlIiBkZXBlbmRzPSJnZXQtZGVwcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHtjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvamF2YSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICAgIDxjb3B5IHRvZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL2phdmEiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICAgIDxjb3B5IHRvZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qZWxseSI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueHNsIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnJuZyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5kdGQiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5odG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamFyIiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgdGhlIGphciIgZGVwZW5kcz0iY29tcGlsZSx0ZXN0Ij4KLSAgICA8amFyIGphcmZpbGU9InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCIgYmFzZWRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0ibyBDbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIGRpcmVjdG9yaWVzIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGlzdGRpcn0iPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgYSBkaXN0cmlidXRpb24iIGRlcGVuZHM9ImphciwgamF2YWRvYyI+Ci0gICAgPG1rZGlyIGRpcj0iZGlzdCI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29weSB0b2Rpcj0iZGlzdCI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iIGluY2x1ZGVzPSIqLmphciI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iIGluY2x1ZGVzPSJMSUNFTlNFKiwgUkVBRE1FKiI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0ibyBSdW4gdGhlIHRlc3QgY2FzZXMiIGlmPSJ0ZXN0LmZhaWx1cmUiIGRlcGVuZHM9ImludGVybmFsLXRlc3QiPgotICAgIDxmYWlsIG1lc3NhZ2U9IlRoZXJlIHdlcmUgdGVzdCBmYWlsdXJlcy4iPgotICAgIDwvZmFpbD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iaW50ZXJuYWwtdGVzdCIgZGVwZW5kcz0iY29tcGlsZS10ZXN0cyI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8anVuaXQgZGlyPSIuLyIgZmFpbHVyZXByb3BlcnR5PSJ0ZXN0LmZhaWx1cmUiIHByaW50U3VtbWFyeT0ieWVzIiBmb3JrPSJ0cnVlIiBoYWx0b25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJiYXNlZGlyIiB2YWx1ZT0iLiI+Ci0gICAgICA8L3N5c3Byb3BlcnR5PgotICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Zm9ybWF0dGVyIHVzZWZpbGU9ImZhbHNlIiB0eXBlPSJwbGFpbiI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL1Rlc3QqLmphdmEiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgPC9qdW5pdD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZS10ZXN0cyIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy90ZXN0Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamF2YWRvYyIgZGVzY3JpcHRpb249Im8gR2VuZXJhdGUgamF2YWRvYyIgZGVwZW5kcz0iamFyIj4KLSAgICA8bWtkaXIgZGlyPSIke2phdmFkb2NkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDx0c3RhbXA+Ci0gICAgICA8Zm9ybWF0IHBhdHRlcm49IjIwMDIteXl5eSIgcHJvcGVydHk9InllYXIiPgotICAgICAgPC9mb3JtYXQ+Ci0gICAgPC90c3RhbXA+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvcHlyaWdodCIgdmFsdWU9IkNvcHlyaWdodCAmYW1wO2NvcHk7ICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLXN3dCAxLjAtU05BUFNIT1QgQVBJIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxqYXZhZG9jIHVzZT0idHJ1ZSIgcHJpdmF0ZT0idHJ1ZSIgZGVzdGRpcj0iJHtqYXZhZG9jZGlyfSIgYXV0aG9yPSJ0cnVlIiB2ZXJzaW9uPSJ0cnVlIiBzb3VyY2VwYXRoPSJzcmMvamF2YSIgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd3QuKiI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFkb2M+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImdldC1kZXBzIiB1bmxlc3M9Im5vZ2V0IiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3N3dC13aW4zMi0yLjEuMC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vc3d0L2phcnMvc3d0LXdpbjMyLTIuMS4wLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1jbGktU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtY2xpL2phcnMvY29tbW9ucy1jbGktU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LXRhZ3MtbG9nLVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS10YWdzLWxvZy1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamV4bC1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZXhsL2phcnMvY29tbW9ucy1qZXhsLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veG1sLWFwaXMtMS4wLmIyLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94bWwtYXBpcy9qYXJzL3htbC1hcGlzLTEuMC5iMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtYmVhbnV0aWxzLTEuNi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1iZWFudXRpbHMvamFycy9jb21tb25zLWJlYW51dGlscy0xLjYuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1jb2xsZWN0aW9ucy9qYXJzL2NvbW1vbnMtY29sbGVjdGlvbnMtMi4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWxvZ2dpbmcvamFycy9jb21tb25zLWxvZ2dpbmctMS4wLjMuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9kb200ai0xLjUtYmV0YS0yLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9kb200ai9qYXJzL2RvbTRqLTEuNS1iZXRhLTIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qYXhlbi0xLjEtYmV0YS0yLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qYXhlbi9qYXJzL2pheGVuLTEuMS1iZXRhLTIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS94ZXJjZXMtMi4yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3hlcmNlcy9qYXJzL3hlcmNlcy0yLjIuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2p1bml0LTMuOC4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qdW5pdC9qYXJzL2p1bml0LTMuOC4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vYW50LTEuNS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vYW50L2phcnMvYW50LTEuNS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FudC1vcHRpb25hbC0xLjUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC1vcHRpb25hbC0xLjUuamFyIj4KLSAgICA8L2dldD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iaW5zdGFsbC1tYXZlbiI+Ci0gICAgPGdldCBkZXN0PSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIHNyYz0iJHtyZXBvfS9tYXZlbi9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDx1bmphciBkZXN0PSIke21hdmVuLmhvbWV9IiBzcmM9IiR7dXNlci5ob21lfS9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiPgotICAgIDwvdW5qYXI+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3d0L21hdmVuLnhtbCBiL2plbGx5LXRhZ3Mvc3d0L21hdmVuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMxMjc3MC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3dC9tYXZlbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXZhOmphciI+Ci0KLSAgPCEtLSBkZWZpbmUgdGhlIGNsYXNzcGF0aCB1c2VkIHRvIHJ1biBleGFtcGxlcyAtLT4KLSAgPGdvYWwgbmFtZT0iY3JlYXRlLWNsYXNzcGF0aCIgcHJlcmVxcz0iamF2YTpjb21waWxlLHRlc3Q6Y29tcGlsZSI+Ci0gICAgICAgIDxwYXRoIGlkPSJ0ZXN0LmNsYXNzcGF0aCI+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHttYXZlbi5idWlsZC5kZXN0fSIvPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9InRhcmdldC9jbGFzc2VzIi8+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0idGFyZ2V0L3Rlc3QtY2xhc3NlcyIvPgotICAgICAgICAgICAgPHBhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0gICAgICAgIDwvcGF0aD4KLSAgPC9nb2FsPgotCi0gICAgPCEtLSBkZW1vcyAtLT4KLSAgPGdvYWwgbmFtZT0iZGVtbyIgcHJlcmVxcz0iY3JlYXRlLWNsYXNzcGF0aCIKLSAgICAgICAgZGVzY3JpcHRpb249IlJ1bnMgYSBKZWxseVNXVCBkZW1vIj4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseSIgZm9yaz0ieWVzIj4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgICA8YXJnIHZhbHVlPSJzcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd3QvZXhhbXBsZS5qZWxseSIvPgotICAgIDwvamF2YT4KLSAgPC9nb2FsPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3dC9wcm9qZWN0LnByb3BlcnRpZXMgYi9qZWxseS10YWdzL3N3dC9wcm9qZWN0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YzFiNjEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd3QvcHJvamVjdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCi0jIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQIFIgTyBKIEUgQyBUICBQIFIgTyBQIEUgUiBUIEkgRSBTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3d0L3Byb2plY3QueG1sIGIvamVsbHktdGFncy9zd3QvcHJvamVjdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZDM0ZDguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd3QvcHJvamVjdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3Q+Ci0gIDxleHRlbmQ+JHtiYXNlZGlyfS8uLi90YWctcHJvamVjdC54bWw8L2V4dGVuZD4KLSAgPGlkPmNvbW1vbnMtamVsbHktdGFncy1zd3Q8L2lkPgotICA8bmFtZT5jb21tb25zLWplbGx5LXRhZ3Mtc3d0PC9uYW1lPgotICA8Y3VycmVudFZlcnNpb24+MS4xLVNOQVBTSE9UPC9jdXJyZW50VmVyc2lvbj4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3d0PC9wYWNrYWdlPgotICA8ZGVzY3JpcHRpb24+VGhpcyBpcyBhIEplbGx5IGludGVyZmFjZSBmb3IgU1dULjwvZGVzY3JpcHRpb24+Ci0gIDxzaG9ydERlc2NyaXB0aW9uPkNvbW1vbnMgSmVsbHkgU1dUIFRhZyBMaWJyYXJ5PC9zaG9ydERlc2NyaXB0aW9uPgotICA8dmVyc2lvbnM+Ci0gICAgPHZlcnNpb24+Ci0gICAgICA8aWQ+MS4wPC9pZD4KLSAgICAgIDxuYW1lPjEuMDwvbmFtZT4KLSAgICAgIDx0YWc+Q09NTU9OUy1KRUxMWS1TV1QtMV8wPC90YWc+Ci0gICAgPC92ZXJzaW9uPgotICA8L3ZlcnNpb25zPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDwhLS0gU1RBUlQgZm9yIGNvbXBpbGF0aW9uIC0tPgotICAgIDwhLS0gc3d0IHRhZ2xpYiAtLT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPnN3dDwvaWQ+Ci0gICAgICA8IS0tIGRvbid0IGtub3cgaG93IHRvIHN1cHBvcnQgT1MtZGVwZW5kZW50IGphcnMgaW4gTWF2ZW4geWV0IC0tPgotCi0gICAgICA8dmVyc2lvbj53aW4zMi0yLjEuMDwvdmVyc2lvbj4KLSAgICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8Z3VtcC5wcm9qZWN0PmVjbGlwc2U8L2d1bXAucHJvamVjdD4KLSAgICAgICAgPGd1bXAuaWQ+c3d0PC9ndW1wLmlkPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8IS0tIEVORCBmb3IgY29tcGlsYXRpb24gLS0+Ci0gICAgPCEtLSBTVEFSVCBmb3IgcnVubmluZyBkZW1vcyAtLT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPmNvbW1vbnMtY2xpPC9pZD4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWplbGx5PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1qZWxseS10YWdzLWxvZzwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPCEtLSBFTkQgZm9yIHJ1bm5pbmcgZGVtb3MgLS0+Ci0KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3dC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd3QvQ29sb3JUYWcuamF2YSBiL2plbGx5LXRhZ3Mvc3d0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9Db2xvclRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjBhMTM4Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3d0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9Db2xvclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3d0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3d0LmNvbnZlcnRlcnMuQ29sb3JDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotLyoqCi0gKiBDbGFzcyB0byBjcmVhdGUgYSB7QGxpbmsgQ29sb3J9IGluc3RhbmNlIHdpdGhpbiBKZWxseSBTV1QuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y3JhZnRlcm1AYXBhY2hlLm9yZyI+TWFyY3VzIENyYWZ0ZXI8L2E+Ci0gKiBAYXV0aG9yIFdyaXR0ZW4gd2l0aCBtdWNoIGhlbHAgdGhhbmtzIHRvIHRoZSBJbWFnZVRhZyBjbGFzcwotICogQHZlcnNpb24gQ1ZTICRJZDogQ29sb3JUYWcuamF2YSx2IDEuMiAyMDA0LzA5LzA5IDEyOjIwOjI2IGRpb24gRXhwICQKLSAqLwotcHVibGljIGNsYXNzIENvbG9yVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogUkdCIHZhbHVlICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmdiOwotCi0gICAgLyoqIFZhcmlhYmxlIG5hbWUgKi8KLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBSR0IgdmFsdWUgZm9yIHRoaXMge0BsaW5rIENvbG9yfSBpbnN0YW5jZQotICAgICAqCi0gICAgICogQHBhcmFtIHJnYiB2YWx1ZSAoZWcuICM2NjY2NjYpOwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJnYihmaW5hbCBTdHJpbmcgcmdiKSB7Ci0gICAgICAgIHRoaXMucmdiID0gcmdiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9idGFpbiB0aGUgUkdCIHZhbHVlIGZvciB0aGlzIHtAbGluayBDb2xvcn0gaW5zdGFuY2UKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIFJHQiB2YWx1ZSAoZWcuICM2NjY2NjYpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZ2IoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJnYjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YXJpYWJsZSBuYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFyIHRoZSB2YXJpYWJsZSBuYW1lIG9mIHRoaXMge0BsaW5rIENvbG9yfSBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhcihmaW5hbCBTdHJpbmcgdmFyKSB7Ci0gICAgICAgIHRoaXMudmFyID0gdmFyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9idGFpbiB0aGUgdmFyaWFibGUgbmFtZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHZhcmlhYmxlIG5hbWUgb2YgdGhpcyB7QGxpbmsgQ29sb3J9IGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWYXIoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnZhcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXJlbnQgd2lkZ2V0IHdoaWNoIHRoaXMgd2lkZ2V0IHdpbGwgYmUgYWRkZWQgdG8uCi0gICAgICovCi0gICAgcHVibGljIFdpZGdldCBnZXRQYXJlbnRXaWRnZXQoKSB7Ci0gICAgICAgIGZpbmFsIFdpZGdldFRhZyB0YWcgPSAoV2lkZ2V0VGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoV2lkZ2V0VGFnLmNsYXNzKTsKLSAgICAgICAgaWYgKHRhZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGFnLmdldFdpZGdldCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgQ29sb3J9IGluc3RhbmNlIGFzIGRlZmluZWQgYnkgdGhlIFJHQiBhdHRyaWJ1dGUuCi0gICAgICogU3RvcmVzIHRoaXMge0BsaW5rIENvbG9yfSBpbnN0YW5jZSBpbiB0aGUgQ29udGV4dCBzbyB0aGF0IGl0IGNhbiBiZQotICAgICAqIHJlZmVyZW5jZWQgaW4gdGhlIEplbGx5IHNjcmlwdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvdXRwdXQge0BsaW5rIFhNTE91dHB1dH0gcmVmZXJlbmNlCi0gICAgICogQHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWcjZG9UYWcob3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhmaW5hbCBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICAvLyBpbnZva2UgYnkgYm9keSBqdXN0IGluIGNhc2Ugc29tZSBuZXN0ZWQgdGFnIGNvbmZpZ3VyZXMgbWUKLSAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotCi0gICAgICAgIGZpbmFsIFdpZGdldCBwYXJlbnQgPSBnZXRQYXJlbnRXaWRnZXQoKTsKLQotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiVGhpcyB0YWcgbXVzdCBiZSBuZXN0ZWQgd2l0aGluIGEgV2lkZ2V0IG9yIGEgV2luZG93IgotICAgICAgICAgICAgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2YXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJUaGlzIHRhZyByZXF1aXJlcyBhIGNvbnRleHQgdmFyaWFibGUgbmFtZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQ29sb3IgY29sb3IgPQotICAgICAgICAgICAgbmV3IENvbG9yKAotICAgICAgICAgICAgICAgIHBhcmVudC5nZXREaXNwbGF5KCksCi0gICAgICAgICAgICAgICAgQ29sb3JDb252ZXJ0ZXIuZ2V0SW5zdGFuY2UoKS5wYXJzZShnZXRSZ2IoKSkKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgLy8gc3RvcmUgdGhlIENvbG9yIGluIHRoZSBjb250ZXh0Ci0gICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUodmFyLCBjb2xvcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd3Qvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3d0L0RpYWxvZ1RhZy5qYXZhIGIvamVsbHktdGFncy9zd3Qvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3d0L0RpYWxvZ1RhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODA1ZjVjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3d0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9EaWFsb2dUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3d0OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogVGhpcyB0YWcgY3JlYXRlcyBhbiBTV1QgZGlhbG9nLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyPC9hPgotICoKLSAqLwotcHVibGljIGNsYXNzIERpYWxvZ1RhZyBleHRlbmRzIFdpZGdldFRhZyB7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gd2lkZ2V0Q2xhc3MKLSAgICAgKiBAcGFyYW0gc3R5bGUKLSAgICAgKi8KLSAgICBwdWJsaWMgRGlhbG9nVGFnKENsYXNzIHdpZGdldENsYXNzLCBpbnQgc3R5bGUpIHsKLSAgICAgICAgc3VwZXIod2lkZ2V0Q2xhc3MsIHN0eWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gd2lkZ2V0Q2xhc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgRGlhbG9nVGFnKENsYXNzIHdpZGdldENsYXNzKSB7Ci0gICAgICAgIHN1cGVyKHdpZGdldENsYXNzKTsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgZGlhbG9nCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBuZXdJbnN0YW5jZShDbGFzcyB0aGVDbGFzcywgTWFwIGF0dHJpYnV0ZXMsIFhNTE91dHB1dCBvdXRwdXQpCi0gICAgICAgIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBzdHlsZSA9IGdldFN0eWxlKGF0dHJpYnV0ZXMpOwotCi0gICAgICAgIC8vIG5vdyBsZXRzIGNhbGwgdGhlIGNvbnN0cnVjdG9yIHdpdGggdGhlIHBhcmVudAotICAgICAgICBXaWRnZXQgcGFyZW50ID0gZ2V0UGFyZW50V2lkZ2V0KCk7Ci0KLSAgICAgICAgYm9vbGVhbiBpc1BhcmVudFNoZWxsID0gcGFyZW50IGluc3RhbmNlb2YgU2hlbGw7Ci0gICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCB8fCAhaXNQYXJlbnRTaGVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJUaGlzIHRhZyBtdXN0IGJlIG5lc3RlZCB3aXRoaW4gYSBTaGVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IChEaWFsb2cpIGNyZWF0ZVdpZGdldCh0aGVDbGFzcywgcGFyZW50LCBzdHlsZSk7Ci0KLSAgICAgICAgcmV0dXJuIGRpYWxvZzsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3dC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd3QvRm9udFRhZy5qYXZhIGIvamVsbHktdGFncy9zd3Qvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3d0L0ZvbnRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MxNzFlOC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3dC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd3QvRm9udFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3d0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3d0LmNvbnZlcnRlcnMuQ29sb3JDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogQ2xhc3MgdG8gY3JlYXRlIGEge0BsaW5rIEZvbnR9IGluc3RhbmNlIHdpdGhpbiBKZWxseSBTV1QuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y3JhZnRlcm1AYXBhY2hlLm9yZyI+TWFyY3VzIENyYWZ0ZXI8L2E+Ci0gKiBAYXV0aG9yIFdyaXR0ZW4gd2l0aCBtdWNoIGhlbHAgdGhhbmtzIHRvIHRoZSBJbWFnZVRhZyBjbGFzcwotICogQHZlcnNpb24gQ1ZTICRJZDogRm9udFRhZy5qYXZhLHYgMS4yIDIwMDQvMDkvMDkgMTI6MjA6MjYgZGlvbiBFeHAgJAotICovCi1wdWJsaWMgY2xhc3MgRm9udFRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEZvbnRUYWcuY2xhc3MpOwotCi0gICAgLyoqIEZvbnQgdHlwZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7Ci0KLSAgICAvKiogRm9udCBzaXplICovCi0gICAgcHJpdmF0ZSBpbnQgc2l6ZTsKLQotICAgIC8qKiBGb250IHN0eWxlICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3R5bGU7Ci0KLSAgICAvKiogRm9udCB2YXJpYWJsZSBuYW1lICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB0eXBlIG9mIHRoaXMge0BsaW5rIEZvbnR9Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdHlwZSB7QGxpbmsgRm9udH0gdHlwZSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShmaW5hbCBTdHJpbmcgdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9idGFpbiB0aGUge0BsaW5rIEZvbnR9IHR5cGUgbmFtZQotICAgICAqCi0gICAgICogQHJldHVybiB0aGUge0BsaW5rIEZvbnR9IHR5cGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNpemUgb2YgdGhpcyB7QGxpbmsgRm9udH0KLSAgICAgKgotICAgICAqIEBwYXJhbSBzaXplIHtAbGluayBGb250fSBzaXplCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2l6ZShmaW5hbCBpbnQgc2l6ZSkgewotICAgICAgICB0aGlzLnNpemUgPSBzaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9idGFpbiB0aGUge0BsaW5rIEZvbnR9IHNpemUKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBGb250fSBzaXplCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTaXplKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc3R5bGUgb2YgdGhpcyB7QGxpbmsgRm9udH0gKGVnLiBib2xkLCBub3JtYWwsIGl0YWxpY3MpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3R5bGUgdGhlIHN0eWxlIG9mIHRoaXMge0BsaW5rIEZvbnR9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3R5bGUoZmluYWwgU3RyaW5nIHN0eWxlKSB7Ci0gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPYnRhaW4gdGhlIHN0eWxlIG9mIHRoaXMge0BsaW5rIEZvbnR9Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHlsZSBvZiB0aGlzIHtAbGluayBGb250fQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3R5bGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnN0eWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhcmlhYmxlIG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSB2YXIgdGhlIHZhcmlhYmxlIG5hbWUgb2YgdGhpcyB7QGxpbmsgRm9udH0gaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoZmluYWwgU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPYnRhaW4gdGhlIHZhcmlhYmxlIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB2YXJpYWJsZSBuYW1lIG9mIHRoaXMge0BsaW5rIEZvbnR9IGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWYXIoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnZhcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXJlbnQgd2lkZ2V0IHdoaWNoIHdpbGwgZGVsaXZlciB1cyBhIHtAbGluayBEZXZpY2V9IHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBXaWRnZXQgZ2V0UGFyZW50V2lkZ2V0KCkgewotICAgICAgICBmaW5hbCBXaWRnZXRUYWcgdGFnID0gKFdpZGdldFRhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKFdpZGdldFRhZy5jbGFzcyk7Ci0gICAgICAgIGlmICh0YWcgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRhZy5nZXRXaWRnZXQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEge0BsaW5rIEZvbnR9IGluc3RhbmNlIGFzIGRlZmluZWQgYnkgdGhlIHR5cGUsIHNpemUgYW5kIHN0eWxlCi0gICAgICogYXR0cmlidXRlcywgYW5kIHN0b3JlcyB0aGlzIHtAbGluayBGb250fSBpbnN0YW5jZSBpbiB0aGUgQ29udGV4dCBzbyB0aGF0Ci0gICAgICogaXQgY2FuIGJlIHJlZmVyZW5jZWQgaW4gdGhlIEplbGx5IHNjcmlwdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvdXRwdXQge0BsaW5rIFhNTE91dHB1dH0gcmVmZXJlbmNlCi0gICAgICogQHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWcjZG9UYWcob3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhmaW5hbCBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICAvLyBpbnZva2UgYnkgYm9keSBqdXN0IGluIGNhc2Ugc29tZSBuZXN0ZWQgdGFnIGNvbmZpZ3VyZXMgbWUKLSAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotCi0gICAgICAgIGZpbmFsIFdpZGdldCBwYXJlbnQgPSBnZXRQYXJlbnRXaWRnZXQoKTsKLQotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiVGhpcyB0YWcgbXVzdCBiZSBuZXN0ZWQgd2l0aGluIGEgV2lkZ2V0IG9yIGEgV2luZG93IgotICAgICAgICAgICAgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2YXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJUaGlzIHRhZyByZXF1aXJlcyBhIGNvbnRleHQgdmFyaWFibGUgbmFtZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJUaGlzIHRhZyByZXF1aXJlcyBhIGZvbnQgdHlwZSBuYW1lIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2l6ZSA8PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIlRoaXMgdGFnIHJlcXVpcmVzIGEgZm9udCBzaXplIGdyZWF0ZXIgdGhhbiAwIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3R5bGUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyBzdHlsZSBzZXQgb24gZm9udCAiICsgdHlwZSArICIsIGRlZmF1bHRpbmcgdG8gbm9ybWFsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBGb250IGZvbnQgPQotICAgICAgICAgICAgbmV3IEZvbnQoCi0gICAgICAgICAgICAgICAgcGFyZW50LmdldERpc3BsYXkoKSwKLSAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgc3R5bGUgPT0gbnVsbCA/IFNXVC5OT1JNQUwgOiBTd3RIZWxwZXIucGFyc2VTdHlsZShTV1QuY2xhc3MsIHN0eWxlKQotICAgICAgICAgICAgKTsKLQotICAgICAgICAvLyBzdG9yZSB0aGUgQ29sb3IgaW4gdGhlIGNvbnRleHQKLSAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIGZvbnQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3d0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9HQ1RhZy5qYXZhIGIvamVsbHktdGFncy9zd3Qvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3d0L0dDVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMzBkMzEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd3Qvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3d0L0dDVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRHJhd2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotCi0vKioKLSAqIENsYXNzIHRvIGNyZWF0ZSBhIHtAbGluayBHQ30gaW5zdGFuY2Ugd2l0aGluIEplbGx5IFNXVC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjcmFmdGVybUBhcGFjaGUub3JnIj5NYXJjdXMgQ3JhZnRlcjwvYT4KLSAqIEB2ZXJzaW9uIENWUyAkSWQ6IEdDVGFnLmphdmEsdiAxLjIgMjAwNC8wOS8wOSAxMjoyMDoyNiBkaW9uIEV4cCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBHQ1RhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIERyYXdhYmxlIG5hbWUgKi8KLSAgICBwcml2YXRlIERyYXdhYmxlIGRyYXdhYmxlOwotCi0gICAgLyoqIFZhcmlhYmxlIG5hbWUgKi8KLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0KLSAgICAvKioKLSAgICAgKiBPYnRhaW4gdGhlIHtAbGluayBEcmF3YWJsZX0gbmFtZSBmb3IgdGhpcyB7QGxpbmsgR0N9LgotICAgICAqCi0gICAgICogQHJldHVybiBhIHtAbGluayBHQ30ge0BsaW5rIERyYXdhYmxlfQotICAgICAqLwotICAgIHB1YmxpYyBEcmF3YWJsZSBnZXREcmF3YWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZHJhd2FibGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB7QGxpbmsgRHJhd2FibGV9IG5hbWUgZm9yIHRoaXMge0BsaW5rIEdDfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkcmF3YWJsZSBhIHtAbGluayBHQ30ge0BsaW5rIERyYXdhYmxlfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERyYXdhYmxlKGZpbmFsIERyYXdhYmxlIGRyYXdhYmxlKSB7Ci0gICAgICAgIHRoaXMuZHJhd2FibGUgPSBkcmF3YWJsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YXJpYWJsZSBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhciB0aGUgdmFyaWFibGUgbmFtZSBvZiB0aGlzIHtAbGluayBHQ30gaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoZmluYWwgU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPYnRhaW4gdGhlIHZhcmlhYmxlIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB2YXJpYWJsZSBuYW1lIG9mIHRoaXMge0BsaW5rIEdDfSBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFyKCkgewotICAgICAgICByZXR1cm4gdGhpcy52YXI7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBHQ30gaW5zdGFuY2UgYW5kIHN0b3JlcyBpdCBpbiB0aGUgQ29udGV4dCB1bmRlciBhCi0gICAgICogcGFydGljdWxhciB2YXJpYWJsZSBuYW1lLiBOb3RlLCB7QGxpbmsgR0N9IG9iamVjdHMgY2FuIG9ubHkgYmUgY3JlYXRlZCBvbgotICAgICAqIHtAbGluayBEcmF3YWJsZX0gb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvdXRwdXQge0BsaW5rIFhNTE91dHB1dH0gcmVmZXJlbmNlCi0gICAgICogQHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWcjZG9UYWcob3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhmaW5hbCBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICAvLyBpbnZva2UgYnkgYm9keSBqdXN0IGluIGNhc2Ugc29tZSBuZXN0ZWQgdGFnIGNvbmZpZ3VyZXMgbWUKLSAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gbnVsbERyYXdhYmxlID0gZHJhd2FibGUgPT0gbnVsbDsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBkcmF3YWJsZVBhcmVudCA9IGRyYXdhYmxlIGluc3RhbmNlb2YgRHJhd2FibGU7Ci0KLSAgICAgICAgaWYgKG51bGxEcmF3YWJsZSB8fCAhZHJhd2FibGVQYXJlbnQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiVGhpcyB0YWcgbXVzdCBzcGVjaWZ5IGEgRHJhd2FibGUgYXR0cmlidXRlIChpZS4gSW1hZ2Ugb3IgQ29udHJvbCkiCi0gICAgICAgICAgICApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIlRoaXMgdGFnIHJlcXVpcmVzIGEgY29udGV4dCB2YXJpYWJsZSBuYW1lIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzdG9yZSB0aGUgR0MgaW4gdGhlIGNvbnRleHQKLSAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIG5ldyBHQyhkcmF3YWJsZSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3d0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9JbWFnZVRhZy5qYXZhIGIvamVsbHktdGFncy9zd3Qvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3d0L0ltYWdlVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZTM2Y2EuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd3Qvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3d0L0ltYWdlVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd3Q7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS51dGlsLkNsYXNzTG9hZGVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EZWNvcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0vKioKLSAqIFRoaXMgY3JlYXRlcyBhbiBpbWFnZSBvbiB0aGUgcGFyZW50IFdpZGdldC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlcjwvYT4KLSAqIEB2ZXJzaW9uIENWUyBJbWFnZVRhZy5qYXZhLHYgMS41IDIwMDQvMDkvMDcgMDI6NDE6NDAgZGlvbiBFeHAKLSAqLwotcHVibGljIGNsYXNzIEltYWdlVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogcGF0aCB0byBmaWxlICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3JjOwotCi0gICAgLyoqIHZhcmlhYmxlIG5hbWUsIGlmIHNwZWNpZmllZCAqLwotICAgIHByaXZhdGUgU3RyaW5nIHZhcjsKLQotICAgIC8qKiByZXNvdXJjZSBuYW1lLCBpZiBzcGVjaWZpZWQgKi8KLSAgICBwcml2YXRlIFN0cmluZyByZXNvdXJjZTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHJlc291cmNlCi0gICAgICogQHBhcmFtIHJlc291cmNlIGltYWdlIHJlc291cmNlIGxvY2F0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2UoU3RyaW5nIHJlc291cmNlKSB7Ci0gICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9idGFpbnMgdGhlIHJlc291cmNlCi0gICAgICogQHJldHVybiB0aGUgaW1hZ2UgcmVzb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlKCkgewotICAgICAgICByZXR1cm4gcmVzb3VyY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFyaWFibGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0gICAgICAgIHRoaXMudmFyID0gdmFyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9idGFpbiB0aGUgdmFyaWFibGUgbmFtZS4KLSAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgdmFyaWFibGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFyKCkgewotICAgICAgcmV0dXJuIHRoaXMudmFyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNyYy4KLSAgICAgKiBAcGFyYW0gc3JjIFRoZSBzcmMgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3JjKFN0cmluZyBzcmMpIHsKLSAgICAgICAgdGhpcy5zcmMgPSBzcmM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldFNyYy4KLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3JjKCkgewotICAgICAgICByZXR1cm4gc3JjOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCB3aWRnZXQgd2hpY2ggdGhpcyB3aWRnZXQgd2lsbCBiZSBhZGRlZCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgV2lkZ2V0IGdldFBhcmVudFdpZGdldCgpIHsKLSAgICAgICAgV2lkZ2V0VGFnIHRhZyA9IChXaWRnZXRUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyhXaWRnZXRUYWcuY2xhc3MpOwotICAgICAgICBpZiAodGFnICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0YWcuZ2V0V2lkZ2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnI2RvVGFnKG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gaW52b2tlIGJ5IGJvZHkganVzdCBpbiBjYXNlIHNvbWUgbmVzdGVkIHRhZyBjb25maWd1cmVzIG1lCi0gICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLQotICAgICAgICBXaWRnZXQgcGFyZW50ID0gZ2V0UGFyZW50V2lkZ2V0KCk7Ci0KLSAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIlRoaXMgdGFnIG11c3QgYmUgbmVzdGVkIHdpdGhpbiBhIFdpZGdldCBvciBhIFdpbmRvdyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBudWxsOwotCi0gICAgICAgIGlmIChnZXRTcmMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgIGltYWdlID0gbG9hZExvY2FsSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZ2V0UmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgIGltYWdlID0gbG9hZFJlc291cmNlSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIkVpdGhlciBhbiBpbWFnZSBsb2NhdGlvbiBvciBhIHJlc291cmNlIG11c3QgYmUgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRXaWRnZXRJbWFnZShwYXJlbnQsIGltYWdlKTsKLQotICAgICAgICAvLyBzdG9yZSB0aGUgaW1hZ2UgYXMgYSBjb250ZXh0IHZhcmlhYmxlIGlmIHNwZWNpZmllZAotICAgICAgICBpZiAodmFyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUodmFyLCBpbWFnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIEltYWdlLCBsb2FkZWQgZnJvbSB0aGUgbG9jYWwgZGlzawotICAgICAqLwotICAgIHByaXZhdGUgSW1hZ2UgbG9hZExvY2FsSW1hZ2UoRGlzcGxheSBkaXNwbGF5KSB7Ci0gICAgICAgIHJldHVybiBuZXcgSW1hZ2UoZGlzcGxheSwgZ2V0U3JjKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gSW1hZ2UsIGxvYWRlZCBmcm9tIGEgc3BlY2lmaWVkIHJlc291cmNlLgotICAgICAqLwotICAgIHByaXZhdGUgSW1hZ2UgbG9hZFJlc291cmNlSW1hZ2UoRGlzcGxheSBkaXNwbGF5KSB7Ci0gICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IENsYXNzTG9hZGVyVXRpbHMuZ2V0Q2xhc3NMb2FkZXIobnVsbCwgZ2V0Q29udGV4dCgpLmdldFVzZUNvbnRleHRDbGFzc0xvYWRlcigpLCBnZXRDbGFzcygpKTsKLSAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0oZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgIHJldHVybiBuZXcgSW1hZ2UoZGlzcGxheSwgc3RyZWFtKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgaW1hZ2UgdG8gYSB3aWRnZXQKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogQHBhcmFtIGltYWdlCi0gICAgICogQHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFdpZGdldEltYWdlKFdpZGdldCBwYXJlbnQsIEltYWdlIGltYWdlKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgTGFiZWwpIHsKLSAgICAgICAgICAgIExhYmVsIGxhYmVsID0gKExhYmVsKSBwYXJlbnQ7Ci0gICAgICAgICAgICBsYWJlbC5zZXRJbWFnZShpbWFnZSk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBCdXR0b24pIHsKLSAgICAgICAgICAgIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBwYXJlbnQ7Ci0gICAgICAgICAgICBidXR0b24uc2V0SW1hZ2UoaW1hZ2UpOwotCi0gICAgICAgIH0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgSXRlbSkgewotICAgICAgICAgICAgSXRlbSBpdGVtID0gKEl0ZW0pIHBhcmVudDsKLSAgICAgICAgICAgIGl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCi0gICAgICAgIH0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgRGVjb3JhdGlvbnMpIHsKLSAgICAgICAgICAgIERlY29yYXRpb25zIGl0ZW0gPSAoRGVjb3JhdGlvbnMpIHBhcmVudDsKLSAgICAgICAgICAgIGl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIlRoaXMgdGFnIG11c3QgYmUgbmVzdGVkIGluc2lkZSBhIDxsYWJlbD4sIDxidXR0b24+LCA8c2hlbGw+IG9yIDxpdGVtPiB0YWciKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3d0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9MYXlvdXREYXRhVGFnLmphdmEgYi9qZWxseS10YWdzL3N3dC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd3QvTGF5b3V0RGF0YVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzI0YmZhLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3d0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9MYXlvdXREYXRhVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd3Q7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0vKioKLSAqIENyZWF0ZXMgYSBMYXlvdXREYXRhIG9iamVjdCBhbmQgc2V0cyBpdCBvbiB0aGUgcGFyZW50IFdpZGdldC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAxLjEKLSAqLwotcHVibGljIGNsYXNzIExheW91dERhdGFUYWcgZXh0ZW5kcyBMYXlvdXRUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhMYXlvdXREYXRhVGFnLmNsYXNzKTsKLQotICAgIHB1YmxpYyBMYXlvdXREYXRhVGFnKENsYXNzIGxheW91dERhdGFDbGFzcykgewotICAgICAgICBzdXBlcihsYXlvdXREYXRhQ2xhc3MpOwotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEVpdGhlciBkZWZpbmVzIGEgdmFyaWFibGUgb3IgYWRkcyB0aGUgY3VycmVudCBjb21wb25lbnQgdG8gdGhlIHBhcmVudAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NCZWFuKFN0cmluZyB2YXIsIE9iamVjdCBiZWFuKQotICAgICAgICB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBzdXBlci5wcm9jZXNzQmVhbih2YXIsIGJlYW4pOwotCi0gICAgICAgIFdpZGdldCBwYXJlbnQgPSBnZXRQYXJlbnRXaWRnZXQoKTsKLQotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgQ29udHJvbCkgewotICAgICAgICAgICAgQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpIHBhcmVudDsKLSAgICAgICAgICAgIGNvbnRyb2wuc2V0TGF5b3V0RGF0YShnZXRCZWFuKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJUaGlzIHRhZyBtdXN0IGJlIG5lc3RlZCB3aXRoaW4gYSBjb250cm9sIHdpZGdldCB0YWciKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZS5Vc2VCZWFuVGFnI25ld0luc3RhbmNlKGphdmEubGFuZy5DbGFzcywgamF2YS51dGlsLk1hcCwgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IG5ld0luc3RhbmNlKAotICAgICAgICBDbGFzcyB0aGVDbGFzcywKLSAgICAgICAgTWFwIGF0dHJpYnV0ZXMsCi0gICAgICAgIFhNTE91dHB1dCBvdXRwdXQpCi0gICAgICAgIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIHRleHQgPSAoU3RyaW5nKSBhdHRyaWJ1dGVzLnJlbW92ZSgic3R5bGUiKTsKLSAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHN0eWxlID0gU3d0SGVscGVyLnBhcnNlU3R5bGUodGhlQ2xhc3MsIHRleHQpOwotCi0gICAgICAgICAgICAvLyBub3cgbGV0cyB0cnkgaW52b2tlIGEgY29uc3RydWN0b3IKLSAgICAgICAgICAgIENsYXNzW10gdHlwZXMgPSB7IGludC5jbGFzcyB9OwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGhlQ2xhc3MuZ2V0Q29uc3RydWN0b3IodHlwZXMpOwotICAgICAgICAgICAgICAgIGlmIChjb25zdHJ1Y3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IHsgbmV3IEludGVnZXIoc3R5bGUpfTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKHRoZUNsYXNzLCBhdHRyaWJ1dGVzLCBvdXRwdXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3d0LkxheW91dFRhZ1N1cHBvcnQjY29udmVydFZhbHVlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VmFsdWUoT2JqZWN0IGJlYW4sIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpCi0gICAgICAgIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGJlYW4gaW5zdGFuY2VvZiBHcmlkRGF0YSkgewotICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoIkFsaWdubWVudCIpICYmIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0eWxlID0KLSAgICAgICAgICAgICAgICAgICAgU3d0SGVscGVyLnBhcnNlU3R5bGUoYmVhbi5nZXRDbGFzcygpLCAoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKHN0eWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuY29udmVydFZhbHVlKGJlYW4sIG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3d0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9MYXlvdXRUYWcuamF2YSBiL2plbGx5LXRhZ3Mvc3d0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9MYXlvdXRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk3OWQ1NC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3dC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd3QvTGF5b3V0VGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IExheW91dCBpbXBsZW1lbnRhdGlvbnMgYW5kIGFkZHMgaXQgdG8gdGhlIHBhcmVudCBXaWRnZXQuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRUYWcgZXh0ZW5kcyBMYXlvdXRUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhMYXlvdXRUYWcuY2xhc3MpOwotCi0gICAgcHVibGljIExheW91dFRhZyhDbGFzcyBsYXlvdXRDbGFzcykgewotICAgICAgICBzdXBlcihsYXlvdXRDbGFzcyk7Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgTGF5b3V0IGlmIHRoZXJlIGlzIG9uZSBvdGhlcndpc2UgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBMYXlvdXQgZ2V0TGF5b3V0KCkgewotICAgICAgICBPYmplY3QgYmVhbiA9IGdldEJlYW4oKTsKLSAgICAgICAgaWYgKGJlYW4gaW5zdGFuY2VvZiBMYXlvdXQpIHsKLSAgICAgICAgICAgIHJldHVybiAoTGF5b3V0KSBiZWFuOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEVpdGhlciBkZWZpbmVzIGEgdmFyaWFibGUgb3IgYWRkcyB0aGUgY3VycmVudCBjb21wb25lbnQgdG8gdGhlIHBhcmVudAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NCZWFuKFN0cmluZyB2YXIsIE9iamVjdCBiZWFuKQotICAgICAgICB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBzdXBlci5wcm9jZXNzQmVhbih2YXIsIGJlYW4pOwotCi0gICAgICAgIFdpZGdldCBwYXJlbnQgPSBnZXRQYXJlbnRXaWRnZXQoKTsKLQotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7Ci0gICAgICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgcGFyZW50OwotICAgICAgICAgICAgY29tcG9zaXRlLnNldExheW91dChnZXRMYXlvdXQoKSk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiVGhpcyB0YWcgbXVzdCBiZSBuZXN0ZWQgd2l0aGluIGEgY29tcG9zaXRlIHdpZGdldCB0YWciKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3d0LkxheW91dFRhZ1N1cHBvcnQjY29udmVydFZhbHVlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VmFsdWUoT2JqZWN0IGJlYW4sIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpCi0gICAgICAgIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGJlYW4gaW5zdGFuY2VvZiBGaWxsTGF5b3V0Ci0gICAgICAgICAgICAmJiBuYW1lLmVxdWFscygidHlwZSIpCi0gICAgICAgICAgICAmJiB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgaW50IHN0eWxlID0gU3d0SGVscGVyLnBhcnNlU3R5bGUoU1dULmNsYXNzLCAoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEludGVnZXIoc3R5bGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5jb252ZXJ0VmFsdWUoYmVhbiwgbmFtZSwgdmFsdWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd3Qvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3d0L0xheW91dFRhZ1N1cHBvcnQuamF2YSBiL2plbGx5LXRhZ3Mvc3d0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9MYXlvdXRUYWdTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNTMwNDQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd3Qvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3d0L0xheW91dFRhZ1N1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3dDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkJlYW5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkNvbnZlcnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZS5Vc2VCZWFuVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBMYXlvdXQgb3IgTGF5b3V0RGF0YSB0YWdzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uIDEuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGF5b3V0VGFnU3VwcG9ydCBleHRlbmRzIFVzZUJlYW5UYWcgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKExheW91dFRhZ1N1cHBvcnQuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyOwotCi0gICAgcHVibGljIExheW91dFRhZ1N1cHBvcnQoQ2xhc3MgbGF5b3V0Q2xhc3MpIHsKLSAgICAgICAgc3VwZXIobGF5b3V0Q2xhc3MpOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCB3aWRnZXQgd2hpY2ggdGhpcyB3aWRnZXQgd2lsbCBiZSBhZGRlZCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgV2lkZ2V0IGdldFBhcmVudFdpZGdldCgpIHsKLSAgICAgICAgV2lkZ2V0VGFnIHRhZyA9IChXaWRnZXRUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyhXaWRnZXRUYWcuY2xhc3MpOwotICAgICAgICBpZiAodGFnICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0YWcuZ2V0V2lkZ2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gdXNlIHRvIGV4cG9zZSB0aGUgbmV3IExheW91dCBvYmplY3QuCi0gICAgICogSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNldCB0aGVuIHRoZSBwYXJlbnQgd2lkZ2V0IHRhZyB3aWxsIGhhdmUgaXRzCi0gICAgICogbGF5b3V0IHByb3BlcnR5IHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogRWl0aGVyIGRlZmluZXMgYSB2YXJpYWJsZSBvciBhZGRzIHRoZSBjdXJyZW50IGNvbXBvbmVudCB0byB0aGUgcGFyZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0JlYW4oU3RyaW5nIHZhciwgT2JqZWN0IGJlYW4pIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh2YXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIGJlYW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5jb3JlLlVzZUJlYW5UYWcjc2V0QmVhblByb3BlcnRpZXMoamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLk1hcCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRCZWFuUHJvcGVydGllcyhPYmplY3QgYmVhbiwgTWFwIGF0dHJpYnV0ZXMpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGJlYW4gIT0gbnVsbCkgewotICAgICAgICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBiZWFuLmdldENsYXNzKCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgdmFsdWUgPSBjb252ZXJ0VmFsdWUoYmVhbiwgbmFtZSwgdmFsdWUpOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbGV0cyBmaXJzdCBzZWUgaWYgdGhlcmUncyBhIGZpZWxkIGF2YWlsYWJsZQotICAgICAgICAgICAgICAgICAgICBGaWVsZCBmaWVsZCA9IHRoZUNsYXNzLmdldEZpZWxkKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBDb252ZXJ0VXRpbHMuY29udmVydCgoU3RyaW5nKSB2YWx1ZSwgZmllbGQuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnNldChiZWFuLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCZWFuVXRpbHMuc2V0UHJvcGVydHkoYmVhbiwgbmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIGEgc3RyYXRlZ3kgbWV0aG9kIHRoYXQgYWxsb3dzIHZhbHVlcyB0byBiZSBjb252ZXJ0ZWQsCi0gICAgICogcGFydGljdWxhcmx5IHRvIHN1cHBvcnQgaW50ZWdlciBlbnVtZXJhdGlvbnMgYW5kIFN0cmluZyByZXByZXNlbnRhdGlvbnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmVhbiBpcyB0aGUgYmVhbiBvbiB3aGljaCB0aGUgcHJvcGVydHkgaXMgdG8gYmUgc2V0Ci0gICAgICogQHBhcmFtIG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgdmFsdWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRWYWx1ZShPYmplY3QgYmVhbiwgU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkKLSAgICAgICAgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd3Qvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3d0L01lbnVUYWcuamF2YSBiL2plbGx5LXRhZ3Mvc3d0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9NZW51VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiM2ZjMDguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd3Qvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3d0L01lbnVUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3d0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGVjb3JhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogVGhpcyB0YWcgY3JlYXRlcyBhbiBTV1QgTWVudQotICogPC9wPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uIDEuMQotICovCi1wdWJsaWMgY2xhc3MgTWVudVRhZyBleHRlbmRzIFdpZGdldFRhZyB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTWVudVRhZy5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgTWVudVRhZygpIHsKLSAgICAgICAgc3VwZXIoTWVudS5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lbnVUYWcoaW50IHN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKE1lbnUuY2xhc3MsIHN0eWxlKTsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBhIHN0cmF0ZWd5IG1ldGhvZCB0byBhbGxvdyBhIG5ldyBjaGlsZCB3aWRnZXQgdG8gYmUgYXR0YWNoZWQgdG8KLSAgICAgKiBpdHMgcGFyZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IGlzIHRoZSBwYXJlbnQgd2lkZ2V0IHdoaWNoIGlzIG5ldmVyIG51bGwKLSAgICAgKiBAcGFyYW0gd2lkZ2V0IGlzIHRoZSBuZXcgY2hpbGQgd2lkZ2V0IHRvIGJlIGF0dGFjaGVkIHRvIHRoZSBwYXJlbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhdHRhY2hXaWRnZXRzKE9iamVjdCBwYXJlbnQsIFdpZGdldCB3aWRnZXQpIHsKLSAgICAgICAgTWVudSBtZW51ID0gKE1lbnUpIHdpZGdldDsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIERlY29yYXRpb25zKSB7Ci0gICAgICAgICAgICBEZWNvcmF0aW9ucyBzaGVsbCA9IChEZWNvcmF0aW9ucykgcGFyZW50OwotICAgICAgICAgICAgc2hlbGwuc2V0TWVudUJhcihtZW51KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBDb250cm9sKSB7Ci0gICAgICAgICAgICBDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbCkgcGFyZW50OwotICAgICAgICAgICAgY29udHJvbC5zZXRNZW51KG1lbnUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1lbnVJdGVtKSB7Ci0gICAgICAgICAgICBNZW51SXRlbSBtZW51SXRlbSA9IChNZW51SXRlbSkgcGFyZW50OwotICAgICAgICAgICAgbWVudUl0ZW0uc2V0TWVudShtZW51KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3d0LldpZGdldFRhZyNjcmVhdGVXaWRnZXQoamF2YS5sYW5nLkNsYXNzLCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQsIGludCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdpZGdldChDbGFzcyB0aGVDbGFzcywgV2lkZ2V0IHBhcmVudCwgaW50IHN0eWxlKQotICAgICAgICB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBEZWNvcmF0aW9ucykgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZVdpZGdldCh0aGVDbGFzcywgcGFyZW50LCBzdHlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgTWVudSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVudSgoTWVudSkgcGFyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1lbnVJdGVtKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZW51KChNZW51SXRlbSkgcGFyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIENvbnRyb2wpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lbnUoKENvbnRyb2wpIHBhcmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIlRoaXMgdGFnIG11c3QgYmUgbmVzdGVkIGluc2lkZSBhIDxzaGVsbD4sIDxtZW51PiwgPG1lbnVJdGVtPiBvciBjb250cm9sIHRhZyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3dC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd3QvT25FdmVudFRhZy5qYXZhIGIvamVsbHktdGFncy9zd3Qvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3d0L09uRXZlbnRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5YzI0MS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3dC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd3QvT25FdmVudFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3d0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogQSB0YWcgd2hpY2ggaW1wbGVtZW50cyBhIExpc3RlbmVyIHRvIGFsbG93IGV2ZW50cyB0byBiZSBwcm9jZXNzZWQgYnkKLSAqIEplbGx5IHNjcmlwdHMKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAxLjEKLSAqLwotcHVibGljIGNsYXNzIE9uRXZlbnRUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IGltcGxlbWVudHMgTGlzdGVuZXIgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE9uRXZlbnRUYWcuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyID0gImV2ZW50IjsKLSAgICBwcml2YXRlIFN0cmluZyB0eXBlOwotICAgIHByaXZhdGUgWE1MT3V0cHV0IG91dHB1dDsKLQotICAgIHB1YmxpYyBPbkV2ZW50VGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZyNkb1RhZyhvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh2YXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oInZhciIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCJ0eXBlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBXaWRnZXQgd2lkZ2V0ID0gZ2V0UGFyZW50V2lkZ2V0KCk7Ci0gICAgICAgIGlmICh3aWRnZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJUaGlzIHRhZyBtdXN0IGJlIG5lc3RlZCB3aXRoaW4gYSB3aWRnZXQgdGFnIik7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGludCBldmVudFR5cGUgPSBnZXRFdmVudFR5cGUodHlwZSk7Ci0gICAgICAgIGlmIChldmVudFR5cGUgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJObyBldmVudCB0eXBlIHNwZWNpZmllZCwgY291bGQgbm90IHVuZGVyc3RhbmQ6ICIgKyB0eXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0OwotICAgICAgICB3aWRnZXQuYWRkTGlzdGVuZXIoZXZlbnRUeXBlLCB0aGlzKTsKLSAgICB9Ci0KLSAgICAvLyBMaXN0ZW5lciBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhciwgZXZlbnQpOwotICAgICAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJDYXVnaHQgZXhjZXB0aW9uOiAiICsgZSArICIgd2hpbGUgcHJvY2Vzc2luZyBldmVudDogIiArIGV2ZW50LCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCB3aWRnZXQgd2hpY2ggdGhpcyB3aWRnZXQgd2lsbCBiZSBhZGRlZCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgV2lkZ2V0IGdldFBhcmVudFdpZGdldCgpIHsKLSAgICAgICAgV2lkZ2V0VGFnIHRhZyA9IChXaWRnZXRUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyhXaWRnZXRUYWcuY2xhc3MpOwotICAgICAgICBpZiAodGFnICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0YWcuZ2V0V2lkZ2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gdXNlIHRvIGV4cG9zZSB0aGUgZXZlbnQgb2JqZWN0IHdoZW4KLSAgICAgKiBpdCBpcyBmaXJlZC4gSWYgbm90IHNwZWNpZmllZCB0aGlzIGRlZmF1bHRzIHRvICJldmVudCIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlLgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0eXBlIG9mIHRoZSBldmVudCBsaXN0ZW5lciB0byBsaXN0ZW4gZm9yLgotICAgICAqCi0gICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIGV2ZW50IHRvIGxpc3RlbiBmb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBnaXZlbiBldmVudCB0eXBlIFN0cmluZyBhbmQgcmV0dXJucyB0aGUgU1dUIGV2ZW50IHR5cGUgY29kZQotICAgICAqCi0gICAgICogQHBhcmFtIHR5cGUgaXMgdGhlIFN0cmluZyBldmVudCB0eXBlCi0gICAgICogQHJldHVybiB0aGUgU1dUIGludGVnZXIgZXZlbnQgdHlwZQotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgZ2V0RXZlbnRUeXBlKFN0cmluZyB0eXBlKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gU3d0SGVscGVyLnBhcnNlU3R5bGUoU1dULmNsYXNzLCB0eXBlLCBmYWxzZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3dC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd3QvU3d0SGVscGVyLmphdmEgYi9qZWxseS10YWdzL3N3dC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd3QvU3d0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Mjk5NmMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd3Qvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3d0L1N3dEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd3Q7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmUuVXNlQmVhblRhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3Igd29ya2luZyB3aXRoIFNXVC4KLSAqIDwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAxLjEKLSAqLwotcHVibGljIGNsYXNzIFN3dEhlbHBlciBleHRlbmRzIFVzZUJlYW5UYWcgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFN3dEhlbHBlci5jbGFzcyk7Ci0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgY29tbWEgZGVsaW1pdGVkIFN0cmluZyBvZiBzdHlsZSBjb2RlcyB3aGljaCBhcmUgb3InZAotICAgICAqIHRvZ2V0aGVyLiBUaGUgZ2l2ZW4gY2xhc3MgZGVzY3JpYmVzIHRoZSBpbnRlZ2VyIHN0YXRpYyBjb25zdGFudHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25zdGFudENsYXNzIGlzIHRoZSB0eXBlIHRvIGxvb2sgZm9yIHN0YXRpYyBmaWVsZHMKLSAgICAgKiBAcGFyYW0gdGV4dCBpcyBhIGNvbW1hIGRlbGltaXRlZCB0ZXh0IHZhbHVlIHN1Y2ggYXMgImJvcmRlciwgcmVzaXplIgotICAgICAqIEByZXR1cm4gdGhlIGludCBjb2RlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgcGFyc2VTdHlsZShDbGFzcyBjb25zdGFudENsYXNzLCBTdHJpbmcgdGV4dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHBhcnNlU3R5bGUoY29uc3RhbnRDbGFzcywgdGV4dCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBjb21tYSBkZWxpbWl0ZWQgU3RyaW5nIG9mIHN0eWxlIGNvZGVzIHdoaWNoIGFyZSBvcidkCi0gICAgICogdG9nZXRoZXIuIFRoZSBnaXZlbiBjbGFzcyBkZXNjcmliZXMgdGhlIGludGVnZXIgc3RhdGljIGNvbnN0YW50cwotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnN0YW50Q2xhc3MgaXMgdGhlIHR5cGUgdG8gbG9vayBmb3Igc3RhdGljIGZpZWxkcwotICAgICAqIEBwYXJhbSB0ZXh0IGlzIGEgY29tbWEgZGVsaW1pdGVkIHRleHQgdmFsdWUgc3VjaCBhcyAiYm9yZGVyLCByZXNpemUiCi0gICAgICogQHBhcmFtIHRvVXBwZXJDYXNlIGlzIHdoZXRoZXIgdGhlIHRleHQgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB1cHBlciBjYXNlCi0gICAgICogYmVmb3JlIGl0cyBjb21wYXJlZCBhZ2FpbnN0IHRoZSByZWZsZWN0aW9uIGZpZWxkcwotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgaW50IGNvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBwYXJzZVN0eWxlKENsYXNzIGNvbnN0YW50Q2xhc3MsIFN0cmluZyB0ZXh0LCBib29sZWFuIHRvVXBwZXJDYXNlKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb257Ci0gICAgICAgIGludCBhbnN3ZXIgPSAwOwotICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodG9VcHBlckNhc2UpIHsKLSAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIGl0ZW1zID0gbmV3IFN0cmluZ1Rva2VuaXplcih0ZXh0LCAiLCIpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZW1zLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IGl0ZW1zLm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICBhbnN3ZXIgfD0gZ2V0U3R5bGVDb2RlKGNvbnN0YW50Q2xhc3MsIHRva2VuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5zd2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGNvZGUgZm9yIHRoZSBnaXZlbiB3b3JkIG9yIHplcm8gaWYgdGhlIHdvcmQgZG9lc24ndCBtYXRjaCBhCi0gICAgICogdmFsaWQgc3R5bGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRTdHlsZUNvZGUoQ2xhc3MgY29uc3RhbnRDbGFzcyxTdHJpbmcgdGV4dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpZWxkIGZpZWxkID0gY29uc3RhbnRDbGFzcy5nZXRGaWVsZCh0ZXh0KTsKLSAgICAgICAgICAgIGlmIChmaWVsZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLndhcm4oICJVbmtub3duIHN0eWxlIGNvZGU6ICIgKyB0ZXh0ICsiIHdpbGwgYmUgaWdub3JlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmdldEludChudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJUaGUgdmFsdWU6ICIgKyB0ZXh0ICsgIiBpcyBub3QgdW5kZXJzdG9vZCIsIGUpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiVGhlIHZhbHVlOiAiICsgdGV4dCArICIgaXMgbm90IHVuZGVyc3Rvb2QiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3d0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9Td3RUYWdMaWJyYXJ5LmphdmEgYi9qZWxseS10YWdzL3N3dC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd3QvU3d0VGFnTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzY1ODAzLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3d0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9Td3RUYWdMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkNvbnZlcnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnTGlicmFyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5UYWdGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3dC5jb252ZXJ0ZXJzLkNvbG9yQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3dC5jb252ZXJ0ZXJzLlBvaW50Q29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Sb3dEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FyZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29sb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29vbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGVjb3JhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRm9udERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lc3NhZ2VCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuUHJvZ3Jlc3NCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2FzaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY2FsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TbGlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotLyoqCi0gKiBBIEplbGx5IGN1c3RvbSB0YWcgbGlicmFyeSB0aGF0IGNyZWF0ZXMgU1dUIHVzZXIgaW50ZXJmYWNlcwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uIDEuMQotICovCi1wdWJsaWMgY2xhc3MgU3d0VGFnTGlicmFyeSBleHRlbmRzIFRhZ0xpYnJhcnkgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFN3dFRhZ0xpYnJhcnkuY2xhc3MpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIHZhcmlvdXMgYmVhbnV0aWxzIENvbnZlcnRlcnMgZnJvbSBTdHJpbmdzIHRvIHZhcmlvdXMgU1dUIHR5cGVzCi0gICAgICAgIENvbnZlcnRVdGlscy5yZWdpc3RlciggbmV3IFBvaW50Q29udmVydGVyKCksIFBvaW50LmNsYXNzICk7Ci0gICAgICAgIENvbnZlcnRVdGlscy5yZWdpc3RlciggbmV3IENvbG9yQ29udmVydGVyKCksIENvbG9yLmNsYXNzICk7Ci0gICAgfQotCi0gICAgcHVibGljIFN3dFRhZ0xpYnJhcnkoKSB7Ci0gICAgICAgIC8vIHdpZGdldHMKLSAgICAgICAgcmVnaXN0ZXJXaWRnZXRUYWcoICJidXR0b24iLCBCdXR0b24uY2xhc3MsIFNXVC5CT1JERVIgfCBTV1QuUFVTSCB8IFNXVC5DRU5URVIgKTsKLSAgICAgICAgcmVnaXN0ZXJXaWRnZXRUYWcoICJjYW52YXMiLCBDYW52YXMuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJXaWRnZXRUYWcoICJjYXJldCIsIENhcmV0LmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyV2lkZ2V0VGFnKCAiY29tYm8iLCBDb21iby5jbGFzcywgU1dULkRST1BfRE9XTiApOwotICAgICAgICByZWdpc3RlcldpZGdldFRhZyggImNvbXBvc2l0ZSIsIENvbXBvc2l0ZS5jbGFzcyApOwotICAgICAgICAgcmVnaXN0ZXJXaWRnZXRUYWcoICJzY3JvbGxlZENvbXBvc2l0ZSIsIFNjcm9sbGVkQ29tcG9zaXRlLmNsYXNzLCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotICAgICAgICByZWdpc3RlcldpZGdldFRhZyggImNvb2xCYXIiLCBDb29sQmFyLmNsYXNzLCBTV1QuVkVSVElDQUwgKTsKLSAgICAgICAgcmVnaXN0ZXJXaWRnZXRUYWcoICJjb29sSXRlbSIsIENvb2xJdGVtLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyV2lkZ2V0VGFnKCAiZGVjb3JhdGlvbnMiLCBEZWNvcmF0aW9ucy5jbGFzcyApOwotICAgICAgICByZWdpc3RlcldpZGdldFRhZyggImdyb3VwIiwgR3JvdXAuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJXaWRnZXRUYWcoICJsYWJlbCIsIExhYmVsLmNsYXNzLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TSEFET1dfSU4gKTsKLSAgICAgICAgcmVnaXN0ZXJXaWRnZXRUYWcoICJsaXN0IiwgTGlzdC5jbGFzcyApOwotICAgICAgICByZWdpc3Rlck1lbnVUYWcoICJtZW51IiwgU1dULkRFRkFVTFQgKTsKLSAgICAgICAgcmVnaXN0ZXJNZW51VGFnKCAibWVudUJhciIsIFNXVC5CQVIgKTsKLSAgICAgICAgcmVnaXN0ZXJXaWRnZXRUYWcoICJtZW51U2VwYXJhdG9yIiwgTWVudUl0ZW0uY2xhc3MsIFNXVC5TRVBBUkFUT1IgKTsKLSAgICAgICAgcmVnaXN0ZXJXaWRnZXRUYWcoICJtZW51SXRlbSIsIE1lbnVJdGVtLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyV2lkZ2V0VGFnKCAibWVzc2FnZUJveCIsIE1lc3NhZ2VCb3guY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJXaWRnZXRUYWcoICJwcm9ncmVzc0JhciIsIFByb2dyZXNzQmFyLmNsYXNzLCBTV1QuSE9SSVpPTlRBTCApOwotICAgICAgICByZWdpc3RlcldpZGdldFRhZyggInNhc2giLCBTYXNoLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyV2lkZ2V0VGFnKCAic2NhbGUiLCBTY2FsZS5jbGFzcyApOwotICAgICAgICByZWdpc3RlcldpZGdldFRhZyggInNoZWxsIiwgU2hlbGwuY2xhc3MsIFNXVC5CT1JERVIgfCBTV1QuQ0xPU0UgfCBTV1QuTUlOIHwgU1dULk1BWCB8IFNXVC5SRVNJWkUgfCBTV1QuVElUTEUgKTsKLSAgICAgICAgcmVnaXN0ZXJXaWRnZXRUYWcoICJzbGlkZXIiLCBTbGlkZXIuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJXaWRnZXRUYWcoICJ0YWJGb2xkZXIiLCBUYWJGb2xkZXIuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJXaWRnZXRUYWcoICJ0YWJJdGVtIiwgVGFiSXRlbS5jbGFzcyApOwotICAgICAgICByZWdpc3RlcldpZGdldFRhZyggInRhYmxlIiwgVGFibGUuY2xhc3MsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04gKTsKLSAgICAgICAgcmVnaXN0ZXJXaWRnZXRUYWcoICJ0YWJsZUNvbHVtbiIsIFRhYmxlQ29sdW1uLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyV2lkZ2V0VGFnKCAidGFibGVJdGVtIiwgVGFibGVJdGVtLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyV2lkZ2V0VGFnKCAidGV4dCIsIFRleHQuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJXaWRnZXRUYWcoICJ0b29sQmFyIiwgVG9vbEJhci5jbGFzcywgU1dULlZFUlRJQ0FMICk7Ci0gICAgICAgIHJlZ2lzdGVyV2lkZ2V0VGFnKCAidG9vbEl0ZW0iLCBUb29sSXRlbS5jbGFzcyApOwotICAgICAgICByZWdpc3RlcldpZGdldFRhZyggInRyYWNrZXIiLCBUcmFja2VyLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyV2lkZ2V0VGFnKCAidHJlZSIsIFRyZWUuY2xhc3MsIFNXVC5NVUxUSSApOwotICAgICAgICByZWdpc3RlcldpZGdldFRhZyggInRyZWVJdGVtIiwgVHJlZUl0ZW0uY2xhc3MgKTsKLQotICAgICAgICAvLyBjdXN0b20gd2lkZ2V0cwotICAgICAgICByZWdpc3RlcldpZGdldFRhZyggImNUYWJGb2xkZXIiLCBDVGFiRm9sZGVyLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyV2lkZ2V0VGFnKCAiY1RhYkl0ZW0iLCBDVGFiSXRlbS5jbGFzcyApOwotICAgICAgICByZWdpc3RlcldpZGdldFRhZyggInRhYmxlVHJlZSIsIFRhYmxlVHJlZS5jbGFzcyApOwotICAgICAgICByZWdpc3RlcldpZGdldFRhZyggInRhYmxlVHJlZUl0ZW0iLCBUYWJsZVRyZWVJdGVtLmNsYXNzICk7Ci0KLSAgICAgICAgLy8gbGF5b3V0cwotICAgICAgICByZWdpc3RlckxheW91dFRhZygiZmlsbExheW91dCIsIEZpbGxMYXlvdXQuY2xhc3MpOwotICAgICAgICByZWdpc3RlckxheW91dFRhZygiZ3JpZExheW91dCIsIEdyaWRMYXlvdXQuY2xhc3MpOwotICAgICAgICByZWdpc3RlckxheW91dFRhZygicm93TGF5b3V0IiwgUm93TGF5b3V0LmNsYXNzKTsKLQotICAgICAgICAvLyBsYXlvdXQgZGF0YSBvYmplY3RzCi0gICAgICAgIHJlZ2lzdGVyTGF5b3V0RGF0YVRhZyggImdyaWREYXRhIiwgR3JpZERhdGEuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJMYXlvdXREYXRhVGFnKCAicm93RGF0YSIsIFJvd0RhdGEuY2xhc3MgKTsKLQotICAgICAgICAvLyBkaWFsb2dzCi0gICAgICAgIHJlZ2lzdGVyRGlhbG9nVGFnKCAiY29sb3JEaWFsb2ciLCBDb2xvckRpYWxvZy5jbGFzcyApOwotICAgICAgICByZWdpc3RlckRpYWxvZ1RhZyggImRpcmVjdG9yeURpYWxvZyIsIERpcmVjdG9yeURpYWxvZy5jbGFzcyApOwotICAgICAgICByZWdpc3RlckRpYWxvZ1RhZyggImZpbGVEaWFsb2ciLCBGaWxlRGlhbG9nLmNsYXNzICk7Ci0gICAgICAgIHJlZ2lzdGVyRGlhbG9nVGFnKCAiZm9udERpYWxvZyIsIEZvbnREaWFsb2cuY2xhc3MgKTsKLQotICAgICAgICAvLyBldmVudHMKLSAgICAgICAgcmVnaXN0ZXJUYWcoIm9uRXZlbnQiLCBPbkV2ZW50VGFnLmNsYXNzKTsKLQotICAgICAgICAvLyBvdGhlciB0YWdzCi0gICAgICAgIHJlZ2lzdGVyVGFnKCJjb2xvciIsIENvbG9yVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImNvbG91ciIsIEZvbnRUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygiZm9udCIsIEZvbnRUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygiZ2MiLCBHQ1RhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJpbWFnZSIsIEltYWdlVGFnLmNsYXNzKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGEgbGF5b3V0IHRhZyBmb3IgdGhlIGdpdmVuIG5hbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckxheW91dFRhZyhTdHJpbmcgbmFtZSwgZmluYWwgQ2xhc3MgbGF5b3V0Q2xhc3MpIHsKLSAgICAgICAgcmVnaXN0ZXJUYWdGYWN0b3J5KAotICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgIG5ldyBUYWdGYWN0b3J5KCkgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuVGFnRmFjdG9yeSNjcmVhdGVUYWcoamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwdWJsaWMgVGFnIGNyZWF0ZVRhZyhTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExheW91dFRhZyhsYXlvdXRDbGFzcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGEgbGF5b3V0IGRhdGEgdGFnIGZvciB0aGUgZ2l2ZW4gbmFtZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyTGF5b3V0RGF0YVRhZyhTdHJpbmcgbmFtZSwgZmluYWwgQ2xhc3MgbGF5b3V0RGF0YUNsYXNzKSB7Ci0gICAgICAgIHJlZ2lzdGVyVGFnRmFjdG9yeSgKLSAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICBuZXcgVGFnRmFjdG9yeSgpIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLlRhZ0ZhY3RvcnkjY3JlYXRlVGFnKGphdmEubGFuZy5TdHJpbmcsIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcHVibGljIFRhZyBjcmVhdGVUYWcoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMYXlvdXREYXRhVGFnKGxheW91dERhdGFDbGFzcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGEgd2lkZ2V0IHRhZyBmb3IgdGhlIGdpdmVuIG5hbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlcldpZGdldFRhZyhTdHJpbmcgbmFtZSwgQ2xhc3Mgd2lkZ2V0Q2xhc3MpIHsKLSAgICAgICAgcmVnaXN0ZXJXaWRnZXRUYWcobmFtZSwgd2lkZ2V0Q2xhc3MsIFNXVC5OVUxMKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBhIHdpZGdldCB0YWcgZm9yIHRoZSBnaXZlbiBuYW1lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJXaWRnZXRUYWcoU3RyaW5nIG5hbWUsIGZpbmFsIENsYXNzIHdpZGdldENsYXNzLCBmaW5hbCBpbnQgc3R5bGUpIHsKLSAgICAgICAgcmVnaXN0ZXJUYWdGYWN0b3J5KAotICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgIG5ldyBUYWdGYWN0b3J5KCkgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuVGFnRmFjdG9yeSNjcmVhdGVUYWcoamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwdWJsaWMgVGFnIGNyZWF0ZVRhZyhTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdpZGdldFRhZyh3aWRnZXRDbGFzcywgc3R5bGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBhIHJlZ2lzdGVyRGlhbG9nVGFnIHRhZyBmb3IgdGhlIGdpdmVuIG5hbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckRpYWxvZ1RhZyhTdHJpbmcgbmFtZSwgQ2xhc3Mgd2lkZ2V0Q2xhc3MpIHsKLSAgICAgICAgcmVnaXN0ZXJEaWFsb2dUYWcobmFtZSwgd2lkZ2V0Q2xhc3MsIFNXVC5OVUxMKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICAqIFJlZ2lzdGVyIGEgZGlhbG9nIHRhZyBmb3IgdGhlIGdpdmVuIG5hbWUKLSAgICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyRGlhbG9nVGFnKFN0cmluZyBuYW1lLCBmaW5hbCBDbGFzcyB3aWRnZXRDbGFzcywgZmluYWwgaW50IHN0eWxlKSB7Ci0gICAgICAgICAgcmVnaXN0ZXJUYWdGYWN0b3J5KAotICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICBuZXcgVGFnRmFjdG9yeSgpIHsKLSAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5UYWdGYWN0b3J5I2NyZWF0ZVRhZyhqYXZhLmxhbmcuU3RyaW5nLCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzKQotICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICBwdWJsaWMgVGFnIGNyZWF0ZVRhZyhTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEaWFsb2dUYWcod2lkZ2V0Q2xhc3MsIHN0eWxlKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICk7Ci0gICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBhIG1lbnUgdGFnIGZvciB0aGUgZ2l2ZW4gbmFtZSBhbmQgc3R5bGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlck1lbnVUYWcoU3RyaW5nIG5hbWUsIGZpbmFsIGludCBzdHlsZSkgewotICAgICAgICByZWdpc3RlclRhZ0ZhY3RvcnkoCi0gICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgbmV3IFRhZ0ZhY3RvcnkoKSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5UYWdGYWN0b3J5I2NyZWF0ZVRhZyhqYXZhLmxhbmcuU3RyaW5nLCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzKQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHB1YmxpYyBUYWcgY3JlYXRlVGFnKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVudVRhZyhzdHlsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgIH0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3d0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9XaWRnZXRUYWcuamF2YSBiL2plbGx5LXRhZ3Mvc3d0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9XaWRnZXRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhNzgyNy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3dC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd3QvV2lkZ2V0VGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd3Q7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5jb3JlLlVzZUJlYW5UYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3d0LmNvbnZlcnRlcnMuQ29sb3JDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3d0LmNvbnZlcnRlcnMuUG9pbnRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotLyoqCi0gKiBUaGlzIHRhZyBjcmVhdGVzIGFuIFNXVCB3aWRnZXQgYmFzZWQgb24gdGhlIHBhcmVudCB0YWcsIG9wdGlvbmFsbHkgZGVjbGFyaW5nCi0gKiB0aGlzIHdpZGdldCBhcyBhIHZhcmlhYmxlIGlmIHRoZSA8aT52YXI8L2k+IGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQuPC9wPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyPC9hPgotICogQHZlcnNpb24gMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBXaWRnZXRUYWcgZXh0ZW5kcyBVc2VCZWFuVGFnIHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhXaWRnZXRUYWcuY2xhc3MpOwotCi0gICAgcHJvdGVjdGVkIFdpZGdldCBwYXJlbnQ7Ci0gICAgcHJpdmF0ZSBpbnQgc3R5bGUgPSBTV1QuTlVMTDsKLQotICAgIHB1YmxpYyBXaWRnZXRUYWcoQ2xhc3Mgd2lkZ2V0Q2xhc3MpIHsKLSAgICAgICAgc3VwZXIod2lkZ2V0Q2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBXaWRnZXRUYWcoQ2xhc3Mgd2lkZ2V0Q2xhc3MsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcih3aWRnZXRDbGFzcyk7Ci0gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIldpZGdldFRhZ1t3aWRnZXQ9IiArIGdldFdpZGdldCgpICsgIl0iOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHZpc2libGUgd2lkZ2V0LCBpZiB0aGVyZSBpcyBvbmUuCi0gICAgICovCi0gICAgcHVibGljIFdpZGdldCBnZXRXaWRnZXQoKSB7Ci0gICAgICAgIE9iamVjdCBiZWFuID0gZ2V0QmVhbigpOwotICAgICAgICBpZiAoYmVhbiBpbnN0YW5jZW9mIFdpZGdldCkgewotICAgICAgICAgICAgcmV0dXJuIChXaWRnZXQpIGJlYW47Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgcGFyZW50IHdpZGdldCB3aGljaCB0aGlzIHdpZGdldCB3aWxsIGJlIGFkZGVkIHRvLgotICAgICAqLwotICAgIHB1YmxpYyBXaWRnZXQgZ2V0UGFyZW50V2lkZ2V0KCkgewotCi0gICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgV2lkZ2V0VGFnIHRhZyA9IChXaWRnZXRUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyhXaWRnZXRUYWcuY2xhc3MpOwotICAgICAgICAgICAgaWYgKHRhZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRhZy5nZXRXaWRnZXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIE1hcCBhdHRyaWJ1dGVzID0gZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBPYmplY3QgcGFyZW50ID0gYXR0cmlidXRlcy5yZW1vdmUoInBhcmVudCIpOwotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBXaWRnZXQpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnBhcmVudCA9IChXaWRnZXQpIHBhcmVudDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVGhlIHBhcmVudCBhdHRyaWJ1dGUgaXMgbm90IGEgV2lkZ2V0LCBpdCBpcyBvZiB0eXBlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBhcmVudC5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHZhbHVlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBhcmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZG9UYWcob3V0cHV0KTsKLSAgICAgICAgY2xlYXJCZWFuKCk7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IHdpZGdldAotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgbmV3SW5zdGFuY2UoQ2xhc3MgdGhlQ2xhc3MsIE1hcCBhdHRyaWJ1dGVzLCBYTUxPdXRwdXQgb3V0cHV0KQotICAgICAgICB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpbnQgc3R5bGUgPSBnZXRTdHlsZShhdHRyaWJ1dGVzKTsKLQotICAgICAgICAvLyBub3cgbGV0cyBjYWxsIHRoZSBjb25zdHJ1Y3RvciB3aXRoIHRoZSBwYXJlbnQKLSAgICAgICAgV2lkZ2V0IHBhcmVudCA9IGdldFBhcmVudFdpZGdldCgpOwotCi0gICAgICAgIFdpZGdldCB3aWRnZXQgPSAoV2lkZ2V0KSBjcmVhdGVXaWRnZXQodGhlQ2xhc3MsIHBhcmVudCwgc3R5bGUpOwotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF0dGFjaFdpZGdldHMocGFyZW50LCB3aWRnZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHdpZGdldDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZS5Vc2VCZWFuVGFnI3NldEJlYW5Qcm9wZXJ0aWVzKGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5NYXApCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0QmVhblByb3BlcnRpZXMoT2JqZWN0IGJlYW4sIE1hcCBhdHRyaWJ1dGVzKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChiZWFuIGluc3RhbmNlb2YgQ29udHJvbCkgewotICAgICAgICAgICAgQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpIGJlYW47Ci0KLSAgICAgICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgb2Ygc2l6ZSBwcm9wZXJ0eSBhcyB0aGUgQ29udHJvbCBvYmplY3QgYnJlYWtzIHRoZQotICAgICAgICAgICAgLy8gSmF2YUJlYW4gbmFtaW5nIGNvbnZlbnRpb25zIGJ5IG92ZXJsb2FkaW5nIHRoZSBzZXRTaXplKCkgbWV0aG9kCi0gICAgICAgICAgICBPYmplY3Qgc2l6ZSA9IGF0dHJpYnV0ZXMucmVtb3ZlKCJzaXplIik7Ci0gICAgICAgICAgICBzZXRTaXplKGNvbnRyb2wsIHNpemUpOwotCi0gICAgICAgICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIG9mIGNvbG9yIHByb3BlcnR5IGFzIHRoZSBDb250cm9sIG9iamVjdCBicmVha3MgdGhlCi0gICAgICAgICAgICAvLyBKYXZhQmVhbiBuYW1pbmcgY29udmVudGlvbnMgYnkgb3ZlcmxvYWRpbmcgdGhlIHNldEJhY2tncm91bmQoKSBvciBzZXRGb3JlZ3JvdW5kKCkgbWV0aG9kCi0gICAgICAgICAgICBPYmplY3QgY29sb3JWYWx1ZSA9IGF0dHJpYnV0ZXMucmVtb3ZlKCJiYWNrZ3JvdW5kIik7Ci0gICAgICAgICAgICBDb2xvciBiYWNrZ3JvdW5kID0KLSAgICAgICAgICAgICAgICAoY29sb3JWYWx1ZSBpbnN0YW5jZW9mIENvbG9yKQotICAgICAgICAgICAgICAgICAgICA/IChDb2xvcikgY29sb3JWYWx1ZSA6IGdldENvbG9yKGNvbnRyb2wsIGNvbG9yVmFsdWUpOwotICAgICAgICAgICAgY29udHJvbC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotCi0gICAgICAgICAgICBjb2xvclZhbHVlID0gYXR0cmlidXRlcy5yZW1vdmUoImZvcmVncm91bmQiKTsKLSAgICAgICAgICAgIENvbG9yIGZvcmVncm91bmQgPQotICAgICAgICAgICAgICAgIChjb2xvclZhbHVlIGluc3RhbmNlb2YgQ29sb3IpCi0gICAgICAgICAgICAgICAgICAgID8gKENvbG9yKSBjb2xvclZhbHVlIDogZ2V0Q29sb3IoY29udHJvbCwgY29sb3JWYWx1ZSk7Ci0gICAgICAgICAgICBjb250cm9sLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5zZXRCZWFuUHJvcGVydGllcyhiZWFuLCBhdHRyaWJ1dGVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBjb2xvciBmb3IgdGhlIGNvbnRyb2wKLSAgICAgKiBAcGFyYW0gY29udHJvbAotICAgICAqIEBwYXJhbSBjb2xvclZhbHVlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbG9yIGdldENvbG9yKENvbnRyb2wgY29udHJvbCwgT2JqZWN0IGNvbG9yVmFsdWUpIHsKLSAgICAgICAgQ29sb3IgY29sb3IgPSBudWxsOwotICAgICAgICBpZiAoY29sb3JWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBSR0IgcmdiID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChjb2xvciBpbnN0YW5jZW9mIENvbG9yKSB7Ci0gICAgICAgICAgICAgICAgY29sb3IgPSAoQ29sb3IpIGNvbG9yVmFsdWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJnYiA9IENvbG9yQ29udmVydGVyLmdldEluc3RhbmNlKCkucGFyc2UoY29sb3JWYWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBjb2xvciA9IG5ldyBDb2xvcihjb250cm9sLmdldERpc3BsYXkoKSwgcmdiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29sb3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2V0IHRoZSBzaXplIG9mIHRoZSBjb250cm9sCi0gICAgICogQHBhcmFtIGNvbnRyb2wKLSAgICAgKiBAcGFyYW0gc2l6ZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFNpemUoQ29udHJvbCBjb250cm9sLCBPYmplY3Qgc2l6ZSkgewotICAgICAgICBQb2ludCBwb2ludCA9IG51bGw7Ci0gICAgICAgIGlmIChzaXplICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChzaXplIGluc3RhbmNlb2YgUG9pbnQpIHsKLSAgICAgICAgICAgICAgICBwb2ludCA9IChQb2ludCkgc2l6ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcG9pbnQgPSBQb2ludENvbnZlcnRlci5nZXRJbnN0YW5jZSgpLnBhcnNlKHNpemUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250cm9sLnNldFNpemUocG9pbnQpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBhIHN0cmF0ZWd5IG1ldGhvZCB0byBhbGxvdyBhIG5ldyBjaGlsZCB3aWRnZXQgdG8gYmUgYXR0YWNoZWQgdG8KLSAgICAgKiBpdHMgcGFyZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IGlzIHRoZSBwYXJlbnQgd2lkZ2V0IHdoaWNoIGlzIG5ldmVyIG51bGwKLSAgICAgKiBAcGFyYW0gd2lkZ2V0IGlzIHRoZSBuZXcgY2hpbGQgd2lkZ2V0IHRvIGJlIGF0dGFjaGVkIHRvIHRoZSBwYXJlbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhdHRhY2hXaWRnZXRzKE9iamVjdCBwYXJlbnQsIFdpZGdldCB3aWRnZXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHNldCB0aGUgY29udGVudCB0aGF0IHdpbGwgYmUgc2Nyb2xsZWQgaWYgdGhlIHBhcmVudCBpcyBhIFNjcm9sbGVkQ29tcG9zaXRlCi0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBTY3JvbGxlZENvbXBvc2l0ZSAmJiB3aWRnZXQgaW5zdGFuY2VvZiBDb250cm9sKSB7Ci0gICAgICAgICAgICBTY3JvbGxlZENvbXBvc2l0ZSBzY3JvbGxlZENvbXBvc2l0ZSA9IChTY3JvbGxlZENvbXBvc2l0ZSkgcGFyZW50OwotICAgICAgICAgICAgc2Nyb2xsZWRDb21wb3NpdGUuc2V0Q29udGVudCgoQ29udHJvbCkgd2lkZ2V0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gV2lkZ2V0IGNsYXNzIHdpdGgKLSAgICAgKiB0aGUgZ2l2ZW4gcGFyZW50IGFuZCBTV1Qgc3R5bGUKLSAgICAgKgotICAgICAqIEBwYXJhbSB0aGVDbGFzcyBpcyB0aGUgdHlwZSBvZiB3aWRnZXQgdG8gY3JlYXRlCi0gICAgICogQHBhcmFtIHBhcmVudCBpcyB0aGUgcGFyZW50IHdpZGdldAotICAgICAqIEBwYXJhbSBzdHlsZSB0aGUgU1dUIHN0eWxlIGNvZGUKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgV2lkZ2V0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXaWRnZXQoQ2xhc3MgdGhlQ2xhc3MsIFdpZGdldCBwYXJlbnQsIGludCBzdHlsZSkKLSAgICAgICAgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoZUNsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiTm8gQ2xhc3MgYXZhaWxhYmxlIHRvIGNyZWF0ZSB0aGUgbmV3IHdpZGdldCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGxldHMgdHJ5IGNhbGwgYSBjb25zdHJ1Y3RvciB3aXRoIGEgc2luZ2xlIHN0eWxlCi0gICAgICAgICAgICAgICAgQ2xhc3NbXSB0eXBlcyA9IHsgaW50LmNsYXNzIH07Ci0gICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSB0aGVDbGFzcy5nZXRDb25zdHJ1Y3Rvcih0eXBlcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYXJndW1lbnRzID0geyBuZXcgSW50ZWdlcihzdHlsZSl9OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3IubmV3SW5zdGFuY2UoYXJndW1lbnRzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGxldHMgdHJ5IHRvIGZpbmQgdGhlIGNvbnN0cnVjdG9yIHdpdGggMiBhcmd1bWVudHMgd2l0aCB0aGUgMm5kIGFyZ3VtZW50IGJlaW5nIGFuIGludAotICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yW10gY29uc3RydWN0b3JzID0gdGhlQ2xhc3MuZ2V0Q29uc3RydWN0b3JzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9ycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gY29uc3RydWN0b3JzLmxlbmd0aDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcnNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1tdIHR5cGVzID0gY29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlcy5sZW5ndGggPT0gMiAmJiB0eXBlc1sxXS5pc0Fzc2lnbmFibGVGcm9tKGludC5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZXNbMF0uaXNBc3NpZ25hYmxlRnJvbShwYXJlbnQuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYXJndW1lbnRzID0geyBwYXJlbnQsIG5ldyBJbnRlZ2VyKHN0eWxlKX07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShhcmd1bWVudHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgU1dUIHN0eWxlIGNvZGUgZm9yIHRoZSBjdXJyZW50IGF0dHJpYnV0ZXMKLSAgICAgKiBAcmV0dXJuIHRoZSBTV1Qgc3R5bGUgY29kZQotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgZ2V0U3R5bGUoTWFwIGF0dHJpYnV0ZXMpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gKFN0cmluZykgYXR0cmlidXRlcy5yZW1vdmUoInN0eWxlIik7Ci0gICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBTd3RIZWxwZXIucGFyc2VTdHlsZShTV1QuY2xhc3MsIHRleHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdHlsZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqIFNldHMgdGhlIGJlYW4gdG8gbnVsbCwgdG8gcHJldmVudCBpdCBmcm9tCi0gICAgICogc3RpY2tpbmcgYXJvdW5kIGluIHRoZSBldmVudCB0aGF0IHRoaXMgdGFnIGluc3RhbmNlIGlzCi0gICAgICogY2FjaGVkLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXQgdGhlIGVuZCBvZiBkb1RhZy4KLSAgICAgKgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFyQmVhbigpIHsKLSAgICAgICAgc2V0QmVhbihudWxsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3dC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd3QvY29udmVydGVycy9Db2xvckNvbnZlcnRlci5qYXZhIGIvamVsbHktdGFncy9zd3Qvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3d0L2NvbnZlcnRlcnMvQ29sb3JDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk1ZTg3Ni4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3dC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd3QvY29udmVydGVycy9Db2xvckNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Muc3d0LmNvbnZlcnRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLQotLyoqCi0gKiBBIENvbnZlcnRlciB0aGF0IGNvbnZlcnRzIFN0cmluZ3MgaW4gdGhlIGZvcm0gIiN1dXV1dXUiIG9yICJ4LHkseiIgaW50byBhIFJHQiBvYmplY3QKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlcjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIENvbG9yQ29udmVydGVyIGltcGxlbWVudHMgQ29udmVydGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yQ29udmVydGVyIGluc3RhbmNlID0gbmV3IENvbG9yQ29udmVydGVyKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdXNhZ2VUZXh0ID0KLSAgICAgICAgIkNvbG9yIHZhbHVlIHNob3VsZCBiZSBpbiB0aGUgZm9ybSBvZiAnI3h4eHh4eCcgb3IgJ3gseSx6JyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbG9yQ29udmVydGVyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VycyBhIFN0cmluZyBpbiB0aGUgZm9ybSAieCwgeSwgeiIgaW50byBhbiBTV1QgUkdCIGNsYXNzCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHJldHVybiBSR0IKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUkdCIHBhcnNlUkdCKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgaXRlbXMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiLCIpOwotICAgICAgICBpbnQgcmVkID0gMDsKLSAgICAgICAgaW50IGdyZWVuID0gMDsKLSAgICAgICAgaW50IGJsdWUgPSAwOwotICAgICAgICBpZiAoaXRlbXMuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICByZWQgPSBwYXJzZU51bWJlcihpdGVtcy5uZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0ZW1zLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgZ3JlZW4gPSBwYXJzZU51bWJlcihpdGVtcy5uZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0ZW1zLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgYmx1ZSA9IHBhcnNlTnVtYmVyKGl0ZW1zLm5leHRUb2tlbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFJHQihyZWQsIGdyZWVuLCBibHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXJzIGEgU3RyaW5nIGluIHRoZSBmb3JtICIjeHh4eHh4IiBpbnRvIGFuIFNXVCBSR0IgY2xhc3MKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAcmV0dXJuIFJHQgotICAgICAqLwotICAgIHByb3RlY3RlZCBSR0IgcGFyc2VIdG1sKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgIT0gNykgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih1c2FnZVRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGludCBjb2xvclZhbHVlID0gMDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbG9yVmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlLnN1YnN0cmluZygxKSwgMTYpOwotICAgICAgICAgICAgamF2YS5hd3QuQ29sb3Igc3dpbmdDb2xvciA9IG5ldyBqYXZhLmF3dC5Db2xvcihjb2xvclZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUkdCKAotICAgICAgICAgICAgICAgIHN3aW5nQ29sb3IuZ2V0UmVkKCksCi0gICAgICAgICAgICAgICAgc3dpbmdDb2xvci5nZXRHcmVlbigpLAotICAgICAgICAgICAgICAgIHN3aW5nQ29sb3IuZ2V0Qmx1ZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIHZhbHVlICsgImlzIG5vdCBhIHZhbGlkIEh0bWwgY29sb3JcbiAiICsgZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgYSBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgUkdCIHBhcnNlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPD0gMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih1c2FnZVRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbHVlLmNoYXJBdCgwKSA9PSAnIycpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJzZUh0bWwodmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJywnKSAhPSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIHBhcnNlUkdCKHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odXNhZ2VUZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENvbnZlcnRlciBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgT2JqZWN0IGNvbnZlcnQoQ2xhc3MgdHlwZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIE9iamVjdCBhbnN3ZXIgPSBudWxsOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSB2YWx1ZS50b1N0cmluZygpOwotICAgICAgICAgICAgYW5zd2VyID0gcGFyc2UodGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnZlcnRpbmcgdmFsdWU6ICIgKyB2YWx1ZSArICIgaW50bzogIiArIGFuc3dlcik7Ci0KLSAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IHBhcnNlTnVtYmVyKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHRleHQgPSB0ZXh0LnRyaW0oKTsKLSAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQodGV4dC50cmltKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3d0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9jb252ZXJ0ZXJzL1BvaW50Q29udmVydGVyLmphdmEgYi9qZWxseS10YWdzL3N3dC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd3QvY29udmVydGVycy9Qb2ludENvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjUxOWY5Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3d0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9jb252ZXJ0ZXJzL1BvaW50Q29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3dC5jb252ZXJ0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuQ29udmVydGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotCi0vKioKLSAqIEEgQ29udmVydGVyIHRoYXQgdHVybnMgU3RyaW5ncyBpbiB0aGUgZm9ybSAieCwgeSIgaW50byBQb2ludCBvYmplY3RzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjYgJAotICovCi1wdWJsaWMgY2xhc3MgUG9pbnRDb252ZXJ0ZXIgaW1wbGVtZW50cyBDb252ZXJ0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUG9pbnRDb252ZXJ0ZXIgaW5zdGFuY2UgPSBuZXcgUG9pbnRDb252ZXJ0ZXIoKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgUG9pbnRDb252ZXJ0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXJzIGEgU3RyaW5nIGluIHRoZSBmb3JtICJ4LCB5IiBpbnRvIGFuIFNXVCBQb2ludCBjbGFzcwotICAgICAqIEBwYXJhbSB0ZXh0Ci0gICAgICogQHJldHVybiBQb2ludAotICAgICAqLwotICAgIHB1YmxpYyBQb2ludCBwYXJzZShTdHJpbmcgdGV4dCkgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgaXRlbXMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKCB0ZXh0LCAiLCIgKTsKLSAgICAgICAgaW50IHggPSAwOwotICAgICAgICBpbnQgeSA9IDA7Ci0gICAgICAgIGlmICggaXRlbXMuaGFzTW9yZVRva2VucygpICkgewotICAgICAgICAgICAgeCA9IHBhcnNlTnVtYmVyKCBpdGVtcy5uZXh0VG9rZW4oKSApOwotICAgICAgICB9Ci0gICAgICAgIGlmICggaXRlbXMuaGFzTW9yZVRva2VucygpICkgewotICAgICAgICAgICAgeSA9IHBhcnNlTnVtYmVyKCBpdGVtcy5uZXh0VG9rZW4oKSApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUG9pbnQoIHgsIHkgKTsKLSAgICB9Ci0KLSAgICAvLyBDb252ZXJ0ZXIgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE9iamVjdCBjb252ZXJ0KENsYXNzIHR5cGUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBPYmplY3QgYW5zd2VyID0gbnVsbDsKLSAgICAgICAgaWYgKCB2YWx1ZSAhPSBudWxsICkgewotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSB2YWx1ZS50b1N0cmluZygpOwotICAgICAgICAgICAgYW5zd2VyID0gcGFyc2UodGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnZlcnRpbmcgdmFsdWU6ICIgKyB2YWx1ZSArICIgaW50bzogIiArIGFuc3dlcik7Ci0KLSAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IHBhcnNlTnVtYmVyKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHRleHQgPSB0ZXh0LnRyaW0oKTsKLSAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQodGV4dC50cmltKCkpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3d0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9wYWNrYWdlLmh0bWwgYi9qZWxseS10YWdzL3N3dC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd3QvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWRkMWEwLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3d0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci0KLSAgPHA+Ci0gIAlUaGUgSmVsbHlTV1QgTGlicmFyeSBpcyBhIEplbGx5IExpYnJhcnkgZm9yIGNyZWF0aW5nIFJpY2ggVXNlciBJbnRlcmZhY2VzIAotICAJdXNpbmcgU1dUIHZpYSBYTUwgbWFya3VwIChhIEplbGx5IHNjcmlwdCkKLSAgPC9wPgotICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3d0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9leGFtcGxlLmplbGx5IGIvamVsbHktdGFncy9zd3Qvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3d0L2V4YW1wbGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMDc2NGYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd3Qvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3d0L2V4YW1wbGUuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxucz0iamVsbHk6c3d0IiB4bWxuczpsb2c9ImplbGx5OmxvZyI+DQotDQotICA8c2hlbGwgdGV4dD0iVGhpcyBpcyBhIHNoZWxsIiB2YXI9InNoZWxsIiBzaXplPSI2MDAsMzAwIiBzdHlsZT0iYm9yZGVyLCBjbG9zZSwgbWluLCBtYXgsIHJlc2l6ZSwgdGl0bGUiPg0KLSAgICAgICAgPG1lbnUgc3R5bGU9ImJhciI+DQotICAgICAgICAgICAgPG1lbnVJdGVtIHRleHQ9IkZpbGUiIHN0eWxlPSJjYXNjYWRlIj4NCi0gICAgICAgICAgICAgICAgPG1lbnU+DQotICAgICAgICAgICAgICAgICAgICA8bWVudUl0ZW0gdGV4dD0iTmV3Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8b25FdmVudCB0eXBlPSJTZWxlY3Rpb24iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9nOmluZm8+U2VsZWN0ZWQgTmV3IG9wdGlvbiB3aXRoIGV2ZW50ICR7ZXZlbnR9PC9sb2c6aW5mbz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L29uRXZlbnQ+DQotICAgICAgICAgICAgICAgICAgICA8L21lbnVJdGVtPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgPG1lbnVJdGVtIHRleHQ9Ik9wZW4iLz4NCi0gICAgICAgICAgICAgICAgICAgIDxtZW51SXRlbSBzdHlsZT0ic2VwYXJhdG9yIi8+DQotICAgICAgICAgICAgICAgICAgICA8bWVudUl0ZW0gdGV4dD0iU2F2ZSIvPg0KLSAgICAgICAgICAgICAgICA8L21lbnU+DQotICAgICAgICAgICAgPC9tZW51SXRlbT4NCi0gICAgICAgICAgICA8bWVudUl0ZW0gdGV4dD0iSGVscCIgc3R5bGU9ImNhc2NhZGUiPg0KLSAgICAgICAgICAgICAgICA8bWVudT4NCi0gICAgICAgICAgICAgICAgICAgIDxtZW51SXRlbSB0ZXh0PSJBYm91dCIvPg0KLSAgICAgICAgICAgICAgICA8L21lbnU+DQotICAgICAgICAgICAgPC9tZW51SXRlbT4NCi0gICAgICAgIDwvbWVudT4gICAgICANCi0NCi0gICAgICA8Z3JpZExheW91dC8+DQotDQotICAgICAgICA8Z3JvdXAgdGV4dD0iU29tZSBmb3JtIj4NCi0gICAgICAgICAgICA8Z3JpZERhdGEgc3R5bGU9ImZpbGxfaG9yaXpvbnRhbCIvPg0KLQ0KLSAgICAgICAgICAgIDxncmlkTGF5b3V0IG51bUNvbHVtbnM9IjIiLz4NCi0gICAgICAgICAgICA8bGFiZWwgdGV4dD0iSGVsbG8iIHN0eWxlPSJob3Jpem9udGFsLCBzaGFkb3dfaW4iLz4NCi0gICAgICAgICAgICA8dGV4dCB2YXI9InRleHRGaWVsZCIgdGV4dD0iMTIzNCIgZWRpdGFibGU9InRydWUiPg0KLSAgICAgICAgICAgICAgICA8Z3JpZERhdGEgc3R5bGU9ImZpbGxfaG9yaXpvbnRhbCIvPg0KLSAgICAgICAgICAgIDwvdGV4dD4NCi0gICAgICAgIDwvZ3JvdXA+DQotDQotICAgICAgICA8dGFibGUgDQotICAgICAgICAgICAgaGVhZGVyVmlzaWJsZT0idHJ1ZSINCi0gICAgICAgICAgICBsaW5lc1Zpc2libGU9InRydWUiDQotICAgICAgICAgICAgdG9vbFRpcFRleHQ9IlRoaXMgaXMgYSB0YWJsZSEiIA0KLSAgICAgICAgICAgIHN0eWxlPSJtdWx0aSwgYm9yZGVyLCBmdWxsX3NlbGVjdGlvbiI+DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgPGdyaWREYXRhIHN0eWxlPSJmaWxsX2JvdGgiLz4NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICA8dGFibGVDb2x1bW4gdGV4dD0iTmFtZSIgd2lkdGg9IjEwMCIgLz4NCi0gICAgICAgICAgICA8dGFibGVDb2x1bW4gdGV4dD0iQWdlIiB3aWR0aD0iNDAiIC8+DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgPCEtLSB3ZSdkIG5vcm1hbGx5IHVzZSBzb21lIEphdmEgYmVhbiBtb2RlbCB0byBpbXBsZW1lbnQgdGhlIG5leHQgYml0IC0tPg0KLSAgICAgICAgICAgIDx0YWJsZUl0ZW0gdmFyPSJyb3ciLz4NCi0gICAgICAgICAgICAke3Jvdy5zZXRUZXh0KDAsICdKYW1lcycpfQ0KLSAgICAgICAgICAgICR7cm93LnNldFRleHQoMSwgJzMzJyl9DQotICAgICAgICAgICAgPHRhYmxlSXRlbSB2YXI9InJvdyIvPg0KLSAgICAgICAgICAgICR7cm93LnNldFRleHQoMCwgJ0JvYicpfQ0KLSAgICAgICAgICAgICR7cm93LnNldFRleHQoMSwgJzMwJyl9DQotICAgICAgICA8L3RhYmxlPg0KLQ0KLSAgICAgIDx0b29sQmFyIHN0eWxlPSJ2ZXJ0aWNhbCI+DQotICAgICAgICAgIDx0b29sSXRlbSB0ZXh0PSJDbGljayBNZSIgdG9vbFRpcFRleHQ9IkkgYW0gYSBUb29sQmFyIEl0ZW0gdGhhdCB5b3UgY2FuIGNsaWNrIj4NCi0gICAgICAgICAgICAgIDxvbkV2ZW50IHR5cGU9IlNlbGVjdGlvbiI+DQotICAgICAgICAgICAgICAgICAgPGxvZzppbmZvPkNsaWNrZWQgYnV0dG9uIHdpdGggZXZlbnQgJHtldmVudH0gYW5kIHRleHQgZmllbGQgY29udGFpbnMgJHt0ZXh0RmllbGQudGV4dH08L2xvZzppbmZvPg0KLSAgICAgICAgICAgICAgPC9vbkV2ZW50Pg0KLSAgICAgICAgICAgIDwvdG9vbEl0ZW0+DQotICAgICAgICAgIDx0b29sSXRlbSB0ZXh0PSJUcmVlIiB0b29sVGlwVGV4dD0iU3RhcnRzIHRoZSBUcmVlIGRlbW8iPg0KLSAgICAgICAgICAgICAgPG9uRXZlbnQgdHlwZT0iU2VsZWN0aW9uIj4NCi0gICAgICAgICAgICAgICAgICA8ajppbmNsdWRlIHVyaT0idHJlZS5qZWxseSIvPg0KLSAgICAgICAgICAgICAgPC9vbkV2ZW50Pg0KLSAgICAgICAgICAgIDwvdG9vbEl0ZW0+DQotICAgICAgICAgIDx0b29sSXRlbSB0ZXh0PSJUYWJsZVRyZWUiIHRvb2xUaXBUZXh0PSJTdGFydHMgdGhlIFRhYmxlVHJlZSBkZW1vIj4NCi0gICAgICAgICAgICAgIDxvbkV2ZW50IHR5cGU9IlNlbGVjdGlvbiI+DQotICAgICAgICAgICAgICAgICAgPGo6aW5jbHVkZSB1cmk9InRhYmxlVHJlZS5qZWxseSIvPg0KLSAgICAgICAgICAgICAgPC9vbkV2ZW50Pg0KLSAgICAgICAgICAgIDwvdG9vbEl0ZW0+DQotICAgICAgICAgIDx0b29sSXRlbSB0ZXh0PSJQYXJlbnQgRGVtbyIgdG9vbFRpcFRleHQ9IlN0YXJ0cyB0aGUgUGFyZW50IERlbW8gdGhhdCBzaG93cyBob3cgdG8gc3RhcnQgYSBjb21wb25lbnQgZ2l2ZW4gYSBwYXJlbnQgd2lkZ2V0Ij4NCi0gICAgICAgICAgICAgIDxvbkV2ZW50IHR5cGU9IlNlbGVjdGlvbiI+DQotICAgICAgICAgICAgICAgICAgPGo6aW5jbHVkZSB1cmk9InBhcmVudERlbW8uamVsbHkiLz4NCi0gICAgICAgICAgICAgIDwvb25FdmVudD4NCi0gICAgICAgICAgICA8L3Rvb2xJdGVtPg0KLSAgICAgICAgICA8dG9vbEl0ZW0gdGV4dD0iU3R5bGUgRGVmYXVsdGluZyBEZW1vIiB0b29sVGlwVGV4dD0iU2hvd3MgaG93IGRlZmF1bHQgc3R5bGVzIGNhbiBiZSB1c2VkLCByYXRoZXIgdGhhbiBhbHdheXMgc3BlY2lmeWluZyB0aGUgc3R5bGVzIj4NCi0gICAgICAgICAgICAgIDxvbkV2ZW50IHR5cGU9IlNlbGVjdGlvbiI+DQotICAgICAgICAgICAgICAgICAgPGo6aW5jbHVkZSB1cmk9InN0eWxlRGVmYXVsdERlbW8uamVsbHkiLz4NCi0gICAgICAgICAgICAgIDwvb25FdmVudD4NCi0gICAgICAgICAgICA8L3Rvb2xJdGVtPg0KLSAgICAgIDwvdG9vbEJhcj4NCi0gIDwvc2hlbGw+DQotDQotICAgIDwhLS0gd2UgY291bGQgYWJzdHJhY3QgdGhlIGZvbGxvd2luZyBhd2F5IGFzIGEgdGFnIC0tPg0KLSAgICANCi08IS0tDQotICAgICR7c2hlbGwucGFjaygpfQ0KLS0tPiAgICANCi0gICAgJHtzaGVsbC5vcGVuKCl9DQotICAgIA0KLSAgICA8ajpzZXQgdmFyPSJkaXNwbGF5IiB2YWx1ZT0iJHtzaGVsbC5kaXNwbGF5fSIvPg0KLSAgICANCi0gICAgPGo6d2hpbGUgdGVzdD0iJHshc2hlbGwuaXNEaXNwb3NlZCgpfSI+DQotICAgICAgICA8ajppZiB0ZXN0PSIkeyFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpfSI+DQotICAgICAgICAgICAgPGo6c2V0IHZhcj0iZm9vIiB2YWx1ZT0iJHtkaXNwbGF5LnNsZWVwKCl9Ii8+DQotICAgICAgICA8L2o6aWY+DQotICAgIDwvajp3aGlsZT4NCi0gICAgJHtkaXNwbGF5LmRpc3Bvc2UoKX0NCi08L2o6amVsbHk+DQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd3Qvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3d0L3BhcmVudERlbW8uamVsbHkgYi9qZWxseS10YWdzL3N3dC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd3QvcGFyZW50RGVtby5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY0YWNlMC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3N3dC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd3QvcGFyZW50RGVtby5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM9ImplbGx5OnN3dCIgeG1sbnM6bG9nPSJqZWxseTpsb2ciPg0KLQ0KLSAgPHNoZWxsIHRleHQ9IlBhcmVudCBEZW1vIiB2YXI9InN1YlNoZWxsIiBzdHlsZT0iYm9yZGVyLCBjbG9zZSwgbWluLCBtYXgsIHJlc2l6ZSwgdGl0bGUiPg0KLSAgICAgIA0KLSAgICAgIDxncmlkTGF5b3V0Lz4NCi0NCi0gIDwvc2hlbGw+DQotDQotICAgIDwhLS0gDQotICAgICAgICB8fCBUaGlzIGRlbW8gc2hvd3MgaG93IHdlIGNhbiBjcmVhdGUgYSBicmFuZCBuZXcgd2lkZ2V0IHdoaWNoIGlzIGFkZGVkIHRvIGEgDQotICAgICAgICB8fCBnaXZlbiBwYXJlbnQgY29udHJvbCAoaW4gdGhpcyBjYXNlIHRoZSBzaGVsbCkuDQotICAgICAgICB8fCBUaGlzIHdpZGdldCBjYW4gYmUgZGVmaW5lZCBhcyBhIHZhcmlhYmxlIHVzaW5nIHRoZSB2YXI9ImZvbyIgYXR0cmlidXRlIGp1c3QNCi0gICAgICAgIHx8IGxpa2UgYW55IG90aGVyIHdpZGdldC4NCi0gICAgICAgIC0tPg0KLSAgICA8dHJlZSBwYXJlbnQ9IiR7c3ViU2hlbGx9IiB0b29sVGlwVGV4dD0iVGhpcyBpcyBhIHRyZWUhIiBzdHlsZT0ibXVsdGkiPg0KLSAgICAgICAgDQotICAgICAgICA8Z3JpZERhdGEgc3R5bGU9ImZpbGxfYm90aCIvPg0KLSAgICAgICAgDQotICAgICAgICA8IS0tIHdlJ2Qgbm9ybWFsbHkgdXNlIHNvbWUgSmF2YSBiZWFuIG1vZGVsIHRvIGltcGxlbWVudCB0aGUgbmV4dCBiaXQgLS0+DQotICAgICAgICA8dHJlZUl0ZW0gdGV4dD0iQSI+DQotICAgICAgICAgICAgPHRyZWVJdGVtIHRleHQ9IkEvQSIvPg0KLSAgICAgICAgICAgIDx0cmVlSXRlbSB0ZXh0PSJBL0IiLz4NCi0gICAgICAgICAgICA8dHJlZUl0ZW0gdGV4dD0iQS9DIi8+DQotICAgICAgICA8L3RyZWVJdGVtPg0KLSAgICAgICAgPHRyZWVJdGVtIHRleHQ9IkIiPg0KLSAgICAgICAgICAgIDx0cmVlSXRlbSB0ZXh0PSJCL0EiLz4NCi0gICAgICAgICAgICA8dHJlZUl0ZW0gdGV4dD0iQi9CIi8+DQotICAgICAgICAgICAgPHRyZWVJdGVtIHRleHQ9IkIvQyIvPg0KLSAgICAgICAgPC90cmVlSXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgIDxtZW51IHN0eWxlPSJwb3BfdXAiPg0KLSAgICAgICAgICAgIDxtZW51SXRlbSB0ZXh0PSJkbyBzb21ldGhpbmchIj4NCi0gICAgICAgICAgICAgICAgPG9uRXZlbnQgdHlwZT0iU2VsZWN0aW9uIj4NCi0gICAgICAgICAgICAgICAgICAgIDxsb2c6aW5mbz5DbGlja2VkIG9uICR7ZXZlbnR9PC9sb2c6aW5mbz4NCi0gICAgICAgICAgICAgICAgPC9vbkV2ZW50Pg0KLSAgICAgICAgICAgIDwvbWVudUl0ZW0+DQotICAgICAgICA8L21lbnU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICA8L3RyZWU+DQotICAgIA0KLSAgICAke3N1YlNoZWxsLnBhY2soKX0NCi0gICAgJHtzdWJTaGVsbC5vcGVuKCl9DQotICAgIA0KLTwvajpqZWxseT4NCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3dC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd3Qvc3R5bGVEZWZhdWx0RGVtby5qZWxseSBiL2plbGx5LXRhZ3Mvc3d0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9zdHlsZURlZmF1bHREZW1vLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGVmODc2Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3d0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC9zdHlsZURlZmF1bHREZW1vLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxucz0iamVsbHk6c3d0IiB4bWxuczpsb2c9ImplbGx5OmxvZyI+DQotICAgIA0KLSAgICA8IS0tDQotICAgICAgICB8fCBBIGRlbW8gd2hpY2ggc2hvd3Mgc29tZSBkZWZhdWx0IHN0eWxlcyBiZWluZyB1c2VkIHJhdGhlciB0aGFuIGV4cGxpY2l0bHkgDQotICAgICAgICB8fCBzcGVjaWZ5aW5nIHRoZW0gZm9yIGVhY2ggd2lkZ2V0DQotICAgICAgICAtLT4NCi0NCi0gIDxzaGVsbCB0ZXh0PSJUaGlzIGlzIGEgc2hlbGwiIHZhcj0ic3ViU2hlbGwiPg0KLSAgICAgICAgPG1lbnVCYXI+DQotICAgICAgICAgICAgPG1lbnVJdGVtIHRleHQ9IkZpbGUiIHN0eWxlPSJjYXNjYWRlIj4NCi0gICAgICAgICAgICAgICAgPG1lbnU+DQotICAgICAgICAgICAgICAgICAgICA8bWVudUl0ZW0gdGV4dD0iTmV3Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8b25FdmVudCB0eXBlPSJTZWxlY3Rpb24iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9nOmluZm8+U2VsZWN0ZWQgTmV3IG9wdGlvbiB3aXRoIGV2ZW50ICR7ZXZlbnR9PC9sb2c6aW5mbz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L29uRXZlbnQ+DQotICAgICAgICAgICAgICAgICAgICA8L21lbnVJdGVtPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgPG1lbnVJdGVtIHRleHQ9Ik9wZW4iLz4NCi0gICAgICAgICAgICAgICAgICAgIDxtZW51U2VwYXJhdG9yLz4NCi0gICAgICAgICAgICAgICAgICAgIDxtZW51SXRlbSB0ZXh0PSJTYXZlIi8+DQotICAgICAgICAgICAgICAgIDwvbWVudT4NCi0gICAgICAgICAgICA8L21lbnVJdGVtPg0KLSAgICAgICAgICAgIDxtZW51SXRlbSB0ZXh0PSJIZWxwIiBzdHlsZT0iY2FzY2FkZSI+DQotICAgICAgICAgICAgICAgIDxtZW51Pg0KLSAgICAgICAgICAgICAgICAgICAgPG1lbnVJdGVtIHRleHQ9IkFib3V0Ii8+DQotICAgICAgICAgICAgICAgIDwvbWVudT4NCi0gICAgICAgICAgICA8L21lbnVJdGVtPg0KLSAgICAgICAgPC9tZW51QmFyPiAgICAgIA0KLQ0KLSAgICAgIDxncmlkTGF5b3V0Lz4NCi0NCi0gICAgICAgIDxncm91cCB0ZXh0PSJTb21lIGZvcm0iPg0KLSAgICAgICAgICAgIDxncmlkRGF0YSBzdHlsZT0iZmlsbF9ob3Jpem9udGFsIi8+DQotDQotICAgICAgICAgICAgPGdyaWRMYXlvdXQgbnVtQ29sdW1ucz0iMiIvPg0KLSAgICAgICAgICAgIDxsYWJlbCB0ZXh0PSJIZWxsbyIvPg0KLSAgICAgICAgICAgIDx0ZXh0IHZhcj0idGV4dEZpZWxkIiB0ZXh0PSIxMjM0IiBlZGl0YWJsZT0idHJ1ZSI+DQotICAgICAgICAgICAgICAgIDxncmlkRGF0YSBzdHlsZT0iZmlsbF9ob3Jpem9udGFsIi8+DQotICAgICAgICAgICAgPC90ZXh0Pg0KLSAgICAgICAgPC9ncm91cD4NCi0NCi0gICAgICAgIDx0YWJsZSANCi0gICAgICAgICAgICBoZWFkZXJWaXNpYmxlPSJ0cnVlIg0KLSAgICAgICAgICAgIGxpbmVzVmlzaWJsZT0idHJ1ZSINCi0gICAgICAgICAgICB0b29sVGlwVGV4dD0iVGhpcyBpcyBhIHRhYmxlISI+DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgPGdyaWREYXRhIHN0eWxlPSJmaWxsX2JvdGgiLz4NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICA8dGFibGVDb2x1bW4gdGV4dD0iTmFtZSIgd2lkdGg9IjEwMCIgdG9vbFRpcFRleHQ9IlRoaXMgaXMgdGhlIG5hbWUgY29sdW1uIi8+DQotICAgICAgICAgICAgPHRhYmxlQ29sdW1uIHRleHQ9IkFnZSIgd2lkdGg9IjQwIiB0b29sVGlwVGV4dD0iVGhpcyBpcyB0aGUgYWdlIGNvbHVtbiIvPg0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIDwhLS0gd2UnZCBub3JtYWxseSB1c2Ugc29tZSBKYXZhIGJlYW4gbW9kZWwgdG8gaW1wbGVtZW50IHRoZSBuZXh0IGJpdCAtLT4NCi0gICAgICAgICAgICA8dGFibGVJdGVtIHZhcj0icm93Ii8+DQotICAgICAgICAgICAgJHtyb3cuc2V0VGV4dCgwLCAnSmFtZXMnKX0NCi0gICAgICAgICAgICAke3Jvdy5zZXRUZXh0KDEsICczMycpfQ0KLSAgICAgICAgICAgIDx0YWJsZUl0ZW0gdmFyPSJyb3ciLz4NCi0gICAgICAgICAgICAke3Jvdy5zZXRUZXh0KDAsICdCb2InKX0NCi0gICAgICAgICAgICAke3Jvdy5zZXRUZXh0KDEsICczMCcpfQ0KLSAgICAgICAgPC90YWJsZT4NCi0NCi0gICAgICA8dG9vbEJhcj4NCi0gICAgICAgICAgPHRvb2xJdGVtIHRleHQ9IkNsaWNrIE1lIiB0b29sVGlwVGV4dD0iSSBhbSBhIFRvb2xCYXIgSXRlbSB0aGF0IHlvdSBjYW4gY2xpY2siPg0KLSAgICAgICAgICAgICAgPG9uRXZlbnQgdHlwZT0iU2VsZWN0aW9uIj4NCi0gICAgICAgICAgICAgICAgICA8bG9nOmluZm8+Q2xpY2tlZCBidXR0b24gd2l0aCBldmVudCAke2V2ZW50fSBhbmQgdGV4dCBmaWVsZCBjb250YWlucyAke3RleHRGaWVsZC50ZXh0fTwvbG9nOmluZm8+DQotICAgICAgICAgICAgICA8L29uRXZlbnQ+DQotICAgICAgICAgICAgPC90b29sSXRlbT4NCi0gICAgICA8L3Rvb2xCYXI+DQotICA8L3NoZWxsPg0KLQ0KLSAgICA8IS0tIHdlIGNvdWxkIGFic3RyYWN0IHRoZSBmb2xsb3dpbmcgYXdheSBhcyBhIHRhZyAtLT4NCi0gICAgDQotICAgICR7c3ViU2hlbGwucGFjaygpfQ0KLSAgICAke3N1YlNoZWxsLm9wZW4oKX0NCi08L2o6amVsbHk+DQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd3Qvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3d0L3RhYmxlVHJlZS5qZWxseSBiL2plbGx5LXRhZ3Mvc3d0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC90YWJsZVRyZWUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YmRmMmUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd3Qvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3d0L3RhYmxlVHJlZS5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM9ImplbGx5OnN3dCIgeG1sbnM6bG9nPSJqZWxseTpsb2ciPg0KLQ0KLSAgPHNoZWxsIHRleHQ9IlRhYmxlVHJlZSBEZW1vIiB2YXI9InN1YlNoZWxsIiBzdHlsZT0iYm9yZGVyLCBjbG9zZSwgbWluLCBtYXgsIHJlc2l6ZSwgdGl0bGUiPg0KLSAgICAgIA0KLSAgICAgIDxncmlkTGF5b3V0Lz4NCi0NCi0gICAgICAgIDx0YWJsZVRyZWUgdG9vbFRpcFRleHQ9IlRoaXMgaXMgYSB0YWJsZSB0cmVlISIgc3R5bGU9Im11bHRpLCBmdWxsX3NlbGVjdGlvbiI+DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgPGdyaWREYXRhIHN0eWxlPSJmaWxsX2JvdGgiLz4NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICA8IS0tIHdlJ2Qgbm9ybWFsbHkgdXNlIHNvbWUgSmF2YSBiZWFuIG1vZGVsIHRvIGltcGxlbWVudCB0aGUgbmV4dCBiaXQgLS0+DQotICAgICAgICAgICAgPHRhYmxlVHJlZUl0ZW0gdmFyPSJyb3ciPg0KLSAgICAgICAgICAgICAgICAgICAgJHtyb3cuc2V0VGV4dCgnQScpfQ0KLSAgICAgICAgICAgICAgICAgICAgJHtyb3cuc2V0VGV4dCgwLCAnSmFtZXMnKX0NCi0gICAgICAgICAgICAgICAgICAgICR7cm93LnNldFRleHQoMSwgJzMzJyl9DQotICAgICAgICAgICAgICAgIDx0YWJsZVRyZWVJdGVtPg0KLSAgICAgICAgICAgICAgICAgICAgJHtyb3cuc2V0VGV4dCgnQicpfQ0KLSAgICAgICAgICAgICAgICAgICAgJHtyb3cuc2V0VGV4dCgwLCAnQ2hpbGQnKX0NCi0gICAgICAgICAgICAgICAgICAgICR7cm93LnNldFRleHQoMSwgJzInKX0NCi0gICAgICAgICAgICAgICAgPC90YWJsZVRyZWVJdGVtPg0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgPHRhYmxlVHJlZUl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAke3Jvdy5zZXRUZXh0KDAsICdDaGlsZC1ub3NldHRleHQnKX0NCi0gICAgICAgICAgICAgICAgICAgICR7cm93LnNldFRleHQoMSwgJzInKX0NCi0gICAgICAgICAgICAgICAgPC90YWJsZVRyZWVJdGVtPg0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgPHRhYmxlVHJlZUl0ZW0gdmFyPSJyb3ciPg0KLSAgICAgICAgICAgICAgICAgICAgJHtyb3cuc2V0VGV4dCgnQycpfQ0KLSAgICAgICAgICAgICAgICAgICAgJHtyb3cuc2V0VGV4dCgwLCAnQm9iJyl9DQotICAgICAgICAgICAgICAgICAgICAke3Jvdy5zZXRUZXh0KDEsICczMCcpfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgPHRhYmxlVHJlZUl0ZW0gdmFyPSJyb3ciPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICR7cm93LnNldFRleHQoJ0MnKX0NCi0gICAgICAgICAgICAgICAgICAgIDwvdGFibGVUcmVlSXRlbT4NCi0NCi0gICAgICAgICAgICAgICAgPC90YWJsZVRyZWVJdGVtPg0KLSAgICAgICAgICAgIDwvdGFibGVUcmVlSXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICA8L3RhYmxlVHJlZT4NCi0gIDwvc2hlbGw+DQotDQotICAgICR7c3ViU2hlbGwub3BlbigpfQ0KLTwvajpqZWxseT4NCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3dC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd3QvdHJlZS5qZWxseSBiL2plbGx5LXRhZ3Mvc3d0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC90cmVlLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2E2MjkxLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3d0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3dC90cmVlLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxucz0iamVsbHk6c3d0IiB4bWxuczpsb2c9ImplbGx5OmxvZyI+DQotDQotICA8c2hlbGwgdGV4dD0iVHJlZSBEZW1vIiB2YXI9InN1YlNoZWxsIiBzaXplPSI1MDAsNTAwIiBzdHlsZT0iYm9yZGVyLCBjbG9zZSwgbWluLCBtYXgsIHJlc2l6ZSwgdGl0bGUiPg0KLSAgICAgIA0KLSAgICAgIDxncmlkTGF5b3V0Lz4NCi0NCi0gICAgICAgIDx0cmVlIHRvb2xUaXBUZXh0PSJUaGlzIGlzIGEgdHJlZSEiIHN0eWxlPSJtdWx0aSI+DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgPGdyaWREYXRhIHN0eWxlPSJmaWxsX2JvdGgiLz4NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICA8IS0tIHdlJ2Qgbm9ybWFsbHkgdXNlIHNvbWUgSmF2YSBiZWFuIG1vZGVsIHRvIGltcGxlbWVudCB0aGUgbmV4dCBiaXQgLS0+DQotICAgICAgICAgICAgPHRyZWVJdGVtIHRleHQ9IkEiPg0KLSAgICAgICAgICAgICAgICA8dHJlZUl0ZW0gdGV4dD0iQS9BIi8+DQotICAgICAgICAgICAgICAgIDx0cmVlSXRlbSB0ZXh0PSJBL0IiLz4NCi0gICAgICAgICAgICAgICAgPHRyZWVJdGVtIHRleHQ9IkEvQyIvPg0KLSAgICAgICAgICAgIDwvdHJlZUl0ZW0+DQotICAgICAgICAgICAgPHRyZWVJdGVtIHRleHQ9IkIiPg0KLSAgICAgICAgICAgICAgICA8dHJlZUl0ZW0gdGV4dD0iQi9BIi8+DQotICAgICAgICAgICAgICAgIDx0cmVlSXRlbSB0ZXh0PSJCL0IiLz4NCi0gICAgICAgICAgICAgICAgPHRyZWVJdGVtIHRleHQ9IkIvQyIvPg0KLSAgICAgICAgICAgIDwvdHJlZUl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIDxtZW51IHN0eWxlPSJwb3BfdXAiPg0KLSAgICAgICAgICAgICAgICA8bWVudUl0ZW0gdGV4dD0iZG8gc29tZXRoaW5nISI+DQotICAgICAgICAgICAgICAgICAgICA8b25FdmVudCB0eXBlPSJTZWxlY3Rpb24iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsb2c6aW5mbz5DbGlja2VkIG9uICR7ZXZlbnR9PC9sb2c6aW5mbz4NCi0gICAgICAgICAgICAgICAgICAgIDwvb25FdmVudD4NCi0gICAgICAgICAgICAgICAgPC9tZW51SXRlbT4NCi0gICAgICAgICAgICA8L21lbnU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgPC90cmVlPg0KLSAgPC9zaGVsbD4NCi0NCi08IS0tDQotICAgICR7c3ViU2hlbGwucGFjaygpfQ0KLS0tPiAgICANCi0gICAgJHtzdWJTaGVsbC5vcGVuKCl9DQotPC9qOmplbGx5Pg0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3Mvc3d0L3hkb2NzL2NoYW5nZXMueG1sIGIvamVsbHktdGFncy9zd3QveGRvY3MvY2hhbmdlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNTYzYWMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy9zd3QveGRvY3MvY2hhbmdlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tIAotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotIC0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5DaGFuZ2VzPC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0gIDxib2R5PgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMS1TTkFQU0hPVCIgZGF0ZT0iaW4gQ1ZTIj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJmaXgiIGlzc3VlPSJKRUxMWS0xNDEiIGR1ZS10bz0iSGFucyBHaWxkZSI+V2lkZ2V0VGFnIHNob3VsZCBudWxsLW91dCBpdHMgYmVhbiBhZnRlciBydW5uaW5nPC9hY3Rpb24+Ci0gICAgPC9yZWxlYXNlPgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMCIgZGF0ZT0iMjAwNC0wOS0xMyI+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0iZml4IiBpc3N1ZT0iSkVMTFktMTIzIiBkdWUtdG89Ik1hcmN1cyBDcmFmdGVyIj52YXIgYW5kIHJlc291cmNlIHN1cHBvcnQgZm9yIGltYWdlczwvYWN0aW9uPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImZpeCIgaXNzdWU9IkpFTExZLTQyIiBkdWUtdG89IkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIj5hZGQgY1RhYkZvbGRlciArIGNUYWJJdGVtIHdpZGdldHM8L2FjdGlvbj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJmaXgiIGlzc3VlPSJKRUxMWS00OCIgZHVlLXRvPSJDaHJpc3RpYWFuIHRlbiBLbG9vc3RlciI+ZGlhbG9nIHRhZzwvYWN0aW9uPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImZpeCIgaXNzdWU9IkpFTExZLTEyNiIgZHVlLXRvPSJNYXJjdXMgQ3JhZnRlciI+U3VwcG9ydCBmb3IgU1dUIEdDIG9iamVjdHM8L2FjdGlvbj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJmaXgiIGlzc3VlPSJKRUxMWS0xMjUiIGR1ZS10bz0iTWFyY3VzIENyYWZ0ZXIiPlN1cHBvcnQgZm9yIFNXVCBGb250IG9iamVjdHM8L2FjdGlvbj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJmaXgiIGlzc3VlPSJKRUxMWS0xMjQiIGR1ZS10bz0iTWFyY3VzIENyYWZ0ZXIiPlN1cHBvcnQgZm9yIFNXVCBDb2xvciBvYmplY3RzPC9hY3Rpb24+Ci0gICAgPC9yZWxlYXNlPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy9zd3QveGRvY3MvaW5kZXgueG1sIGIvamVsbHktdGFncy9zd3QveGRvY3MvaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGVmZDIxLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3d0L3hkb2NzL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPlNXVCBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotICAgIDxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KLSAgICAgIDxwPgotICAgICAgICBUaGUgSmVsbHlTV1QgTGlicmFyeSBpcyBhIEplbGx5IExpYnJhcnkgZm9yIGNyZWF0aW5nIFJpY2ggVXNlciBJbnRlcmZhY2VzIAotICAgICAgICB1c2luZyBTV1QgdmlhIFhNTCBtYXJrdXAgKGEgSmVsbHkgc2NyaXB0KS4KLSAgICAgICAgICBTZWUgdGhlIDxhIGhyZWY9InRhZ3MuaHRtbCI+dGFnczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICA8L3A+Ci0gICAgPC9zZWN0aW9uPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3N3dC94ZG9jcy9uYXZpZ2F0aW9uLnhtbCBiL2plbGx5LXRhZ3Mvc3d0L3hkb2NzL25hdmlnYXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2UwOWU2Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3Mvc3d0L3hkb2NzL25hdmlnYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBuYW1lPSJTV1QgVGFnIExpYnJhcnkiPgotCi0gIDx0aXRsZT5TV1QgVGFnIExpYnJhcnk8L3RpdGxlPgotICAKLSAgPGJvZHk+Ci0gICAgPG1lbnUgbmFtZT0iU1dUIFRhZyBMaWJyYXJ5Ij4KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICAgICAgICAgICBocmVmPSIvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iVGFncyIgICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWdzLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvdGFnLWNoZWNrc3R5bGUueG1sIGIvamVsbHktdGFncy90YWctY2hlY2tzdHlsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZTFkZjQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy90YWctY2hlY2tzdHlsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tIAotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotIC0tPgotCi08IURPQ1RZUEUgbW9kdWxlIFBVQkxJQwotICAgICItLy9QdXBweSBDcmF3bC8vRFREIENoZWNrIENvbmZpZ3VyYXRpb24gMS4xLy9FTiIKLSAgICAiaHR0cDovL3d3dy5wdXBweWNyYXdsLmNvbS9kdGRzL2NvbmZpZ3VyYXRpb25fMV8xLmR0ZCI+Ci0KLTwhLS0KLQotICBDaGVja3N0eWxlIGNvbmZpZ3VyYXRpb24gdGhhdCBjaGVja3MgdGhlIHN1biBjb2RpbmcgY29udmVudGlvbnMgZnJvbToKLQotICAgIC0gdGhlIEphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiBhdAotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2luZGV4Lmh0bWwKLQotICAgIC0gdGhlIFN1biBDb2RlIENvbnZlbnRpb25zIGF0IGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9jb2RlY29udi8KLQotICAgIC0gdGhlIEphdmFkb2MgZ3VpZGVsaW5lcyBhdAotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlL2phdmFkb2Mvd3JpdGluZ2RvY2NvbW1lbnRzL2luZGV4Lmh0bWwKLQotICAgIC0gdGhlIEpESyBBcGkgZG9jdW1lbnRhdGlvbiBodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvZG9jcy9hcGkvaW5kZXguaHRtbAotCi0gICAgLSBzb21lIGJlc3QgcHJhY3RpY2VzCi0KLSAgQ2hlY2tzdHlsZSBpcyB2ZXJ5IGNvbmZpZ3VyYWJsZS4gQmUgc3VyZSB0byByZWFkIHRoZSBkb2N1bWVudGF0aW9uIGF0Ci0gIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldCAob3IgaW4geW91ciBkb3dubG9hZGVkIGRpc3RyaWJ1dGlvbikuCi0KLSAgTW9zdCBDaGVja3MgYXJlIGNvbmZpZ3VyYWJsZSwgYmUgc3VyZSB0byBjb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uLgotCi0gIFRvIGNvbXBsZXRlbHkgZGlzYWJsZSBhIGNoZWNrLCBqdXN0IGNvbW1lbnQgaXQgb3V0IG9yIGRlbGV0ZSBpdCBmcm9tIHRoZSBmaWxlLgotCi0gIEZpbmFsbHksIGl0IGlzIHdvcnRoIHJlYWRpbmcgdGhlIGRvY3VtZW50YXRpb24uCi0KLS0tPgotCi08bW9kdWxlIG5hbWU9IkNoZWNrZXIiPgotICAgIDwhLS0gc2V0IGRlZmF1bHQgc2V2ZXJpdHkgLS0+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNldmVyaXR5IiB2YWx1ZT0id2FybmluZyIvPgotCi0gICAgPCEtLSBDaGVja3MgdGhhdCBhIHBhY2thZ2UuaHRtbCBmaWxlIGV4aXN0cyBmb3IgZWFjaCBwYWNrYWdlLiAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19qYXZhZG9jLmh0bWwjUGFja2FnZUh0bWwgLS0+Ci0gICAgPG1vZHVsZSBuYW1lPSJQYWNrYWdlSHRtbCIvPgotCi0gICAgPCEtLSBDaGVja3Mgd2hldGhlciBmaWxlcyBlbmQgd2l0aCBhIG5ldyBsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbWlzYy5odG1sI05ld2xpbmVBdEVuZE9mRmlsZSAtLT4KLSAgICA8bW9kdWxlIG5hbWU9Ik5ld2xpbmVBdEVuZE9mRmlsZSIvPgotCi0gICAgPCEtLSBDaGVja3MgdGhhdCBwcm9wZXJ0eSBmaWxlcyBjb250YWluIHRoZSBzYW1lIGtleXMuICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19taXNjLmh0bWwjVHJhbnNsYXRpb24gLS0+Ci0gICAgPG1vZHVsZSBuYW1lPSJUcmFuc2xhdGlvbiIvPgotCi0gICAgPCEtLSBDaGVja3MgZm9yIGR1cGxpY2F0ZSBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19kdXBsaWNhdGVzLmh0bWwgLS0+Ci0gICAgPG1vZHVsZSBuYW1lPSJTdHJpY3REdXBsaWNhdGVDb2RlIj4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtaW4iIHZhbHVlPSIxOSIvPgotICAgIDwvbW9kdWxlPgotCi0gICAgPG1vZHVsZSBuYW1lPSJUcmVlV2Fsa2VyIj4KLQotICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FjaGVGaWxlIiB2YWx1ZT0iJHtjaGVja3N0eWxlLmNhY2hlLmZpbGV9Ii8+Ci0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIEphdmFkb2MgY29tbWVudHMuICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfamF2YWRvYy5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NNZXRob2QiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJKYXZhZG9jVHlwZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NWYXJpYWJsZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NTdHlsZSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2hlY2tFbXB0eUphdmFkb2MiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotCi0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIE5hbWluZyBDb252ZW50aW9ucy4gICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19uYW1pbmcuaHRtbCAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJDb25zdGFudE5hbWUiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJeKGxvZyl8W0EtWl1bQS1aMC05XSooX1tBLVowLTldKykqJCIvPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXZlcml0eSIgdmFsdWU9ImVycm9yIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkxvY2FsVmFyaWFibGVOYW1lIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXZlcml0eSIgdmFsdWU9ImVycm9yIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1lbWJlck5hbWUiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNldmVyaXR5IiB2YWx1ZT0iZXJyb3IiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTWV0aG9kTmFtZSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2V2ZXJpdHkiIHZhbHVlPSJlcnJvciIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYWNrYWdlTmFtZSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2V2ZXJpdHkiIHZhbHVlPSJlcnJvciIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYXJhbWV0ZXJOYW1lIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXZlcml0eSIgdmFsdWU9ImVycm9yIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlN0YXRpY1ZhcmlhYmxlTmFtZSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2V2ZXJpdHkiIHZhbHVlPSJlcnJvciIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJUeXBlTmFtZSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2V2ZXJpdHkiIHZhbHVlPSJlcnJvciIvPgotICAgICAgICA8L21vZHVsZT4KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgSGVhZGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2hlYWRlci5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkhlYWRlciI+Ci0gICAgICAgICAgICA8IS0tIFRoZSBmb2xsb3cgcHJvcGVydHkgdmFsdWUgZGVtb25zdHJhdGVzIHRoZSBhYmlsaXR5ICAgICAtLT4KLSAgICAgICAgICAgIDwhLS0gdG8gaGF2ZSBhY2Nlc3MgdG8gQU5UIHByb3BlcnRpZXMuIEluIHRoaXMgY2FzZSBpdCB1c2VzIC0tPgotICAgICAgICAgICAgPCEtLSB0aGUgJHtiYXNlZGlyfSBwcm9wZXJ0eSB0byBhbGxvdyBDaGVja3N0eWxlIHRvIGJlIHJ1biAgLS0+Ci0gICAgICAgICAgICA8IS0tIGZyb20gYW55IGRpcmVjdG9yeSB3aXRoaW4gYSBwcm9qZWN0LiBTZWUgcHJvcGVydHkgICAgICAtLT4KLSAgICAgICAgICAgIDwhLS0gZXhwYW5zaW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgPCEtLSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnLmh0bWwjcHJvcGVydGllcyAgICAgICAgLS0+Ci0gICAgICAgICAgICA8IS0tIDxwcm9wZXJ0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgIDwhLS0gICAgIG5hbWU9ImhlYWRlckZpbGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgPCEtLSAgICAgdmFsdWU9IiR7YmFzZWRpcn0vamF2YS5oZWFkZXIiLz4gICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyRmlsZSIgdmFsdWU9IiR7Y2hlY2tzdHlsZS5oZWFkZXIuZmlsZX0iLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXZlcml0eSIgdmFsdWU9ImVycm9yIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotCi0gICAgICAgIDwhLS0gRm9sbG93aW5nIGludGVycHJldHMgdGhlIGhlYWRlciBmaWxlIGFzIHJlZ3VsYXIgZXhwcmVzc2lvbnMuIC0tPgotICAgICAgICA8IS0tIDxtb2R1bGUgbmFtZT0iUmVnZXhwSGVhZGVyIi8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBpbXBvcnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfaW1wb3J0Lmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iQXZvaWRTdGFySW1wb3J0Ij4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXZlcml0eSIgdmFsdWU9ImVycm9yIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxJbXBvcnQiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNldmVyaXR5IiB2YWx1ZT0iZXJyb3IiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUmVkdW5kYW50SW1wb3J0Ij4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXZlcml0eSIgdmFsdWU9ImVycm9yIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlVudXNlZEltcG9ydHMiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNldmVyaXR5IiB2YWx1ZT0iZXJyb3IiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iSW1wb3J0T3JkZXIiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Imdyb3VwcyIgdmFsdWU9ImphdmEsamF2YXgsanVuaXQsb3JnLGNvbSIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNlcGFyYXRlZCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYXNlU2Vuc2l0aXZlIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICA8L21vZHVsZT4KLQotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBTaXplIFZpb2xhdGlvbnMuICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19zaXplcy5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkZpbGVMZW5ndGgiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJMaW5lTGVuZ3RoIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4IiB2YWx1ZT0iMTAwIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZExlbmd0aCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlBhcmFtZXRlck51bWJlciIvPgotCi0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIHdoaXRlc3BhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfd2hpdGVzcGFjZS5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkVtcHR5Rm9ySXRlcmF0b3JQYWQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJOb1doaXRlc3BhY2VBZnRlciIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik5vV2hpdGVzcGFjZUJlZm9yZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik9wZXJhdG9yV3JhcCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlBhcmVuUGFkIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVHlwZWNhc3RQYXJlblBhZCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlRhYkNoYXJhY3RlciIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IldoaXRlc3BhY2VBZnRlciIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IldoaXRlc3BhY2VBcm91bmQiLz4KLQotCi0gICAgICAgIDwhLS0gTW9kaWZpZXIgQ2hlY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbW9kaWZpZXJzLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTW9kaWZpZXJPcmRlciIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJlZHVuZGFudE1vZGlmaWVyIi8+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgYmxvY2tzLiBZb3Uga25vdywgdGhvc2Uge30ncyAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2Jsb2Nrcy5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkF2b2lkTmVzdGVkQmxvY2tzIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRW1wdHlCbG9jayIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkxlZnRDdXJseSI+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbiIgdmFsdWU9ImVvbCIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iTmVlZEJyYWNlcyIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJpZ2h0Q3VybHkiLz4KLQotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBjb21tb24gY29kaW5nIHByb2JsZW1zICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfY29kaW5nLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iQXZvaWRJbmxpbmVDb25kaXRpb25hbHMiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJDb3ZhcmlhbnRFcXVhbHMiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNldmVyaXR5IiB2YWx1ZT0iZXJyb3IiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRGVjbGFyYXRpb25PcmRlciI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2V2ZXJpdHkiIHZhbHVlPSJlcnJvciIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJEZWZhdWx0Q29tZXNMYXN0Ij4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXZlcml0eSIgdmFsdWU9ImVycm9yIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkRvdWJsZUNoZWNrZWRMb2NraW5nIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXZlcml0eSIgdmFsdWU9ImVycm9yIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkRlY2xhcmF0aW9uT3JkZXIiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNldmVyaXR5IiB2YWx1ZT0iZXJyb3IiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRGVmYXVsdENvbWVzTGFzdCI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2V2ZXJpdHkiIHZhbHVlPSJlcnJvciIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJEb3VibGVDaGVja2VkTG9ja2luZyI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2V2ZXJpdHkiIHZhbHVlPSJlcnJvciIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJGYWxsVGhyb3VnaCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkhpZGRlbkZpZWxkIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXZlcml0eSIgdmFsdWU9ImVycm9yIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9rZW5zIiB2YWx1ZT0iVkFSSUFCTEVfREVGIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxDYXRjaCI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2V2ZXJpdHkiIHZhbHVlPSJlcnJvciIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImlsbGVnYWxDbGFzc05hbWVzIiB2YWx1ZT0iamF2YS5sYW5nLlRocm93YWJsZSxqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJJbGxlZ2FsSW5zdGFudGlhdGlvbiI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2V2ZXJpdHkiIHZhbHVlPSJlcnJvciIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJJbGxlZ2FsVG9rZW5UZXh0Ij4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXZlcml0eSIgdmFsdWU9ImVycm9yIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxUeXBlIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXZlcml0eSIgdmFsdWU9ImVycm9yIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IklubmVyQXNzaWdubWVudCI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2V2ZXJpdHkiIHZhbHVlPSJlcnJvciIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJKVW5pdFRlc3RDYXNlIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXZlcml0eSIgdmFsdWU9ImVycm9yIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1hZ2ljTnVtYmVyIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTWlzc2luZ1N3aXRjaERlZmF1bHQiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNldmVyaXR5IiB2YWx1ZT0iZXJyb3IiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTXVsdGlwbGVWYXJpYWJsZURlY2xhcmF0aW9ucyI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2V2ZXJpdHkiIHZhbHVlPSJlcnJvciIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJOZXN0ZWRJZkRlcHRoIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXgiIHZhbHVlPSI0Ii8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik5lc3RlZFRyeURlcHRoIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXgiIHZhbHVlPSIzIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlBhY2thZ2VEZWNsYXJhdGlvbiI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2V2ZXJpdHkiIHZhbHVlPSJlcnJvciIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYXJhbWV0ZXJBc3NpZ25tZW50Ij4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXZlcml0eSIgdmFsdWU9ImVycm9yIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJlZHVuZGFudFRocm93cyIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlNpbXBsaWZ5Qm9vbGVhbkV4cHJlc3Npb24iPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNldmVyaXR5IiB2YWx1ZT0iZXJyb3IiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iU2ltcGxpZnlCb29sZWFuUmV0dXJuIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXZlcml0eSIgdmFsdWU9ImVycm9yIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlN0cmluZ0xpdGVyYWxFcXVhbGl0eSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2V2ZXJpdHkiIHZhbHVlPSJlcnJvciIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJTdXBlckZpbmFsaXplIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXZlcml0eSIgdmFsdWU9ImVycm9yIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBjbGFzcyBkZXNpZ24gICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfZGVzaWduLmh0bWwgLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkRlc2lnbkZvckV4dGVuc2lvbiIvLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRmluYWxDbGFzcyIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkhpZGVVdGlsaXR5Q2xhc3NDb25zdHJ1Y3RvciIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkludGVyZmFjZUlzVHlwZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlZpc2liaWxpdHlNb2RpZmllciIvPgotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGNvZGUgbWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX21ldHJpY3MuaHRtbCAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJCb29sZWFuRXhwcmVzc2lvbkNvbXBsZXhpdHkiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNldmVyaXR5IiB2YWx1ZT0iaW5mbyIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heCIgdmFsdWU9IjMiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iQ2xhc3NEYXRhQWJzdHJhY3Rpb25Db3VwbGluZyI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2V2ZXJpdHkiIHZhbHVlPSJpbmZvIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4IiB2YWx1ZT0iMTAiLz4KLSAgICAgICAgPC9tb2R1bGU+ICAgICAgICAKLSAgICAgICAgPG1vZHVsZSBuYW1lPSJDbGFzc0Zhbk91dENvbXBsZXhpdHkiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNldmVyaXR5IiB2YWx1ZT0iaW5mbyIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heCIgdmFsdWU9IjIwIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkN5Y2xvbWF0aWNDb21wbGV4aXR5Ij4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXZlcml0eSIgdmFsdWU9ImluZm8iLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXgiIHZhbHVlPSIxMCIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJOUGF0aENvbXBsZXhpdHkiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNldmVyaXR5IiB2YWx1ZT0iaW5mbyIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heCIgdmFsdWU9IjIwMCIvPgotICAgICAgICA8L21vZHVsZT4KLQotICAgICAgICA8IS0tIE1pc2NlbGxhbmVvdXMgb3RoZXIgY2hlY2tzLiAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19taXNjLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iQXJyYXlUeXBlU3R5bGUiLz4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iRmluYWxQYXJhbWV0ZXJzIi8tLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iR2VuZXJpY0lsbGVnYWxSZWdleHAiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9IlxzKyQiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iTGluZSBoYXMgdHJhaWxpbmcgc3BhY2VzLiIvPgotICAgICAgICA8L21vZHVsZS0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkdlbmVyaWNJbGxlZ2FsUmVnZXhwIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJnZW5lcmF0ZWQgY29tbWVudHxhdXRvLWdlbmVyYXRlZHx0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZXx0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Imlnbm9yZUNhc2UiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IkdlbmVyYXRlZCBDb21tZW50IEZvdW5kLiBQbGVhc2UgZW50ZXIgYSByZWFsIG9uZS4iLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXZlcml0eSIgdmFsdWU9ImVycm9yIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkluZGVudGF0aW9uIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVG9kb0NvbW1lbnQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJVbmNvbW1lbnRlZE1haW4iLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJVcHBlckVsbCIvPgotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciB1c2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ191c2FnZS5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9InVzYWdlLk9uZU1ldGhvZFByaXZhdGVGaWVsZCI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlRm9ybWF0IiB2YWx1ZT0iVGVtcCQiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0idXNhZ2UuVW51c2VkTG9jYWxWYXJpYWJsZSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2V2ZXJpdHkiIHZhbHVlPSJlcnJvciIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJ1c2FnZS5VbnVzZWRQcml2YXRlRmllbGQiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Imlnbm9yZUZvcm1hdCIgdmFsdWU9IkxPRyIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNldmVyaXR5IiB2YWx1ZT0iZXJyb3IiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLSAgICA8L21vZHVsZT4KLQotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3RhZy1uYXZpZ2F0aW9uLnhtbCBiL2plbGx5LXRhZ3MvdGFnLW5hdmlnYXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDk5YmRiLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdGFnLW5hdmlnYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBuYW1lPSJAcG9tLm5hbWVAIj4KLQotICA8dGl0bGU+QHBvbS5uYW1lQDwvdGl0bGU+Ci0gIDxvcmdhbml6YXRpb25Mb2dvIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvaW1hZ2VzL2pha2FydGEtbG9nby5naWYiPkpha2FydGE8L29yZ2FuaXphdGlvbkxvZ28+Ci0gIAotICA8Ym9keT48IS0tIG5vdGUsIGFsbCBsaW5rcyB3aWxsIGJlIHJlbGF0aXZpemVkIGF0IEhUTUwgcHJvZHVjdGlvbi4uLiAtLT4KLSAgICAgICAgPGxpbmtzPjxpdGVtIG5hbWU9IkplbGx5IiBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvamVsbHkiLz48L2xpbmtzPgotICAgIDxtZW51IG5hbWU9IkBwb20ubmFtZUAiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgICAgICAgICAgIGhyZWY9Ii9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJUYWdzIiAgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZ3MuaHRtbCIvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3RhZy1wcm9qZWN0LnhtbCBiL2plbGx5LXRhZ3MvdGFnLXByb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGIxNTRmLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdGFnLXByb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0PgotICA8ZXh0ZW5kPi4uL3BhcmVudC1wcm9qZWN0LnhtbDwvZXh0ZW5kPgotICA8cG9tVmVyc2lvbj4zPC9wb21WZXJzaW9uPgotICA8Z3JvdXBJZD5jb21tb25zLWplbGx5PC9ncm91cElkPgotICA8Y3VycmVudFZlcnNpb24+MS4wLVNOQVBTSE9UPC9jdXJyZW50VmVyc2lvbj4KLSAgCi0gIDxvcmdhbml6YXRpb24+Ci0gICAgPG5hbWU+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+Ci0gICAgPHVybD5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnLzwvdXJsPgotICAgIDxsb2dvPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvaW1hZ2VzL2pha2FydGEtbG9nby5naWY8L2xvZ28+Ci0gIDwvb3JnYW5pemF0aW9uPgotICA8aW5jZXB0aW9uWWVhcj4yMDAyPC9pbmNlcHRpb25ZZWFyPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5hbnQ8L3BhY2thZ2U+Ci0gIDxsb2dvPi9pbWFnZXMvbG9nby5naWY8L2xvZ28+Ci0gIDwhLS0gR3VtcCBpbnRlZ3JhdGlvbiAtLT4KLSAgPGd1bXBSZXBvc2l0b3J5SWQ+amFrYXJ0YTwvZ3VtcFJlcG9zaXRvcnlJZD4KLQotICA8ZGVzY3JpcHRpb24+Ci0gICAgICBUaGlzIGlzIGEgSmVsbHkgdGFnLgotICA8L2Rlc2NyaXB0aW9uPgotICA8c2hvcnREZXNjcmlwdGlvbj5Db21tb25zIEplbGx5IFRhZyBMaWJyYXJ5PC9zaG9ydERlc2NyaXB0aW9uPgotICAKLSAgPHVybD5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvamVsbHkvbGlicy8ke3BvbS5pZC5zdWJzdHJpbmcoMzMpfS9pbmRleC5odG1sPC91cmw+Ci0gIDxpc3N1ZVRyYWNraW5nVXJsPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL3NlY3VyZS9Ccm93c2VQcm9qZWN0LmpzcGE/aWQ9MTAwMTI8L2lzc3VlVHJhY2tpbmdVcmw+Ci0gIAotICA8c2l0ZUFkZHJlc3M+amFrYXJ0YS5hcGFjaGUub3JnPC9zaXRlQWRkcmVzcz4KLSAgPHNpdGVEaXJlY3Rvcnk+L3d3dy9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9qZWxseS9saWJzLyR7cG9tLmlkLnN1YnN0cmluZygzMyl9Lzwvc2l0ZURpcmVjdG9yeT4KLSAgPGRpc3RyaWJ1dGlvbkRpcmVjdG9yeT4vd3d3L2pha2FydGEuYXBhY2hlLm9yZy9idWlsZHMvamFrYXJ0YS1jb21tb25zL2plbGx5L2plbGx5LXRhZ3MvJHtwb20uaWQuc3Vic3RyaW5nKDMzKX0vPC9kaXN0cmlidXRpb25EaXJlY3Rvcnk+Ci0gIAotICA8cmVwb3NpdG9yeT4KLSAgICA8Y29ubmVjdGlvbj5zY206Y3ZzOnBzZXJ2ZXI6YW5vbmN2c0BjdnMuYXBhY2hlLm9yZzovaG9tZS9jdnNwdWJsaWM6amFrYXJ0YS1jb21tb25zL2plbGx5L2plbGx5LXRhZ3MvJHtwb20uaWQuc3Vic3RyaW5nKDMzKX08L2Nvbm5lY3Rpb24+Ci0gICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOmN2czpleHQ6JHttYXZlbi51c2VybmFtZX1AY3ZzLmFwYWNoZS5vcmc6L2hvbWUvY3ZzOmpha2FydGEtY29tbW9ucy9qZWxseS9qZWxseS10YWdzLyR7cG9tLmlkLnN1YnN0cmluZygzMyl9PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgIDx1cmw+aHR0cDovL2N2cy5hcGFjaGUub3JnL3ZpZXdjdnMvamFrYXJ0YS1jb21tb25zL2plbGx5L2plbGx5LXRhZ3MvJHtwb20uaWQuc3Vic3RyaW5nKDMzKX0vPC91cmw+Ci0gIDwvcmVwb3NpdG9yeT4KLSAgCi0gIAotICA8bWFpbGluZ0xpc3RzPgotICAgIDxtYWlsaW5nTGlzdD4KLSAgICAgIDxuYW1lPkNvbW1vbnMgRGV2IExpc3Q8L25hbWU+Ci0gICAgICA8c3Vic2NyaWJlPmNvbW1vbnMtZGV2LXN1YnNjcmliZUBqYWthcnRhLmFwYWNoZS5vcmc8L3N1YnNjcmliZT4KLSAgICAgIDx1bnN1YnNjcmliZT5jb21tb25zLWRldi11bnN1YnNjcmliZUBqYWthcnRhLmFwYWNoZS5vcmc8L3Vuc3Vic2NyaWJlPgotICAgICAgPGFyY2hpdmU+aHR0cDovL21haWwtYXJjaGl2ZXMuYXBhY2hlLm9yZy9leWVicm93c2UvU3VtbWFyaXplTGlzdD9saXN0TmFtZT1jb21tb25zLWRldkBqYWthcnRhLmFwYWNoZS5vcmc8L2FyY2hpdmU+Ci0gICAgPC9tYWlsaW5nTGlzdD4KLSAgICA8bWFpbGluZ0xpc3Q+Ci0gICAgICA8bmFtZT5Db21tb25zIFVzZXIgTGlzdDwvbmFtZT4KLSAgICAgIDxzdWJzY3JpYmU+Y29tbW9ucy11c2VyLXN1YnNjcmliZUBqYWthcnRhLmFwYWNoZS5vcmc8L3N1YnNjcmliZT4KLSAgICAgIDx1bnN1YnNjcmliZT5jb21tb25zLXVzZXItdW5zdWJzY3JpYmVAamFrYXJ0YS5hcGFjaGUub3JnPC91bnN1YnNjcmliZT4KLSAgICAgIDxhcmNoaXZlPmh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvZXllYnJvd3NlL1N1bW1hcml6ZUxpc3Q/bGlzdE5hbWU9Y29tbW9ucy11c2VyQGpha2FydGEuYXBhY2hlLm9yZzwvYXJjaGl2ZT4KLSAgICA8L21haWxpbmdMaXN0PgotICA8L21haWxpbmdMaXN0cz4KLSAgCi0gIDxkZXZlbG9wZXJzPgotICAgIDxkZXZlbG9wZXI+Ci0gICAgICA8bmFtZT5KYW1lcyBTdHJhY2hhbjwvbmFtZT4KLSAgICAgIDxpZD5qc3RyYWNoYW48L2lkPgotICAgICAgPGVtYWlsPmpzdHJhY2hhbkBhcGFjaGUub3JnPC9lbWFpbD4KLSAgICAgIDxvcmdhbml6YXRpb24+U3Bpcml0U29mdCwgSW5jLjwvb3JnYW5pemF0aW9uPgotICAgIDwvZGV2ZWxvcGVyPgotICAgIDxkZXZlbG9wZXI+Ci0gICAgICA8bmFtZT5HZWlyIE1hZ251c3NvbiBKci48L25hbWU+Ci0gICAgICA8aWQ+Z2Vpcm08L2lkPgotICAgICAgPGVtYWlsPmdlaXJtQGFkZXB0cmEuY29tPC9lbWFpbD4KLSAgICAgIDxvcmdhbml6YXRpb24+QWRlcHRyYSwgSW5jLjwvb3JnYW5pemF0aW9uPgotICAgIDwvZGV2ZWxvcGVyPgotICAgIDxkZXZlbG9wZXI+Ci0gICAgICA8bmFtZT5Cb2IgTWNXaGlydGVyPC9uYW1lPgotICAgICAgPGlkPndlcmtlbjwvaWQ+Ci0gICAgICA8ZW1haWw+Ym9iQGVuZy53ZXJrZW4uY29tPC9lbWFpbD4KLSAgICAgIDxvcmdhbml6YXRpb24+VGhlIFdlcmtlbiBDb21wYW55PC9vcmdhbml6YXRpb24+Ci0gICAgPC9kZXZlbG9wZXI+Ci0gICAgPGRldmVsb3Blcj4KLSAgICAgIDxuYW1lPmRJb24gR2lsbGFyZDwvbmFtZT4KLSAgICAgIDxpZD5kaW9uPC9pZD4KLSAgICAgIDxlbWFpbD5kaW9uQG11bHRpdGFzay5jb20uYXU8L2VtYWlsPgotICAgICAgPG9yZ2FuaXphdGlvbj5NdWx0aXRhc2sgQ29uc3VsdGluZzwvb3JnYW5pemF0aW9uPgotICAgICAgPHJvbGVzPgotICAgICAgICA8cm9sZT5JbnRlcmVzdGVkIHBhcnR5PC9yb2xlPgotICAgICAgPC9yb2xlcz4KLSAgICA8L2RldmVsb3Blcj4KLSAgICA8ZGV2ZWxvcGVyPgotICAgICAgPG5hbWU+TW9yZ2FuIERlbGFncmFuZ2U8L25hbWU+Ci0gICAgICA8aWQ+bW9yZ2FuZDwvaWQ+Ci0gICAgICA8ZW1haWw+bW9yZ2FuZEBhcGFjaGUub3JnPC9lbWFpbD4KLSAgICA8L2RldmVsb3Blcj4KLSAgICA8ZGV2ZWxvcGVyPgotICAgICAgPG5hbWU+Um9kbmV5IFdhbGRob2ZmPC9uYW1lPgotICAgICAgPGlkPnJ3YWxkaG9mZjwvaWQ+Ci0gICAgICA8ZW1haWw+cndhbGRob2ZmQGFwYWNoZS5vcmc8L2VtYWlsPgotICAgIDwvZGV2ZWxvcGVyPgotICAgIDxkZXZlbG9wZXI+Ci0gICAgICA8bmFtZT5Sb2JlcnQgQnVycmVsbCBEb25raW48L25hbWU+Ci0gICAgICA8aWQ+cmRvbmtpbjwvaWQ+Ci0gICAgICA8ZW1haWw+cmRvbmtpbkBhcGFjaGUub3JnPC9lbWFpbD4KLSAgICA8L2RldmVsb3Blcj4KLSAgPC9kZXZlbG9wZXJzPgotCi0gIDxjb250cmlidXRvcnM+Ci0gICAgPGNvbnRyaWJ1dG9yPgotICAgICAgPG5hbWU+TWFydGluIHZhbiBkZW0gQmVtdDwvbmFtZT4KLSAgICAgIDxlbWFpbD5tdmRiQG12ZGIuY29tPC9lbWFpbD4KLSAgICA8L2NvbnRyaWJ1dG9yPgotICAgIDxjb250cmlidXRvcj4KLSAgICAgIDxuYW1lPkVyaWsgRnJhbnNlbjwvbmFtZT4KLSAgICAgIDxlbWFpbD5lcmlrMTY3QHhzNGFsbC5ubDwvZW1haWw+Ci0gICAgICA8cm9sZXM+Ci0gICAgICAgICAgPHJvbGU+TG9nbyBkZXNpZ25lcjwvcm9sZT4KLSAgICAgIDwvcm9sZXM+Ci0gICAgPC9jb250cmlidXRvcj4KLSAgICA8Y29udHJpYnV0b3I+Ci0gICAgICA8bmFtZT5DYWx2aW4gWXU8L25hbWU+Ci0gICAgPC9jb250cmlidXRvcj4KLSAgICA8Y29udHJpYnV0b3I+Ci0gICAgICA8bmFtZT5TdGVwaGVuIEhhYmVybWFuPC9uYW1lPgotICAgICAgPGVtYWlsPnN0ZXBoZW5oQGNoYXNlMzAwMC5jb208L2VtYWlsPgotICAgIDwvY29udHJpYnV0b3I+Ci0gICAgPGNvbnRyaWJ1dG9yPgotICAgICAgPG5hbWU+VmluYXkgQ2hhbmRyYW48L25hbWU+Ci0gICAgICA8ZW1haWw+c2FoaWx2aW5heUB5YWhvby5jb208L2VtYWlsPgotICAgICAgPHJvbGVzPgotICAgICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KLSAgICAgIDwvcm9sZXM+Ci0gICAgPC9jb250cmlidXRvcj4KLSAgICA8Y29udHJpYnV0b3I+Ci0gICAgICA8bmFtZT5UaGVvIE5pZW1laWplcjwvbmFtZT4KLSAgICA8L2NvbnRyaWJ1dG9yPgotICAgIDxjb250cmlidXRvcj4KLSAgICAgIDxuYW1lPkpvZSBXYWxuZXM8L25hbWU+Ci0gICAgICA8ZW1haWw+am9ld0B0aG91Z2h0d29ya3MuY29tPC9lbWFpbD4KLSAgICAgIDxvcmdhbml6YXRpb24+VGhvdWdodFdvcmtzLCBJbmMuPC9vcmdhbml6YXRpb24+Ci0gICAgICA8cm9sZXM+Ci0gICAgICAgICAgPHJvbGU+SW52ZW50b3Igb2YgTW9jayBUYWdzPC9yb2xlPgotICAgICAgPC9yb2xlcz4KLSAgICA8L2NvbnRyaWJ1dG9yPgotICAgIDxjb250cmlidXRvcj4KLSAgICAgIDxuYW1lPk90dG8gdm9uIFdhY2h0ZXI8L25hbWU+Ci0gICAgICA8ZW1haWw+dm9ud2FvQHlhaG9vLmNvbTwvZW1haWw+Ci0gICAgICA8b3JnYW5pemF0aW9uPjwvb3JnYW5pemF0aW9uPgotICAgICAgPHJvbGVzPgotICAgICAgICAgIDxyb2xlPkF1dGhvciBvZiB0aGUgdHV0b3JpYWxzPC9yb2xlPgotICAgICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KLSAgICAgIDwvcm9sZXM+Ci0gICAgPC9jb250cmlidXRvcj4KLSAgICA8Y29udHJpYnV0b3I+Ci0gICAgICA8bmFtZT5Sb2JlcnQgTGVmdHdpY2g8L25hbWU+Ci0gICAgICA8ZW1haWw+cm9iZXJ0QGxlZnR3aWNoLmluZm88L2VtYWlsPgotICAgICAgPHJvbGVzPgotICAgICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KLSAgICAgIDwvcm9sZXM+Ci0gICAgPC9jb250cmlidXRvcj4KLSAgICA8Y29udHJpYnV0b3I+Ci0gICAgICA8bmFtZT5QYXVsIExpYmJyZWNodDwvbmFtZT4KLSAgICAgIDxlbWFpbD5wYXVsQGFjdGl2ZW1hdGgub3JnPC9lbWFpbD4KLSAgICAgIDxyb2xlcz4KLSAgICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+Ci0gICAgICA8L3JvbGVzPgotICAgIDwvY29udHJpYnV0b3I+ICAgIAotICAgIDxjb250cmlidXRvcj4KLSAgICAgIDxuYW1lPkppbSBCaXJjaGZpZWxkPC9uYW1lPgotICAgICAgPGVtYWlsPmppbS5iaXJjaGZpZWxkQGdlbnNjYXBlLmNvbTwvZW1haWw+Ci0gICAgICA8b3JnYW5pemF0aW9uPkdlbnNjYXBlLCBJbmMuPC9vcmdhbml6YXRpb24+Ci0gICAgICA8cm9sZXM+Ci0gICAgICAgICAgPHJvbGU+RGV2ZWxvcGVyPC9yb2xlPgotICAgICAgPC9yb2xlcz4KLSAgICA8L2NvbnRyaWJ1dG9yPiAgICAKLSAgICA8Y29udHJpYnV0b3I+Ci0gICAgICA8bmFtZT5KYXNvbiBIb3JtYW48L25hbWU+Ci0gICAgICA8ZW1haWw+amhvcm1hbkBtdXNpY21hdGNoLmNvbTwvZW1haWw+Ci0gICAgICA8cm9sZXM+Ci0gICAgICAgICAgPHJvbGU+RGV2ZWxvcGVyPC9yb2xlPgotICAgICAgPC9yb2xlcz4KLSAgICA8L2NvbnRyaWJ1dG9yPiAgICAKLSAgICA8Y29udHJpYnV0b3I+Ci0gICAgICA8bmFtZT5UaW0gQW5kZXJzb248L25hbWU+Ci0gICAgICA8ZW1haWw+dGltYUBpbnRhbGlvLmNvbTwvZW1haWw+Ci0gICAgICA8b3JnYW5pemF0aW9uPkludGFsaW8sIEluYy48L29yZ2FuaXphdGlvbj4KLSAgICAgIDxyb2xlcz4KLSAgICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+Ci0gICAgICA8L3JvbGVzPgotICAgIDwvY29udHJpYnV0b3I+ICAgIAotICAgIDxjb250cmlidXRvcj4KLSAgICAgIDxuYW1lPlRoZW8gTmllbWVpamVyPC9uYW1lPgotICAgICAgPGVtYWlsPnRoZW8ubmllbWVpamVyQGdldHRoZXJlLm5sPC9lbWFpbD4KLSAgICAgIDxvcmdhbml6YXRpb24+PC9vcmdhbml6YXRpb24+Ci0gICAgICA8cm9sZXM+Ci0gICAgICAgICAgPHJvbGU+RGV2ZWxvcGVyPC9yb2xlPgotICAgICAgPC9yb2xlcz4KLSAgICA8L2NvbnRyaWJ1dG9yPiAgICAKLSAgICA8Y29udHJpYnV0b3I+Ci0gICAgICA8bmFtZT5KLiBNYXR0aGV3IFByeW9yPC9uYW1lPgotICAgICAgPGVtYWlsPm1hdHRoZXdfcHJ5b3JAdmVyc2F0YS5jb208L2VtYWlsPgotICAgICAgPG9yZ2FuaXphdGlvbj48L29yZ2FuaXphdGlvbj4KLSAgICAgIDxyb2xlcz4KLSAgICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+Ci0gICAgICA8L3JvbGVzPgotICAgIDwvY29udHJpYnV0b3I+ICAgICAgICAKLSAgICA8Y29udHJpYnV0b3I+Ci0gICAgICA8bmFtZT5LbnV0IFdhbm5oZWRlbjwvbmFtZT4KLSAgICAgIDxlbWFpbD48L2VtYWlsPgotICAgICAgPG9yZ2FuaXphdGlvbj48L29yZ2FuaXphdGlvbj4KLSAgICAgIDxyb2xlcz4KLSAgICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+Ci0gICAgICA8L3JvbGVzPgotICAgIDwvY29udHJpYnV0b3I+ICAgICAgICAKLSAgICA8Y29udHJpYnV0b3I+Ci0gICAgICA8bmFtZT5LZWx2aW4gVGFuPC9uYW1lPgotICAgICAgPGVtYWlsPjwvZW1haWw+Ci0gICAgICA8b3JnYW5pemF0aW9uPjwvb3JnYW5pemF0aW9uPgotICAgICAgPHJvbGVzPgotICAgICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KLSAgICAgIDwvcm9sZXM+Ci0gICAgPC9jb250cmlidXRvcj4gICAgICAgIAotICAgIDxjb250cmlidXRvcj4KLSAgICAgIDxuYW1lPlRvZGQgSm9ua2VyPC9uYW1lPgotICAgICAgPGVtYWlsPjwvZW1haWw+Ci0gICAgICA8b3JnYW5pemF0aW9uPjwvb3JnYW5pemF0aW9uPgotICAgICAgPHJvbGVzPgotICAgICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KLSAgICAgIDwvcm9sZXM+Ci0gICAgPC9jb250cmlidXRvcj4gICAgICAgICAgICAKLSAgPC9jb250cmlidXRvcnM+Ci0gICAgCi0gIDxkZXBlbmRlbmNpZXM+Ci0gCi0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+eG1sLWFwaXM8L2lkPgotICAgICAgPHZlcnNpb24+MS4wLmIyPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5jb21tb25zLWJlYW51dGlsczwvaWQ+Ci0gICAgICA8dmVyc2lvbj4xLjY8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPmNvbW1vbnMtY29sbGVjdGlvbnM8L2lkPgotICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5jb21tb25zLWpleGw8L2lkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5jb21tb25zLWplbGx5PC9pZD4KLSAgICAgIDx2ZXJzaW9uPlNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5jb21tb25zLWxvZ2dpbmc8L2lkPgotICAgICAgPHZlcnNpb24+MS4wLjM8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPmRvbTRqPC9pZD4KLSAgICAgIDx2ZXJzaW9uPjEuNTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5qYXhlbjwvaWQ+Ci0gICAgICA8dmVyc2lvbj4xLjEtYmV0YS0yPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPnhlcmNlczwvaWQ+Ci0gICAgICA8dmVyc2lvbj4yLjIuMTwvdmVyc2lvbj4KLSAgICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8Z3VtcC5wcm9qZWN0PnhtbC14ZXJjZXM8L2d1bXAucHJvamVjdD4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICAKLSAgPGJ1aWxkPgotICAgIDxuYWdFbWFpbEFkZHJlc3M+Y29tbW9ucy1kZXZAamFrYXJ0YS5hcGFjaGUub3JnPC9uYWdFbWFpbEFkZHJlc3M+Ci0gICAgPHNvdXJjZURpcmVjdG9yeT5zcmMvamF2YTwvc291cmNlRGlyZWN0b3J5PgotICAgIDx1bml0VGVzdFNvdXJjZURpcmVjdG9yeT5zcmMvdGVzdDwvdW5pdFRlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0KLSAgICA8IS0tIFVuaXQgdGVzdCBjbGFzc2VzIC0tPgotICAgIDx1bml0VGVzdD4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+KiovVGVzdCouamF2YTwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvdGVzdDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLmplbGx5PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnhzbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoucm5nPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi5kdGQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLmh0bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgIDwvcmVzb3VyY2VzPgotICAgIDwvdW5pdFRlc3Q+Ci0KLSAgICA8IS0tIFJlc291cmNlcyB0aGF0IGFyZSBwYWNrYWdlZCB1cCBpbnNpZGUgdGhlIEpBUiBmaWxlIC0tPgotICAgIDxyZXNvdXJjZXM+ICAgICAgICAKLSAgICAgICAgPHJlc291cmNlPiAgICAgICAgCi0gICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi5wcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9yZXNvdXJjZT4KLSAgICA8L3Jlc291cmNlcz4KLSAgCi0gIDwvYnVpbGQ+Ci0KLSAgPHJlcG9ydHM+Ci0gICAgPHJlcG9ydD5tYXZlbi1jaGFuZ2Vsb2ctcGx1Z2luPC9yZXBvcnQ+Ci0gICAgPHJlcG9ydD5tYXZlbi1jaGFuZ2VzLXBsdWdpbjwvcmVwb3J0PgotICAgIDxyZXBvcnQ+bWF2ZW4tY2hlY2tzdHlsZS1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLWRldmVsb3Blci1hY3Rpdml0eS1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLWZpbGUtYWN0aXZpdHktcGx1Z2luPC9yZXBvcnQ+Ci0gICAgPHJlcG9ydD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvcmVwb3J0PgotICAgIDxyZXBvcnQ+bWF2ZW4tamNvdmVyYWdlLXBsdWdpbjwvcmVwb3J0PgotICAgIDxyZXBvcnQ+bWF2ZW4tamRlcGVuZC1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLWplbGx5ZG9jLXBsdWdpbjwvcmVwb3J0PgotICAgIDxyZXBvcnQ+bWF2ZW4tanVuaXQtcmVwb3J0LXBsdWdpbjwvcmVwb3J0PgotICAgIDxyZXBvcnQ+bWF2ZW4tanhyLXBsdWdpbjwvcmVwb3J0PgotICAgIDxyZXBvcnQ+bWF2ZW4tbGljZW5zZS1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLXBtZC1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLXRhc2tsaXN0LXBsdWdpbjwvcmVwb3J0PgotICA8L3JlcG9ydHM+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvdGhyZWFkcy8uY3ZzaWdub3JlIGIvamVsbHktdGFncy90aHJlYWRzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Y2ViNzYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy90aHJlYWRzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLW1hdmVuLmxvZwotdGFyZ2V0Ci12ZWxvY2l0eS5sb2cKLWpjb3ZlcmFnZS5zZXIKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvdGhyZWFkcy9idWlsZC54bWwgYi9qZWxseS10YWdzL3RocmVhZHMvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGNmZDllLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdGhyZWFkcy9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLWJ1aWxkLnhtbCBnZW5lcmF0ZWQgYnkgbWF2ZW4gZnJvbSBwcm9qZWN0LnhtbCB2ZXJzaW9uIDEuMC1TTkFQU0hPVAotICBvbiBkYXRlIE1heSAyNCAyMDA0LCB0aW1lIDIzMDItLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImphciIgbmFtZT0iY29tbW9ucy1qZWxseS10YWdzLXRocmVhZHMiIGJhc2VkaXI9Ii4iPgotICA8cHJvcGVydHkgbmFtZT0iZGVmYXVsdHRhcmdldGRpciIgdmFsdWU9InRhcmdldCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJkaXIiIHZhbHVlPSJ0YXJnZXQvbGliIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXNkaXIiIHZhbHVlPSJ0YXJnZXQvY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Y2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0idGVzdHJlcG9ydGRpciIgdmFsdWU9InRhcmdldC90ZXN0LXJlcG9ydHMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZGlzdGRpciIgdmFsdWU9ImRpc3QiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iamF2YWRvY2RpciIgdmFsdWU9ImRpc3QvZG9jcy9hcGkiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZmluYWwubmFtZSIgdmFsdWU9ImNvbW1vbnMtamVsbHktdGFncy10aHJlYWRzLTEuMC1TTkFQU0hPVCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVzY3JpcHRpb249Im8gSW5pdGlhbGl6ZXMgc29tZSBwcm9wZXJ0aWVzIj4KLSAgICA8bWtkaXIgZGlyPSIke2xpYmRpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibm9nZXQiPgotICAgICAgPGVxdWFscyBhcmcyPSJvbmx5IiBhcmcxPSIke2J1aWxkLnN5c2NsYXNzcGF0aH0iPgotICAgICAgPC9lcXVhbHM+Ci0gICAgPC9jb25kaXRpb24+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJvIENvbXBpbGUgdGhlIGNvZGUiIGRlcGVuZHM9ImdldC1kZXBzIj4KLSAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqYXZhYyBkZXN0ZGlyPSIke2NsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy9qYXZhIj4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0gICAgPGNvcHkgdG9kaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvamF2YSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gICAgPGNvcHkgdG9kaXI9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmplbGx5Ij4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54c2wiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucm5nIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmR0ZCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmh0bWwiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJqYXIiIGRlc2NyaXB0aW9uPSJvIENyZWF0ZSB0aGUgamFyIiBkZXBlbmRzPSJjb21waWxlLHRlc3QiPgotICAgIDxqYXIgamFyZmlsZT0idGFyZ2V0LyR7ZmluYWwubmFtZX0uamFyIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIiBiYXNlZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICA8L2phcj4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJvIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZGlyZWN0b3JpZXMiPgotICAgIDxkZWxldGUgZGlyPSIke2RlZmF1bHR0YXJnZXRkaXJ9Ij4KLSAgICA8L2RlbGV0ZT4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlc2NyaXB0aW9uPSJvIENyZWF0ZSBhIGRpc3RyaWJ1dGlvbiIgZGVwZW5kcz0iamFyLCBqYXZhZG9jIj4KLSAgICA8bWtkaXIgZGlyPSJkaXN0Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb3B5IHRvZGlyPSJkaXN0Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSIgaW5jbHVkZXM9IiouamFyIj4KLSAgICAgIDwvZmlsZXNldD4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZXM9IkxJQ0VOU0UqLCBSRUFETUUqIj4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlc2NyaXB0aW9uPSJvIFJ1biB0aGUgdGVzdCBjYXNlcyIgaWY9InRlc3QuZmFpbHVyZSIgZGVwZW5kcz0iaW50ZXJuYWwtdGVzdCI+Ci0gICAgPGZhaWwgbWVzc2FnZT0iVGhlcmUgd2VyZSB0ZXN0IGZhaWx1cmVzLiI+Ci0gICAgPC9mYWlsPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJpbnRlcm5hbC10ZXN0IiBkZXBlbmRzPSJjb21waWxlLXRlc3RzIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3RyZXBvcnRkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqdW5pdCBkaXI9Ii4vIiBmYWlsdXJlcHJvcGVydHk9InRlc3QuZmFpbHVyZSIgcHJpbnRTdW1tYXJ5PSJ5ZXMiIGZvcms9InRydWUiIGhhbHRvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImJhc2VkaXIiIHZhbHVlPSIuIj4KLSAgICAgIDwvc3lzcHJvcGVydHk+Ci0gICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxmb3JtYXR0ZXIgdXNlZmlsZT0iZmFsc2UiIHR5cGU9InBsYWluIj4KLSAgICAgIDwvZm9ybWF0dGVyPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICA8YmF0Y2h0ZXN0IHRvZGlyPSIke3Rlc3RyZXBvcnRkaXJ9Ij4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovVGVzdCouamF2YSI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2JhdGNodGVzdD4KLSAgICA8L2p1bml0PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlLXRlc3RzIiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iIGRlcHJlY2F0aW9uPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSIgb3B0aW1pemU9ImZhbHNlIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIj4KLSAgICAgIDxzcmM+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL3Rlc3QiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9zcmM+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJqYXZhZG9jIiBkZXNjcmlwdGlvbj0ibyBHZW5lcmF0ZSBqYXZhZG9jIiBkZXBlbmRzPSJqYXIiPgotICAgIDxta2RpciBkaXI9IiR7amF2YWRvY2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPHRzdGFtcD4KLSAgICAgIDxmb3JtYXQgcGF0dGVybj0iMjAwMi15eXl5IiBwcm9wZXJ0eT0ieWVhciI+Ci0gICAgICA8L2Zvcm1hdD4KLSAgICA8L3RzdGFtcD4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29weXJpZ2h0IiB2YWx1ZT0iQ29weXJpZ2h0ICZhbXA7Y29weTsgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLiI+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgICA8cHJvcGVydHkgbmFtZT0idGl0bGUiIHZhbHVlPSJjb21tb25zLWplbGx5LXRhZ3MtdGhyZWFkcyAxLjAtU05BUFNIT1QgQVBJIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxqYXZhZG9jIHVzZT0idHJ1ZSIgcHJpdmF0ZT0idHJ1ZSIgZGVzdGRpcj0iJHtqYXZhZG9jZGlyfSIgYXV0aG9yPSJ0cnVlIiB2ZXJzaW9uPSJ0cnVlIiBzb3VyY2VwYXRoPSJzcmMvamF2YSIgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy50aHJlYWRzLioiPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhZG9jPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJnZXQtZGVwcyIgdW5sZXNzPSJub2dldCIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LXRhZ3MtanVuaXQtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamVsbHkvamFycy9jb21tb25zLWplbGx5LXRhZ3MtanVuaXQtU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamV4bC9qYXJzL2NvbW1vbnMtamV4bC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3htbC1hcGlzLTEuMC5iMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veG1sLWFwaXMvamFycy94bWwtYXBpcy0xLjAuYjIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWJlYW51dGlscy0xLjYuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtYmVhbnV0aWxzL2phcnMvY29tbW9ucy1iZWFudXRpbHMtMS42LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtY29sbGVjdGlvbnMvamFycy9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1sb2dnaW5nL2phcnMvY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vZG9tNGotMS41LWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vZG9tNGovamFycy9kb200ai0xLjUtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vamF4ZW4tMS4xLWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vamF4ZW4vamFycy9qYXhlbi0xLjEtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veGVyY2VzLTIuMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94ZXJjZXMvamFycy94ZXJjZXMtMi4yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qdW5pdC0zLjguMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vanVuaXQvamFycy9qdW5pdC0zLjguMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FudC0xLjUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC0xLjUuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtb3B0aW9uYWwtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtb3B0aW9uYWwtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtbWF2ZW4iPgotICAgIDxnZXQgZGVzdD0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBzcmM9IiR7cmVwb30vbWF2ZW4vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8dW5qYXIgZGVzdD0iJHttYXZlbi5ob21lfSIgc3JjPSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L3VuamFyPgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3RocmVhZHMvbWF2ZW4ueG1sIGIvamVsbHktdGFncy90aHJlYWRzL21hdmVuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJlZWExYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3RocmVhZHMvbWF2ZW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImphdmE6amFyIj4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy90aHJlYWRzL3Byb2plY3QucHJvcGVydGllcyBiL2plbGx5LXRhZ3MvdGhyZWFkcy9wcm9qZWN0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YzFiNjEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy90aHJlYWRzL3Byb2plY3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQotIyBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUCBSIE8gSiBFIEMgVCAgUCBSIE8gUCBFIFIgVCBJIEUgUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3RocmVhZHMvcHJvamVjdC54bWwgYi9qZWxseS10YWdzL3RocmVhZHMvcHJvamVjdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMjM0MjMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy90aHJlYWRzL3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3Q+Ci0gIDxleHRlbmQ+JHtiYXNlZGlyfS8uLi90YWctcHJvamVjdC54bWw8L2V4dGVuZD4KLSAgPGlkPmNvbW1vbnMtamVsbHktdGFncy10aHJlYWRzPC9pZD4KLSAgPG5hbWU+Y29tbW9ucy1qZWxseS10YWdzLXRocmVhZHM8L25hbWU+Ci0gIDxjdXJyZW50VmVyc2lvbj4xLjA8L2N1cnJlbnRWZXJzaW9uPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy50aHJlYWRzPC9wYWNrYWdlPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgQSBsaWJyYXJ5IGZvciBwcm9jZXNzaW5nIEplbGx5IHNjcmlwdHMgdXNpbmcgbXVsdGlwbGUgdGhyZWFkcy4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPHNob3J0RGVzY3JpcHRpb24+Q29tbW9ucyBKZWxseSBUaHJlYWRzIFRhZyBMaWJyYXJ5PC9zaG9ydERlc2NyaXB0aW9uPgotICAKLSAgPHZlcnNpb25zPgotICAgIDx2ZXJzaW9uPgotICAgICAgPGlkPjEuMDwvaWQ+Ci0gICAgICA8bmFtZT4xLjA8L25hbWU+Ci0gICAgICA8dGFnPkNPTU1PTlMtSkVMTFktVEhSRUFEUy0xXzA8L3RhZz4KLSAgICA8L3ZlcnNpb24+Ci0gIDwvdmVyc2lvbnM+Ci0gIAotICA8ZGVwZW5kZW5jaWVzPgotCi0gICAgPCEtLSBTVEFSVCBmb3IgdGVzdCAtLT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1qZWxseTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtamVsbHktdGFncy1qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgIDx1cmw+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5L2xpYnMvanVuaXQvPC91cmw+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPCEtLSBFTkQgZm9yIHRlc3QgLS0+Ci0KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvR3JvdXBUYWcuamF2YSBiL2plbGx5LXRhZ3MvdGhyZWFkcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy90aHJlYWRzL0dyb3VwVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OGIyNzQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvR3JvdXBUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy50aHJlYWRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBncm91cCBvZiB0aHJlYWRzLiBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBKYXZhJ3MgdGhyZWFkIGdyb3Vwcy4KLSAqIEFsbCBvZiB0aGUgdGhyZWFkcyBpbiBhIHRocmVhZCBncm91cCBhcmUgc3RhcnRlZCBhdCB0aGUgc2FtZSB0aW1lLCBub3QgYXMgdGhleQotICogYXJlIGRlZmluZWQuIFVzZSB0aGlzIGluIGNvbmp1bmN0aW9uIHdpdGggb3RoZXIgdGFncyBsaWtlIGpvaW4gdG8gbWFuaXB1bGF0ZQotICogYSBncm91cCBvZiB0aHJlYWRzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQGpob3JtYW4ub3JnIj5KYXNvbiBIb3JtYW48L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIEdyb3VwVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0gICAgLyoqIFZhcmlhYmxlIHRvIHBsYWNlIHRoZSB0aHJlYWQgZ3JvdXAgaW50byAqLwotICAgIHByaXZhdGUgU3RyaW5nIHZhciA9IG51bGw7Ci0gICAgLyoqIFRoZSB0aHJlYWQgbGlzdCAqLwotICAgIHByaXZhdGUgTGlzdCB0aHJlYWRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLyoqIENoaWxkIHRocmVhZHMgd2lsbCBhZGQgdGhlbXNlbHZlcyBhbmQgd2lsbCB0aGVuIGFsbCBiZSBzdGFydGVkIHRvZ2V0aGVyICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotCi0gICAgICAgIC8vIHN0b3JlIHRoZSBncm91cCBpbiBhIGplbGx5IHZhcmlhYmxlCi0gICAgICAgIGlmICh2YXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIHRocmVhZHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc3RhcnQgdGhlIHRocmVhZHMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBUaHJlYWQgdGhyZWFkID0gKFRocmVhZCkgdGhyZWFkcy5nZXQoaSk7Ci0gICAgICAgICAgICB0aHJlYWQuc3RhcnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBBZGQgYSB0aHJlYWQgdG8gdGhlIHRocmVhZCBncm91cCBsaXN0ICovCi0gICAgcHVibGljIHZvaWQgYWRkVGhyZWFkKFRocmVhZCB0aHJlYWQpIHsKLSAgICAgICAgdGhyZWFkcy5hZGQodGhyZWFkKTsKLSAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSBsaXN0IG9mIHRocmVhZHMgaW4gdGhpcyB0aHJlYWQgZ3JvdXAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRUaHJlYWRzKCkgewotICAgICAgICByZXR1cm4gdGhyZWFkczsKLSAgICB9Ci0KLSAgICAvKiogU2V0IHRoZSB2YXJpYWJsZSBuYW1lIHRvIHN0b3JlIHRoZSB0aHJlYWQgZ3JvdXAgaW4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9JbnRlcnJ1cHRUYWcuamF2YSBiL2plbGx5LXRhZ3MvdGhyZWFkcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy90aHJlYWRzL0ludGVycnVwdFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2ZjZTJkLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdGhyZWFkcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy90aHJlYWRzL0ludGVycnVwdFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnRocmVhZHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSW50ZXJydXB0cyBhIHRocmVhZCBvciB0aHJlYWQgZ3JvdXAuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25Aamhvcm1hbi5vcmciPkphc29uIEhvcm1hbjwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgSW50ZXJydXB0VGFnIGV4dGVuZHMgVXNlVGhyZWFkVGFnIHsKLSAgICAvKiogSW50ZXJydXB0IG9uZSB0aHJlYWQgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1c2VUaHJlYWQoVGhyZWFkIHRocmVhZCwgWE1MT3V0cHV0IG91dHB1dCkgewotICAgICAgICB0aHJlYWQuaW50ZXJydXB0KCk7Ci0gICAgfQotCi0gICAgLyoqIEludGVycnVwdCBhbGwgb2YgdGhlIHRocmVhZHMgaW4gYSBncm91cCAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVzZVRocmVhZEdyb3VwKExpc3QgdGhyZWFkR3JvdXAsIFhNTE91dHB1dCBvdXRwdXQpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRHcm91cC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgKChUaHJlYWQpIHRocmVhZEdyb3VwLmdldChpKSkuaW50ZXJydXB0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9KZWxseVRocmVhZC5qYXZhIGIvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvSmVsbHlUaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmOTI2NC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9KZWxseVRocmVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MudGhyZWFkczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIEFkZHMgc29tZSBmdW5jdGlvbmFsaXR5IHRvIHRoZSBqZGsgdGhyZWFkIGNsYXNzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQGpob3JtYW4ub3JnIj5KYXNvbiBIb3JtYW48L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIEplbGx5VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVGhyZWFkVGFnLmNsYXNzKTsKLQotICAgIC8qKiBXaGlsZSB0aGlzIHRocmVhZCBpcyBzdGlsbCBydW5uaW5nIGl0IG93bnMgdGhpcyBtdXRleCAqLwotICAgIHByaXZhdGUgTXV0ZXggcnVubmluZ011dGV4ID0gbmV3IE11dGV4KCk7Ci0gICAgLyoqIFRoZSBSdW5uYWJsZSB0YXJnZXQgKi8KLSAgICBwcml2YXRlIFJ1bm5hYmxlIHRhcmdldCA9IG51bGw7Ci0KLSAgICAvKiogVHJhY2tzIHRoZSBzdGF0dXMgb2YgdGhpcyB0aHJlYWQgKi8KLSAgICBSdW5uYWJsZVN0YXR1cyBzdGF0dXMgPSBuZXcgUnVubmFibGVTdGF0dXMoKTsKLQotICAgIHB1YmxpYyBKZWxseVRocmVhZCgpIHsKLSAgICAgICAgLy8gYXF1aXJlIG15IHN0aWxsIHJ1bm5pbmcgbG9jayBpbW1lZGlhdGVseQotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBydW5uaW5nTXV0ZXguYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBSdW5uYWJsZSB0YXJnZXQgdGhhdCB3aWxsIGJlIHJ1bgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChSdW5uYWJsZSB0YXJnZXQpIHsKLSAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUnVuIHRoZSB0aHJlYWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnRpbmcgdGhyZWFkIFwiIiArIGdldE5hbWUoKSArICJcIiIpOwotCi0gICAgICAgIC8vIHJ1biB0aGUgcnVubmFibGUgaXRlbQotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBsb2cuZGVidWcoIlRocmVhZCBcIiIgKyBnZXROYW1lKCkgKyAiXCIgcnVubmluZyIpOwotICAgICAgICAgICAgdGFyZ2V0LnJ1bigpOwotCi0gICAgICAgICAgICAvLyBhcyBsb25nIGFzIHRoZXJlIHdlcmUgbm8gcnVudGltZSBleGNlcHRpb25zIHNldCBTVUNDRVNTCi0gICAgICAgICAgICBzdGF0dXMuc2V0KFJ1bm5hYmxlU3RhdHVzLlNVQ0NFU1MpOwotCi0gICAgICAgIH0gY2F0Y2goUmVxdWlyZW1lbnRFeGNlcHRpb24gZSkgewotCi0gICAgICAgICAgICBzdGF0dXMuc2V0KFJ1bm5hYmxlU3RhdHVzLkFWT0lERUQpOwotICAgICAgICAgICAgbG9nLndhcm4oIlRocmVhZCBcIiIgKyBnZXROYW1lKCkgKyAiXCIgYXZvaWRlZCwgIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQotICAgICAgICB9IGNhdGNoKFRpbWVvdXRFeGNlcHRpb24gZSkgewotCi0gICAgICAgICAgICBzdGF0dXMuc2V0KFJ1bm5hYmxlU3RhdHVzLkFWT0lERUQpOwotICAgICAgICAgICAgbG9nLndhcm4oIlRocmVhZCBcIiIgKyBnZXROYW1lKCkgKyAiXCIgYXZvaWRlZCwgIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0gICAgICAgICAgICAvLyBydW50aW1lIGV4Y2VwdGlvbnMgd2lsbCBjYXVzZSBhIHN0YXR1cyBvZiBGQUlMVVJFCi0gICAgICAgICAgICBzdGF0dXMuc2V0KFJ1bm5hYmxlU3RhdHVzLkZBSUxVUkUsIGUpOwotICAgICAgICAgICAgbG9nLmVycm9yKCJUaHJlYWQgXCIiICsgZ2V0TmFtZSgpICsgIlwiIGZhaWx1cmUsICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoZSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlbGVhc2UgdGhlIGknbSBzdGlsbCBydW5uaW5nIG11dGV4Ci0gICAgICAgIHJ1bm5pbmdNdXRleC5yZWxlYXNlKCk7Ci0KLSAgICAgICAgbG9nLmRlYnVnKCJUaHJlYWQgXCIiICsgZ2V0TmFtZSgpICsgIlwiIGZpbmlzaGVkIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbCB0aGlzIG1ldGhvZCBmcm9tIGEgZGlmZmVyZW50IHRocmVhZCB0byB3YWl0IHVudGlsIHRoaXMgdGhyZWFkIGlzIGRvbmUuIFRoaXMKLSAgICAgKiBpcyB1c2VkIGJ5IHRoZSB7QGxpbmsgV2FpdEZvclRhZ30gY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2FpdFVudGlsRG9uZShsb25nIGhvd0xvbmcpIHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgPT0gdGhpcykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQgdGhhbiBpdHNlbGYiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdhaXQgdW50aWwgdGhlIGNhbGxpbmcgdGhyZWFkIGNhbiBhcXVpcmUgdGhlIGxvY2sKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGhvd0xvbmcgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgcnVubmluZ011dGV4LmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcnVubmluZ011dGV4LmF0dGVtcHQoaG93TG9uZykpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oIm1heCB3YWl0IHRpbWUgZXhjZWVkZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZWxlYXNlIHRoZSBsb2NrLCBqdXN0IG5lZWRlZCBpdCB0byBnZXQgc3RhcnRlZAotICAgICAgICBydW5uaW5nTXV0ZXgucmVsZWFzZSgpOwotICAgIH0KLQotICAgIC8qKiBHZXQgdGhlIHN0YXR1cyBvZiB0aGlzIHRocmVhZCAqLwotICAgIHB1YmxpYyBSdW5uYWJsZVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvSm9pblRhZy5qYXZhIGIvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvSm9pblRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjkxYzYwLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdGhyZWFkcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy90aHJlYWRzL0pvaW5UYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MudGhyZWFkczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBIHRocmVhZCBqb2luIHdhaXRzIHVudGlsIGEgdGhyZWFkIG9yIHRocmVhZEdyb3VwIGlzIGNvbXBsZXRlLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQGpob3JtYW4ub3JnIj5KYXNvbiBIb3JtYW48L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIEpvaW5UYWcgZXh0ZW5kcyBVc2VUaHJlYWRUYWcgewotICAgIC8qKiBob3cgbG9uZyB0byB3YWl0ICovCi0gICAgcHJpdmF0ZSBsb25nIHRpbWVvdXQgPSAtMTsKLQotICAgIC8qKiBQZXJmb3JtIHRoZSB0aHJlYWQgam9pbiAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVzZVRocmVhZChUaHJlYWQgdGhyZWFkLCBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBqb2luVGhyZWFkKHRocmVhZCk7Ci0gICAgfQotCi0gICAgLyoqIEpvaW4gYWxsIG9mIHRoZSB0aHJlYWRzIGluIGEgdGhyZWFkIGdyb3VwICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXNlVGhyZWFkR3JvdXAoTGlzdCB0aHJlYWRHcm91cCwgWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRHcm91cC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgam9pblRocmVhZCgoVGhyZWFkKSB0aHJlYWRHcm91cC5nZXQoaSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEpvaW4gYSB0aHJlYWQgKi8KLSAgICBwcml2YXRlIHZvaWQgam9pblRocmVhZChUaHJlYWQgdGhyZWFkKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBpZiAodGltZW91dCA+IDApIHsKLSAgICAgICAgICAgIHRocmVhZC5qb2luKHRpbWVvdXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyZWFkLmpvaW4oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhvdyBsb25nIHNob3VsZCB0aGUgam9pbiB3YWl0LiBJZiA8PSAwIHRoZSBqb2luIHdhaXRzIHVudGlsIHRoZQotICAgICAqIHRocmVhZCBpcyBkZWFkLgotICAgICAqIEBwYXJhbSB0aW1lb3V0IGluIG1pbGxpcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQobG9uZyB0aW1lb3V0KSB7Ci0gICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvTXV0ZXguamF2YSBiL2plbGx5LXRhZ3MvdGhyZWFkcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy90aHJlYWRzL011dGV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmM2JjMDIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvTXV0ZXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoKLSAgRmlsZTogTXV0ZXguamF2YQotCi0gIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBEb3VnIExlYSBhbmQgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KLSAgVGhpcyBtYXkgYmUgdXNlZCBmb3IgYW55IHB1cnBvc2VzIHdoYXRzb2V2ZXIgd2l0aG91dCBhY2tub3dsZWRnbWVudC4KLSAgVGhhbmtzIGZvciB0aGUgYXNzaXN0YW5jZSBhbmQgc3VwcG9ydCBvZiBTdW4gTWljcm9zeXN0ZW1zIExhYnMsCi0gIGFuZCBldmVyeW9uZSBjb250cmlidXRpbmcsIHRlc3RpbmcsIGFuZCB1c2luZyB0aGlzIGNvZGUuCi0KLSAgSGlzdG9yeToKLSAgRGF0ZSAgICAgICBXaG8gICAgICAgICAgICAgICAgV2hhdAotICAxMUp1bjE5OTggIGRsICAgICAgICAgICAgICAgQ3JlYXRlIHB1YmxpYyB2ZXJzaW9uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnRocmVhZHM7Ci0KLS8qKgotICogQSBzaW1wbGUgbm9uLXJlZW50cmFudCBtdXR1YWwgZXhjbHVzaW9uIGxvY2suCi0gKiBUaGUgbG9jayBpcyBmcmVlIHVwb24gY29uc3RydWN0aW9uLiBFYWNoIGFjcXVpcmUgZ2V0cyB0aGUKLSAqIGxvY2ssIGFuZCBlYWNoIHJlbGVhc2UgZnJlZXMgaXQuIFJlbGVhc2luZyBhIGxvY2sgdGhhdAotICogaXMgYWxyZWFkeSBmcmVlIGhhcyBubyBlZmZlY3QuCi0gKiA8cD4KLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gbWFrZXMgbm8gYXR0ZW1wdCB0byBwcm92aWRlIGFueSBmYWlybmVzcwotICogb3Igb3JkZXJpbmcgZ3VhcmFudGVlcy4gSWYgeW91IG5lZWQgdGhlbSwgY29uc2lkZXIgdXNpbmcgb25lIG9mCi0gKiB0aGUgU2VtYXBob3JlIGltcGxlbWVudGF0aW9ucyBhcyBhIGxvY2tpbmcgbWVjaGFuaXNtLgotICogPHA+Ci0gKiA8Yj5TYW1wbGUgdXNhZ2U8L2I+PGJyPgotICogPHA+Ci0gKiBNdXRleCBjYW4gYmUgdXNlZnVsIGluIGNvbnN0cnVjdGlvbnMgdGhhdCBjYW5ub3QgYmUKLSAqIGV4cHJlc3NlZCB1c2luZyBqYXZhIHN5bmNocm9uaXplZCBibG9ja3MgYmVjYXVzZSB0aGUKLSAqIGFjcXVpcmUvcmVsZWFzZSBwYWlycyBkbyBub3Qgb2NjdXIgaW4gdGhlIHNhbWUgbWV0aG9kIG9yCi0gKiBjb2RlIGJsb2NrLiBGb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UgdGhlbSBmb3IgaGFuZC1vdmVyLWhhbmQKLSAqIGxvY2tpbmcgYWNyb3NzIHRoZSBub2RlcyBvZiBhIGxpbmtlZCBsaXN0LiBUaGlzIGFsbG93cwotICogZXh0cmVtZWx5IGZpbmUtZ3JhaW5lZCBsb2NraW5nLCAgYW5kIHNvIGluY3JlYXNlcwotICogcG90ZW50aWFsIGNvbmN1cnJlbmN5LCBhdCB0aGUgY29zdCBvZiBhZGRpdGlvbmFsIGNvbXBsZXhpdHkgYW5kCi0gKiBvdmVyaGVhZCB0aGF0IHdvdWxkIG5vcm1hbGx5IG1ha2UgdGhpcyB3b3J0aHdoaWxlIG9ubHkgaW4gY2FzZXMgb2YKLSAqIGV4dHJlbWUgY29udGVudGlvbi4KLSAqIDxwcmU+Ci0gKiBjbGFzcyBOb2RlIHsKLSAqICAgT2JqZWN0IGl0ZW07Ci0gKiAgIE5vZGUgbmV4dDsKLSAqICAgTXV0ZXggbG9jayA9IG5ldyBNdXRleCgpOyAvLyBlYWNoIG5vZGUga2VlcHMgaXRzIG93biBsb2NrCi0gKgotICogICBOb2RlKE9iamVjdCB4LCBOb2RlIG4pIHsgaXRlbSA9IHg7IG5leHQgPSBuOyB9Ci0gKiB9Ci0gKgotICogY2xhc3MgTGlzdCB7Ci0gKiAgICBwcm90ZWN0ZWQgTm9kZSBoZWFkOyAvLyBwb2ludGVyIHRvIGZpcnN0IG5vZGUgb2YgbGlzdAotICoKLSAqICAgIC8vIFVzZSBwbGFpbiBqYXZhIHN5bmNocm9uaXphdGlvbiB0byBwcm90ZWN0IGhlYWQgZmllbGQuCi0gKiAgICAvLyAgKFdlIGNvdWxkIGluc3RlYWQgdXNlIGEgTXV0ZXggaGVyZSB0b28gYnV0IHRoZXJlIGlzIG5vCi0gKiAgICAvLyAgcmVhc29uIHRvIGRvIHNvLikKLSAqICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgTm9kZSBnZXRIZWFkKCkgeyByZXR1cm4gaGVhZDsgfQotICoKLSAqICAgIGJvb2xlYW4gc2VhcmNoKE9iamVjdCB4KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICogICAgICBOb2RlIHAgPSBnZXRIZWFkKCk7Ci0gKiAgICAgIGlmIChwID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAqCi0gKiAgICAgIC8vICAoVGhpcyBjb3VsZCBiZSBtYWRlIG1vcmUgY29tcGFjdCwgYnV0IGZvciBjbGFyaXR5IG9mIGlsbHVzdHJhdGlvbiwKLSAqICAgICAgLy8gIGFsbCBvZiB0aGUgY2FzZXMgdGhhdCBjYW4gYXJpc2UgYXJlIGhhbmRsZWQgc2VwYXJhdGVseS4pCi0gKgotICogICAgICBwLmxvY2suYWNxdWlyZSgpOyAgICAgICAgICAgICAgLy8gUHJpbWUgbG9vcCBieSBhY3F1aXJpbmcgZmlyc3QgbG9jay4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIChJZiB0aGUgYWNxdWlyZSBmYWlscyBkdWUgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGludGVycnVwdCwgdGhlIG1ldGhvZCB3aWxsIHRocm93Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBub3csCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzbyB0aGVyZSBpcyBubyBuZWVkIGZvciBhbnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGZ1cnRoZXIgY2xlYW51cC4pCi0gKiAgICAgIGZvciAoOzspIHsKLSAqICAgICAgICBpZiAoeC5lcXVhbHMocC5pdGVtKSkgewotICogICAgICAgICAgcC5sb2NrLnJlbGVhc2UoKTsgICAgICAgICAgLy8gcmVsZWFzZSBjdXJyZW50IGJlZm9yZSByZXR1cm4KLSAqICAgICAgICAgIHJldHVybiB0cnVlOwotICogICAgICAgIH0KLSAqICAgICAgICBlbHNlIHsKLSAqICAgICAgICAgIE5vZGUgbmV4dHAgPSBwLm5leHQ7Ci0gKiAgICAgICAgICBpZiAobmV4dHAgPT0gbnVsbCkgewotICogICAgICAgICAgICBwLmxvY2sucmVsZWFzZSgpOyAgICAgICAvLyByZWxlYXNlIGZpbmFsIGxvY2sgdGhhdCB3YXMgaGVsZAotICogICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gKiAgICAgICAgICB9Ci0gKiAgICAgICAgICBlbHNlIHsKLSAqICAgICAgICAgICAgdHJ5IHsKLSAqICAgICAgICAgICAgICBuZXh0cC5sb2NrLmFjcXVpcmUoKTsgLy8gZ2V0IG5leHQgbG9jayBiZWZvcmUgcmVsZWFzaW5nIGN1cnJlbnQKLSAqICAgICAgICAgICAgfQotICogICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLSAqICAgICAgICAgICAgICBwLmxvY2sucmVsZWFzZSgpOyAgICAvLyBhbHNvIHJlbGVhc2UgY3VycmVudCBpZiBhY3F1aXJlIGZhaWxzCi0gKiAgICAgICAgICAgICAgdGhyb3cgZXg7Ci0gKiAgICAgICAgICAgIH0KLSAqICAgICAgICAgICAgcC5sb2NrLnJlbGVhc2UoKTsgICAgICAvLyByZWxlYXNlIG9sZCBsb2NrIG5vdyB0aGF0IG5ldyBvbmUgaGVsZAotICogICAgICAgICAgICBwID0gbmV4dHA7Ci0gKiAgICAgICAgICB9Ci0gKiAgICAgICAgfQotICogICAgICB9Ci0gKiAgICB9Ci0gKgotICogICAgc3luY2hyb25pemVkIHZvaWQgYWRkKE9iamVjdCB4KSB7IC8vIHNpbXBsZSBwcmVwZW5kCi0gKiAgICAgIC8vIFRoZSB1c2Ugb2YgYHN5bmNocm9uaXplZCcgIGhlcmUgcHJvdGVjdHMgb25seSBoZWFkIGZpZWxkLgotICogICAgICAvLyBUaGUgbWV0aG9kIGRvZXMgbm90IG5lZWQgdG8gd2FpdCBvdXQgb3RoZXIgdHJhdmVyc2VycwotICogICAgICAvLyB3aG8gaGF2ZSBhbHJlYWR5IG1hZGUgaXQgcGFzdCBoZWFkLgotICoKLSAqICAgICAgaGVhZCA9IG5ldyBOb2RlKHgsIGhlYWQpOwotICogICAgfQotICoKLSAqICAgIC8vIC4uLiAgb3RoZXIgc2ltaWxhciB0cmF2ZXJzYWwgYW5kIHVwZGF0ZSBtZXRob2RzIC4uLgotICogfQotICogPC9wcmU+Ci0gKiA8cD5bPGEgaHJlZj0iaHR0cDovL2dlZS5jcy5vc3dlZ28uZWR1L2RsL2NsYXNzZXMvRURVL29zd2Vnby9jcy9kbC91dGlsL2NvbmN1cnJlbnQvaW50cm8uaHRtbCI+IEludHJvZHVjdGlvbiB0byB0aGlzIHBhY2thZ2UuIDwvYT5dCi0gKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFRoaXMgTXV0ZXggaXMgdXNlZCB0byBhZGQgdGhlIHN0aWxsIHJ1bm5pbmcgbG9jayB0byB0aGUgSmVsbHlUaHJlYWQgdGFnLgotICoqLwotCi1wdWJsaWMgY2xhc3MgTXV0ZXggewotCi0gICAgLyoqIFRoZSBsb2NrIHN0YXR1cyAqKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbnVzZV8gPSBmYWxzZTsKLQotICAgIHB1YmxpYyB2b2lkIGFjcXVpcmUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBpZiAoVGhyZWFkLmludGVycnVwdGVkKCkpIHRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGludXNlXykgd2FpdCgpOwotICAgICAgICAgICAgICAgIGludXNlXyA9IHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIG5vdGlmeSgpOwotICAgICAgICAgICAgICAgIHRocm93IGV4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2UoKSB7Ci0gICAgICAgIGludXNlXyA9IGZhbHNlOwotICAgICAgICBub3RpZnkoKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBib29sZWFuIGF0dGVtcHQobG9uZyBtc2VjcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKFRocmVhZC5pbnRlcnJ1cHRlZCgpKSB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBpZiAoIWludXNlXykgewotICAgICAgICAgICAgICAgIGludXNlXyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1zZWNzIDw9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9uZyB3YWl0VGltZSA9IG1zZWNzOwotICAgICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKDsgOykgewotICAgICAgICAgICAgICAgICAgICAgICAgd2FpdCh3YWl0VGltZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWludXNlXykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludXNlXyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRUaW1lID0gbXNlY3MgLSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhaXRUaW1lIDw9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeSgpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvdGhyZWFkcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy90aHJlYWRzL011dGV4VGFnLmphdmEgYi9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9NdXRleFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmRlYjEyLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdGhyZWFkcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy90aHJlYWRzL011dGV4VGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MudGhyZWFkczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKioKLSAqIENyZWF0ZXMgYSBtdXRleCBvYmplY3QgYW5kIHN0b3JlcyBpdCBpbiBhIHZhcmlhYmxlCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25Aamhvcm1hbi5vcmciPkphc29uIEhvcm1hbjwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgTXV0ZXhUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLSAgICAvKiogVGhlIHZhcmlhYmxlIG5hbWUgb2YgdGhlIG11dGV4ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyID0gbnVsbDsKLQotICAgIC8qKiBDcmVhdGUgYW5kIHNldCB0aGUgbXV0ZXggKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAodmFyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigibXV0ZXhlcyByZXF1aXJlIGEgdmFyIGF0dHJpYnV0ZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhcmlhYmxlIG5hbWUgdG8gZXhwb3J0Ci0gICAgICogQHBhcmFtIHZhciBUaGUgdmFyaWFibGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0gICAgICAgIHRoaXMudmFyID0gdmFyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvdGhyZWFkcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy90aHJlYWRzL05vdGlmeVRhZy5qYXZhIGIvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvTm90aWZ5VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMDVkZTMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvTm90aWZ5VGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MudGhyZWFkczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLS8qKgotICogVGhpcyBjYWxscyBtdXRleC5ub3RpZnkoKSBvciBtdXRleC5ub3RpZnlBbGwoKSBvbiB0aGUgbXV0ZXggcGFzc2VkCi0gKiBpbiB2aWEgdGhlICJtdXRleCIgYXR0cmlidXRlLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQGpob3JtYW4ub3JnIj5KYXNvbiBIb3JtYW48L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIE5vdGlmeVRhZyBleHRlbmRzIFVzZU11dGV4VGFnIHsKLSAgICAvKiogVHJ1ZSBtZWFucyBtdXRleC5ub3RpZnlBbGwoKSB3aWxsIGJlIGNhbGxlZCAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBub3RpZnlBbGwgPSBmYWxzZTsKLQotICAgIC8qKiBQZXJmb3JtIHRoZSBub3RpZnkgKi8KLSAgICBwdWJsaWMgdm9pZCB1c2VNdXRleChPYmplY3QgbXV0ZXgsIFhNTE91dHB1dCBvdXRwdXQpIHsKLSAgICAgICAgaWYgKG5vdGlmeUFsbCkgewotICAgICAgICAgICAgbXV0ZXgubm90aWZ5QWxsKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtdXRleC5ub3RpZnkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHNldCB0byB0cnVlIHRoZSBub3RpZnkgd2lsbCBub3RpZnkgYWxsIHdhaXRpbmcgdGhyZWFkcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5vdGlmeUFsbChib29sZWFuIG5vdGlmeUFsbCkgewotICAgICAgICB0aGlzLm5vdGlmeUFsbCA9IG5vdGlmeUFsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9SZXF1aXJlbWVudEV4Y2VwdGlvbi5qYXZhIGIvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvUmVxdWlyZW1lbnRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5YzhiZi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9SZXF1aXJlbWVudEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnRocmVhZHM7Ci0KLS8qKgotICogVGhyb3duIGJ5IHRoZSB7QGxpbmsgV2FpdEZvclRhZ30gd2hlbiBhIHJlcXVpcmVtZW50IGlzIG5vdCBtZXQuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25Aamhvcm1hbi5vcmciPkphc29uIEhvcm1hbjwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgUmVxdWlyZW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgUmVxdWlyZW1lbnRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvUnVubmFibGVTdGF0dXMuamF2YSBiL2plbGx5LXRhZ3MvdGhyZWFkcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy90aHJlYWRzL1J1bm5hYmxlU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2M2VlYTAuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvUnVubmFibGVTdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MudGhyZWFkczsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRoZSBzdGF0dXMgb2Yge0BsaW5rIEplbGx5VGhyZWFkfS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBqaG9ybWFuLm9yZyI+SmFzb24gSG9ybWFuPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBSdW5uYWJsZVN0YXR1cyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORSA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VDQ0VTUyA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFJTFVSRSA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVZPSURFRCA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElNRURfT1VUID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSUxMRUQgPSA1OwotCi0gICAgcHJpdmF0ZSBpbnQgc3RhdHVzID0gTk9ORTsKLQotICAgIC8qKiBPbiBhIHN0YXR1cyBjaGFuZ2UgdG8gRkFJTFVSRSBhbiBleGNlcHRpb24gY2FuIGJlIHNldCAqLwotICAgIHByaXZhdGUgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7Ci0KLSAgICBwdWJsaWMgUnVubmFibGVTdGF0dXMoKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUnVubmFibGVTdGF0dXMoaW50IHN0YXR1cykgewotICAgICAgICBzZXQoc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0KGludCBzdGF0dXMpIHsKLSAgICAgICAgc2V0KHN0YXR1cywgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldChpbnQgc3RhdHVzLCBFeGNlcHRpb24gZSkgewotICAgICAgICAvLyB0aGlzIGNoZWNrIGlzIGltcG9ydGFudCBzaW5jZSBJIG1heSBjYWxsIHNldFN0YXR1cyhCTEFIKSBhZ2FpbgotICAgICAgICAvLyB0byB0cmlnZ2VyIHRoZSBjYWxsYmFjawotICAgICAgICBpZiAodGhpcy5zdGF0dXMgIT0gc3RhdHVzKSB7Ci0gICAgICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKLQotICAgICAgICAgICAgLy8gc3RvcmUgdGhlIGV4Y2VwdGlvbiBpZiBvbmUgd2FzIHNldAotICAgICAgICAgICAgaWYgKGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aGlzLmV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXQoKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzU3VjY2VzcygpIHsKLSAgICAgICAgcmV0dXJuIChzdGF0dXMgPT0gU1VDQ0VTUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzRmFpbHVyZSgpIHsKLSAgICAgICAgcmV0dXJuIChzdGF0dXMgPT0gRkFJTFVSRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzQXZvaWRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChzdGF0dXMgPT0gQVZPSURFRCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzVGltZWRPdXQoKSB7Ci0gICAgICAgIHJldHVybiAoc3RhdHVzID09IFRJTUVEX09VVCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzS2lsbGVkKCkgewotICAgICAgICByZXR1cm4gKHN0YXR1cyA9PSBLSUxMRUQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZXF1YWxzKFJ1bm5hYmxlU3RhdHVzIHN0YXR1cykgewotICAgICAgICByZXR1cm4gc3RhdHVzLmdldCgpID09IHRoaXMuc3RhdHVzOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBlcXVhbHMoaW50IHN0YXR1cykgewotICAgICAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT0gc3RhdHVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gZ2V0IHRoZSBzdGF0dXMgY29kZSBmcm9tIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiBNYWlubHkgdXNlZCBmb3IKLSAgICAgKiB4bWwgcGFyc2luZy4KLSAgICAgKiBAcGFyYW0gc3RhdHVzIFRoZSBzdGF0dXMgc3RyaW5nIHJlcC4KLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0dXMgZW51bSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFN0YXR1c0NvZGUoU3RyaW5nIHN0YXR1cykgewotICAgICAgICBpZiAoc3RhdHVzLmVxdWFsc0lnbm9yZUNhc2UoIlNVQ0NFU1MiKSkgewotICAgICAgICAgICAgcmV0dXJuIFNVQ0NFU1M7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzLmVxdWFsc0lnbm9yZUNhc2UoIkZBSUxVUkUiKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzLmVxdWFsc0lnbm9yZUNhc2UoIlRJTUVEX09VVCIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVElNRURfT1VUOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cy5lcXVhbHNJZ25vcmVDYXNlKCJBVk9JREVEIikpIHsKLSAgICAgICAgICAgIHJldHVybiBBVk9JREVEOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cy5lcXVhbHNJZ25vcmVDYXNlKCJLSUxMRUQiKSkgewotICAgICAgICAgICAgcmV0dXJuIEtJTExFRDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oc3RhdHVzICsgIiBpcyBpbnZhbGlkIHN0YXR1cyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHJldmVyc2Ugb2YgZ2V0U3RhdHVzQ29kZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0YXR1c1N0cmluZyhpbnQgc3RhdHVzKSB7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gU1VDQ0VTUykgewotICAgICAgICAgICAgcmV0dXJuICJTVUNDRVNTIjsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gRkFJTFVSRSkgewotICAgICAgICAgICAgcmV0dXJuICJGQUlMVVJFIjsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gVElNRURfT1VUKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlRJTUVEX09VVCI7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IEFWT0lERUQpIHsKLSAgICAgICAgICAgIHJldHVybiAiQVZPSURFRCI7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IEtJTExFRCkgewotICAgICAgICAgICAgcmV0dXJuICJLSUxMRUQiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihzdGF0dXMgKyAiIGlzIGludmFsaWQgc3RhdHVzIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFN0YXR1cyhpbnQgc3RhdHVzKSB7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gU1VDQ0VTUykgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IEZBSUxVUkUpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBUSU1FRF9PVVQpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBBVk9JREVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gS0lMTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTdGF0dXNTdHJpbmcoc3RhdHVzKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvU2xlZXBUYWcuamF2YSBiL2plbGx5LXRhZ3MvdGhyZWFkcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy90aHJlYWRzL1NsZWVwVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4Nzc1YzcuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvU2xlZXBUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MudGhyZWFkczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKioKLSAqIFB1dHMgdGhlIGN1cnJlbnQgdGhyZWFkIHRvIHNsZWVwIGZvciBzb21lIGFtb3VudCBvZiB0aW1lLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQGpob3JtYW4ub3JnIj5KYXNvbiBIb3JtYW48L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIFNsZWVwVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0gICAgLyoqIEhvdyBsb25nIHRvIHNsZWVwIGZvciAqLwotICAgIHByaXZhdGUgbG9uZyBob3dMb25nID0gMDsKLQotICAgIC8qKiBQdXQgdGhlIHRocmVhZCB0byBzbGVlcCAqLwotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoaG93TG9uZyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhvdyBsb25nIHRvIHB1dCB0aGUgdGhyZWFkIHRvIHNsZWVwIGZvcgotICAgICAqIEBwYXJhbSBob3dMb25nIGluIG1pbGxpcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvcihsb25nIGhvd0xvbmcpIHsKLSAgICAgICAgdGhpcy5ob3dMb25nID0gaG93TG9uZzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9TeW5jaHJvbml6ZVRhZy5qYXZhIGIvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvU3luY2hyb25pemVUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY2ZmQ5Ni4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9TeW5jaHJvbml6ZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnRocmVhZHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqCi0gKiBTeW5jaHJvbml6ZSBhIGJsb2NrIGluc2lkZSBvZiBhIHRocmVhZCB1c2luZyB0aGUgcGFzc2VkIGluIG11dGV4LiBUaGUKLSAqIG11dGV4IG9iamVjdCBwYXNzZWQgaW4gZG9lcyBub3QgaGF2ZSB0byBoYXZlIGJlZW4gY3JlYXRlZCB1c2luZyB0aGUKLSAqIG11dGV4IHRhZywgaXQgY2FuIGJlIGFueSBvYmplY3QgYXQgYWxsLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQGpob3JtYW4ub3JnIj5KYXNvbiBIb3JtYW48L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIFN5bmNocm9uaXplVGFnIGV4dGVuZHMgVXNlTXV0ZXhUYWcgewotICAgIC8qKiBTeW5jaHJvbml6ZSBvbiB0aGUgbXV0ZXggKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1c2VNdXRleChPYmplY3QgbXV0ZXgsIFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobXV0ZXgpIHsKLSAgICAgICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvVGhyZWFkVGFnLmphdmEgYi9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9UaHJlYWRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEwMTE4Yy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9UaHJlYWRUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnRocmVhZHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS51dGlsLk5lc3RlZFJ1bnRpbWVFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIHRhZyB0aGF0IHNwYXducyB0aGUgY29udGFpbmVkIHNjcmlwdCBpbiBhIHNlcGFyYXRlIHRocmVhZC4gIEEgdGhyZWFkCi0gKiBjYW4gd2FpdCBvbiBhbm90aGVyIHRocmVhZCBvciBhbm90aGVyIHRocmVhZCBncm91cCB0byBmaW5pc2ggYmVmb3JlIHN0YXJ0aW5nLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnZpbmF5Y0BhcGFjaGUub3JnIj5WaW5heSBDaGFuZHJhbjwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQGpob3JtYW4ub3JnIj5KYXNvbiBIb3JtYW48L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBUaHJlYWRUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVGhyZWFkVGFnLmNsYXNzKTsKLQotICAgIC8qKiBUaGUgY3VycmVudCB0aHJlYWQgbnVtYmVyLiBVc2VkIGZvciBkZWZhdWx0IHRocmVhZCBuYW1pbmcgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgdGhyZWFkTnVtYmVyID0gMDsKLQotICAgIC8qKiBWYXJpYWJsZSB0byBwbGFjZSB0aGUgdGhyZWFkIGludG8gKi8KLSAgICBwcml2YXRlIFN0cmluZyB2YXIgPSBudWxsOwotICAgIC8qKiBUaHJlYWQgTmFtZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgIC8qKiBUaHJlYWQgcHJpb3JpdHksIGRlZmF1bHRzIHRvIFRocmVhZC5OT1JNX1BSSU9SSVRZICovCi0gICAgcHJpdmF0ZSBpbnQgcHJpb3JpdHkgPSBUaHJlYWQuTk9STV9QUklPUklUWTsKLSAgICAvKiogU2V0IGlmIHRoZSB0aHJlYWQgc2hvdWxkIGJlIGEgZGFlbW9uIG9yIG5vdCAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBkYWVtb24gPSBmYWxzZTsKLSAgICAvKiogdGhlIGRlc3RpbmF0aW9uIG9mIG91dHB1dCAqLwotICAgIHByaXZhdGUgWE1MT3V0cHV0IHhtbE91dHB1dDsKLSAgICAvKiogU2hvdWxkIHdlIGNsb3NlIHRoZSB1bmRlcmx5aW5nIG91dHB1dCAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZU91dHB1dDsKLSAgICAvKiogU2hvdWxkIGEgbmV3IGNvbnRleHQgYmUgY3JlYXRlZCAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBuZXdDb250ZXh0ID0gZmFsc2U7Ci0gICAgLyoqIEtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIHRocmVhZCAqLwotICAgIHByaXZhdGUgSmVsbHlUaHJlYWQgdGhyZWFkID0gbmV3IEplbGx5VGhyZWFkKCk7Ci0KLSAgICBwdWJsaWMgVGhyZWFkVGFnKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBUaHJlYWRUYWcoYm9vbGVhbiBzaG91bGRUcmltKSB7Ci0gICAgICAgIHN1cGVyKHNob3VsZFRyaW0pOwotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhmaW5hbCBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAoeG1sT3V0cHV0ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGxldHMgZGVmYXVsdCB0byBzeXN0ZW0ub3V0Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHhtbE91dHB1dCA9IFhNTE91dHB1dC5jcmVhdGVYTUxPdXRwdXQoU3lzdGVtLm91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbGV0cyBjcmVhdGUgYSBjaGlsZCBjb250ZXh0Ci0gICAgICAgIGZpbmFsIEplbGx5Q29udGV4dCB1c2VUaGlzQ29udGV4dCA9IG5ld0NvbnRleHQgPyBjb250ZXh0Lm5ld0plbGx5Q29udGV4dCgpIDogY29udGV4dDsKLQotICAgICAgICAvLyBzZXQgdGhlIHRhcmdldCB0byBydW4KLSAgICAgICAgdGhyZWFkLnNldFRhcmdldChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0Qm9keSgpLnJ1bih1c2VUaGlzQ29udGV4dCwgeG1sT3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsb3NlT3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dC5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChKZWxseVRhZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGplbGx5IHdyYXBzIHRoZSBleGNlcHRpb25zIHRocm93bgotICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUgc3ViRXhjZXB0aW9uID0gZS5nZXRDYXVzZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRXhjZXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJFeGNlcHRpb24gaW5zdGFuY2VvZiBUaW1lb3V0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFRpbWVvdXRFeGNlcHRpb24pc3ViRXhjZXB0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJFeGNlcHRpb24gaW5zdGFuY2VvZiBSZXF1aXJlbWVudEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChSZXF1aXJlbWVudEV4Y2VwdGlvbilzdWJFeGNlcHRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gd3JhcCB0aGUgZXhjZXB0aW9uIHdpdGggYSBSdW50aW1lRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOZXN0ZWRSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHdyYXAgdGhlIGV4Y2VwdGlvbiB3aXRoIGEgUnVudGltZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSBlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5lc3RlZFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIHNldCB0aGUgdGhyZWFkcyBwcmlvcml0eQotICAgICAgICB0aHJlYWQuc2V0UHJpb3JpdHkocHJpb3JpdHkpOwotCi0gICAgICAgIC8vIHNldCB0aGUgdGhyZWFkcyBuYW1lCi0gICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocmVhZC5zZXROYW1lKG5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyZWFkLnNldE5hbWUoIkplbGx5IFRocmVhZCAjIiArICh0aHJlYWROdW1iZXIrKykpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IHdoZXRoZXIgdGhpcyB0aHJlYWQgaXMgYSBkYWVtb24gdGhyZWFkCi0gICAgICAgIHRocmVhZC5zZXREYWVtb24oZGFlbW9uKTsKLQotICAgICAgICAvLyBzYXZlIHRoZSB0aHJlYWQgaW4gYSBjb250ZXh0IHZhcmlhYmxlCi0gICAgICAgIGlmICh2YXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIHRocmVhZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBpZiB0aGlzIHRhZyBpcyBuZXN0ZWQgaW5zaWRlIGEgZ3JvdXAgdGFnLiBpZiBzbwotICAgICAgICAvLyBhZGQgdGhpcyB0aHJlYWQgdG8gdGhlIHRocmVhZCBncm91cCBidXQgZG8gbm90IHN0YXJ0IGl0LgotICAgICAgICAvLyBhbGwgdGhyZWFkcyBpbiBhIHRocmVhZCBncm91cCBzaG91bGQgc3RhcnQgdG9nZXRoZXIuCi0gICAgICAgIEdyb3VwVGFnIGd0ID0gKEdyb3VwVGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoR3JvdXBUYWcuY2xhc3MpOwotICAgICAgICBpZiAoZ3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZ3QuYWRkVGhyZWFkKHRocmVhZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBzdGFydCB0aGUgdGhyZWFkCi0gICAgICAgICAgICB0aHJlYWQuc3RhcnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhcmlhYmxlIG5hbWUgdG8gZXhwb3J0LCBvcHRpb25hbAotICAgICAqIEBwYXJhbSB2YXIgVGhlIHZhcmlhYmxlIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgbmFtZSA9IHZhcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHRocmVhZC4KLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB0aHJlYWRzIHByaW9yaXR5LiBEZWZhdWx0cyB0byBUaHJlYWQuTk9STV9QUklPUklUWQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByaW9yaXR5KGludCBwcmlvcml0eSkgewotICAgICAgICB0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGhyZWFkIHRvIGJlIGEgZGFlbW9uIHRocmVhZCBpZiB0cnVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGFlbW9uKGJvb2xlYW4gZGFlbW9uKSB7Ci0gICAgICAgIHRoaXMuZGFlbW9uID0gZGFlbW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlc3RpbmF0aW9uIG9mIG91dHB1dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhtbE91dHB1dChYTUxPdXRwdXQgeG1sT3V0cHV0KSB7Ci0gICAgICAgIHRoaXMuY2xvc2VPdXRwdXQgPSBmYWxzZTsKLSAgICAgICAgdGhpcy54bWxPdXRwdXQgPSB4bWxPdXRwdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBmaWxlIHdoaWNoIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBvdXRwdXQKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgb3V0cHV0IGZpbGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbGUoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuY2xvc2VPdXRwdXQgPSB0cnVlOwotICAgICAgICBzZXRYbWxPdXRwdXQoWE1MT3V0cHV0LmNyZWF0ZVhNTE91dHB1dChuZXcgRmlsZU91dHB1dFN0cmVhbShuYW1lKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3VsZCBhIG5ldyBjb250ZXh0IGJlIGNyZWF0ZWQgZm9yIHRoaXMgdGhyZWFkPwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5ld0NvbnRleHQoYm9vbGVhbiBuZXdDb250ZXh0KSB7Ci0gICAgICAgIHRoaXMubmV3Q29udGV4dCA9IG5ld0NvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB0aHJlYWQgaW5zdGFuY2UKLSAgICAgKiBAcmV0dXJuIFRoZSB0aHJlYWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVGhyZWFkIGdldFRocmVhZCgpIHsKLSAgICAgICAgcmV0dXJuIHRocmVhZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9UaHJlYWRzVGFnTGlicmFyeS5qYXZhIGIvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvVGhyZWFkc1RhZ0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYxYWI4NS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9UaHJlYWRzVGFnTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnRocmVhZHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnTGlicmFyeTsKLQotLyoqCi0gKiBUaHJlYWQgcmVsYXRlZCB0YWdzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25Aamhvcm1hbi5vcmciPkphc29uIEhvcm1hbjwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgVGhyZWFkc1RhZ0xpYnJhcnkgZXh0ZW5kcyBUYWdMaWJyYXJ5IHsKLSAgICBwdWJsaWMgVGhyZWFkc1RhZ0xpYnJhcnkoKSB7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJ0aHJlYWQiLCBUaHJlYWRUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygiaW50ZXJydXB0IiwgSW50ZXJydXB0VGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImpvaW4iLCBKb2luVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoIm11dGV4IiwgTXV0ZXhUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygibm90aWZ5IiwgTm90aWZ5VGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInNsZWVwIiwgU2xlZXBUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygid2FpdCIsIFdhaXRUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygic3luY2hyb25pemUiLCBTeW5jaHJvbml6ZVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJ3YWl0Rm9yIiwgV2FpdEZvclRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJ3YWl0Zm9yIiwgV2FpdEZvclRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJncm91cCIsIEdyb3VwVGFnLmNsYXNzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9UaW1lb3V0RXhjZXB0aW9uLmphdmEgYi9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9UaW1lb3V0RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYjdiZTYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvVGltZW91dEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy50aHJlYWRzOwotCi0vKioKLSAqIENhbiBiZSB0aHJvd24gd2hlbiB0aGUge0BsaW5rIFdhaXRGb3JUYWd9IHRyaWVzIHRvIHdhaXQgZm9yIGFub3RoZXIKLSAqIHRocmVhZCB0byBmaW5pc2guCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25Aamhvcm1hbi5vcmciPkphc29uIEhvcm1hbjwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgVGltZW91dEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgIHB1YmxpYyBUaW1lb3V0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvdGhyZWFkcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy90aHJlYWRzL1VzZU11dGV4VGFnLmphdmEgYi9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9Vc2VNdXRleFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjA3NmI0Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdGhyZWFkcy9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy90aHJlYWRzL1VzZU11dGV4VGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MudGhyZWFkczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIHRhZ3MgdGhhdCB3aWxsICJ1c2UiIG11dGV4ZXMuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25Aamhvcm1hbi5vcmciPkphc29uIEhvcm1hbjwvYT4KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVXNlTXV0ZXhUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLSAgICAvKiogVGhlIG11dGV4IHRvIHVzZSBpbiBzb21lIHdheS4gKi8KLSAgICBwcml2YXRlIE9iamVjdCBtdXRleCA9IG51bGw7Ci0KLSAgICAvKiogQ2FsbHMgdXNlTXV0ZXggYWZ0ZXIgY2hlY2tpbmcgdG8gbWFrZSBzdXJlIHRoYXQgPGk+c2V0TXV0ZXg8L2k+IHdhcyBjYWxsZWQgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICAvLyBlaXRoZXIgdXNlIHRoZSBzZXQgdGhyZWFkIG9yIHNlYXJjaCBmb3IgYSBwYXJlbnQgdGhyZWFkIHRvIHVzZQotICAgICAgICBpZiAobXV0ZXggPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJubyBtdXRleCBzZXQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHVzZU11dGV4KG11dGV4LCBvdXRwdXQpOwotICAgIH0KLQotICAgIC8qKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gZG8gc29tZXRoaW5nIHdpdGggdGhlIG11dGV4ICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdXNlTXV0ZXgoT2JqZWN0IG11dGV4LCBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb247Ci0KLSAgICAvKiogR2V0IHRoZSBtdXRleCAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0TXV0ZXgoKSB7Ci0gICAgICAgIHJldHVybiBtdXRleDsKLSAgICB9Ci0KLSAgICAvKiogU2V0IHRoZSBtdXRleC4gQW55IG9iamVjdCBjYW4gYmUgdXNlZCBhcyBhIG11dGV4LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldE11dGV4KE9iamVjdCBtdXRleCkgewotICAgICAgICB0aGlzLm11dGV4ID0gbXV0ZXg7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvVXNlVGhyZWFkVGFnLmphdmEgYi9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9Vc2VUaHJlYWRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI0NzNiNy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9Vc2VUaHJlYWRUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MudGhyZWFkczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgdGFncyB0aGF0IHdpbGwgInVzZSIgdGhyZWFkcy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBqaG9ybWFuLm9yZyI+SmFzb24gSG9ybWFuPC9hPgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVc2VUaHJlYWRUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLSAgICAvKiogVGhlIHRocmVhZCB0byB1c2UgaW4gc29tZSB3YXkuICovCi0gICAgcHJpdmF0ZSBUaHJlYWQgdGhyZWFkID0gbnVsbDsKLSAgICAvKiogVGhyZWFkcyBjYW4gYmUgZ3JvdXBlZCBhbmQgYWN0ZWQgb24gYXMgYSBzZXQgKi8KLSAgICBwcml2YXRlIExpc3QgdGhyZWFkR3JvdXAgPSBudWxsOwotICAgIC8qKiBJZiB0cnVlIGRvVGFnIHdpbGwgc2VhcmNoIGZvciBhIHBhcmVudCB0aHJlYWQgdG8gdXNlIGlmIHNldFRocmVhZCB3YXMgbm90IGNhbGxlZCAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzZWFyY2hGb3JQYXJlbnQgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZWl0aGVyIHVzZSB0aGUgc2V0IHRocmVhZCBvciB0bwotICAgICAqIHNlYXJjaCBmb3IgYSBwYXJlbnQgdGhyZWFkIHRvIHVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZWl0aGVyIHVzZSB0aGUgc2V0IHRocmVhZCBvciBzZWFyY2ggZm9yIGEgcGFyZW50IHRocmVhZCB0byB1c2UKLSAgICAgICAgICAgIGlmICh0aHJlYWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVzZVRocmVhZCh0aHJlYWQsIG91dHB1dCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRocmVhZEdyb3VwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1c2VUaHJlYWRHcm91cCh0aHJlYWRHcm91cCwgb3V0cHV0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyB0YWcgaXMgbmVzdGVkIGluc2lkZSBhIHRocmVhZC4gaWYgc28KLSAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIHBhcmVudCB0aHJlYWQuCi0gICAgICAgICAgICAgICAgaWYgKHNlYXJjaEZvclBhcmVudCkgewotICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBsb29rIGZvciBwYXJlbnQgdGhyZWFkcwotICAgICAgICAgICAgICAgICAgICBUaHJlYWRUYWcgdHQgPSAoVGhyZWFkVGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoVGhyZWFkVGFnLmNsYXNzKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAodHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXNlVGhyZWFkKHR0LmdldFRocmVhZCgpLCBvdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBsb29rIGZvciBwYXJlbnQgdGhyZWFkIGdyb3VwcwotICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBUYWcgZ3QgPSAoR3JvdXBUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyhHcm91cFRhZy5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVRocmVhZEdyb3VwKGd0LmdldFRocmVhZHMoKSwgb3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJubyB0aHJlYWQgb3IgdGhyZWFkIGdyb3VwIGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIm5vIHRocmVhZCBvciB0aHJlYWQgZ3JvdXAgZm91bmQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gZG8gc29tZXRoaW5nIHdpdGggdGhlIHRocmVhZCAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHVzZVRocmVhZChUaHJlYWQgdGhyZWFkLCBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gOwotCi0gICAgLyoqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBkbyBzb21ldGhpbmcgd2l0aCB0aGUgdGhyZWFkR3JvdXAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB1c2VUaHJlYWRHcm91cChMaXN0IHRocmVhZEdyb3VwLCBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB0aHJlYWQgdG8gdXNlIGluIHNvbWUgd2F5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRocmVhZChUaHJlYWQgdGhyZWFkKSB7Ci0gICAgICAgIHRoaXMudGhyZWFkID0gdGhyZWFkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgdGhyZWFkIHRvIHVzZQotICAgICAqLwotICAgIHB1YmxpYyBUaHJlYWQgZ2V0VGhyZWFkKCkgewotICAgICAgICByZXR1cm4gdGhyZWFkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdGhyZWFkIGdyb3VwIHRvICJ1c2UiLgotICAgICAqIEBwYXJhbSB0aHJlYWRHcm91cCBUaGUgdGhyZWFkR3JvdXAgY3JlYXRlZCB3aXRoIHRoZSA8aT5ncm91cDwvaT4gdGFnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRocmVhZEdyb3VwKExpc3QgdGhyZWFkR3JvdXApIHsKLSAgICAgICAgdGhpcy50aHJlYWRHcm91cCA9IHRocmVhZEdyb3VwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdGhyZWFkIGdyb3VwCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0VGhyZWFkR3JvdXAoKSB7Ci0gICAgICAgIHJldHVybiB0aHJlYWRHcm91cDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0cnVlIHRoZSB0YWcgd2lsbCBzZWFyY2ggZm9yIGEgcGFyZW50IHRocmVhZCB0YWcgdG8gInVzZSIgaWYKLSAgICAgKiBubyB0aHJlYWQgd2FzIHNldCB2aWEgPGk+c2V0VGhyZWFkPC9pPi4gVGhpcyBpcyA8aT50cnVlPC9pPiBieSBkZWZhdWx0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlYXJjaEZvclBhcmVudFRocmVhZChib29sZWFuIHNlYXJjaEZvclBhcmVudCkgewotICAgICAgICB0aGlzLnNlYXJjaEZvclBhcmVudCA9IHNlYXJjaEZvclBhcmVudDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9XYWl0Rm9yVGFnLmphdmEgYi9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9XYWl0Rm9yVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZTI3YTYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvV2FpdEZvclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy50aHJlYWRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGlzIHRhZyBjcmVhdGVzIGEgZGVwZW5kZW5jeSBvbiBhbm90aGVyIHRocmVhZC4gSWYgb25seVdhaXQgaXMgc2V0Ci0gKiBhIHtAbGluayBUaW1lb3V0RXhjZXB0aW9ufSBjYW4gYmUgdGhyb3duLiBJZiBzdGF0dXMgaXMgc2V0IGEge0BsaW5rIFJlcXVpcmVtZW50RXhjZXB0aW9ufQotICogY2FuIGJlIHRocm93bi4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBqaG9ybWFuLm9yZyI+SmFzb24gSG9ybWFuPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBXYWl0Rm9yVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0gICAgcHJpdmF0ZSBpbnQgc3RhdHVzID0gUnVubmFibGVTdGF0dXMuTk9ORTsKLSAgICBwcml2YXRlIEplbGx5VGhyZWFkIHRocmVhZCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBMaXN0IGdyb3VwID0gbnVsbDsKLSAgICBwcml2YXRlIGxvbmcgb25seVdhaXQgPSAtMTsKLQotICAgIC8qKgotICAgICAqIFdhaXQgZm9yIGEgc3BlY2lmaWMgc3RhdHVzLiAiU1VDQ0VTUyIsICJGQUlMVVJFIiwgIlRJTUVEX09VVCIsIG9yICJBVk9JREVEIi4gSWYKLSAgICAgKiB3YWl0aW5nIG9uIGEgdGhyZWFkIGdyb3VwIGVhY2ggdGhyZWFkIGluIHRoZSBncm91cCB3aWxsIGhhdmUgdG8gaGF2ZSB0aGlzIHN0YXR1cwotICAgICAqIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIHN0YXR1cykgewotICAgICAgICB0aGlzLnN0YXR1cyA9IFJ1bm5hYmxlU3RhdHVzLmdldFN0YXR1c0NvZGUoc3RhdHVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGljaCB0aHJlYWQgd2lsbCB0aGlzIHRhZyBjaGVjayB0aGUgc3RhdHVzIG9mCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGhyZWFkKEplbGx5VGhyZWFkIHRocmVhZCkgewotICAgICAgICB0aGlzLnRocmVhZCA9IHRocmVhZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGdyb3VwIG9mIHRocmVhZHMgdG8gd2FpdCBvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwKExpc3QgZ3JvdXApIHsKLSAgICAgICAgdGhpcy5ncm91cCA9IGdyb3VwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBob3cgbG9uZyB0byB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIGZpbmlzaC4gSWYgd2FpdGluZyBmb3IgYSBncm91cAotICAgICAqIHRoaXMgd2lsbCBiZSB0aGUgdGltZSB0byB3YWl0IGZvciBlYWNoIHRocmVhZCBpbiB0aGUgZ3JvdXAgdG8gZmluaXNoLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9ubHlXYWl0KGxvbmcgb25seVdhaXQpIHsKLSAgICAgICAgdGhpcy5vbmx5V2FpdCA9IG9ubHlXYWl0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHRoZSByZXF1aXJlbWVudHMKLSAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gSWYgdGhlIGNhbGwgdG8gd2FpdFVudGlsRG9uZShvbmx5V2FpdCkgdGltZXMgb3V0Ci0gICAgICogQHRocm93cyBSZXF1aXJlbWVudEV4Y2VwdGlvbiBJZiBhIHRocmVhZHMgc3RhdHVzIGRvZXNuJ3QgbWF0Y2ggdGhlIHNldFN0YXR1cygpIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24sIFJlcXVpcmVtZW50RXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aHJlYWQgPT0gbnVsbCAmJiBncm91cCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIlRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgeW91IHNldCB0aGUgdGhyZWFkIG9yIGdyb3VwIGF0dHJpYnV0ZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd2FpdCBvbiB0aGUgdGhyZWFkCi0gICAgICAgIGlmICh0aHJlYWQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyZWFkLndhaXRVbnRpbERvbmUob25seVdhaXQpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBSdW5uYWJsZVN0YXR1cy5OT05FKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCF0aHJlYWQuZ2V0U3RhdHVzKCkuZXF1YWxzKHN0YXR1cykpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlcXVpcmVtZW50RXhjZXB0aW9uKCJSZXF1aXJlbWVudCBvbiB0aHJlYWQgXCIiICsgdGhyZWFkLmdldE5hbWUoKSArICJcIiBub3QgbWV0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd2FpdCBvbiB0aGUgdGhyZWFkZ3JvdXAKLSAgICAgICAgaWYgKGdyb3VwICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXAuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBKZWxseVRocmVhZCBndGhyZWFkID0gKEplbGx5VGhyZWFkKSBncm91cC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgZ3RocmVhZC53YWl0VW50aWxEb25lKG9ubHlXYWl0KTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFJ1bm5hYmxlU3RhdHVzLk5PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFndGhyZWFkLmdldFN0YXR1cygpLmVxdWFscyhzdGF0dXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVxdWlyZW1lbnRFeGNlcHRpb24oIlJlcXVpcmVtZW50IG9uIHRocmVhZCBcIiIgKyBndGhyZWFkLmdldE5hbWUoKSArICJcIiBub3QgbWV0Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9XYWl0VGFnLmphdmEgYi9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9XYWl0VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOTE4NDguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvV2FpdFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnRocmVhZHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqCi0gKiBUaGlzIGNhbGxzIG11dGV4LndhaXQoKSBvbiB0aGUgbXV0ZXggcGFzc2VkIGluIHZpYSB0aGUgIm11dGV4IiBhdHRyaWJ1dGUuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25Aamhvcm1hbi5vcmciPkphc29uIEhvcm1hbjwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgV2FpdFRhZyBleHRlbmRzIFVzZU11dGV4VGFnIHsKLSAgICAvKiogSG93IGxvbmcgc2hvdWxkIHRoZSB3YWl0IGxhc3QuIElmIDw9MCBpdCBsYXN0cyB1bnRpbCBhIG5vdGlmeS4gKi8KLSAgICBwcml2YXRlIGxvbmcgdGltZW91dCA9IC0xOwotCi0gICAgLyoqIFN0YXJ0IHdhaXRpbmcgKi8KLSAgICBwdWJsaWMgdm9pZCB1c2VNdXRleChPYmplY3QgbXV0ZXgsIFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAodGltZW91dCA+IDApIHsKLSAgICAgICAgICAgICAgICBtdXRleC53YWl0KHRpbWVvdXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtdXRleC53YWl0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBob3cgbG9uZyB0aGUgd2FpdCBzaG91bGQgbGFzdC4gSWYgPD0gMCB0aGUgd2FpdCB3aWxsIGxhc3QKLSAgICAgKiB1bnRpbCBhIG5vdGlmeSBvY2N1cnMuCi0gICAgICogQHBhcmFtIHRpbWVvdXQgaW4gbWlsbGlzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGltZW91dChsb25nIHRpbWVvdXQpIHsKLSAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9wYWNrYWdlLmh0bWwgYi9qZWxseS10YWdzL3RocmVhZHMvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdGhyZWFkcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZWU0Y2IuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy90aHJlYWRzL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3RocmVhZHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTwvaGVhZD4KLTxib2R5PgotCi0gIDxwPgotICAJQSBsaWJyYXJ5IGZvciBwcm9jZXNzaW5nIEplbGx5IHNjcmlwdHMgdXNpbmcgbXVsdGlwbGUgdGhyZWFkcy4KLSAgPC9wPgotICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvdGhyZWFkcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGhyZWFkcy9UZXN0SmVsbHkuamF2YSBiL2plbGx5LXRhZ3MvdGhyZWFkcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGhyZWFkcy9UZXN0SmVsbHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiOWI3NC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RocmVhZHMvVGVzdEplbGx5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50aHJlYWRzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmp1bml0LkplbGx5VGVzdFN1aXRlOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIHRvIHJ1biBqZWxseSB0ZXN0IGNhc2VzIGFzIHBhcnQgb2YgQW50J3MgSlVuaXQgdGVzdHMKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0SmVsbHkgZXh0ZW5kcyBKZWxseVRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUZXN0UnVubmVyLnJ1biggc3VpdGUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVUZXN0U3VpdGUoVGVzdEplbGx5LmNsYXNzLCAic3VpdGUuamVsbHkiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RocmVhZHMvYmFzaWMuamVsbHkgYi9qZWxseS10YWdzL3RocmVhZHMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RocmVhZHMvYmFzaWMuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNWNhYmMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy90aHJlYWRzL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90aHJlYWRzL2Jhc2ljLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0NCi08IS0tDQotQmFzaWMgZXhhbXBsZS4gU2hvdWxkIHByaW50IHRoZSBudW1iZXJzIGluIHJldmVyc2UuDQotLS0+DQotDQotPGplbGx5IHhtbG5zPSJqZWxseTpjb3JlIiB4bWxuczp0aHJlYWRzPSJqZWxseTp0aHJlYWRzIj4NCi0NCi0gICAgPHRocmVhZHM6dGhyZWFkIHZhcj0idGhyZWFkMSI+DQotICAgICAgICA8dGhyZWFkczpzbGVlcCBmb3I9IjEwMDAiLz4NCi0gICAgICAgIDENCi0gICAgPC90aHJlYWRzOnRocmVhZD4NCi0NCi0gICAgPHRocmVhZHM6dGhyZWFkPg0KLSAgICAgICAgPHRocmVhZHM6c2xlZXAgZm9yPSI1MDAiLz4NCi0gICAgICAgIDINCi0gICAgPC90aHJlYWRzOnRocmVhZD4NCi0NCi0gICAgPHRocmVhZHM6dGhyZWFkPg0KLSAgICAgICAgPHRocmVhZHM6c2xlZXAgZm9yPSIxMDAiLz4NCi0gICAgICAgIDMNCi0gICAgPC90aHJlYWRzOnRocmVhZD4NCi0NCi0gICAgPHRocmVhZHM6dGhyZWFkPg0KLSAgICAgICAgNA0KLSAgICA8L3RocmVhZHM6dGhyZWFkPg0KLQ0KLTx3aGl0ZXNwYWNlPg0KLVttYWluXTogd2FpdGluZyBmb3IgdGhyZWFkcyB0byBmaW5pc2gNCi08L3doaXRlc3BhY2U+DQotDQotICAgICAgICA8dGhyZWFkczpqb2luIHRocmVhZD0iJHt0aHJlYWQxfSIvPg0KLQ0KLTx3aGl0ZXNwYWNlPg0KLVttYWluXTogdGhyZWFkcyBhcmUgbm93IGRvbmUNCi08L3doaXRlc3BhY2U+DQotDQotPC9qZWxseT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RocmVhZHMvZ3JvdXAxLmplbGx5IGIvamVsbHktdGFncy90aHJlYWRzL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90aHJlYWRzL2dyb3VwMS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ0YWI4Mi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RocmVhZHMvZ3JvdXAxLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0NCi08IS0tDQotQmFzaWMgdGhyZWFkIGdyb3VwIGV4YW1wbGUuDQotLS0+DQotDQotPGplbGx5IHhtbG5zPSJqZWxseTpjb3JlIiB4bWxuczp0aHJlYWRzPSJqZWxseTp0aHJlYWRzIj4NCi0NCi0gICAgPHRocmVhZHM6Z3JvdXAgdmFyPSJncm91cDEiPg0KLSAgICAgICAgPHRocmVhZHM6dGhyZWFkPg0KLSAgICAgICAgICAgIDx0aHJlYWRzOnNsZWVwIGZvcj0iMTAwIi8+DQotICAgICAgICAgICAgMQ0KLSAgICAgICAgPC90aHJlYWRzOnRocmVhZD4NCi0NCi0gICAgICAgIDx0aHJlYWRzOnRocmVhZD4NCi0gICAgICAgICAgICA8dGhyZWFkczpzbGVlcCBmb3I9IjEwMCIvPg0KLSAgICAgICAgICAgIDINCi0gICAgICAgIDwvdGhyZWFkczp0aHJlYWQ+DQotICAgIDwvdGhyZWFkczpncm91cD4NCi0NCi0gICAgPHRocmVhZHM6dGhyZWFkPg0KLSAgICAgICAgPCEtLSB3YWl0IGZvciBib3RoIHRocmVhZCAxIGFuZCAyIHRvIGNvbXBsZXRlIC0tPg0KLSAgICAgICAgPHRocmVhZHM6d2FpdEZvciBncm91cD0iJHtncm91cDF9Ii8+DQotICAgICAgICAzDQotICAgIDwvdGhyZWFkczp0aHJlYWQ+DQotDQotPC9qZWxseT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RocmVhZHMvc3VpdGUuamVsbHkgYi9qZWxseS10YWdzL3RocmVhZHMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RocmVhZHMvc3VpdGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMzUyMWMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy90aHJlYWRzL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90aHJlYWRzL3N1aXRlLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHRlc3Q6c3VpdGUgeG1sbnM9ImplbGx5OmNvcmUiIHhtbG5zOnRlc3Q9ImplbGx5Omp1bml0IiB4bWxuczp0aHJlYWRzPSJqZWxseTp0aHJlYWRzIj4NCi0gICAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0QmFzaWMiPg0KLSAgICAgICAgPHNldCB2YXI9InJlc3VsdCIgdmFsdWU9IiIvPg0KLQ0KLSAgICAgICAgPHRocmVhZHM6dGhyZWFkIHZhcj0idGhyZWFkMSI+DQotICAgICAgICAgICAgPHRocmVhZHM6c2xlZXAgZm9yPSI3MDAiLz4NCi0gICAgICAgICAgICA8c2V0IHZhcj0icmVzdWx0IiB2YWx1ZT0iJHtyZXN1bHR9MSIvPg0KLSAgICAgICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iNDMyMSIgYWN0dWFsPSIke3Jlc3VsdH0iLz4NCi0gICAgICAgIDwvdGhyZWFkczp0aHJlYWQ+DQotDQotICAgICAgICA8dGhyZWFkczp0aHJlYWQ+DQotICAgICAgICAgICAgPHRocmVhZHM6c2xlZXAgZm9yPSI0MDAiLz4NCi0gICAgICAgICAgICA8c2V0IHZhcj0icmVzdWx0IiB2YWx1ZT0iJHtyZXN1bHR9MiIvPg0KLSAgICAgICAgPC90aHJlYWRzOnRocmVhZD4NCi0NCi0gICAgICAgIDx0aHJlYWRzOnRocmVhZD4NCi0gICAgICAgICAgICA8dGhyZWFkczpzbGVlcCBmb3I9IjEwMCIvPg0KLSAgICAgICAgICAgIDxzZXQgdmFyPSJyZXN1bHQiIHZhbHVlPSIke3Jlc3VsdH0zIi8+DQotICAgICAgICA8L3RocmVhZHM6dGhyZWFkPg0KLQ0KLSAgICAgICAgPHRocmVhZHM6dGhyZWFkPg0KLSAgICAgICAgICAgIDxzZXQgdmFyPSJyZXN1bHQiIHZhbHVlPSIke3Jlc3VsdH00Ii8+DQotICAgICAgICA8L3RocmVhZHM6dGhyZWFkPg0KLSAgICA8L3Rlc3Q6Y2FzZT4NCi0NCi0gICAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0U3luYyI+DQotICAgICAgICA8c2V0IHZhcj0icmVzdWx0IiB2YWx1ZT0iIi8+DQotICAgICAgICA8dGhyZWFkczptdXRleCB2YXI9Im11dGV4Ii8+DQotDQotICAgICAgICA8dGhyZWFkczp0aHJlYWQgdmFyPSJ0aHJlYWQxIj4NCi0gICAgICAgICAgICA8dGhyZWFkczpzeW5jaHJvbml6ZSBtdXRleD0iJHttdXRleH0iPg0KLSAgICAgICAgICAgICAgICA8c2V0IHZhcj0iY250MSIgdmFsdWU9IjAiLz4NCi0gICAgICAgICAgICAgICAgPHdoaWxlIHRlc3Q9IiR7Y250MSAhPSA1fSI+DQotICAgICAgICAgICAgICAgICAgICA8c2V0IHZhcj0icmVzdWx0IiB2YWx1ZT0iJHtyZXN1bHR9JHtjbnQxfSIvPg0KLSAgICAgICAgICAgICAgICAgICAgPHNldCB2YXI9ImNudDEiIHZhbHVlPSIke2NudDEgKyAxfSIvPg0KLSAgICAgICAgICAgICAgICAgICAgPHRocmVhZHM6aW50ZXJydXB0Lz4NCi0gICAgICAgICAgICAgICAgPC93aGlsZT4NCi0gICAgICAgICAgICA8L3RocmVhZHM6c3luY2hyb25pemU+DQotICAgICAgICA8L3RocmVhZHM6dGhyZWFkPg0KLQ0KLSAgICAgICAgPHRocmVhZHM6dGhyZWFkIHZhcj0idGhyZWFkMiI+DQotICAgICAgICAgICAgPCEtLSBsZXQgdGhlIG90aGVyIHRocmVhZCBzdGFydCAtLT4NCi0gICAgICAgICAgICA8dGhyZWFkczpzbGVlcCBmb3I9IjEwMCIvPg0KLSAgICAgICAgICAgIDx0aHJlYWRzOnN5bmNocm9uaXplIG11dGV4PSIke211dGV4fSI+DQotICAgICAgICAgICAgICAgIDxzZXQgdmFyPSJjbnQyIiB2YWx1ZT0iNSIvPg0KLSAgICAgICAgICAgICAgICA8d2hpbGUgdGVzdD0iJHtjbnQyICE9IDEwfSI+DQotICAgICAgICAgICAgICAgICAgICA8c2V0IHZhcj0icmVzdWx0IiB2YWx1ZT0iJHtyZXN1bHR9JHtjbnQyfSIvPg0KLSAgICAgICAgICAgICAgICAgICAgPHNldCB2YXI9ImNudDIiIHZhbHVlPSIke2NudDIgKyAxfSIvPg0KLSAgICAgICAgICAgICAgICAgICAgPHRocmVhZHM6aW50ZXJydXB0Lz4NCi0gICAgICAgICAgICAgICAgPC93aGlsZT4NCi0gICAgICAgICAgICA8L3RocmVhZHM6c3luY2hyb25pemU+DQotICAgICAgICA8L3RocmVhZHM6dGhyZWFkPg0KLQ0KLSAgICAgICAgPHRocmVhZHM6am9pbiB0aHJlYWQ9IiR7dGhyZWFkMX0iLz4NCi0gICAgICAgIDx0aHJlYWRzOmpvaW4gdGhyZWFkPSIke3RocmVhZDJ9Ii8+DQotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IjAxMjM0NTY3ODkiIGFjdHVhbD0iJHtyZXN1bHR9Ii8+DQotICAgIDwvdGVzdDpjYXNlPg0KLQ0KLSAgICA8dGVzdDpjYXNlIG5hbWU9InRlc3RXYWl0Tm90aWZ5Ij4NCi0gICAgICAgIDxzZXQgdmFyPSJyZXN1bHQiIHZhbHVlPSIiLz4NCi0gICAgICAgIDx0aHJlYWRzOm11dGV4IHZhcj0ibXV0ZXgiLz4NCi0NCi0gICAgICAgIDx0aHJlYWRzOnRocmVhZCB2YXI9InRocmVhZDEiPg0KLSAgICAgICAgICAgIDx0aHJlYWRzOnN5bmNocm9uaXplIG11dGV4PSIke211dGV4fSI+DQotICAgICAgICAgICAgICAgIDxzZXQgdmFyPSJjbnQxIiB2YWx1ZT0iMCIvPg0KLSAgICAgICAgICAgICAgICA8d2hpbGUgdGVzdD0iJHtjbnQxICE9IDV9Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzZXQgdmFyPSJyZXN1bHQiIHZhbHVlPSIke3Jlc3VsdH0ke2NudDF9Ii8+DQotICAgICAgICAgICAgICAgICAgICA8c2V0IHZhcj0iY250MSIgdmFsdWU9IiR7Y250MSArIDF9Ii8+DQotICAgICAgICAgICAgICAgICAgICA8IS0tIGxldCB0aGUgb3RoZXIgdGhyZWFkIGdvIC0tPg0KLSAgICAgICAgICAgICAgICAgICAgPHRocmVhZHM6bm90aWZ5IG11dGV4PSIke211dGV4fSIvPg0KLSAgICAgICAgICAgICAgICAgICAgPHRocmVhZHM6d2FpdCBtdXRleD0iJHttdXRleH0iLz4NCi0gICAgICAgICAgICAgICAgPC93aGlsZT4NCi0gICAgICAgICAgICAgICAgPCEtLSBvbmUgbGFzdCBub3RpZnkgLS0+DQotICAgICAgICAgICAgICAgIDx0aHJlYWRzOm5vdGlmeSBtdXRleD0iJHttdXRleH0iLz4NCi0gICAgICAgICAgICA8L3RocmVhZHM6c3luY2hyb25pemU+DQotICAgICAgICA8L3RocmVhZHM6dGhyZWFkPg0KLQ0KLSAgICAgICAgPHRocmVhZHM6dGhyZWFkIHZhcj0idGhyZWFkMiI+DQotICAgICAgICAgICAgPCEtLSBsZXQgdGhlIG90aGVyIHRocmVhZCBzdGFydCAtLT4NCi0gICAgICAgICAgICA8dGhyZWFkczpzbGVlcCBmb3I9IjEwMCIvPg0KLSAgICAgICAgICAgIDx0aHJlYWRzOnN5bmNocm9uaXplIG11dGV4PSIke211dGV4fSI+DQotICAgICAgICAgICAgICAgIDxzZXQgdmFyPSJjbnQyIiB2YWx1ZT0iMCIvPg0KLSAgICAgICAgICAgICAgICA8d2hpbGUgdGVzdD0iJHtjbnQyICE9IDV9Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzZXQgdmFyPSJyZXN1bHQiIHZhbHVlPSIke3Jlc3VsdH0ke2NudDJ9Ii8+DQotICAgICAgICAgICAgICAgICAgICA8c2V0IHZhcj0iY250MiIgdmFsdWU9IiR7Y250MiArIDF9Ii8+DQotICAgICAgICAgICAgICAgICAgICA8IS0tIGxldCB0aGUgb3RoZXIgdGhyZWFkIGdvIC0tPg0KLSAgICAgICAgICAgICAgICAgICAgPHRocmVhZHM6bm90aWZ5IG11dGV4PSIke211dGV4fSIvPg0KLSAgICAgICAgICAgICAgICAgICAgPHRocmVhZHM6d2FpdCBtdXRleD0iJHttdXRleH0iLz4NCi0gICAgICAgICAgICAgICAgPC93aGlsZT4NCi0gICAgICAgICAgICAgICAgPCEtLSBvbmUgbGFzdCBub3RpZnkgLS0+DQotICAgICAgICAgICAgICAgIDx0aHJlYWRzOm5vdGlmeSBtdXRleD0iJHttdXRleH0iLz4NCi0gICAgICAgICAgICA8L3RocmVhZHM6c3luY2hyb25pemU+DQotICAgICAgICA8L3RocmVhZHM6dGhyZWFkPg0KLQ0KLSAgICAgICAgPHRocmVhZHM6am9pbiB0aHJlYWQ9IiR7dGhyZWFkMX0iLz4NCi0gICAgICAgIDx0aHJlYWRzOmpvaW4gdGhyZWFkPSIke3RocmVhZDJ9Ii8+DQotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IjAwMTEyMjMzNDQiIGFjdHVhbD0iJHtyZXN1bHR9Ii8+DQotICAgIDwvdGVzdDpjYXNlPg0KLQ0KLSAgICA8dGVzdDpjYXNlIG5hbWU9InRlc3RXYWl0Rm9yIj4NCi0gICAgICAgIDxzZXQgdmFyPSJyZXN1bHQiIHZhbHVlPSIiLz4NCi0NCi0gICAgICAgIDx0aHJlYWRzOnRocmVhZCB2YXI9InRocmVhZDEiPg0KLSAgICAgICAgICAgIDxzZXQgdmFyPSJjbnQxIiB2YWx1ZT0iMCIvPg0KLSAgICAgICAgICAgIDx3aGlsZSB0ZXN0PSIke2NudDEgIT0gNX0iPg0KLSAgICAgICAgICAgICAgICA8c2V0IHZhcj0icmVzdWx0IiB2YWx1ZT0iJHtyZXN1bHR9JHtjbnQxfSIvPg0KLSAgICAgICAgICAgICAgICA8c2V0IHZhcj0iY250MSIgdmFsdWU9IiR7Y250MSArIDF9Ii8+DQotICAgICAgICAgICAgICAgIDwhLS0gZm9yY2UgYW4gaW50ZXJydXB0LCBzaG91bGRuJ3QgbWF0dGVyIC0tPg0KLSAgICAgICAgICAgICAgICA8dGhyZWFkczppbnRlcnJ1cHQvPg0KLSAgICAgICAgICAgIDwvd2hpbGU+DQotICAgICAgICA8L3RocmVhZHM6dGhyZWFkPg0KLQ0KLSAgICAgICAgPHRocmVhZHM6dGhyZWFkIHZhcj0idGhyZWFkMiI+DQotICAgICAgICAgICAgPHRocmVhZHM6d2FpdGZvciB0aHJlYWQ9IiR7dGhyZWFkMX0iLz4NCi0gICAgICAgICAgICA8c2V0IHZhcj0iY250MiIgdmFsdWU9IjUiLz4NCi0gICAgICAgICAgICA8d2hpbGUgdGVzdD0iJHtjbnQyICE9IDEwfSI+DQotICAgICAgICAgICAgICAgIDxzZXQgdmFyPSJyZXN1bHQiIHZhbHVlPSIke3Jlc3VsdH0ke2NudDJ9Ii8+DQotICAgICAgICAgICAgICAgIDxzZXQgdmFyPSJjbnQyIiB2YWx1ZT0iJHtjbnQyICsgMX0iLz4NCi0gICAgICAgICAgICA8L3doaWxlPg0KLSAgICAgICAgPC90aHJlYWRzOnRocmVhZD4NCi0NCi0gICAgICAgIDx0aHJlYWRzOmpvaW4gdGhyZWFkPSIke3RocmVhZDF9Ii8+DQotICAgICAgICA8dGhyZWFkczpqb2luIHRocmVhZD0iJHt0aHJlYWQyfSIvPg0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSIwMTIzNDU2Nzg5IiBhY3R1YWw9IiR7cmVzdWx0fSIvPg0KLSAgICA8L3Rlc3Q6Y2FzZT4NCi0NCi0gICAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0V2FpdEZvclRpbWVvdXQiPg0KLSAgICAgICAgPHNldCB2YXI9InJlc3VsdCIgdmFsdWU9IiIvPg0KLQ0KLSAgICAgICAgPHRocmVhZHM6dGhyZWFkIHZhcj0idGhyZWFkMSI+DQotICAgICAgICAgICAgPHNldCB2YXI9ImNudDEiIHZhbHVlPSIwIi8+DQotICAgICAgICAgICAgPHdoaWxlIHRlc3Q9IiR7Y250MSAhPSA1fSI+DQotICAgICAgICAgICAgICAgIDxzZXQgdmFyPSJyZXN1bHQiIHZhbHVlPSIke3Jlc3VsdH0ke2NudDF9Ii8+DQotICAgICAgICAgICAgICAgIDxzZXQgdmFyPSJjbnQxIiB2YWx1ZT0iJHtjbnQxICsgMX0iLz4NCi0gICAgICAgICAgICAgICAgPCEtLSBmb3JjZSBhbiBpbnRlcnJ1cHQsIHNob3VsZG4ndCBtYXR0ZXIgLS0+DQotICAgICAgICAgICAgICAgIDx0aHJlYWRzOnNsZWVwIGZvcj0iNTAwIi8+DQotICAgICAgICAgICAgPC93aGlsZT4NCi0gICAgICAgIDwvdGhyZWFkczp0aHJlYWQ+DQotDQotICAgICAgICA8dGhyZWFkczp0aHJlYWQgdmFyPSJ0aHJlYWQyIj4NCi0gICAgICAgICAgICA8IS0tIHRoaXMgd2lsbCBmYWlsIHNpbmNlIHRocmVhZCAxIGlzIHNsZWVwaW5nIC0tPg0KLSAgICAgICAgICAgIDx0aHJlYWRzOndhaXRmb3IgdGhyZWFkPSIke3RocmVhZDF9IiBvbmx5V2FpdD0iMTAwIi8+DQotICAgICAgICAgICAgPHNldCB2YXI9ImNudDIiIHZhbHVlPSI1Ii8+DQotICAgICAgICAgICAgPHdoaWxlIHRlc3Q9IiR7Y250MiAhPSAxMH0iPg0KLSAgICAgICAgICAgICAgICA8c2V0IHZhcj0icmVzdWx0IiB2YWx1ZT0iJHtyZXN1bHR9JHtjbnQyfSIvPg0KLSAgICAgICAgICAgICAgICA8c2V0IHZhcj0iY250MiIgdmFsdWU9IiR7Y250MiArIDF9Ii8+DQotICAgICAgICAgICAgPC93aGlsZT4NCi0gICAgICAgIDwvdGhyZWFkczp0aHJlYWQ+DQotDQotICAgICAgICA8dGhyZWFkczp0aHJlYWQgdmFyPSJ0aHJlYWQzIj4NCi0gICAgICAgICAgICA8dGhyZWFkczp3YWl0Zm9yIHRocmVhZD0iJHt0aHJlYWQxfSIvPg0KLSAgICAgICAgICAgIDwhLS0gdGhyZWFkMiB3aWxsIGhhdmUgYmVlbiBhdm9pZGVkIC0tPg0KLSAgICAgICAgICAgIDx0aHJlYWRzOndhaXRmb3IgdGhyZWFkPSIke3RocmVhZDJ9IiBzdGF0dXM9IkFWT0lERUQiLz4NCi0gICAgICAgICAgICA8c2V0IHZhcj0iY250MiIgdmFsdWU9IjEwIi8+DQotICAgICAgICAgICAgPHdoaWxlIHRlc3Q9IiR7Y250MiAhPSAxNX0iPg0KLSAgICAgICAgICAgICAgICA8c2V0IHZhcj0icmVzdWx0IiB2YWx1ZT0iJHtyZXN1bHR9JHtjbnQyfSIvPg0KLSAgICAgICAgICAgICAgICA8c2V0IHZhcj0iY250MiIgdmFsdWU9IiR7Y250MiArIDF9Ii8+DQotICAgICAgICAgICAgPC93aGlsZT4NCi0gICAgICAgIDwvdGhyZWFkczp0aHJlYWQ+DQotDQotICAgICAgICA8dGhyZWFkczpqb2luIHRocmVhZD0iJHt0aHJlYWQxfSIvPg0KLSAgICAgICAgPHRocmVhZHM6am9pbiB0aHJlYWQ9IiR7dGhyZWFkMn0iLz4NCi0gICAgICAgIDx0aHJlYWRzOmpvaW4gdGhyZWFkPSIke3RocmVhZDN9Ii8+DQotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IjAxMjM0MTAxMTEyMTMxNCIgYWN0dWFsPSIke3Jlc3VsdH0iLz4NCi0gICAgPC90ZXN0OmNhc2U+DQotDQotICAgIDx0ZXN0OmNhc2UgbmFtZT0idGVzdFdhaXRGb3JGYWlsdXJlIj4NCi0gICAgICAgIDxzZXQgdmFyPSJyZXN1bHQiIHZhbHVlPSIiLz4NCi0NCi0gICAgICAgIDx0aHJlYWRzOnRocmVhZCB2YXI9InRocmVhZDEiPg0KLSAgICAgICAgICAgIFRIUk9XIEFOIEVYQ0VQVElPTg0KLSAgICAgICAgICAgIDxuZXcgdmFyPSJib2d1cyIgY2xhc3NOYW1lPSJqYXZhLmxhbmcuU3lzdGVtIi8+DQotICAgICAgICA8L3RocmVhZHM6dGhyZWFkPg0KLQ0KLSAgICAgICAgPHRocmVhZHM6dGhyZWFkIHZhcj0idGhyZWFkMiI+DQotICAgICAgICAgICAgPCEtLSB0aGlzIHdpbGwgZmFpbCBzaW5jZSB0aHJlYWQgMSBpcyBzbGVlcGluZyAtLT4NCi0gICAgICAgICAgICA8dGhyZWFkczp3YWl0Zm9yIHRocmVhZD0iJHt0aHJlYWQxfSIgc3RhdHVzPSJTVUNDRVNTIi8+DQotICAgICAgICAgICAgPHNldCB2YXI9ImNudDIiIHZhbHVlPSI1Ii8+DQotICAgICAgICAgICAgPHdoaWxlIHRlc3Q9IiR7Y250MiAhPSAxMH0iPg0KLSAgICAgICAgICAgICAgICA8c2V0IHZhcj0icmVzdWx0IiB2YWx1ZT0iJHtyZXN1bHR9JHtjbnQyfSIvPg0KLSAgICAgICAgICAgICAgICA8c2V0IHZhcj0iY250MiIgdmFsdWU9IiR7Y250MiArIDF9Ii8+DQotICAgICAgICAgICAgPC93aGlsZT4NCi0gICAgICAgIDwvdGhyZWFkczp0aHJlYWQ+DQotDQotICAgICAgICA8dGhyZWFkczp0aHJlYWQgdmFyPSJ0aHJlYWQzIj4NCi0gICAgICAgICAgICA8IS0tIHRoaXMgd2lsbCBmYWlsIHNpbmNlIHRocmVhZCAxIGlzIHNsZWVwaW5nIC0tPg0KLSAgICAgICAgICAgIDx0aHJlYWRzOndhaXRmb3IgdGhyZWFkPSIke3RocmVhZDF9IiBzdGF0dXM9IkZBSUxVUkUiLz4NCi0gICAgICAgICAgICA8c2V0IHZhcj0iY250MiIgdmFsdWU9IjEwIi8+DQotICAgICAgICAgICAgPHdoaWxlIHRlc3Q9IiR7Y250MiAhPSAxNX0iPg0KLSAgICAgICAgICAgICAgICA8c2V0IHZhcj0icmVzdWx0IiB2YWx1ZT0iJHtyZXN1bHR9JHtjbnQyfSIvPg0KLSAgICAgICAgICAgICAgICA8c2V0IHZhcj0iY250MiIgdmFsdWU9IiR7Y250MiArIDF9Ii8+DQotICAgICAgICAgICAgPC93aGlsZT4NCi0gICAgICAgIDwvdGhyZWFkczp0aHJlYWQ+DQotDQotICAgICAgICA8dGhyZWFkczpqb2luIHRocmVhZD0iJHt0aHJlYWQxfSIvPg0KLSAgICAgICAgPHRocmVhZHM6am9pbiB0aHJlYWQ9IiR7dGhyZWFkMn0iLz4NCi0gICAgICAgIDx0aHJlYWRzOmpvaW4gdGhyZWFkPSIke3RocmVhZDN9Ii8+DQotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IjEwMTExMjEzMTQiIGFjdHVhbD0iJHtyZXN1bHR9Ii8+DQotICAgIDwvdGVzdDpjYXNlPg0KLQ0KLSAgICA8dGVzdDpjYXNlIG5hbWU9InRlc3RUaHJlYWRHcm91cCI+DQotICAgICAgICA8c2V0IHZhcj0icmVzdWx0IiB2YWx1ZT0iIi8+DQotDQotICAgICAgICA8dGhyZWFkczpncm91cCB2YXI9Imdyb3VwMSI+DQotICAgICAgICAgICAgPHRocmVhZHM6dGhyZWFkIHZhcj0idGhyZWFkMSI+DQotICAgICAgICAgICAgICAgIDwhLS0gbGV0IHRocmVhZCAzIHRyeSBhbmQgZ28gLS0+DQotICAgICAgICAgICAgICAgIDx0aHJlYWRzOnNsZWVwIGZvcj0iMTAwIi8+DQotICAgICAgICAgICAgICAgIDxzZXQgdmFyPSJyZXN1bHQiIHZhbHVlPSIke3Jlc3VsdH0xIi8+DQotICAgICAgICAgICAgPC90aHJlYWRzOnRocmVhZD4NCi0NCi0gICAgICAgICAgICA8dGhyZWFkczp0aHJlYWQ+DQotICAgICAgICAgICAgICAgIDx0aHJlYWRzOndhaXRGb3IgdGhyZWFkPSIke3RocmVhZDF9Ii8+DQotICAgICAgICAgICAgICAgIDwhLS0gbGV0IHRocmVhZCAzIHRyeSBhbmQgZ28gLS0+DQotICAgICAgICAgICAgICAgIDx0aHJlYWRzOnNsZWVwIGZvcj0iMTAwIi8+DQotICAgICAgICAgICAgICAgIDxzZXQgdmFyPSJyZXN1bHQiIHZhbHVlPSIke3Jlc3VsdH0yIi8+DQotICAgICAgICAgICAgPC90aHJlYWRzOnRocmVhZD4NCi0gICAgICAgIDwvdGhyZWFkczpncm91cD4NCi0NCi0gICAgICAgIDx0aHJlYWRzOnRocmVhZD4NCi0gICAgICAgICAgICA8IS0tIHdhaXQgZm9yIHRoZSB0aHJlYWQgZ3JvdXAgdG8gY29tcGxldGUgLS0+DQotICAgICAgICAgICAgPHRocmVhZHM6d2FpdEZvciBncm91cD0iJHtncm91cDF9Ii8+DQotICAgICAgICAgICAgPHNldCB2YXI9InJlc3VsdCIgdmFsdWU9IiR7cmVzdWx0fTMiLz4NCi0gICAgICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IjEyMyIgYWN0dWFsPSIke3Jlc3VsdH0iLz4NCi0gICAgICAgIDwvdGhyZWFkczp0aHJlYWQ+DQotICAgIDwvdGVzdDpjYXNlPg0KLSAgICANCi08L3Rlc3Q6c3VpdGU+DQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy90aHJlYWRzL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90aHJlYWRzL3N5bmMuamVsbHkgYi9qZWxseS10YWdzL3RocmVhZHMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RocmVhZHMvc3luYy5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ2NmU0ZC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RocmVhZHMvc3luYy5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotDQotPCEtLQ0KLVRoaXMgZXhhbXBsZSBzaG93cyBjb29yZGluYXRpbmcgYmV0d2VlbiAyIHRocmVhZHMgdXNpbmcNCi1tdXRleGVzIGFuZCBzbGVlcC4gVGhyZWFkIDEgc2hvdWxkIGV4ZWN1dGUgYWZ0ZXIgdGhyZWFkIDIuDQotLS0+DQotDQotPGplbGx5IHhtbG5zPSJqZWxseTpjb3JlIiB4bWxuczp0aHJlYWRzPSJqZWxseTp0aHJlYWRzIj4NCi0NCi0gICAgPHRocmVhZHM6bXV0ZXggdmFyPSJtdXRleCIvPg0KLQ0KLSAgICA8dGhyZWFkczp0aHJlYWQgdmFyPSJ0aHJlYWQxIj4NCi0gICAgICAgIDwhLS0gZ2l2ZSB0aGUgb3RoZXIgdGhyZWFkIGEgY2hhbmNlIHRvIGdldCB0aGUgbXV0ZXggLS0+DQotICAgICAgICA8dGhyZWFkczpzbGVlcCBmb3I9IjEwMCIvPg0KLQ0KLSAgICAgICAgPCEtLSBnZXQgdGhlIG11dGV4IC0tPg0KLSAgICAgICAgPHRocmVhZHM6c3luY2hyb25pemUgbXV0ZXg9IiR7bXV0ZXh9Ij4NCi0NCi0gICAgICAgICAgICA8d2hpdGVzcGFjZT4NCi0gICAgICAgICAgICAgICAgW3RocmVhZDFdOiBmaW5hbGx5IEkgZ290IGl0DQotICAgICAgICAgICAgPC93aGl0ZXNwYWNlPg0KLQ0KLSAgICAgICAgPC90aHJlYWRzOnN5bmNocm9uaXplPg0KLSAgICA8L3RocmVhZHM6dGhyZWFkPg0KLQ0KLSAgICA8dGhyZWFkczp0aHJlYWQ+DQotICAgICAgICA8IS0tIGdldCB0aGUgbXV0ZXggLS0+DQotICAgICAgICA8dGhyZWFkczpzeW5jaHJvbml6ZSBtdXRleD0iJHttdXRleH0iPg0KLQ0KLSAgICAgICAgICAgIDx3aGl0ZXNwYWNlPg0KLSAgICAgICAgICAgICAgICBbdGhyZWFkMl06IG1ha2luZyB0aGUgb3RoZXIgdGhyZWFkIHdhaXQgZm9yIDIgc2Vjcw0KLSAgICAgICAgICAgIDwvd2hpdGVzcGFjZT4NCi0NCi0gICAgICAgICAgICA8IS0tIG1ha2UgdGhlIG90aGVyIHRocmVhZCB3YWl0IC0tPg0KLSAgICAgICAgICAgIDx0aHJlYWRzOnNsZWVwIGZvcj0iMjAwMCIvPg0KLSAgICAgICAgPC90aHJlYWRzOnN5bmNocm9uaXplPg0KLSAgICA8L3RocmVhZHM6dGhyZWFkPg0KLQ0KLSAgICA8d2hpdGVzcGFjZT4NCi0gICAgICAgIFttYWluXTogd2FpdGluZyBmb3IgdGhyZWFkcyB0byBmaW5pc2gNCi0gICAgPC93aGl0ZXNwYWNlPg0KLQ0KLSAgICA8dGhyZWFkczpqb2luIHRocmVhZD0iJHt0aHJlYWQxfSIvPg0KLQ0KLSAgICA8d2hpdGVzcGFjZT4NCi0gICAgICAgIFttYWluXTogdGhyZWFkcyBhcmUgbm93IGRvbmUNCi0gICAgPC93aGl0ZXNwYWNlPg0KLQ0KLTwvamVsbHk+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy90aHJlYWRzL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90aHJlYWRzL3dhaXQxLmplbGx5IGIvamVsbHktdGFncy90aHJlYWRzL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90aHJlYWRzL3dhaXQxLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTA1ZjlkLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdGhyZWFkcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGhyZWFkcy93YWl0MS5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotDQotPCEtLQ0KLVRoaXMgdGVzdCBzaG93cyBjb29yZGluYXRpbmcgYmV0d2VlbiAyIHRocmVhZHMgdXNpbmcNCi1tdXRleGVzIHdpdGggd2FpdC9ub3RpZnkuIE51bWJlcnMgYmV0d2VlbiB0aHJlYWRzDQotc2hvdWxkIGluY3JlbWVudCB0b2dldGhlci4NCi0tLT4NCi0NCi08amVsbHkgeG1sbnM9ImplbGx5OmNvcmUiIHhtbG5zOnRocmVhZHM9ImplbGx5OnRocmVhZHMiPg0KLQ0KLSAgICA8IS0tIGdldCB0aGUgbXV0ZXggLS0+DQotICAgIDx0aHJlYWRzOm11dGV4IHZhcj0ibXV0ZXgiLz4NCi0NCi0gICAgPHRocmVhZHM6dGhyZWFkIHZhcj0idGhyZWFkMSI+DQotICAgICAgICA8c2V0IHZhcj0iY291bnRlcjEiIHZhbHVlPSIwIi8+DQotDQotICAgICAgICA8IS0tIGdldCB0aGUgbXV0ZXggLS0+DQotICAgICAgICA8dGhyZWFkczpzeW5jaHJvbml6ZSBtdXRleD0iJHttdXRleH0iPg0KLSAgICAgICAgICAgIDwhLS0gbG9vcCAtLT4NCi0gICAgICAgICAgICA8d2hpbGUgdGVzdD0iJHtjb3VudGVyMSAhPSAyMH0iPg0KLQ0KLTx3aGl0ZXNwYWNlPg0KLWNvdW50ZXIxOiAke2NvdW50ZXIxfQ0KLTwvd2hpdGVzcGFjZT4NCi0NCi0gICAgICAgICAgICAgICAgPHNldCB2YXI9ImNvdW50ZXIxIiB2YWx1ZT0iJHtjb3VudGVyMSsxfSIvPg0KLQ0KLSAgICAgICAgICAgICAgICA8IS0tIGxldCB0aGUgb3RoZXIgdGhyZWFkIHByb2NlZWQgLS0+DQotICAgICAgICAgICAgICAgIDx0aHJlYWRzOm5vdGlmeSBtdXRleD0iJHttdXRleH0iLz4NCi0NCi0gICAgICAgICAgICAgICAgPCEtLSB3YWl0IGZvciAxIGl0ZXJhdGlvbiBvZiB0aGUgb3RoZXIgdGhyZWFkIC0tPg0KLSAgICAgICAgICAgICAgICA8dGhyZWFkczp3YWl0IG11dGV4PSIke211dGV4fSIvPg0KLSAgICAgICAgICAgIDwvd2hpbGU+DQotDQotICAgICAgICAgICAgPCEtLSBsZXQgdGhlIG90aGVyIHRocmVhZCBwcm9jZWVkIC0tPg0KLSAgICAgICAgICAgIDx0aHJlYWRzOm5vdGlmeSBtdXRleD0iJHttdXRleH0iLz4NCi0NCi0gICAgICAgIDwvdGhyZWFkczpzeW5jaHJvbml6ZT4NCi0gICAgPC90aHJlYWRzOnRocmVhZD4NCi0NCi0gICAgPHRocmVhZHM6dGhyZWFkIHZhcj0idGhyZWFkMiI+DQotICAgICAgICA8c2V0IHZhcj0iY291bnRlcjIiIHZhbHVlPSIwIi8+DQotICAgICAgICA8dGhyZWFkczpzbGVlcCBmb3I9IjEwMCIvPg0KLSAgICAgICAgPCEtLSBnZXQgdGhlIG11dGV4IC0tPg0KLSAgICAgICAgPHRocmVhZHM6c3luY2hyb25pemUgbXV0ZXg9IiR7bXV0ZXh9Ij4NCi0gICAgICAgICAgICA8IS0tIGxvb3AgLS0+DQotICAgICAgICAgICAgPHdoaWxlIHRlc3Q9IiR7Y291bnRlcjIgIT0gMjB9Ij4NCi0NCi08d2hpdGVzcGFjZT4NCi1jb3VudGVyMjogJHtjb3VudGVyMn0NCi08L3doaXRlc3BhY2U+DQotDQotICAgICAgICAgICAgICAgIDxzZXQgdmFyPSJjb3VudGVyMiIgdmFsdWU9IiR7Y291bnRlcjIrMX0iLz4NCi0NCi0gICAgICAgICAgICAgICAgPCEtLSBsZXQgdGhlIG90aGVyIHRocmVhZCBwcm9jZWVkIC0tPg0KLSAgICAgICAgICAgICAgICA8dGhyZWFkczpub3RpZnkgbXV0ZXg9IiR7bXV0ZXh9Ii8+DQotDQotICAgICAgICAgICAgICAgIDwhLS0gd2FpdCBmb3IgMSBpdGVyYXRpb24gb2YgdGhlIG90aGVyIHRocmVhZCAtLT4NCi0gICAgICAgICAgICAgICAgPHRocmVhZHM6d2FpdCBtdXRleD0iJHttdXRleH0iLz4NCi0gICAgICAgICAgICA8L3doaWxlPg0KLQ0KLSAgICAgICAgICAgIDwhLS0gbGV0IHRoZSBvdGhlciB0aHJlYWQgcHJvY2VlZCAtLT4NCi0gICAgICAgICAgICA8dGhyZWFkczpub3RpZnkgbXV0ZXg9IiR7bXV0ZXh9Ii8+DQotDQotICAgICAgICA8L3RocmVhZHM6c3luY2hyb25pemU+DQotICAgIDwvdGhyZWFkczp0aHJlYWQ+DQotDQotPHdoaXRlc3BhY2U+DQotW21haW5dOiB3YWl0aW5nIGZvciB0aHJlYWRzIHRvIGZpbmlzaA0KLTwvd2hpdGVzcGFjZT4NCi0NCi0gICAgPHRocmVhZHM6am9pbiB0aHJlYWQ9IiR7dGhyZWFkMX0iLz4NCi0gICAgPHRocmVhZHM6am9pbiB0aHJlYWQ9IiR7dGhyZWFkMn0iLz4NCi0NCi08d2hpdGVzcGFjZT4NCi1bbWFpbl06IHRocmVhZHMgYXJlIG5vdyBkb25lDQotPC93aGl0ZXNwYWNlPg0KLQ0KLTwvamVsbHk+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy90aHJlYWRzL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90aHJlYWRzL3dhaXQyLmplbGx5IGIvamVsbHktdGFncy90aHJlYWRzL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90aHJlYWRzL3dhaXQyLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjRjOWYzLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdGhyZWFkcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGhyZWFkcy93YWl0Mi5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotDQotPCEtLQ0KLVRoaXMgdGVzdCBzaG93cyBjb29yZGluYXRpbmcgYmV0d2VlbiAyIHRocmVhZHMgdXNpbmcNCi1tdXRleGVzIHdpdGggd2FpdC9ub3RpZnkuIE51bWJlcnMgYmV0d2VlbiB0aHJlYWRzDQotc2hvdWxkIGluY3JlbWVudCB0b2dldGhlci4NCi0tLT4NCi0NCi08amVsbHkgeG1sbnM9ImplbGx5OmNvcmUiIHhtbG5zOnRocmVhZHM9ImplbGx5OnRocmVhZHMiPg0KLSAgICA8dGhyZWFkczp0aHJlYWQgdmFyPSJ0aHJlYWQxIj4NCi0NCi0gICAgICAgIDx3aGl0ZXNwYWNlPg0KLSAgICAgICAgdGhyZWFkMTogZ29pbmcgdG8gc2xlZXAgZm9yIDIgc2Vjb25kcw0KLSAgICAgICAgPC93aGl0ZXNwYWNlPg0KLQ0KLSAgICAgICAgPHRocmVhZHM6c2xlZXAgZm9yPSIyMDAwIi8+DQotICAgIDwvdGhyZWFkczp0aHJlYWQ+DQotDQotICAgIDx0aHJlYWRzOnRocmVhZCB2YXI9InRocmVhZDIiPg0KLSAgICAgICAgPHRocmVhZHM6d2FpdGZvciB0aHJlYWQ9IiR7dGhyZWFkMX0iLz4NCi0NCi0gICAgICAgIDx3aGl0ZXNwYWNlPg0KLSAgICAgICAgdGhyZWFkMjogZmluaXNoZWQgd2FpdGluZyBmb3IgdGhyZWFkMSwgc2xlZXBpbmcgZm9yIDIgc2Vjb25kcw0KLSAgICAgICAgPC93aGl0ZXNwYWNlPg0KLQ0KLSAgICAgICAgPHRocmVhZHM6c2xlZXAgZm9yPSIxMDAwIi8+DQotICAgIDwvdGhyZWFkczp0aHJlYWQ+DQotDQotICAgIDx0aHJlYWRzOnRocmVhZD4NCi0gICAgICAgIDx0aHJlYWRzOndhaXRmb3IgdGhyZWFkPSIke3RocmVhZDF9Ii8+DQotDQotICAgICAgICA8d2hpdGVzcGFjZT4NCi0gICAgICAgIHRocmVhZDM6IGZpbmlzaGVkIHdhaXRpbmcgZm9yIHRocmVhZDENCi0gICAgICAgIDwvd2hpdGVzcGFjZT4NCi0NCi0gICAgPC90aHJlYWRzOnRocmVhZD4NCi0NCi0gICAgPHRocmVhZHM6dGhyZWFkPg0KLSAgICAgICAgPHRocmVhZHM6d2FpdGZvciB0aHJlYWQ9IiR7dGhyZWFkMn0iLz4NCi0NCi0gICAgICAgIDx3aGl0ZXNwYWNlPg0KLSAgICAgICAgdGhyZWFkNDogZmluaXNoZWQgd2FpdGluZyBmb3IgdGhyZWFkMg0KLSAgICAgICAgPC93aGl0ZXNwYWNlPg0KLQ0KLSAgICA8L3RocmVhZHM6dGhyZWFkPg0KLTwvamVsbHk+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy90aHJlYWRzL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90aHJlYWRzL3dhaXQzLmplbGx5IGIvamVsbHktdGFncy90aHJlYWRzL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90aHJlYWRzL3dhaXQzLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTQ0Y2E4Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdGhyZWFkcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGhyZWFkcy93YWl0My5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotDQotPCEtLQ0KLVRoaXMgdGVzdCBzaG93cyBob3cgdGhlIHdhaXRGb3IgdGFnIHdvcmtzLg0KLS0tPg0KLQ0KLTxqZWxseSB4bWxucz0iamVsbHk6Y29yZSIgeG1sbnM6dGhyZWFkcz0iamVsbHk6dGhyZWFkcyI+DQotICAgIDx0aHJlYWRzOnRocmVhZCB2YXI9InRocmVhZDEiPg0KLQ0KLSAgICAgICAgPHdoaXRlc3BhY2U+DQotICAgICAgICB0aHJlYWQxOiBnb2luZyB0byBzbGVlcCBmb3IgMiBzZWNvbmRzDQotICAgICAgICA8L3doaXRlc3BhY2U+DQotDQotICAgICAgICA8dGhyZWFkczpzbGVlcCBmb3I9IjIwMDAiLz4NCi0gICAgPC90aHJlYWRzOnRocmVhZD4NCi0NCi0gICAgPHRocmVhZHM6dGhyZWFkIHZhcj0idGhyZWFkMiI+DQotICAgICAgICA8d2hpdGVzcGFjZT4NCi0gICAgICAgIHRocmVhZDI6IHdhaXRpbmcgZm9yIHRocmVhZDEgZm9yIDEgc2Vjb25kDQotICAgICAgICA8L3doaXRlc3BhY2U+DQotDQotICAgICAgICA8IS0tIHRoaXMgdGhyZWFkIHdpbGwgYmUgbWFya2VkIGFzIGF2b2lkZWQgLS0+DQotICAgICAgICA8dGhyZWFkczp3YWl0Zm9yIHRocmVhZD0iJHt0aHJlYWQxfSIgb25seVdhaXQ9IjEwMDAiLz4NCi0NCi0gICAgICAgIDx3aGl0ZXNwYWNlPg0KLSAgICAgICAgdGhyZWFkMjogZmluaXNoZWQgd2FpdGluZyBmb3IgdGhyZWFkMQ0KLSAgICAgICAgPC93aGl0ZXNwYWNlPg0KLQ0KLSAgICAgICAgPHRocmVhZHM6c2xlZXAgZm9yPSIxMDAwIi8+DQotICAgIDwvdGhyZWFkczp0aHJlYWQ+DQotDQotICAgIDx0aHJlYWRzOnRocmVhZD4NCi0gICAgICAgIDwhLS0gd2FpdCBmb3IgdGhyZWFkMidzIGF2b2lkZWQgc3RhdHVzIC0tPg0KLSAgICAgICAgPHRocmVhZHM6d2FpdGZvciB0aHJlYWQ9IiR7dGhyZWFkMn0iIHN0YXR1cz0iQVZPSURFRCIvPg0KLQ0KLSAgICAgICAgPHdoaXRlc3BhY2U+DQotICAgICAgICB0aHJlYWQzOiBmaW5pc2hlZCB3YWl0aW5nIGZvciB0aHJlYWQyIGF2b2lkZWQgc3RhdHVzDQotICAgICAgICA8L3doaXRlc3BhY2U+DQotDQotICAgIDwvdGhyZWFkczp0aHJlYWQ+DQotDQotICAgIDx0aHJlYWRzOnRocmVhZCB2YXI9InRocmVhZDQiPg0KLSAgICAgICAgPCEtLSB3YWl0IGZvciB0aGUgdGhyZWFkMidzIHN1Y2Nlc3MgLS0+DQotICAgICAgICA8dGhyZWFkczp3YWl0Zm9yIHRocmVhZD0iJHt0aHJlYWQyfSIgc3RhdHVzPSJTVUNDRVNTIi8+DQotDQotICAgICAgICA8d2hpdGVzcGFjZT4NCi0gICAgICAgIHRocmVhZDQ6IGZpbmlzaGVkIHdhaXRpbmcgZm9yIHRocmVhZDIgc3VjY2VzcyBzdGF0dXMNCi0gICAgICAgIDwvd2hpdGVzcGFjZT4NCi0NCi0gICAgPC90aHJlYWRzOnRocmVhZD4NCi0NCi0gICAgPHRocmVhZHM6dGhyZWFkPg0KLSAgICAgICAgPCEtLSB3YWl0IGZvciB0aGUgdGhyZWFkMidzIHN1Y2Nlc3MgLS0+DQotICAgICAgICA8dGhyZWFkczp3YWl0Zm9yIHRocmVhZD0iJHt0aHJlYWQ0fSIgc3RhdHVzPSJBVk9JREVEIi8+DQotDQotICAgICAgICA8d2hpdGVzcGFjZT4NCi0gICAgICAgIHRocmVhZDY6IGZpbmlzaGVkIHdhaXRpbmcgZm9yIHRocmVhZDQgYXZvaWRlZCBzdGF0dXMNCi0gICAgICAgIDwvd2hpdGVzcGFjZT4NCi0NCi0gICAgPC90aHJlYWRzOnRocmVhZD4NCi0NCi0gPC9qZWxseT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3RocmVhZHMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RocmVhZHMvd2FpdDQuamVsbHkgYi9qZWxseS10YWdzL3RocmVhZHMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RocmVhZHMvd2FpdDQuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZDA4ODQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy90aHJlYWRzL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90aHJlYWRzL3dhaXQ0LmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0NCi08IS0tDQotVGhpcyB0ZXN0IHNob3dzIHRoZSB3YWl0Rm9yIHRhZyB3YWl0aW5nIGZvciBtdWx0aXBsZSB0aHJlYWRzLiANCi0tLT4NCi0NCi08amVsbHkgeG1sbnM9ImplbGx5OmNvcmUiIHhtbG5zOnRocmVhZHM9ImplbGx5OnRocmVhZHMiPg0KLSAgICA8dGhyZWFkczp0aHJlYWQgdmFyPSJ0aHJlYWQxIj4NCi0gICAgICAgIDx3aGl0ZXNwYWNlPg0KLSAgICAgICAgdGhyZWFkMTogZ29pbmcgdG8gc2xlZXAgZm9yIDEgc2Vjb25kDQotICAgICAgICA8L3doaXRlc3BhY2U+DQotICAgICAgICA8dGhyZWFkczpzbGVlcCBmb3I9IjEwMDAiLz4NCi0gICAgPC90aHJlYWRzOnRocmVhZD4NCi0NCi0gICAgPHRocmVhZHM6dGhyZWFkIHZhcj0idGhyZWFkMiI+DQotICAgICAgICA8d2hpdGVzcGFjZT4NCi0gICAgICAgIHRocmVhZDI6IGdvaW5nIHRvIHNsZWVwIGZvciAyIHNlY29uZHMNCi0gICAgICAgIDwvd2hpdGVzcGFjZT4NCi0gICAgICAgIDx0aHJlYWRzOnNsZWVwIGZvcj0iMjAwMCIvPg0KLSAgICA8L3RocmVhZHM6dGhyZWFkPg0KLQ0KLSAgICA8IS0tIHJlc3VsdHMgaW4gYSBGQUlMVVJFIC0tPg0KLSAgICA8dGhyZWFkczp0aHJlYWQgdmFyPSJ0aHJlYWQzIj4NCi0gICAgICAgICAgICA8bmV3IHZhcj0iYm9ndXMiIGNsYXNzTmFtZT0iamF2YS5sYW5nLlN5c3RlbSIvPg0KLSAgICA8L3RocmVhZHM6dGhyZWFkPg0KLQ0KLSAgICA8IS0tIHdhaXRzIGZvciB0aHJlYWQgMSBhbmQgMiAtLT4NCi0gICAgPHRocmVhZHM6dGhyZWFkPg0KLSAgICAgICAgPHRocmVhZHM6d2FpdGZvciB0aHJlYWQ9IiR7dGhyZWFkMX0iIHN0YXR1cz0iU1VDQ0VTUyIvPg0KLSAgICAgICAgPHRocmVhZHM6d2FpdGZvciB0aHJlYWQ9IiR7dGhyZWFkMn0iIHN0YXR1cz0iU1VDQ0VTUyIvPg0KLQ0KLSAgICAgICAgPHdoaXRlc3BhY2U+DQotICAgICAgICB0aHJlYWQ0OiBmaW5pc2hlZCB3YWl0aW5nIGZvciB0aHJlYWQxIGFuZCB0aHJlYWQyDQotICAgICAgICA8L3doaXRlc3BhY2U+DQotICAgIDwvdGhyZWFkczp0aHJlYWQ+DQotDQotICAgIDwhLS0gd2FpdHMgZm9yIHRocmVhZCAzIHN1Y2Nlc3MgLS0+DQotICAgIDx0aHJlYWRzOnRocmVhZD4NCi0gICAgICAgIDx0aHJlYWRzOndhaXRmb3IgdGhyZWFkPSIke3RocmVhZDF9IiBzdGF0dXM9IlNVQ0NFU1MiLz4NCi0gICAgICAgIDx0aHJlYWRzOndhaXRmb3IgdGhyZWFkPSIke3RocmVhZDJ9IiBzdGF0dXM9IlNVQ0NFU1MiLz4NCi0gICAgICAgIDx0aHJlYWRzOndhaXRmb3IgdGhyZWFkPSIke3RocmVhZDN9IiBzdGF0dXM9IlNVQ0NFU1MiLz4NCi0NCi0gICAgICAgIDx3aGl0ZXNwYWNlPg0KLSAgICAgICAgdGhyZWFkNTogZmluaXNoZWQgd2FpdGluZyBmb3IgdGhyZWFkMSBhbmQgdGhyZWFkMiBhbmQgdGhyZWFkMyBzdWNjZXNzDQotICAgICAgICA8L3doaXRlc3BhY2U+DQotICAgIDwvdGhyZWFkczp0aHJlYWQ+DQotDQotICAgIDwhLS0gd2FpdHMgZm9yIHRocmVhZCAzIGZhaWx1cmUgLS0+DQotICAgIDx0aHJlYWRzOnRocmVhZD4NCi0gICAgICAgIDx0aHJlYWRzOndhaXRmb3IgdGhyZWFkPSIke3RocmVhZDF9IiBzdGF0dXM9IlNVQ0NFU1MiLz4NCi0gICAgICAgIDx0aHJlYWRzOndhaXRmb3IgdGhyZWFkPSIke3RocmVhZDJ9IiBzdGF0dXM9IlNVQ0NFU1MiLz4NCi0gICAgICAgIDx0aHJlYWRzOndhaXRmb3IgdGhyZWFkPSIke3RocmVhZDN9IiBzdGF0dXM9IkZBSUxVUkUiLz4NCi0NCi0gICAgICAgIDx3aGl0ZXNwYWNlPg0KLSAgICAgICAgdGhyZWFkNjogZmluaXNoZWQgd2FpdGluZyBmb3IgdGhyZWFkMSBhbmQgdGhyZWFkMiBhbmQgdGhyZWFkMyBmYWlsdXJlDQotICAgICAgICA8L3doaXRlc3BhY2U+DQotICAgIDwvdGhyZWFkczp0aHJlYWQ+DQotDQotIDwvamVsbHk+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy90aHJlYWRzL3hkb2NzL2NoYW5nZXMueG1sIGIvamVsbHktdGFncy90aHJlYWRzL3hkb2NzL2NoYW5nZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTQ0MDgxLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdGhyZWFkcy94ZG9jcy9jaGFuZ2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0gLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkNoYW5nZXM8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLSAgPGJvZHk+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4wIiBkYXRlPSIyMDA0LTA5LTEyIj4KLSAgICA8L3JlbGVhc2U+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3RocmVhZHMveGRvY3MvaW5kZXgueG1sIGIvamVsbHktdGFncy90aHJlYWRzL3hkb2NzL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEzY2I1Yy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3RocmVhZHMveGRvY3MvaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+VGhyZWFkcyBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotICAgIDxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KLSAgICAgIDxwPgotICAgICAgICBBIGxpYnJhcnkgZm9yIHByb2Nlc3NpbmcgSmVsbHkgc2NyaXB0cyB1c2luZyBtdWx0aXBsZSB0aHJlYWRzLgotICAgICAgICAgIFNlZSB0aGUgPGEgaHJlZj0idGFncy5odG1sIj50YWdzPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvdGhyZWFkcy94ZG9jcy9uYXZpZ2F0aW9uLnhtbCBiL2plbGx5LXRhZ3MvdGhyZWFkcy94ZG9jcy9uYXZpZ2F0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmMDhiNi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3RocmVhZHMveGRvY3MvbmF2aWdhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IG5hbWU9IlRocmVhZHMgVGFnIExpYnJhcnkiPgotCi0gIDx0aXRsZT5UaHJlYWRzIFRhZyBMaWJyYXJ5PC90aXRsZT4KLSAgCi0gIDxib2R5PgotICAgIDxtZW51IG5hbWU9IlRocmVhZHMgVGFnIExpYnJhcnkiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgICAgICAgICAgIGhyZWY9Ii9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJUYWdzIiAgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZ3MuaHRtbCIvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy91dGlsLy5jdnNpZ25vcmUgYi9qZWxseS10YWdzL3V0aWwvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRkMzFmNy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3V0aWwvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotbWF2ZW4ubG9nCi10YXJnZXQKLXZlbG9jaXR5LmxvZwpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy91dGlsL2J1aWxkLnhtbCBiL2plbGx5LXRhZ3MvdXRpbC9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYmZkZWQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy91dGlsL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tYnVpbGQueG1sIGdlbmVyYXRlZCBieSBtYXZlbiBmcm9tIHByb2plY3QueG1sIHZlcnNpb24gMS4wLVNOQVBTSE9UCi0gIG9uIGRhdGUgTWF5IDI0IDIwMDQsIHRpbWUgMjMwMC0tPgotPHByb2plY3QgZGVmYXVsdD0iamFyIiBuYW1lPSJjb21tb25zLWplbGx5LXRhZ3MtdXRpbCIgYmFzZWRpcj0iLiI+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkZWZhdWx0dGFyZ2V0ZGlyIiB2YWx1ZT0idGFyZ2V0Ij4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYmRpciIgdmFsdWU9InRhcmdldC9saWIiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC9jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cmVwb3J0ZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtcmVwb3J0cyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0ZGlyIiB2YWx1ZT0iZGlzdCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jZGlyIiB2YWx1ZT0iZGlzdC9kb2NzL2FwaSI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJmaW5hbC5uYW1lIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLXV0aWwtMS4wLVNOQVBTSE9UIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0ibyBJbml0aWFsaXplcyBzb21lIHByb3BlcnRpZXMiPgotICAgIDxta2RpciBkaXI9IiR7bGliZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJub2dldCI+Ci0gICAgICA8ZXF1YWxzIGFyZzI9Im9ubHkiIGFyZzE9IiR7YnVpbGQuc3lzY2xhc3NwYXRofSI+Ci0gICAgICA8L2VxdWFscz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249Im8gQ29tcGlsZSB0aGUgY29kZSIgZGVwZW5kcz0iZ2V0LWRlcHMiPgotICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7Y2xhc3Nlc2Rpcn0iIGRlcHJlY2F0aW9uPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSIgb3B0aW1pemU9ImZhbHNlIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIj4KLSAgICAgIDxzcmM+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL2phdmEiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9zcmM+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgICA8Y29weSB0b2Rpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy9qYXZhIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgICA8Y29weSB0b2Rpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamVsbHkiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhzbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5ybmciPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouZHRkIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouaHRtbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphciIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIHRoZSBqYXIiIGRlcGVuZHM9ImNvbXBpbGUsdGVzdCI+Ci0gICAgPGphciBqYXJmaWxlPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiIGJhc2VkaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgIDwvamFyPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249Im8gQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBkaXJlY3RvcmllcyI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iPgotICAgIDwvZGVsZXRlPgotICAgIDxkZWxldGUgZGlyPSIke2Rpc3RkaXJ9Ij4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIGEgZGlzdHJpYnV0aW9uIiBkZXBlbmRzPSJqYXIsIGphdmFkb2MiPgotICAgIDxta2RpciBkaXI9ImRpc3QiPgotICAgIDwvbWtkaXI+Ci0gICAgPGNvcHkgdG9kaXI9ImRpc3QiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2RlZmF1bHR0YXJnZXRkaXJ9IiBpbmNsdWRlcz0iKi5qYXIiPgotICAgICAgPC9maWxlc2V0PgotICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRlcz0iTElDRU5TRSosIFJFQURNRSoiPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249Im8gUnVuIHRoZSB0ZXN0IGNhc2VzIiBpZj0idGVzdC5mYWlsdXJlIiBkZXBlbmRzPSJpbnRlcm5hbC10ZXN0Ij4KLSAgICA8ZmFpbCBtZXNzYWdlPSJUaGVyZSB3ZXJlIHRlc3QgZmFpbHVyZXMuIj4KLSAgICA8L2ZhaWw+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImludGVybmFsLXRlc3QiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdHMiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdHJlcG9ydGRpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGp1bml0IGRpcj0iLi8iIGZhaWx1cmVwcm9wZXJ0eT0idGVzdC5mYWlsdXJlIiBwcmludFN1bW1hcnk9InllcyIgZm9yaz0idHJ1ZSIgaGFsdG9uZXJyb3I9InRydWUiPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYmFzZWRpciIgdmFsdWU9Ii4iPgotICAgICAgPC9zeXNwcm9wZXJ0eT4KLSAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIj4KLSAgICAgIDwvZm9ybWF0dGVyPgotICAgICAgPGZvcm1hdHRlciB1c2VmaWxlPSJmYWxzZSIgdHlwZT0icGxhaW4iPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdHJlcG9ydGRpcn0iPgotICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9UZXN0Ki5qYXZhIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvYmF0Y2h0ZXN0PgotICAgIDwvanVuaXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtdGVzdHMiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqYXZhYyBkZXN0ZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvdGVzdCI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MiIGRlc2NyaXB0aW9uPSJvIEdlbmVyYXRlIGphdmFkb2MiIGRlcGVuZHM9ImphciI+Ci0gICAgPG1rZGlyIGRpcj0iJHtqYXZhZG9jZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8dHN0YW1wPgotICAgICAgPGZvcm1hdCBwYXR0ZXJuPSIyMDAyLXl5eXkiIHByb3BlcnR5PSJ5ZWFyIj4KLSAgICAgIDwvZm9ybWF0PgotICAgIDwvdHN0YW1wPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb3B5cmlnaHQiIHZhbHVlPSJDb3B5cmlnaHQgJmFtcDtjb3B5OyAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSIgdmFsdWU9ImNvbW1vbnMtamVsbHktdGFncy11dGlsIDEuMC1TTkFQU0hPVCBBUEkiPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPGphdmFkb2MgdXNlPSJ0cnVlIiBwcml2YXRlPSJ0cnVlIiBkZXN0ZGlyPSIke2phdmFkb2NkaXJ9IiBhdXRob3I9InRydWUiIHZlcnNpb249InRydWUiIHNvdXJjZXBhdGg9InNyYy9qYXZhIiBwYWNrYWdlbmFtZXM9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnV0aWwuKiI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFkb2M+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImdldC1kZXBzIiB1bmxlc3M9Im5vZ2V0IiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktdGFncy1qdW5pdC1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktdGFncy1qdW5pdC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamV4bC1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZXhsL2phcnMvY29tbW9ucy1qZXhsLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veG1sLWFwaXMtMS4wLmIyLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94bWwtYXBpcy9qYXJzL3htbC1hcGlzLTEuMC5iMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtYmVhbnV0aWxzLTEuNi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1iZWFudXRpbHMvamFycy9jb21tb25zLWJlYW51dGlscy0xLjYuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1jb2xsZWN0aW9ucy9qYXJzL2NvbW1vbnMtY29sbGVjdGlvbnMtMi4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWxvZ2dpbmcvamFycy9jb21tb25zLWxvZ2dpbmctMS4wLjMuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9kb200ai0xLjUtYmV0YS0yLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9kb200ai9qYXJzL2RvbTRqLTEuNS1iZXRhLTIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qYXhlbi0xLjEtYmV0YS0yLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qYXhlbi9qYXJzL2pheGVuLTEuMS1iZXRhLTIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS94ZXJjZXMtMi4yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3hlcmNlcy9qYXJzL3hlcmNlcy0yLjIuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2p1bml0LTMuOC4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qdW5pdC9qYXJzL2p1bml0LTMuOC4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vYW50LTEuNS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vYW50L2phcnMvYW50LTEuNS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FudC1vcHRpb25hbC0xLjUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC1vcHRpb25hbC0xLjUuamFyIj4KLSAgICA8L2dldD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iaW5zdGFsbC1tYXZlbiI+Ci0gICAgPGdldCBkZXN0PSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIHNyYz0iJHtyZXBvfS9tYXZlbi9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDx1bmphciBkZXN0PSIke21hdmVuLmhvbWV9IiBzcmM9IiR7dXNlci5ob21lfS9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiPgotICAgIDwvdW5qYXI+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvdXRpbC9tYXZlbi54bWwgYi9qZWxseS10YWdzL3V0aWwvbWF2ZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDk0Mjc5Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdXRpbC9tYXZlbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXZhOmphciIgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM6bWF2ZW49ImplbGx5Om1hdmVuIiB4bWxuczp1dGlsPSJqZWxseTp1dGlsIj4KLQotICA8IS0tIGNvcGllcyB1bml0IHRlc3Rpbmcgc3R1ZmYgLS0+Ci0gIDxwb3N0R29hbCBuYW1lPSJ0ZXN0OmNvbXBpbGUiPgotICAgIDxjb3B5IHRvZGlyPSIke21hdmVuLnRlc3QuZGVzdH0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy8qIi8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamVsbHkiLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5odG1sIi8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouZHRkIi8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucm5nIi8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3Bvc3RHb2FsPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3V0aWwvcHJvamVjdC5wcm9wZXJ0aWVzIGIvamVsbHktdGFncy91dGlsL3Byb2plY3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzljMWI2MS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3V0aWwvcHJvamVjdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCi0jIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQIFIgTyBKIEUgQyBUICBQIFIgTyBQIEUgUiBUIEkgRSBTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvdXRpbC9wcm9qZWN0LnhtbCBiL2plbGx5LXRhZ3MvdXRpbC9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBiYWNhMy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3V0aWwvcHJvamVjdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3Q+Ci0gIDxleHRlbmQ+JHtiYXNlZGlyfS8uLi90YWctcHJvamVjdC54bWw8L2V4dGVuZD4KLSAgPGlkPmNvbW1vbnMtamVsbHktdGFncy11dGlsPC9pZD4KLSAgPG5hbWU+Y29tbW9ucy1qZWxseS10YWdzLXV0aWw8L25hbWU+Ci0gIDxjdXJyZW50VmVyc2lvbj4xLjEuMTwvY3VycmVudFZlcnNpb24+Ci0gIDxwYWNrYWdlPm9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnV0aWw8L3BhY2thZ2U+Ci0gIDxkZXNjcmlwdGlvbj5UaGlzIGlzIGEgc2V0IG9mIEplbGx5IHV0aWxpdHkgdGFncy48L2Rlc2NyaXB0aW9uPgotICA8c2hvcnREZXNjcmlwdGlvbj5Db21tb25zIEplbGx5IFV0aWwgVGFnIExpYnJhcnk8L3Nob3J0RGVzY3JpcHRpb24+Ci0gIDx2ZXJzaW9ucz4KLSAgICA8dmVyc2lvbj4KLSAgICAgIDxpZD4xLjA8L2lkPgotICAgICAgPG5hbWU+MS4wPC9uYW1lPgotICAgICAgPHRhZz5DT01NT05TX0pFTExZX1VUSUwtMV8wPC90YWc+Ci0gICAgPC92ZXJzaW9uPgotICAgIDx2ZXJzaW9uPgotICAgICAgPGlkPjEuMTwvaWQ+Ci0gICAgICA8bmFtZT4xLjE8L25hbWU+Ci0gICAgICA8dGFnPkNPTU1PTlNfSkVMTFktVVRJTC0xXzE8L3RhZz4KLSAgICA8L3ZlcnNpb24+Ci0gICAgPHZlcnNpb24+Ci0gICAgICA8aWQ+MS4xLjE8L2lkPgotICAgICAgPG5hbWU+MS4xLjE8L25hbWU+Ci0gICAgICA8dGFnPkNPTU1PTlNfSkVMTFlfVVRJTC0xXzFfMTwvdGFnPgotICAgIDwvdmVyc2lvbj4KLSAgPC92ZXJzaW9ucz4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8IS0tIFNUQVJUIGZvciBjb21waWxhdGlvbiAtLT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5jb21tb25zLWxhbmc8L2lkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8IS0tIEVORCBmb3IgY29tcGlsYXRpb24gLS0+Ci0gICAgPCEtLSBTVEFSVCBmb3IgdGVzdCAtLT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1qZWxseTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtamVsbHktdGFncy1qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgIDx1cmw+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvPC91cmw+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDwhLS0gRU5EIGZvciB0ZXN0IC0tPgotCi0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy91dGlsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3V0aWwvQXZhaWxhYmxlVGFnLmphdmEgYi9qZWxseS10YWdzL3V0aWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdXRpbC9BdmFpbGFibGVUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI2NjA3My4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3V0aWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdXRpbC9BdmFpbGFibGVUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKioKLSAqIEEgdGFnIHdoaWNoIGV2YWx1YXRlcyBpdHMgYm9keSBpZiB0aGUgZ2l2ZW4gZmlsZSBpcyBhdmFpbGFibGUuCi0gKiBUaGUgZmlsZSBjYW4gYmUgc3BlY2lmaWVkIHZpYSBhIEZpbGUgb2JqZWN0IG9yIHZpYSBhIHJlbGF0aXZlIG9yIGFic29sdXRlCi0gKiBVUkkgZnJvbSB0aGUgY3VycmVudCBKZWxseSBzY3JpcHQuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICovCi1wdWJsaWMgY2xhc3MgQXZhaWxhYmxlVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICBwcml2YXRlIEZpbGUgZmlsZTsKLSAgICBwcml2YXRlIFN0cmluZyB1cmk7Ci0KLSAgICBwdWJsaWMgQXZhaWxhYmxlVGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhmaW5hbCBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGF2YWlsYWJsZSA9IGZhbHNlOwotCi0gICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF2YWlsYWJsZSA9IGZpbGUuZXhpc3RzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodXJpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVVJMIHVybCA9IGNvbnRleHQuZ2V0UmVzb3VyY2UodXJpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSB1cmwuZ2V0RmlsZSgpOwotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBhdmFpbGFibGUgPSAoaXMgIT0gbnVsbCk7Ci0gICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgYXZhaWxhYmxlID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpbGUuCi0gICAgICogQHJldHVybiBGaWxlCi0gICAgICovCi0gICAgcHVibGljIEZpbGUgZ2V0RmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdXJpLgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRVcmkoKSB7Ci0gICAgICAgIHJldHVybiB1cmk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmlsZSB0byB1c2UgdG8gdGVzdCB3aGV0aGVyIGl0IGV4aXN0cyBvciBub3QuCi0gICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gdGVzdCBmb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZmlsZSkgewotICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIFVSSSB0byB1c2UgdG8gdGVzdCBmb3IgYXZhaWxhYmlsaXR5LgotICAgICAqIFRoZSBVUkkgY2FuIGJlIGEgZnVsbCBmaWxlIGJhc2VkIFVSTCBvciBhIHJlbGF0aXZlIFVSSQotICAgICAqIG9yIGFuIGFic29sdXRlIFVSSSBmcm9tIHRoZSByb290IGNvbnRleHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgb2YgdGhlIGZpbGUgdG8gdGVzdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVyaShTdHJpbmcgdXJpKSB7Ci0gICAgICAgIHRoaXMudXJpID0gdXJpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy91dGlsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3V0aWwvRmlsZVRhZy5qYXZhIGIvamVsbHktdGFncy91dGlsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3V0aWwvRmlsZVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZThlZDhmLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdXRpbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy91dGlsL0ZpbGVUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLS8qKgotICogQSB0YWcgd2hpY2ggY3JlYXRlcyBhIHtAbGluayBGaWxlfSBmcm9tIGEgZ2l2ZW4gbmFtZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS42ICQKLSAqLwotcHVibGljIGNsYXNzIEZpbGVUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgZmlsZSB0byBwbGFjZSBpbnRvIHRoZSBjb250ZXh0ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIC8qKiBUaGUgdmFyaWFibGUgbmFtZSB0byBwbGFjZSB0aGUgZmlsZSBpbnRvICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyOwotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKGZpbmFsIFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gYXZhaWxhYmxlID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oIm5hbWUgbXVzdCBiZSBzcGVjaWZpZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2YXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oInZhciBtdXN0IGJlIHNwZWNpZmllZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUobmFtZSk7Ci0gICAgICAgIGdldENvbnRleHQoKS5zZXRWYXJpYWJsZSh2YXIsIG5ld0ZpbGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgcGxhY2VkIGludG8gdGhlIGNvbnRleHQKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgZmlsZU5hbWUgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGNvbnRhaW4gdGhlIGZpbGUKLSAgICAgKiBAcGFyYW0gdmFyIFRoZSB2YXIgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3V0aWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdXRpbC9Mb2FkVGV4dFRhZy5qYXZhIGIvamVsbHktdGFncy91dGlsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3V0aWwvTG9hZFRleHRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVkZTY5Zi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3V0aWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdXRpbC9Mb2FkVGV4dFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIEEgdGFnIHdoaWNoIGxvYWRzIHRleHQgZnJvbSBhIGZpbGUgb3IgVVJJIGludG8gYSBKZWxseSB2YXJpYWJsZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2FkVGV4dFRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKExvYWRUZXh0VGFnLmNsYXNzKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHZhcjsKLSAgICBwcml2YXRlIEZpbGUgZmlsZTsKLSAgICBwcml2YXRlIFN0cmluZyB1cmk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2Rpbmc7Ci0KLSAgICBwdWJsaWMgTG9hZFRleHRUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh2YXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oInZhciIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmaWxlID09IG51bGwgJiYgdXJpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIlRoaXMgdGFnIG11c3QgaGF2ZSBhICdmaWxlJyBvciAndXJpJyBzcGVjaWZpZWQiICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCEgZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIlRoZSBmaWxlOiAiICsgZmlsZSArICIgZG9lcyBub3QgZXhpc3QiICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oImNvdWxkIG5vdCBmaW5kIHRoZSBmaWxlIixlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGluID0gY29udGV4dC5nZXRSZXNvdXJjZUFzU3RyZWFtKHVyaSk7Ci0gICAgICAgICAgICBpZiAoaW4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIkNvdWxkIG5vdCBmaW5kIHVyaTogIiArIHVyaSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgZW5jb2RpbmcpOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJ1bnN1cHBvcnRlZCBlbmNvZGluZyIsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHRleHQgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0ZXh0ID0gbG9hZFRleHQocmVhZGVyKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIHRleHQpOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHdoaWNoIHdpbGwgYmUgZXhwb3J0ZWQgd2l0aCB0aGUgdGV4dCB2YWx1ZSBvZiB0aGUKLSAgICAgKiBnaXZlbiBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0gICAgICAgIHRoaXMudmFyID0gdmFyOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaWxlLgotICAgICAqIEByZXR1cm4gRmlsZQotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHVyaS4KLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJpKCkgewotICAgICAgICByZXR1cm4gdXJpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhci4KLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFyKCkgewotICAgICAgICByZXR1cm4gdmFyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZpbGUgdG8gYmUgcGFyc2VkIGFzIHRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZmlsZSkgewotICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGVuY29kaW5nIHRvIHVzZSB0byByZWFkIHRoZSBmaWxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB7Ci0gICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB1cmkgdG8gYmUgcGFyc2VkIGFzIHRleHQuCi0gICAgICogVGhpcyBjYW4gYmUgYW4gYWJzb2x1dGUgVVJMIG9yIGEgcmVsYXRpdmUgb3IgYWJzb2x1dGUgVVJJCi0gICAgICogZnJvbSB0aGlzIEplbGx5IHNjcmlwdCBvciB0aGUgcm9vdCBjb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVyaShTdHJpbmcgdXJpKSB7Ci0gICAgICAgIHRoaXMudXJpID0gdXJpOwotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIHRoZSBlbmNvZGluZyBzZXQuCi0gICAgKiBAcmV0dXJuIHRoZSBlbmNvZGluZyBzZXQgd2l0aCB7QGxpbmsgI3NldEVuY29kaW5nKFN0cmluZyl9Ci0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0gICAgICAgIHJldHVybiBlbmNvZGluZzsKLSAgICB9Ci0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIExvYWRzIGFsbCB0aGUgdGV4dCBmcm9tIHRoZSBnaXZlbiBSZWFkZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGxvYWRUZXh0KFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgLy8gQHRvZG8gaXRzIHByb2JhYmx5IG1vcmUgZWZmaWNpZW50IHRvIHVzZSBhIGZpeGVkIGNoYXJbXSBidWZmZXIgaW5zdGVhZAotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnVmZmVyZWRSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIocmVhZGVyKTsKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBidWZmZXJlZFJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoICJDYXVnaHQgZXhjZXB0aW9uIGNsb3NpbmcgUmVhZGVyOiAiICsgZSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3V0aWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdXRpbC9Qcm9wZXJ0aWVzVGFnLmphdmEgYi9qZWxseS10YWdzL3V0aWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdXRpbC9Qcm9wZXJ0aWVzVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NjY2N2YuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy91dGlsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3V0aWwvUHJvcGVydGllc1RhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqCi0gKiBBIHRhZyB3aGljaCBsb2FkcyBhIHByb3BlcnRpZXMgZmlsZSBmcm9tIGEgZ2l2ZW4gZmlsZSBuYW1lIG9yIFVSSQotICogd2hpY2ggYXJlIGxvYWRlZCBpbnRvIHRoZSBjdXJyZW50IGNvbnRleHQuCi0gKgotICogQGF1dGhvciBKaW0gQmlyY2hmaWVsZAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjcgJAotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydGllc1RhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotICAgIHByaXZhdGUgU3RyaW5nIGZpbGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdXJpOwotICAgIHByaXZhdGUgU3RyaW5nIHZhcjsKLQotICAgIHB1YmxpYyBQcm9wZXJ0aWVzVGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhmaW5hbCBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAoZmlsZSA9PSBudWxsICYmIHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIlRoaXMgdGFnIG11c3QgZGVmaW5lIGEgJ2ZpbGUnIG9yICd1cmknIGF0dHJpYnV0ZSIpOwotICAgICAgICB9Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZmlsZSk7Ci0gICAgICAgICAgICBpZiAoIWYuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oImZpbGU6ICIgKyBmaWxlICsgIiBkb2VzIG5vdCBleGlzdCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZik7Ci0gICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlzID0gY29udGV4dC5nZXRSZXNvdXJjZUFzU3RyZWFtKHVyaSk7Ci0gICAgICAgICAgICBpZiAoaXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIkNvdWxkIG5vdCBmaW5kOiAiICsgdXJpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByb3BzLmxvYWQoaXMpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oInByb3BlcnRpZXMgdGFnIGNvdWxkIG5vdCBsb2FkIGZyb20gZmlsZSIsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgICAgICAgICB9ICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgaWYgKHZhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhciwgcHJvcHMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgRW51bWVyYXRpb24gcHJvcHNFbnVtID0gcHJvcHMucHJvcGVydHlOYW1lcygpOwotICAgICAgICAgICAgd2hpbGUgKHByb3BzRW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBwcm9wc0VudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwcm9wcy5nZXRQcm9wZXJ0eShrZXkpOwotCi0gICAgICAgICAgICAgICAgLy8gQHRvZG8gd2Ugc2hvdWxkIHBhcnNlIHRoZSB2YWx1ZSBpbiBjYXNlIGl0cyBhbiBFeHByZXNzaW9uCi0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmlsZSBuYW1lIHRvIGJlIHVzZWQgdG8gbG9hZCB0aGUgcHJvcGVydGllcyBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbGUoU3RyaW5nIGZpbGUpIHsKLSAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBVUkkgb2YgdGhlIHByb3BlcnRpZXMgZmlsZSB0byB1c2UuIFRoaXMgY2FuIGJlIGEgZnVsbCBVUkwgb3IgYSByZWxhdGl2ZSBVUkkKLSAgICAgKiBvciBhbiBhYnNvbHV0ZSBVUkkgdG8gdGhlIHJvb3QgY29udGV4dCBvZiB0aGlzIEplbGx5Q29udGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVcmkoU3RyaW5nIHVyaSkgewotICAgICAgICB0aGlzLnVyaSA9IHVyaTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGlzIGlzIGRlZmluZWQgdGhlbiBhIFByb3BlcnRpZXMgb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHRoZQotICAgICAqIHByb3BlcnRpZXMgd2lsbCBiZSBjcmVhdGVkIGFuZCBleHBvcnRlZCwgb3RoZXJ3aXNlIHRoZSBjdXJyZW50IHZhcmlhYmxlCi0gICAgICogc2NvcGUgd2lsbCBiZSBzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0aWVzLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhciBUaGUgdmFyIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0gICAgICAgIHRoaXMudmFyID0gdmFyOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy91dGlsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3V0aWwvUmVwbGFjZVRhZy5qYXZhIGIvamVsbHktdGFncy91dGlsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3V0aWwvUmVwbGFjZVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWQ5NTRkLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdXRpbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy91dGlsL1JlcGxhY2VUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKLQotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIHRhZyB0aGF0IHJlcGxhY2VzIG9jY3VycmVuY2VzIG9mIGEgY2hhcmFjdGVyIG9yIHN0cmluZyBpbiBpdHMgYm9keSBvcgotICogKG9yIHZhbHVlKSBhbmQgcGxhY2VzIHRoZSByZXN1bHQgaW50byB0aGUgY29udGV4dAotICoKLSAqIEBhdXRob3IgZGlvbgotICovCi1wdWJsaWMgY2xhc3MgUmVwbGFjZVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhSZXBsYWNlVGFnLmNsYXNzKTsKLQotICAgIC8qKiBUaGUgdmFyaWFibGUgbmFtZSB0byBleHBvcnQuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyOwotCi0gICAgLyoqIFRoZSBleHByZXNzaW9uIHRvIGV2YWx1YXRlLiAqLwotICAgIHByaXZhdGUgRXhwcmVzc2lvbiB2YWx1ZTsKLQotICAgIC8qKiB0aGUgb2xkIGNoYXJhY3RlciB0byBiZSByZXBsYWNlZCAqLwotICAgIHByaXZhdGUgU3RyaW5nIG9sZENoYXI7Ci0KLSAgICAvKiogdGhlIG5ldyBjaGFyYWN0ZXIgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIG9sZCAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5ld0NoYXI7Ci0KLSAgICAvKiogdGhlIG9sZCBzdHJpbmcgdG8gYmUgcmVwbGFjZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIG9sZFN0cmluZzsKLQotICAgIC8qKiB0aGUgbmV3IHN0cmluZyB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgb2xkICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmV3U3RyaW5nOwotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGNoZWNrIHJlcXVpcmVkIHByb3BlcnRpZXMKLSAgICAgICAgaWYgKG9sZENoYXIgIT0gbnVsbCkgewotICAgICAgICAgICAgb2xkU3RyaW5nID0gb2xkQ2hhci5zdWJzdHJpbmcoMCwxKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuZXdDaGFyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG5ld1N0cmluZyA9IG5ld0NoYXIuc3Vic3RyaW5nKDAsMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob2xkU3RyaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCJvbGRDaGFyIG9yIG9sZFN0cmluZyBtdXN0IGJlIHByb3ZpZGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmV3U3RyaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCJuZXdDaGFyIG9yIG5ld1N0cmluZyBtdXN0IGJlIHByb3ZpZGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgZWl0aGVyIHRoZSB2YWx1ZSBvciB0aGUgYm9keSBvZiB0aGUgdGFnCi0gICAgICAgIE9iamVjdCBhbnN3ZXIgPSBudWxsOwotICAgICAgICBpZiAoIHZhbHVlICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBhbnN3ZXIgPSB2YWx1ZS5ldmFsdWF0ZUFzU3RyaW5nKGNvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYW5zd2VyID0gZ2V0Qm9keVRleHQoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IHRoZSByZXN1bHQgaW4gdGhlIGNvbnRleHQsIG9yIG91dHB1dCBpdAotICAgICAgICBpZiAoYW5zd2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBzdHJpbmdBbnN3ZXIgPSBTdHJpbmdVdGlscy5yZXBsYWNlKGFuc3dlci50b1N0cmluZygpLCBvbGRTdHJpbmcsIG5ld1N0cmluZyk7Ci0gICAgICAgICAgICBpZiAoIHZhciAhPSBudWxsICkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUodmFyLCBzdHJpbmdBbnN3ZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoc3RyaW5nQW5zd2VyKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV3Q2hhciB1c2VkIGluIHJlcGxhY2luZy4gU2hvdWxkIG9ubHkgYmUgYSBzaW5nbGUKLSAgICAgKiBjaGFyYWN0ZXIuCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5ld0NoYXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ld0NoYXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb2xkQ2hhciB0aGF0IHdpbGwgYmUgcmVwbGFjZWQuIFNob3VsZCBvbmx5IGJlIGEgc2luZ2xlCi0gICAgICogY2hhcmFjdGVyLgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRPbGRDaGFyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBvbGRDaGFyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5ld1N0cmluZyB0aGF0IHdpbGwgYmUgcmVwbGFjZWQuCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5ldygpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3U3RyaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG9sZFN0cmluZyB0aGF0IHdpbGwgYmUgcmVwbGFjZWQuCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9sZCgpCi0gICAgewotICAgICAgICByZXR1cm4gb2xkU3RyaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlLgotICAgICAqIEByZXR1cm4gRXhwcmVzc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YXIuCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhcigpCi0gICAgewotICAgICAgICByZXR1cm4gdmFyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5ld0NoYXIuCi0gICAgICogQHBhcmFtIG5ld0NoYXIgVGhlIG5ld0NoYXIgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmV3Q2hhcihTdHJpbmcgbmV3Q2hhcikKLSAgICB7Ci0gICAgICAgIHRoaXMubmV3Q2hhciA9IG5ld0NoYXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgb2xkQ2hhci4KLSAgICAgKiBAcGFyYW0gb2xkQ2hhciBUaGUgb2xkQ2hhciB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPbGRDaGFyKFN0cmluZyBvbGRDaGFyKQotICAgIHsKLSAgICAgICAgdGhpcy5vbGRDaGFyID0gb2xkQ2hhcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuZXdTdHJpbmcuCi0gICAgICogQHBhcmFtIG5ld1N0cmluZyBUaGUgbmV3U3RyaW5nIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5ldyhTdHJpbmcgbmV3U3RyaW5nKQotICAgIHsKLSAgICAgICAgdGhpcy5uZXdTdHJpbmcgPSBuZXdTdHJpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgb2xkU3RyaW5nLgotICAgICAqIEBwYXJhbSBvbGRTdHJpbmcgVGhlIG9sZFN0cmluZyB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPbGQoU3RyaW5nIG9sZFN0cmluZykKLSAgICB7Ci0gICAgICAgIHRoaXMub2xkU3RyaW5nID0gb2xkU3RyaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlLgotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoRXhwcmVzc2lvbiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YXIuCi0gICAgICogQHBhcmFtIHZhciBUaGUgdmFyIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKQotICAgIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3V0aWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdXRpbC9TbGVlcFRhZy5qYXZhIGIvamVsbHktdGFncy91dGlsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3V0aWwvU2xlZXBUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0MDU0Yy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3V0aWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdXRpbC9TbGVlcFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLS8qKgotICogQSB0YWcgd2hpY2ggc2xlZXBzIGZvciBhIGdpdmVuIGFtb3VudCBvZiB0aW1lLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIFNsZWVwVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0gICAgcHJpdmF0ZSBsb25nIG1pbGxpczsKLQotICAgIHB1YmxpYyBTbGVlcFRhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoZmluYWwgWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1pbGxpcyA+IDApIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKG1pbGxpcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGlzIHRocmVhZCBzaG91bGQgc2xlZXAgZm9yIGluIG1pbGxpc2Vjb25kcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNaWxsaXMobG9uZyBtaWxsaXMpIHsKLSAgICAgICAgdGhpcy5taWxsaXMgPSBtaWxsaXM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3V0aWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdXRpbC9Tb3J0VGFnLmphdmEgYi9qZWxseS10YWdzL3V0aWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdXRpbC9Tb3J0VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMjQ0YWIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy91dGlsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3V0aWwvU29ydFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuQmVhbkNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLXB1YmxpYyBjbGFzcyBTb3J0VGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogdGhpbmdzIHRvIHNvcnQgKi8KLSAgICBwcml2YXRlIExpc3QgaXRlbXM7Ci0gICAgCi0gICAgLyoqIHRoZSB2YXJpYWJsZSB0byBzdG9yZSB0aGUgcmVzdWx0IGluICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyOwotICAgIAotICAgIC8qKiBwcm9wZXJ0eSBvZiB0aGUgYmVhbnMgdG8gc29ydCBvbiwgaWYgYW55ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7Ci0gICAgCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKGZpbmFsIFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh2YXIgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oInZhciIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoaXRlbXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oIml0ZW1zIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIExpc3Qgc29ydGVkID0gbmV3IEFycmF5TGlzdChpdGVtcyk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBCZWFuQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IEJlYW5Db21wYXJhdG9yKHByb3BlcnR5KTsKLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoc29ydGVkLCBjb21wYXJhdG9yKTsKLSAgICAgICAgfQotICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhciwgc29ydGVkKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpdGVtcyB0byBiZSBzb3J0ZWQKLSAgICAgKiBAcGFyYW0gbmV3SXRlbXMgc29tZSBjb2xsZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SXRlbXMoTGlzdCBuZXdJdGVtcykgewotICAgICAgICBpdGVtcyA9IG5ld0l0ZW1zOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgdmFyaWFibGUgdG8gaG9sZCB0aGUgc29ydGVkIGNvbGxlY3Rpb24uCi0gICAgICogQHBhcmFtIG5ld1ZhciB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyBuZXdWYXIpIHsKLSAgICAgICAgdmFyID0gbmV3VmFyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmV3UHJvcGVydHkpCi0gICAgewotICAgICAgICBwcm9wZXJ0eSA9IG5ld1Byb3BlcnR5OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3V0aWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdXRpbC9Ub2tlbml6ZVRhZy5qYXZhIGIvamVsbHktdGFncy91dGlsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3V0aWwvVG9rZW5pemVUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NiZWI1MS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3V0aWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdXRpbC9Ub2tlbml6ZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotcHVibGljIGNsYXNzIFRva2VuaXplVGFnIGV4dGVuZHMgVGFnU3VwcG9ydAotewotICAgIHByaXZhdGUgU3RyaW5nIHZhcjsKLSAgICBwcml2YXRlIFN0cmluZyBkZWxpbTsKLQotICAgIHB1YmxpYyBUb2tlbml6ZVRhZygpCi0gICAgewotICAgIH0KLQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIHZvaWQgZG9UYWcoZmluYWwgWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCB0aGlzLnZhciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oICJ2YXIiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHRoaXMuZGVsaW0gPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCAiZGVsaW0iICk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplciggZ2V0Qm9keVRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsaW0gKTsKLQotICAgICAgICBMaXN0IHRva2VucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICB3aGlsZSAoIHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0b2tlbnMuYWRkKCB0b2tlbml6ZXIubmV4dFRva2VuKCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGdldENvbnRleHQoKS5zZXRWYXJpYWJsZSggdGhpcy52YXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zICk7Ci0gICAgfQotCi0gICAgLyoqIFRoZSB2YXJpYWJsZSBuYW1lIHRvIGhvbGQgdGhlIGxpc3Qgb2YgdG9rZW5zICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpCi0gICAgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0KLSAgICAvKiogdGhlIGRlbGltaXRlciB0aGF0IHNlcGFyYXRlcyB0aGUgdG9rZW5zICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVsaW0oU3RyaW5nIGRlbGltKQotICAgIHsKLSAgICAgICAgdGhpcy5kZWxpbSA9IGRlbGltOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy91dGlsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3V0aWwvVXRpbFRhZ0xpYnJhcnkuamF2YSBiL2plbGx5LXRhZ3MvdXRpbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy91dGlsL1V0aWxUYWdMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMThiMTguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy91dGlsL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3V0aWwvVXRpbFRhZ0xpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdMaWJyYXJ5OwotCi0vKiogSW1wbGVtZW50cyBnZW5lcmFsIHV0aWxpdHkgdGFncy4KLSAqCi0gKiAgQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Ym9iQGVuZy53ZXJrZW4uY29tIj5ib2IgbWN3aGlydGVyPC9hPgotICogIEB2ZXJzaW9uICRSZXZpc2lvbjogMS42ICQKLSAqLwotcHVibGljIGNsYXNzIFV0aWxUYWdMaWJyYXJ5IGV4dGVuZHMgVGFnTGlicmFyeSB7Ci0KLSAgICBwdWJsaWMgVXRpbFRhZ0xpYnJhcnkoKSB7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJhdmFpbGFibGUiLCBBdmFpbGFibGVUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygiZmlsZSIsIEZpbGVUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygibG9hZFRleHQiLCBMb2FkVGV4dFRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJwcm9wZXJ0aWVzIiwgUHJvcGVydGllc1RhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJyZXBsYWNlIiwgUmVwbGFjZVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJzbGVlcCIsIFNsZWVwVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInNvcnQiLCBTb3J0VGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInRva2VuaXplIiwgVG9rZW5pemVUYWcuY2xhc3MpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvdXRpbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy91dGlsL3BhY2thZ2UuaHRtbCBiL2plbGx5LXRhZ3MvdXRpbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwOWRhMS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3V0aWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci0KLSAgPHA+QSBudW1iZXIgb2YgdXRpbGl0eSB0YWdzIHN1Y2ggYXMgZm9yIHRva2VuaXppbmcgU3RyaW5ncy4KLSAgPC9wPgotICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvdXRpbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy91dGlsL0N1c3RvbWVyLmphdmEgYi9qZWxseS10YWdzL3V0aWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdXRpbC9DdXN0b21lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzU5YTIyLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdXRpbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy91dGlsL0N1c3RvbWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEEgc2FtcGxlIGJlYW4gdGhhdCB3ZSBjYW4gY29uc3RydWN0IHZpYSBKZWxseSB0YWdzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tZXIgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBjaXR5OwotICAgIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOwotCi0KLSAgICBwdWJsaWMgQ3VzdG9tZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIEN1c3RvbWVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHNldE5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEN1c3RvbWVyKFN0cmluZyBuYW1lLCBTdHJpbmcgY2l0eSkgewotICAgICAgICBzZXROYW1lKG5hbWUpOwotICAgICAgICBzZXRDaXR5KGNpdHkpOwotICAgIH0KLQotICAgIHB1YmxpYyBDdXN0b21lcihDdXN0b21lciBjdXN0KSB7Ci0gICAgICAgIHNldE5hbWUoY3VzdC5nZXROYW1lKCkpOwotICAgICAgICBzZXRDaXR5KGN1c3QuZ2V0Q2l0eSgpKTsKLSAgICAgICAgc2V0TG9jYXRpb24oY3VzdC5nZXRMb2NhdGlvbigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICJbbmFtZT0iICsgbmFtZSArICI7Y2l0eT0iICsgY2l0eSArICJdIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaXR5LgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDaXR5KCkgewotICAgICAgICByZXR1cm4gY2l0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbi4KLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lLgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjaXR5LgotICAgICAqIEBwYXJhbSBjaXR5IFRoZSBjaXR5IHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENpdHkoU3RyaW5nIGNpdHkpIHsKLSAgICAgICAgdGhpcy5jaXR5ID0gY2l0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsb2NhdGlvbi4KLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGxvY2F0aW9uIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZS4KLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy91dGlsL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3V0aWwvVGVzdEplbGx5LmphdmEgYi9qZWxseS10YWdzL3V0aWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdXRpbC9UZXN0SmVsbHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ5YjJiNi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3V0aWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdXRpbC9UZXN0SmVsbHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MudXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qdW5pdC5KZWxseVRlc3RTdWl0ZTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyB0byBydW4gamVsbHkgdGVzdCBjYXNlcyBhcyBwYXJ0IG9mIEFudCdzIEpVbml0IHRlc3RzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjQgJAotICovCi1wdWJsaWMgY2xhc3MgVGVzdEplbGx5IGV4dGVuZHMgSmVsbHlUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oIHN1aXRlKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3JlYXRlVGVzdFN1aXRlKFRlc3RKZWxseS5jbGFzcywgInN1aXRlLmplbGx5Iik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy91dGlsL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3V0aWwvZGVsZXRhYmxlLnByb3BlcnRpZXMgYi9qZWxseS10YWdzL3V0aWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdXRpbC9kZWxldGFibGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzMzFjNy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3V0aWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdXRpbC9kZWxldGFibGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZm9vPUFCQwotCi1iYXI9WFlaClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy91dGlsL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3V0aWwvZHVtbXkueG1sIGIvamVsbHktdGFncy91dGlsL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3V0aWwvZHVtbXkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmNhMDA1Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdXRpbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy91dGlsL2R1bW15LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ZHVtbXk+Ci0gIDxlbnRyeSBpZD0iMSI+VGhpcyBpcyBzb21lIHNhbXBsZSBYTUw8L2VudHJ5PgotICA8ZW50cnkgaWQ9IjIiPkFuZCBzb21lIG1vcmUgWE1MPC9lbnRyeT4KLSAgPGVtcHR5Lz4KLTwvZHVtbXk+ICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3V0aWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdXRpbC9mb28ucHJvcGVydGllcyBiL2plbGx5LXRhZ3MvdXRpbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy91dGlsL2Zvby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDMzMWM3Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdXRpbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy91dGlsL2Zvby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mb289QUJDCi0KLWJhcj1YWVoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3V0aWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdXRpbC9zdWl0ZS5qZWxseSBiL2plbGx5LXRhZ3MvdXRpbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy91dGlsL3N1aXRlLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2U1YWVlLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdXRpbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy91dGlsL3N1aXRlLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08dGVzdDpzdWl0ZSAKLSAgICB4bWxuczpqPSJqZWxseTpjb3JlIiAKLSAgICB4bWxuczp1dGlsPSJqZWxseTp1dGlsIiAKLSAgICB4bWxuczp0ZXN0PSJqZWxseTpqdW5pdCI+Ci0KLSAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0VG9rZW5pemUiPgotICAgIAotICAgICAgICA8dXRpbDp0b2tlbml6ZSB2YXI9InRva2VucyIgZGVsaW09IiwiPlRlc3QxLFRlc3QyLFRlc3QzLFRlc3Q0PC91dGlsOnRva2VuaXplPgotCi0gICAgICAgIDxqOnNldCB2YXI9InMiIHZhbHVlPSIke3NpemUodG9rZW5zKX0iLz4gICAgICAgIAotICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtzID09IDR9Ii8+Ci0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke3NpemUodG9rZW5zKSA9PSA0fSIvPgotCi08IS0tICAgICAgICAKLSAgICAgICAgPGo6c2V0IHZhcj0icyIgdmFsdWU9IiR7dG9rZW5zLnNpemUoKX0iLz4gICAgICAgIAotICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtzID09IDR9Ii8+Ci0gICAgICAgIAotICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHt0b2tlbnMuc2l6ZSgpID09IDR9Ii8+Ci0tLT4KLQotICAgICAgICAgICAgCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iVGVzdDEiIGFjdHVhbD0iJHt0b2tlbnNbMF19Ii8+Ci0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iVGVzdDIiIGFjdHVhbD0iJHt0b2tlbnNbMV19Ii8+Ci0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iVGVzdDMiIGFjdHVhbD0iJHt0b2tlbnNbMl19Ii8+Ci0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iVGVzdDQiIGFjdHVhbD0iJHt0b2tlbnNbM119Ii8+Ci0gICAgICAgIAotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IlRlc3Q0IiBhY3R1YWw9IiR7dG9rZW5zW3MgLSAxXX0iLz4KLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJUZXN0NCIgYWN0dWFsPSIke3Rva2Vuc1tzaXplKHRva2VucykgLSAxXX0iLz4KLSAgICAgICAgCi08IS0tICAgICAgICAKLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJUZXN0NCIgYWN0dWFsPSIke3Rva2Vucy5nZXQoc2l6ZSh0b2tlbnMpIC0gMSl9Ii8+Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJUZXN0NCIgYWN0dWFsPSIke3Rva2Vuc1t0b2tlbnMuc2l6ZSgpIC0gMV19Ii8+Ci0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iVGVzdDQiIGFjdHVhbD0iJHt0b2tlbnMuZ2V0KHRva2Vucy5zaXplKCkgLSAxKX0iLz4KLS0tPiAgICAgICAgCi0gICAgICAgIAotICA8L3Rlc3Q6Y2FzZT4KLQotICA8dGVzdDpjYXNlIG5hbWU9InRlc3RGaWxlRXhpc3RzIj4KLQotICAgICAgPCEtLSBlbnN1cmUgdGhhdCAke2Jhc2UuZGlyfSBpcyBkZWZpbmVkIC0tPgotICAgICAgPGo6aWYgdGVzdD0iJHtlbXB0eSBiYXNlLmRpcn0iPgotICAgICAgICAgIDxqOnNldCB2YXI9ImJhc2UuZGlyIiB2YWx1ZT0iLiIvPgotICAgICAgPC9qOmlmPgotICAgICAgICAKLSAgICAgIDxqOnNldCB2YXI9ImZsYWciIHZhbHVlPSJub3QgZm91bmQiLz4KLQotICAgICAgPHV0aWw6YXZhaWxhYmxlIGZpbGU9IiR7YmFzZS5kaXJ9L3Byb2plY3QueG1sIj4KLSAgICAgICAgICA8ajpzZXQgdmFyPSJmbGFnIiB2YWx1ZT0iZm91bmQiLz4KLSAgICAgIDwvdXRpbDphdmFpbGFibGU+Ci0KLSAgICAgICAgCi0gICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9ImZvdW5kIiBhY3R1YWw9IiR7ZmxhZ30iPgotICAgICAgICAgIFNob3VsZCBoYXZlIGZvdW5kIHRoZSBmaWxlIHZpYSB0aGUgZmlsZSAkJHtiYXNlLmRpcn0vcHJvamVjdC54bWwgd2l0aCBiYXNlLmRpcj0ke2Jhc2UuZGlyfQotICAgICAgPC90ZXN0OmFzc2VydEVxdWFscz4KLSAgICAgICAgCi0gICAgICA8dXRpbDphdmFpbGFibGUgZmlsZT0iJHtiYXNlLmRpcn0vZG9lc05vdEV4aXN0LnhtbCI+Ci0gICAgICAgICAgPHRlc3Q6ZmFpbD5UaGUgZmlsZSAke2Jhc2UuZGlyfS9kb2VzTm90RXhpc3QueG1sIHNob3VsZCBub3QgZXhpc3Q8L3Rlc3Q6ZmFpbD4KLSAgICAgIDwvdXRpbDphdmFpbGFibGU+Ci0gICAgICAgIAotICA8L3Rlc3Q6Y2FzZT4KLSAgICAKLSAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0VVJJRXhpc3RzIj4KLQotICAgICAgPGo6c2V0IHZhcj0iZmxhZyIgdmFsdWU9Im5vdCBmb3VuZCIvPgotCi0gICAgICAgIDwhLS0gdXNlIHJlbGF0aXZlIFVSSXMtLT4KLSAgICAgICAgCi0gICAgICA8dXRpbDphdmFpbGFibGUgdXJpPSJkdW1teS54bWwiPgotICAgICAgICAgIDxqOnNldCB2YXI9ImZsYWciIHZhbHVlPSJmb3VuZCIvPgotICAgICAgPC91dGlsOmF2YWlsYWJsZT4KLSAgICAgICAgCi0gICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9ImZvdW5kIiBhY3R1YWw9IiR7ZmxhZ30iPgotICAgICAgICBTaG91bGQgaGF2ZSBmb3VuZCB0aGUgZmlsZSB2aWEgdGhlIFVSSSBkdW1teS54bWwKLSAgICAgIDwvdGVzdDphc3NlcnRFcXVhbHM+Ci0gICAgICAgIAotICAgICAgPHV0aWw6YXZhaWxhYmxlIHVyaT0iZG9lc05vdEV4aXN0LnhtbCI+Ci0KLSAgICAgICAgICA8dGVzdDpmYWlsPlRoZSBVUkkgZG9lc05vdEV4aXN0LnhtbCBzaG91bGQgbm90IGV4aXN0ITwvdGVzdDpmYWlsPgotICAgICAgPC91dGlsOmF2YWlsYWJsZT4KLSAgICAgICAgCi0gIDwvdGVzdDpjYXNlPgotICAKLSAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0UmVwbGFjZSI+Ci0gICAgCi0gICAgPHV0aWw6cmVwbGFjZSBvbGRDaGFyPSJcIiBuZXdDaGFyPSIvIiB2YXI9InRlc3RTdHJpbmciPkFcQjwvdXRpbDpyZXBsYWNlPgotICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iQS9CIiBhY3R1YWw9IiR7dGVzdFN0cmluZ30iPgotICAgICAgU2hvdWxkIGhhdmUgcmVwbGFjZWQgYSBiYWNrIHNsYXNoIHdpdGggYSBmb3J3YXJkIG9uZQotICAgIDwvdGVzdDphc3NlcnRFcXVhbHM+Ci0KLSAgICAKLSAgICA8ajpzZXQgdmFyPSJ0ZXN0U3RyaW5nMiI+PHV0aWw6cmVwbGFjZSBvbGRDaGFyPSJcIiBuZXdDaGFyPSIvIj5BXEI8L3V0aWw6cmVwbGFjZT48L2o6c2V0PgotICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iQS9CIiBhY3R1YWw9IiR7dGVzdFN0cmluZzJ9Ij4KLSAgICAgIFNob3VsZCBoYXZlIHJlcGxhY2VkIGEgYmFjayBzbGFzaCB3aXRoIGEgZm9yd2FyZCBvbmUKLSAgICAgIGFuZCBwbGFjZWQgdGhlIHJlc3VsdCBpbnRvIG91dHB1dAotICAgIDwvdGVzdDphc3NlcnRFcXVhbHM+Ci0gICAgCi0gICAgPHV0aWw6cmVwbGFjZSBvbGRDaGFyPSIvIiBuZXdDaGFyPSJcIiB2YWx1ZT0iJHt0ZXN0U3RyaW5nfSIgdmFyPSJ0ZXN0U3RyaW5nMyIgLz4KLSAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IkFcQiIgYWN0dWFsPSIke3Rlc3RTdHJpbmczfSI+Ci0gICAgICBTaG91bGQgaGF2ZSByZXBsYWNlZCBhIHNsYXNoIHdpdGggYSBiYWNrIHNsYXNoIGZyb20gYSB2YXJpYWJsZQotICAgICAgYW5kIHBsYWNlZCB0aGUgcmVzdWx0IGludG8gYSB2YXJpYWJsZQotICAgIDwvdGVzdDphc3NlcnRFcXVhbHM+Ci0KLSAgICA8dXRpbDpyZXBsYWNlIG9sZENoYXI9IkFCQyIgbmV3Q2hhcj0iMTIzIiB2YWx1ZT0iQ0JBQkMiIHZhcj0idGVzdFN0cmluZzQiIC8+Ci0KLSAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IkNCMUJDIiBhY3R1YWw9IiR7dGVzdFN0cmluZzR9Ij4KLSAgICAgIFNob3VsZCBoYXZlIG9ubHkgc3Vic3RpdHV0ZWQgdGhlIDEgZm9yIHRoZSBBLCBzaW5jZSB0aGUKLSAgICAgIG9sZC9uZXdDaGFyIGF0dHJpYnV0ZXMgd2VyZSB1c2VkLgotICAgIDwvdGVzdDphc3NlcnRFcXVhbHM+Ci0KLSAgICA8dXRpbDpyZXBsYWNlIG9sZD0iYnJvd24iIG5ldz0iYmxhY2siIHZhbHVlPSJUaGUgcXVpY2sgYnJvd24gZm94IiB2YXI9InRlc3RTdHJpbmc2IiAvPgotICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iVGhlIHF1aWNrIGJsYWNrIGZveCIgYWN0dWFsPSIke3Rlc3RTdHJpbmc2fSI+Ci0gICAgICAgIFNob3VsZCBoYXZlIHN1YnN0aXR1dGVkIHRoZSBzdHJpbmcgImJsYWNrIiBmb3IgImJyb3duIgotICAgIDwvdGVzdDphc3NlcnRFcXVhbHM+Ci0KLSAgPC90ZXN0OmNhc2U+Ci0KLSAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0UHJvcGVydGllcyI+Ci0gICAgICAKLSAgICAgIDx1dGlsOnByb3BlcnRpZXMgdXJpPSJmb28ucHJvcGVydGllcyIvPgotICAgICAgCi0gICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IkFCQyIgYWN0dWFsPSIke2Zvb30iLz4KLSAgICAKLSAgPC90ZXN0OmNhc2U+Ci0gICAgCi0gIDx0ZXN0OmNhc2UgbmFtZT0idGVzdFByb3BlcnRpZXNWYXIiPgotICAgICAgCi0gICAgICA8dXRpbDpwcm9wZXJ0aWVzIHVyaT0iZm9vLnByb3BlcnRpZXMiIHZhcj0icHJvcHMiLz4KLSAgICAgIAotICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJBQkMiIGFjdHVhbD0iJHtwcm9wcy5mb299Ii8+Ci0gICAgCi0gICAgICBMb2FkZWQgcHJvcGVydGllcyB2YWx1ZSAke3Byb3BzfQotICAgIAotICA8L3Rlc3Q6Y2FzZT4KLQotICAKLSAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0UHJvcGVydGllc0FyZU5vdExvY2tlZCI+Ci0gICAgICA8ajpzZXQgdmFyPSJmaWxlbmFtZSIgdmFsdWU9IiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy91dGlsL2RlbGV0YWJsZS5wcm9wZXJ0aWVzIi8+Ci0gICAgICAKLSAgICAgIDx1dGlsOnByb3BlcnRpZXMgZmlsZT0iJHtmaWxlbmFtZX0iLz4KLSAgICAgIAotICAgICAgPGo6bmV3IHZhcj0iZiIgY2xhc3NOYW1lPSJqYXZhLmlvLkZpbGUiPgotICAgICAgICA8ajphcmcgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdmFsdWU9IiR7ZmlsZW5hbWV9Ii8+Ci0gICAgICA8L2o6bmV3PiAgICAgICAgCi0gICAgICA8ajptdXRlPgotICAgICAgICAke2YuZGVsZXRlKCl9Ci0gICAgICA8L2o6bXV0ZT4KLSAgICAKLSAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iJHtmYWxzZX0iIGFjdHVhbD0iJHtmLmV4aXN0cygpfSIgPlRoZSBmaWxlICR7bmFtZX0gc2hvdWxkIG5vIGxvbmdlciBleGlzdDwvdGVzdDphc3NlcnRFcXVhbHM+Ci0KLSAgPC90ZXN0OmNhc2U+Ci0gICAgCi0KLSAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0RmlsZVRhZyI+Ci0gICAgICA8dXRpbDpmaWxlIG5hbWU9IiR7YmFzZWRpcn0vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdXRpbC9zdWl0ZS5qZWxseSIgCi0gICAgICAgIHZhcj0ic3VpdGUiIC8+Ci0gICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtzdWl0ZSAhPSBudWxsfSIgPlRoZSBzdWl0ZSBzaG91bGQgZXhpc3Q8L3Rlc3Q6YXNzZXJ0PgotICA8L3Rlc3Q6Y2FzZT4KLSAgCi0gIDx0ZXN0OmNhc2UgbmFtZT0idGVzdFNvcnRCYXNpYyI+Ci0gICAgPGo6bmV3IHZhcj0idGVzdENvbGxlY3Rpb24iIGNsYXNzTmFtZT0iamF2YS51dGlsLkFycmF5TGlzdCIvPgotICAgIDxqOm11dGU+Ci0KLSAgICAJJHt0ZXN0Q29sbGVjdGlvbi5hZGQoJ0hlbGxvJyl9Ci0gICAgCSR7dGVzdENvbGxlY3Rpb24uYWRkKCdXb3JsZCcpfQotICAgIAkke3Rlc3RDb2xsZWN0aW9uLmFkZCgnSmVsbHknKX0KLSAgICA8L2o6bXV0ZT4KLSAgICA8dXRpbDpzb3J0IHZhcj0ic29ydGVkIiBpdGVtcz0iJHt0ZXN0Q29sbGVjdGlvbn0iIC8+Ci0gICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJIZWxsbyIgYWN0dWFsPSIke3NvcnRlZFswXX0iLz4KLSAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IkplbGx5IiBhY3R1YWw9IiR7c29ydGVkWzFdfSIvPgotICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iV29ybGQiIGFjdHVhbD0iJHtzb3J0ZWRbMl19Ii8+Ci0gIDwvdGVzdDpjYXNlPgotICAKLSAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0U29ydEJlYW4iPgotICAgIDxqOm5ldyB2YXI9InRlc3RDb2xsZWN0aW9uIiBjbGFzc05hbWU9ImphdmEudXRpbC5BcnJheUxpc3QiLz4KLQotICAgIDxqOnVzZUJlYW4gdmFyPSJjdXN0MSIgY2xhc3M9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS51dGlsLkN1c3RvbWVyIiBjaXR5PSJTeWRuZXkiIGxvY2F0aW9uPSJBdXN0cmFsaWEiIG5hbWU9IkZyZWQgTmVyayIvPgotICAgIDxqOnVzZUJlYW4gdmFyPSJjdXN0MiIgY2xhc3M9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS51dGlsLkN1c3RvbWVyIiBjaXR5PSJNZWxib3VybmUiIGxvY2F0aW9uPSJBdXN0cmFsaWEiIG5hbWU9IkpvZSBOZXJrIi8+Ci0gICAgPGo6dXNlQmVhbiB2YXI9ImN1c3QzIiBjbGFzcz0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnV0aWwuQ3VzdG9tZXIiIGNpdHk9IlNhbiBGcmFuY2lzY28iIGxvY2F0aW9uPSJVLlMuQS4iIG5hbWU9IkNvbGV0dGUgQ29vbCIvPgotICAgIDxqOm11dGU+Ci0gICAgCSR7dGVzdENvbGxlY3Rpb24uYWRkKGN1c3QxKX0KLSAgICAJJHt0ZXN0Q29sbGVjdGlvbi5hZGQoY3VzdDIpfQotICAgIAkke3Rlc3RDb2xsZWN0aW9uLmFkZChjdXN0Myl9Ci0gICAgPC9qOm11dGU+Ci0gICAgPCEtLSB0ZXN0IHNvcnRpbmcgYnkgdGhlIG5hbWUgcHJvcGVydHkgLS0+Ci0gICAgPHV0aWw6c29ydCB2YXI9InNvcnRlZEJ5TmFtZSIgaXRlbXM9IiR7dGVzdENvbGxlY3Rpb259IiBwcm9wZXJ0eT0ibmFtZSIvPgotICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iQ29sZXR0ZSBDb29sIiBhY3R1YWw9IiR7c29ydGVkQnlOYW1lWzBdLm5hbWV9Ii8+Ci0KLSAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IkZyZWQgTmVyayIgYWN0dWFsPSIke3NvcnRlZEJ5TmFtZVsxXS5uYW1lfSIvPgotICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iSm9lIE5lcmsiIGFjdHVhbD0iJHtzb3J0ZWRCeU5hbWVbMl0ubmFtZX0iLz4KLQotICAgIDwhLS0gdGVzdCBzb3J0aW5nIGJ5IHRoZSBsb2NhdGlvbiBwcm9wZXJ0eSAtLT4KLSAgICA8dXRpbDpzb3J0IHZhcj0ic29ydGVkQnlMb2NhdGlvbiIgaXRlbXM9IiR7dGVzdENvbGxlY3Rpb259IiBwcm9wZXJ0eT0ibG9jYXRpb24iLz4KLSAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IkF1c3RyYWxpYSIgYWN0dWFsPSIke3NvcnRlZEJ5TG9jYXRpb25bMF0ubG9jYXRpb259Ii8+Ci0gICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJBdXN0cmFsaWEiIGFjdHVhbD0iJHtzb3J0ZWRCeUxvY2F0aW9uWzFdLmxvY2F0aW9ufSIvPgotICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iVS5TLkEuIiBhY3R1YWw9IiR7c29ydGVkQnlMb2NhdGlvblsyXS5sb2NhdGlvbn0iLz4KLSAgCi0gIDwvdGVzdDpjYXNlPgotCi0gICAgCi08L3Rlc3Q6c3VpdGU+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3V0aWwveGRvY3MvY2hhbmdlcy54bWwgYi9qZWxseS10YWdzL3V0aWwveGRvY3MvY2hhbmdlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNTkxNWUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy91dGlsL3hkb2NzL2NoYW5nZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLSAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSAtLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+Q2hhbmdlczwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotICA8Ym9keT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjEuMSIgZGF0ZT0iMjAwNS0wMS0wMSI+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0iZml4IiBkdWUtdG89IlN0ZWZhbiBCb2Rld2lnIj5IYW5kbGUgbnVsbCBlbmNvZGluZyBpbiBsb2FkVGV4dCB0YWc8L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4xIiBkYXRlPSIyMDA0LTEwLTI3Ij4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJhZGQiIGlzc3VlPSJKRUxMWS0xNTciPkFkZCB1dGlsOnNvcnQgdG8gc29ydCBsaXN0cywgaW5jbHVkaW5nIHNvcnRpbmcgYnkgYmVhbiBwcm9wZXJ0aWVzPC9hY3Rpb24+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0idXBkYXRlIiBpc3N1ZT0iSkVMTFktNTciIGR1ZS10bz0iQmlsbCBLZWVzZSI+c3VwcG9ydCBlbmNvZGluZyBwYXJhbWV0ZXIgZm9yIHV0aWw6bG9hZFRleHQ8L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4wIiBkYXRlPSIyMDA0LTA5LTEwIj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJmaXgiIGlzc3VlPSJKRUxMWS03NyIgZHVlLXRvPSJQYXVsIE8mYXBvcztGYWxsb24iPlVwZGF0ZSBqZWxseTp1dGlsIHJlcGxhY2UgdGFnIHRvIHJlcGxhY2UgZW50aXJlIHN0cmluZ3M8L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3V0aWwveGRvY3MvaW5kZXgueG1sIGIvamVsbHktdGFncy91dGlsL3hkb2NzL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAzNTAxZi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3V0aWwveGRvY3MvaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+VXRpbGl0eSBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotICAgIDxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KLSAgICAgIDxwPgotICAgICAgICBBIG51bWJlciBvZiB1dGlsaXR5IHRhZ3MuCi0gICAgICAgICAgU2VlIHRoZSA8YSBocmVmPSJ0YWdzLmh0bWwiPnRhZ3M8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgICAgPC9wPgotICAgIDwvc2VjdGlvbj4KLSAgICA8c2VjdGlvbiBuYW1lPSJUaXBzIj4KLSAgICAgIDxwPgotICAgICAgICBJZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgdGhlIDxjb2RlPnRva2VuaXplPC9jb2RlPiB0YWcgYW5kIHRva2VuaXplIG9uCi0gICAgICAgIHdoaXRlc3BhY2UsIHlvdSBtYXkgdGhpbmsgeW91IGNvdWxkIHVzZSBhIGRlbGltaXRlciBvZiA8Y29kZT5cbiBvciBcdDwvY29kZT4KLSAgICAgICAgZXRjLCBidXQgdGhvc2UgY2hhcmFjdGVyIHN0cmluZ3MgYXJlIHNwZWNpZmljIHRvIEphdmEsIG5vdCBYTUwuCi0gICAgICA8L3A+Ci0gICAgICA8cD4KLSAgICAgICAgUmFuZHkgWHUgY2FtZSB1cCB3aXRoIGEgd29ya2Fyb3VuZCwgdXNpbmcgWE1MIHVuaWNvZGUgZW50aXRpZXMsIGUuZy4KLSAgICAgICAgPGNvZGU+PCFbQ0RBVEFbJiN4QSwgJiN4RCwgJiN4OSwgJngyMF1dPjwvY29kZT4gZm9yIGxpbmUgZmVlZCwgY2FycmlhZ2UgcmV0dXJuLAotICAgICAgICB0YWIgYW5kIHNwYWNlIHJlc3BlY3RpdmVseS4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvdXRpbC94ZG9jcy9uYXZpZ2F0aW9uLnhtbCBiL2plbGx5LXRhZ3MvdXRpbC94ZG9jcy9uYXZpZ2F0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2ODg1Yy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3V0aWwveGRvY3MvbmF2aWdhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IG5hbWU9IlV0aWxpdHkgVGFnIExpYnJhcnkiPgotCi0gIDx0aXRsZT5VdGlsaXR5IFRhZyBMaWJyYXJ5PC90aXRsZT4KLSAgCi0gIDxib2R5PgotICAgIDxtZW51IG5hbWU9IlV0aWxpdHkgVGFnIExpYnJhcnkiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgICAgICAgICAgIGhyZWY9Ii9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJUYWdzIiAgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZ3MuaHRtbCIvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy92YWxpZGF0ZS8uY3ZzaWdub3JlIGIvamVsbHktdGFncy92YWxpZGF0ZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmNlYjc2Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdmFsaWRhdGUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotbWF2ZW4ubG9nCi10YXJnZXQKLXZlbG9jaXR5LmxvZwotamNvdmVyYWdlLnNlcgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy92YWxpZGF0ZS9idWlsZC54bWwgYi9qZWxseS10YWdzL3ZhbGlkYXRlL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkMDU2ZC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3ZhbGlkYXRlL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tYnVpbGQueG1sIGdlbmVyYXRlZCBieSBtYXZlbiBmcm9tIHByb2plY3QueG1sIHZlcnNpb24gMS4wLVNOQVBTSE9UCi0gIG9uIGRhdGUgTWF5IDI0IDIwMDQsIHRpbWUgMjMwMi0tPgotPHByb2plY3QgZGVmYXVsdD0iamFyIiBuYW1lPSJjb21tb25zLWplbGx5LXRhZ3MtdmFsaWRhdGUiIGJhc2VkaXI9Ii4iPgotICA8cHJvcGVydHkgbmFtZT0iZGVmYXVsdHRhcmdldGRpciIgdmFsdWU9InRhcmdldCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJkaXIiIHZhbHVlPSJ0YXJnZXQvbGliIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXNkaXIiIHZhbHVlPSJ0YXJnZXQvY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Y2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0idGVzdHJlcG9ydGRpciIgdmFsdWU9InRhcmdldC90ZXN0LXJlcG9ydHMiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZGlzdGRpciIgdmFsdWU9ImRpc3QiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iamF2YWRvY2RpciIgdmFsdWU9ImRpc3QvZG9jcy9hcGkiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iZmluYWwubmFtZSIgdmFsdWU9ImNvbW1vbnMtamVsbHktdGFncy12YWxpZGF0ZS0xLjAtU05BUFNIT1QiPgotICA8L3Byb3BlcnR5PgotICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlc2NyaXB0aW9uPSJvIEluaXRpYWxpemVzIHNvbWUgcHJvcGVydGllcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im5vZ2V0Ij4KLSAgICAgIDxlcXVhbHMgYXJnMj0ib25seSIgYXJnMT0iJHtidWlsZC5zeXNjbGFzc3BhdGh9Ij4KLSAgICAgIDwvZXF1YWxzPgotICAgIDwvY29uZGl0aW9uPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXNjcmlwdGlvbj0ibyBDb21waWxlIHRoZSBjb2RlIiBkZXBlbmRzPSJnZXQtZGVwcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHtjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvamF2YSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICAgIDxjb3B5IHRvZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL2phdmEiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICAgIDxjb3B5IHRvZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qZWxseSI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueHNsIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnJuZyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5kdGQiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5odG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamFyIiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgdGhlIGphciIgZGVwZW5kcz0iY29tcGlsZSx0ZXN0Ij4KLSAgICA8amFyIGphcmZpbGU9InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCIgYmFzZWRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0ibyBDbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIGRpcmVjdG9yaWVzIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGlzdGRpcn0iPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgYSBkaXN0cmlidXRpb24iIGRlcGVuZHM9ImphciwgamF2YWRvYyI+Ci0gICAgPG1rZGlyIGRpcj0iZGlzdCI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29weSB0b2Rpcj0iZGlzdCI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iIGluY2x1ZGVzPSIqLmphciI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iIGluY2x1ZGVzPSJMSUNFTlNFKiwgUkVBRE1FKiI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0ibyBSdW4gdGhlIHRlc3QgY2FzZXMiIGlmPSJ0ZXN0LmZhaWx1cmUiIGRlcGVuZHM9ImludGVybmFsLXRlc3QiPgotICAgIDxmYWlsIG1lc3NhZ2U9IlRoZXJlIHdlcmUgdGVzdCBmYWlsdXJlcy4iPgotICAgIDwvZmFpbD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iaW50ZXJuYWwtdGVzdCIgZGVwZW5kcz0iY29tcGlsZS10ZXN0cyI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8anVuaXQgZGlyPSIuLyIgZmFpbHVyZXByb3BlcnR5PSJ0ZXN0LmZhaWx1cmUiIHByaW50U3VtbWFyeT0ieWVzIiBmb3JrPSJ0cnVlIiBoYWx0b25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJiYXNlZGlyIiB2YWx1ZT0iLiI+Ci0gICAgICA8L3N5c3Byb3BlcnR5PgotICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Zm9ybWF0dGVyIHVzZWZpbGU9ImZhbHNlIiB0eXBlPSJwbGFpbiI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL1Rlc3QqLmphdmEiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgPC9qdW5pdD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZS10ZXN0cyIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy90ZXN0Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamF2YWRvYyIgZGVzY3JpcHRpb249Im8gR2VuZXJhdGUgamF2YWRvYyIgZGVwZW5kcz0iamFyIj4KLSAgICA8bWtkaXIgZGlyPSIke2phdmFkb2NkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDx0c3RhbXA+Ci0gICAgICA8Zm9ybWF0IHBhdHRlcm49IjIwMDIteXl5eSIgcHJvcGVydHk9InllYXIiPgotICAgICAgPC9mb3JtYXQ+Ci0gICAgPC90c3RhbXA+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvcHlyaWdodCIgdmFsdWU9IkNvcHlyaWdodCAmYW1wO2NvcHk7ICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLXZhbGlkYXRlIDEuMC1TTkFQU0hPVCBBUEkiPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPGphdmFkb2MgdXNlPSJ0cnVlIiBwcml2YXRlPSJ0cnVlIiBkZXN0ZGlyPSIke2phdmFkb2NkaXJ9IiBhdXRob3I9InRydWUiIHZlcnNpb249InRydWUiIHNvdXJjZXBhdGg9InNyYy9qYXZhIiBwYWNrYWdlbmFtZXM9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnZhbGlkYXRlLioiPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhZG9jPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJnZXQtZGVwcyIgdW5sZXNzPSJub2dldCIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9pc29yZWxheC0yMDAzMDgwNy5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vbXN2L2phcnMvaXNvcmVsYXgtMjAwMzA4MDcuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qdW5pdC0zLjguMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vanVuaXQvamFycy9qdW5pdC0zLjguMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L21zdi0yMDAzMDgwNy5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vbXN2L2phcnMvbXN2LTIwMDMwODA3LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veHNkbGliLTIwMDMwODA3LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9tc3YvamFycy94c2RsaWItMjAwMzA4MDcuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9yZWxheG5nRGF0YXR5cGUtMjAwMzA4MDcuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL21zdi9qYXJzL3JlbGF4bmdEYXRhdHlwZS0yMDAzMDgwNy5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktdGFncy1qdW5pdC1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktdGFncy1qdW5pdC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtY2xpLVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWNsaS9qYXJzL2NvbW1vbnMtY2xpLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZXhsLVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWpleGwvamFycy9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS94bWwtYXBpcy0xLjAuYjIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3htbC1hcGlzL2phcnMveG1sLWFwaXMtMS4wLmIyLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1iZWFudXRpbHMtMS42LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWJlYW51dGlscy9qYXJzL2NvbW1vbnMtYmVhbnV0aWxzLTEuNi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtY29sbGVjdGlvbnMtMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWNvbGxlY3Rpb25zL2phcnMvY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWxvZ2dpbmctMS4wLjMuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtbG9nZ2luZy9qYXJzL2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2RvbTRqLTEuNS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2RvbTRqL2phcnMvZG9tNGotMS41LWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2pheGVuLTEuMS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2pheGVuL2phcnMvamF4ZW4tMS4xLWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3hlcmNlcy0yLjIuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veGVyY2VzL2phcnMveGVyY2VzLTIuMi4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vanVuaXQtMy44LjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2p1bml0L2phcnMvanVuaXQtMy44LjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vYW50LW9wdGlvbmFsLTEuNS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vYW50L2phcnMvYW50LW9wdGlvbmFsLTEuNS5qYXIiPgotICAgIDwvZ2V0PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJpbnN0YWxsLW1hdmVuIj4KLSAgICA8Z2V0IGRlc3Q9IiR7dXNlci5ob21lfS9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgc3JjPSIke3JlcG99L21hdmVuL21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPHVuamFyIGRlc3Q9IiR7bWF2ZW4uaG9tZX0iIHNyYz0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC91bmphcj4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy92YWxpZGF0ZS9tYXZlbi54bWwgYi9qZWxseS10YWdzL3ZhbGlkYXRlL21hdmVuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiMjBjOS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3ZhbGlkYXRlL21hdmVuLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImphdmE6amFyIj4KLQotICA8IS0tIGRlZmluZSB0aGUgY2xhc3NwYXRoIHVzZWQgdG8gcnVuIGV4YW1wbGVzIC0tPgotICA8Z29hbCBuYW1lPSJjcmVhdGUtY2xhc3NwYXRoIiBwcmVyZXFzPSJqYXZhOmNvbXBpbGUsdGVzdDpjb21waWxlIj4KLSAgICAgICAgPHBhdGggaWQ9InRlc3QuY2xhc3NwYXRoIj4KLSAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke21hdmVuLmJ1aWxkLmRlc3R9Ii8+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0idGFyZ2V0L2NsYXNzZXMiLz4KLSAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIi8+Ci0gICAgICAgICAgICA8cGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiLz4KLSAgICAgICAgPC9wYXRoPgotICA8L2dvYWw+Ci0KLSAgICA8IS0tIGRlbW9zIC0tPgotICA8Z29hbCBuYW1lPSJkZW1vOnJuZyIgcHJlcmVxcz0iY3JlYXRlLWNsYXNzcGF0aCIKLSAgICBkZXNjcmlwdGlvbj0iUnVucyBhIHZhbGlkYXRpb24gZGVtbywgd2l0aCBSZWxheE5HIj4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseSIgZm9yaz0ieWVzIj4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgICA8YXJnIHZhbHVlPSJzcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy92YWxpZGF0ZS92YWxpZGF0ZVJORy5qZWxseSIvPgotICAgIDwvamF2YT4KLSAgPC9nb2FsPgotCi0gIDxnb2FsIG5hbWU9ImRlbW86ZHRkIiBwcmVyZXFzPSJjcmVhdGUtY2xhc3NwYXRoIgotICAgIGRlc2NyaXB0aW9uPSJSdW5zIGEgdmFsaWRhdGlvbiBkZW1vLCB3aXRoIERURCI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHkiIGZvcms9InllcyI+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgPGFyZyB2YWx1ZT0ic3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdmFsaWRhdGUvdmFsaWRhdGVEVEQuamVsbHkiLz4KLSAgICA8L2phdmE+Ci0gIDwvZ29hbD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy92YWxpZGF0ZS9wcm9qZWN0LnByb3BlcnRpZXMgYi9qZWxseS10YWdzL3ZhbGlkYXRlL3Byb2plY3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzljMWI2MS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3ZhbGlkYXRlL3Byb2plY3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQotIyBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUCBSIE8gSiBFIEMgVCAgUCBSIE8gUCBFIFIgVCBJIEUgUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3ZhbGlkYXRlL3Byb2plY3QueG1sIGIvamVsbHktdGFncy92YWxpZGF0ZS9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI3ODg4ZS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3ZhbGlkYXRlL3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0PgotICA8ZXh0ZW5kPiR7YmFzZWRpcn0vLi4vdGFnLXByb2plY3QueG1sPC9leHRlbmQ+Ci0gIDxpZD5jb21tb25zLWplbGx5LXRhZ3MtdmFsaWRhdGU8L2lkPgotICA8bmFtZT5jb21tb25zLWplbGx5LXRhZ3MtdmFsaWRhdGU8L25hbWU+Ci0gIDxjdXJyZW50VmVyc2lvbj4xLjA8L2N1cnJlbnRWZXJzaW9uPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy52YWxpZGF0ZTwvcGFja2FnZT4KLSAgPGRlc2NyaXB0aW9uPlRoaXMgaXMgYSBKZWxseSBpbnRlcmZhY2UgZm9yIFhNTCB2YWxpZGF0aW9uLjwvZGVzY3JpcHRpb24+Ci0gIDxzaG9ydERlc2NyaXB0aW9uPkNvbW1vbnMgSmVsbHkgVmFsaWRhdGUgVGFnIExpYnJhcnk8L3Nob3J0RGVzY3JpcHRpb24+Ci0gIDx2ZXJzaW9ucz4KLSAgICA8dmVyc2lvbj4KLSAgICAgIDxpZD4xLjA8L2lkPgotICAgICAgPG5hbWU+MS4wPC9uYW1lPgotICAgICAgPHRhZz5DT01NT05TLUpFTExZLVZBTElEQVRFLTFfMDwvdGFnPgotICAgIDwvdmVyc2lvbj4KLSAgPC92ZXJzaW9ucz4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDwhLS0gU1RBUlQgZm9yIGNvbXBpbGF0aW9uIC0tPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+bXN2PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+aXNvcmVsYXg8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yMDAzMDgwNzwvdmVyc2lvbj4KLSAgICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8Z3VtcC5wcm9qZWN0Pmlzby1yZWxheDwvZ3VtcC5wcm9qZWN0PgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5qdW5pdDwvaWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+bXN2PC9pZD4KLSAgICAgIDx2ZXJzaW9uPjIwMDMwODA3PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8IS0tIEVORCBmb3IgY29tcGlsYXRpb24gLS0+Ci0gICAgPCEtLSBydW50aW1lIGRlcGVuZGVuY2llcyAtLT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+bXN2PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+eHNkbGliPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MjAwMzA4MDc8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+bXN2PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cmVsYXhuZ0RhdGF0eXBlPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MjAwMzA4MDc8L3ZlcnNpb24+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGd1bXAucHJvamVjdD5yZWxheG5nPC9ndW1wLnByb2plY3Q+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDwhLS0gRU5EIHJ1bnRpbWUgLS0+Ci0gICAgPCEtLSBTVEFSVCBmb3IgdGVzdCAtLT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1qZWxseTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtamVsbHktdGFncy1qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgIDx1cmw+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5L2xpYnMvanVuaXQvPC91cmw+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDwhLS0gRU5EIGZvciB0ZXN0IC0tPgotICAgIDwhLS0gU1RBUlQgZm9yIHJ1bm5pbmcgZGVtb3MgLS0+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5jb21tb25zLWNsaTwvaWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDwhLS0gRU5EIGZvciBydW5uaW5nIGRlbW9zIC0tPgotCi0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy92YWxpZGF0ZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy92YWxpZGF0ZS9Bc3NlcnRWYWxpZFRhZy5qYXZhIGIvamVsbHktdGFncy92YWxpZGF0ZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy92YWxpZGF0ZS9Bc3NlcnRWYWxpZFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGU2NWFiLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdmFsaWRhdGUvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdmFsaWRhdGUvQXNzZXJ0VmFsaWRUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MudmFsaWRhdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qdW5pdC5KZWxseUFzc2VydGlvbkZhaWxlZEVycm9yOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgdGFnIHBlcmZvcm1zIGFuIGFzc2VydGlvbiB0aGF0IHRoZSB0YWdzIGJvZHkgY29udGFpbnMgWE1MCi0gKiB3aGljaCBtYXRjaGVzIGEgZ2l2ZW0gc2NoZW1hIHZhbGlkYXRpb24uIFRoaXMgdGFnIGlzIHVzZWQgd2l0aAotICogSmVsbHlVbml0IHRvIGltcGxlbWVudCBhbiBhc3NlcnRpb24uCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICovCi1wdWJsaWMgY2xhc3MgQXNzZXJ0VmFsaWRUYWcgZXh0ZW5kcyBWYWxpZGF0ZVRhZyB7Ci0KLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQotLyoKLSAgICBwdWJsaWMgQXNzZXJ0VmFsaWRUYWcoKSB7Ci0gICAgICAgIHNldEVycm9ySGFuZGxlcigKLSAgICAgICAgICAgIG5ldyBFcnJvckhhbmRsZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RXhjZXB0aW9uKG91dHB1dCwgImVycm9yIiwgZXhjZXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dEV4Y2VwdGlvbihvdXRwdXQsICJmYXRhbEVycm9yIiwgZXhjZXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dEV4Y2VwdGlvbihvdXRwdXQsICJ3YXJuaW5nIiwgZXhjZXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgfQotKi8KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoZmluYWwgWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgYnVmZmVyLnNldExlbmd0aCgwKTsKLSAgICAgICAgc3VwZXIuZG9UYWcob3V0cHV0KTsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgd2hldGhlciBvciBub3QgdGhlIGRvY3VtZW50IGlzIHZhbGlkLgotICAgICAqIERlcml2ZWQgY2xhc3NlcyBjYW4gb3ZlcmxvYWQgdGhpcyBtZXRob2QgdG8gZG8gZGlmZmVyZW50IHRoaW5ncywgc3VjaAotICAgICAqIGFzIHRvIHRocm93IGFzc2VydGlvbiBleGNlcHRpb25zIGV0Yy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVWYWxpZChib29sZWFuIHZhbGlkKSB7Ci0gICAgICAgIHN1cGVyLmhhbmRsZVZhbGlkKHZhbGlkKTsKLQotICAgICAgICBpZiAoICEgdmFsaWQgKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGJ1ZmZlci50b1N0cmluZygpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5QXNzZXJ0aW9uRmFpbGVkRXJyb3IoICJUaGUgWE1MIGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8gdGhlIHNjaGVtYTogIiArIG1lc3NhZ2UgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE91dHB1dHMgdGhlIGdpdmVuIHZhbGlkYXRpb24gZXhjZXB0aW9uIGFzIFhNTCB0byB0aGUgb3V0cHV0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgb3V0cHV0RXhjZXB0aW9uKFhNTE91dHB1dCBvdXRwdXQsIFN0cmluZyBuYW1lLCBTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCggbmFtZSApOwotICAgICAgICBidWZmZXIuYXBwZW5kKCAiIDogbGluZTogIiApOwotICAgICAgICBidWZmZXIuYXBwZW5kKCBlLmdldExpbmVOdW1iZXIoKSApOwotICAgICAgICBidWZmZXIuYXBwZW5kKCAiIGNvbHVtbjogIiApOwotICAgICAgICBidWZmZXIuYXBwZW5kKCBlLmdldENvbHVtbk51bWJlcigpICk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoICIgbWVzc2FnZTogIiApOwotICAgICAgICBidWZmZXIuYXBwZW5kKCBlLmdldE1lc3NhZ2UoKSApOwotICAgICAgICBidWZmZXIuYXBwZW5kKCAnXG4nICk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3ZhbGlkYXRlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3ZhbGlkYXRlL1ZhbGlkYXRlVGFnLmphdmEgYi9qZWxseS10YWdzL3ZhbGlkYXRlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3ZhbGlkYXRlL1ZhbGlkYXRlVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMmNhNmMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy92YWxpZGF0ZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy92YWxpZGF0ZS9WYWxpZGF0ZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MudmFsaWRhdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuaXNvX3JlbGF4LnZlcmlmaWVyLlZlcmlmaWVyOwotaW1wb3J0IG9yZy5pc29fcmVsYXgudmVyaWZpZXIuVmVyaWZpZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmlzb19yZWxheC52ZXJpZmllci5WZXJpZmllckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsOwotCi0vKioKLSAqIFRoaXMgdGFnIHZhbGlkYXRlcyBpdHMgYm9keSB1c2luZyBhIHNjaGVtYSBWZXJpZmllciB3aGljaCBjYW4KLSAqIHZhbGlkYXRlIGFnYWluc3QgRFREcywgWE1MIFNjaGVtYSwgUmVsYXhORywgUmVsYXggb3IgVFJFWC4KLSAqIEFueSBKQVJWIGNvbXBsaWFudCBWZXJpZmllciBjb3VsZCBiZSB1c2VkLgotICogVGhlIGVycm9yIG1lc3NhZ2VzIGFyZSBvdXRwdXQgYXMgWE1MIGV2ZW50cyBzbyB0aGF0IHRoZXkgY2FuIGJlIHN0eWxlZCBieSB0aGUgcGFyZW50IHRhZy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSB2ZXJpZmllciB0aGF0IHRoaXMgdGFnIHdpbGwgdXNlICovCi0gICAgcHJpdmF0ZSBWZXJpZmllciB2ZXJpZmllcjsKLQotICAgIC8qKiBUaGUgU0FYIEVycm9ySGFuZGxlciAqLwotICAgIHByaXZhdGUgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcjsKLQotICAgIC8qKiBUaGUgYm9vbGVhbiBmbGFnIGZvciB3aGV0aGVyIHRoZSBYTUwgaXMgdmFsaWQgKi8KLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoZmluYWwgWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCB2ZXJpZmllciA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oInZlcmlmaWVyIik7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCi0gICAgICAgIC8vIGV2YWx1YXRlIHRoZSBib2R5IHVzaW5nIHRoZSBjdXJyZW50IFZlcmlmaWVyCi0gICAgICAgIGlmICggZXJyb3JIYW5kbGVyICE9IG51bGwgKSB7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgYXJlIHJlZGlyZWN0aW5nIGVycm9ycyB0byBhbm90aGVyIGhhbmRsZXIKLSAgICAgICAgICAgICAgICAvLyBzbyBqdXN0IGZpbHRlciB0aGUgYm9keQotICAgICAgICAgICAgICAgIFZlcmlmaWVyRmlsdGVyIGZpbHRlciA9IHZlcmlmaWVyLmdldFZlcmlmaWVyRmlsdGVyKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBub3cgaW5zdGFsbCB0aGUgY3VycmVudCBvdXRwdXQgaW4gdGhlIGZpbHRlciBjaGFpbi4uLgotICAgICAgICAgICAgICAgIC8vICMjIyMKLQotICAgICAgICAgICAgICAgIENvbnRlbnRIYW5kbGVyIGhhbmRsZXIgPSBmaWx0ZXIuZ2V0Q29udGVudEhhbmRsZXIoKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICBpbnZva2VCb2R5KCBuZXcgWE1MT3V0cHV0KCBoYW5kbGVyICkgKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVyLmVuZERvY3VtZW50KCk7Ci0gICAgICAgICAgICAgICAgdmFsaWQgPSBmaWx0ZXIuaXNWYWxpZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gb3V0cHV0dGluZyB0aGUgZXJyb3JzIHRvIHRoZSBjdXJyZW50IG91dHB1dAotICAgICAgICAgICAgdmVyaWZpZXIuc2V0RXJyb3JIYW5kbGVyKAotICAgICAgICAgICAgICAgIG5ldyBFcnJvckhhbmRsZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRFeGNlcHRpb24ob3V0cHV0LCAiZXJyb3IiLCBleGNlcHRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RXhjZXB0aW9uKG91dHB1dCwgImZhdGFsRXJyb3IiLCBleGNlcHRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RXhjZXB0aW9uKG91dHB1dCwgIndhcm5pbmciLCBleGNlcHRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBWZXJpZmllckhhbmRsZXIgaGFuZGxlciA9IHZlcmlmaWVyLmdldFZlcmlmaWVySGFuZGxlcigpOwotICAgICAgICAgICAgICAgIGhhbmRsZXIuc3RhcnREb2N1bWVudCgpOwotICAgICAgICAgICAgICAgIGludm9rZUJvZHkoIG5ldyBYTUxPdXRwdXQoIGhhbmRsZXIgKSApOwotICAgICAgICAgICAgICAgIGhhbmRsZXIuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICB2YWxpZCA9IGhhbmRsZXIuaXNWYWxpZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGhhbmRsZVZhbGlkKHZhbGlkKTsKLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzY2hlbWEgVmVyaWZpZXIgdGhhdCB0aGlzIHRhZyB3aWxsIHVzZSB0byB2ZXJpZnkgaXRzIGJvZHkKLSAgICAgKgotICAgICAqIEBqZWxseTpyZXF1aXJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZlcmlmaWVyKFZlcmlmaWVyIHZlcmlmaWVyKSB7Ci0gICAgICAgIHRoaXMudmVyaWZpZXIgPSB2ZXJpZmllcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBFcnJvckhhbmRsZXIgdXNlZCB3aGVuIHZhbGlkYXRpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgRXJyb3JIYW5kbGVyIGdldEVycm9ySGFuZGxlcigpIHsKLSAgICAgICAgcmV0dXJuIGVycm9ySGFuZGxlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBTQVggRXJyb3JIYW5kbGVyIHdoaWNoIGlzIHVzZWQgdG8gY2FwdHVyZQotICAgICAqIFhNTCB2YWxpZGF0aW9uIGV2ZW50cy4KLSAgICAgKiBJZiBhbiBFcnJvckhhbmRsZXIgaXMgc3BlY2lmaWVkCi0gICAgICogdGhlbiB0aGlzIHRhZyB3aWxsIG91dHB1dCBpdHMgYm9keSBhbmQgcmVkaXJlY3QgYWxsIGVycm9yIG1lc3NhZ2VzCi0gICAgICogdG8gdGhlIEVycm9ySGFuZGxlci4KLSAgICAgKiBJZiBubyBFcnJvckhhbmRsZXIgaXMgc3BlY2lmaWVkIHRoZW4gdGhpcyB0YWcgd2lsbCBqdXN0IG91dHB1dCB0aGUKLSAgICAgKiBlcnJvciBtZXNzYWdlcyBhcyBYTUwgZXZlbnRzCi0gICAgICoKLSAgICAgKiBAamVsbHk6b3B0aW9uYWwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFcnJvckhhbmRsZXIoRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgewotICAgICAgICB0aGlzLmVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0aGF0IHdpbGwgY29udGFpbiBhIGJvb2xlYW4gZmxhZyBmb3Igd2hldGhlciBvcgotICAgICAqIG5vdCB0aGUgWE1MIGlzIHZhbGlkLgotICAgICAqCi0gICAgICogQGplbGx5Om9wdGlvbmFsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIHdoZXRoZXIgb3Igbm90IHRoZSBkb2N1bWVudCBpcyB2YWxpZC4KLSAgICAgKiBEZXJpdmVkIGNsYXNzZXMgY2FuIG92ZXJsb2FkIHRoaXMgbWV0aG9kIHRvIGRvIGRpZmZlcmVudCB0aGluZ3MsIHN1Y2gKLSAgICAgKiBhcyB0byB0aHJvdyBhc3NlcnRpb24gZXhjZXB0aW9ucyBldGMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlVmFsaWQoYm9vbGVhbiB2YWxpZCkgewotICAgICAgICBpZiAodmFyICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBCb29sZWFuIHZhbHVlID0gKHZhbGlkKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhciwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3V0cHV0cyB0aGUgZ2l2ZW4gdmFsaWRhdGlvbiBleGNlcHRpb24gYXMgWE1MIHRvIHRoZSBvdXRwdXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBvdXRwdXRFeGNlcHRpb24oWE1MT3V0cHV0IG91dHB1dCwgU3RyaW5nIG5hbWUsIFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBBdHRyaWJ1dGVzSW1wbCBhdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7Ci0gICAgICAgIFN0cmluZyB1cmkgPSAiIjsKLSAgICAgICAgU3RyaW5nIHR5cGUgPSAiQ0RBVEEiOwotICAgICAgICBhdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZSggdXJpLCAiY29sdW1uIiwgImNvbHVtbiIsIHR5cGUsIEludGVnZXIudG9TdHJpbmcoIGUuZ2V0Q29sdW1uTnVtYmVyKCkgKSApOwotICAgICAgICBhdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZSggdXJpLCAibGluZSIsICJsaW5lIiwgdHlwZSwgSW50ZWdlci50b1N0cmluZyggZS5nZXRMaW5lTnVtYmVyKCkgKSApOwotCi0gICAgICAgIFN0cmluZyBwdWJsaWNJRCA9IGUuZ2V0UHVibGljSWQoKTsKLSAgICAgICAgaWYgKCBwdWJsaWNJRCAhPSBudWxsICYmIHB1YmxpY0lELmxlbmd0aCgpID4gMCApIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKCB1cmksICJwdWJsaWNJRCIsICJwdWJsaWNJRCIsIHR5cGUsIHB1YmxpY0lEICk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHN5c3RlbUlEID0gZS5nZXRTeXN0ZW1JZCgpOwotICAgICAgICBpZiAoIHN5c3RlbUlEICE9IG51bGwgJiYgc3lzdGVtSUQubGVuZ3RoKCkgPiAwICkgewotICAgICAgICAgICAgYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoIHVyaSwgInN5c3RlbUlEIiwgInN5c3RlbUlEIiwgdHlwZSwgc3lzdGVtSUQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIG91dHB1dC5zdGFydEVsZW1lbnQoIHVyaSwgbmFtZSwgbmFtZSwgYXR0cmlidXRlcyApOwotICAgICAgICBvdXRwdXQud3JpdGUoIGUuZ2V0TWVzc2FnZSgpICk7Ci0gICAgICAgIG91dHB1dC5lbmRFbGVtZW50KCB1cmksIG5hbWUsIG5hbWUgKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy92YWxpZGF0ZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy92YWxpZGF0ZS9WYWxpZGF0ZVRhZ0xpYnJhcnkuamF2YSBiL2plbGx5LXRhZ3MvdmFsaWRhdGUvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdmFsaWRhdGUvVmFsaWRhdGVUYWdMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZDc5YWEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy92YWxpZGF0ZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy92YWxpZGF0ZS9WYWxpZGF0ZVRhZ0xpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MudmFsaWRhdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnTGlicmFyeTsKLQotLyoqIERlc2NyaWJlcyB0aGUgVGFnbGliLiBUaGlzIGNsYXNzIGNvdWxkIGJlIGdlbmVyYXRlZCBieSBYRG9jbGV0Ci0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjQgJAotICAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlVGFnTGlicmFyeSBleHRlbmRzIFRhZ0xpYnJhcnkgewotCi0gICAgcHVibGljIFZhbGlkYXRlVGFnTGlicmFyeSgpIHsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInZhbGlkYXRlIiwgVmFsaWRhdGVUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygidmVyaWZpZXIiLCBWZXJpZmllclRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJhc3NlcnRWYWxpZCIsIEFzc2VydFZhbGlkVGFnLmNsYXNzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3ZhbGlkYXRlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3ZhbGlkYXRlL1ZlcmlmaWVyVGFnLmphdmEgYi9qZWxseS10YWdzL3ZhbGlkYXRlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3ZhbGlkYXRlL1ZlcmlmaWVyVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZmRjOGEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy92YWxpZGF0ZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy92YWxpZGF0ZS9WZXJpZmllclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MudmFsaWRhdGU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudXRpbC5DbGFzc0xvYWRlclV0aWxzOwotaW1wb3J0IG9yZy5pc29fcmVsYXgudmVyaWZpZXIuU2NoZW1hOwotaW1wb3J0IG9yZy5pc29fcmVsYXgudmVyaWZpZXIuVmVyaWZpZXI7Ci1pbXBvcnQgb3JnLmlzb19yZWxheC52ZXJpZmllci5WZXJpZmllckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmlzb19yZWxheC52ZXJpZmllci5WZXJpZmllckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgdGFnIGNyZWF0ZXMgYSBuZXcgVmVyaWZpZXIgb2YgYSBzY2hlbWEgYXMgYSB2YXJpYWJsZQotICogc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBieSBhICZsdDt2YWxpZGF0ZSZndDsgdGFnLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBWZXJpZmllclRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIHRoZSB2YXJpYWJsZSBuYW1lIHRvIGV4cG9ydCB0aGUgVmVyaWZpZXIgYXMgKi8KLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0KLSAgICAvKiogVGhlIFVSSSB0byBsb2FkIHRoZSBzY2hlbWEgZnJvbSAqLwotICAgIHByaXZhdGUgU3RyaW5nIHVyaTsKLQotICAgIC8qKiBUaGUgZmlsZSB0byBsb2FkIHRoZSBzY2hlbWEgZnJvbSAqLwotICAgIHByaXZhdGUgRmlsZSBmaWxlOwotCi0gICAgLyoqIFRoZSBzeXN0ZW0gSUQgdG8gdXNlIHdoZW4gcGFyc2luZyB0aGUgc2NoZW1hICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3lzdGVtSWQ7Ci0KLSAgICAvKiogVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgbmV3IHNjaGVtYSB2ZXJpZmllciBvYmplY3RzICovCi0gICAgcHJpdmF0ZSBWZXJpZmllckZhY3RvcnkgZmFjdG9yeTsKLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhmaW5hbCBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiwgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAoIHZhciA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oInZhciIpOwotICAgICAgICB9Ci0KLSAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICBpZiAoIHVyaSAhPSBudWxsICkgewotICAgICAgICAgICAgaW4gPSBjb250ZXh0LmdldFJlc291cmNlQXNTdHJlYW0oIHVyaSApOwotICAgICAgICAgICAgaWYgKCBpbiA9PSBudWxsICkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIkNvdWxkIG5vdCBmaW5kIHJlc291cmNlIGZvciB1cmk6ICIgKyB1cmkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChmaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGdldEJvZHlUZXh0KCk7Ci0gICAgICAgICAgICBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSggdGV4dC5nZXRCeXRlcygpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBWZXJpZmllciB2ZXJpZmllciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTY2hlbWEgc2NoZW1hID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChzeXN0ZW1JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2NoZW1hID0gZ2V0RmFjdG9yeSgpLmNvbXBpbGVTY2hlbWEoaW4sIHN5c3RlbUlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCB1cmkgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICBzY2hlbWEgPSBnZXRGYWN0b3J5KCkuY29tcGlsZVNjaGVtYShpbiwgdXJpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgc2NoZW1hID0gZ2V0RmFjdG9yeSgpLmNvbXBpbGVTY2hlbWEoaW4pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIHNjaGVtYSA9PSBudWxsICkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIkNvdWxkIG5vdCBjcmVhdGUgYSB2YWxpZCBzY2hlbWEiICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHZlcmlmaWVyID0gc2NoZW1hLm5ld1ZlcmlmaWVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFZlcmlmaWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUodmFyLCB2ZXJpZmllcik7Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgbmV3IFZlcmlmaWVyCi0gICAgICoKLSAgICAgKiBAamVsbHk6cmVxdWlyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBVUkkgb2YgdGhlIHNjaGVtYSBmaWxlIHRvIHBhcnNlLiBJZiBubyBVUkkgYW5kIG5vIGZpbGUgaXMKLSAgICAgKiBzcGVjaWZpZWQgdGhlbiB0aGUgYm9keSBvZiB0aGlzIHRhZyBpcyB1c2VkIGFzIHRoZSBzb3VyY2Ugb2YgdGhlIHNjaGVtYQotICAgICAqCi0gICAgICogQGplbGx5Om9wdGlvbmFsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXJpKFN0cmluZyB1cmkpIHsKLSAgICAgICAgdGhpcy51cmkgPSB1cmk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUge0BsaW5rIEZpbGV9IG9mIHRoZSBzY2hlbWEgdG8gcGFyc2UuIElmIG5vIFVSSSBhbmQgbm8gZmlsZSBpcwotICAgICAqIHNwZWNpZmllZCB0aGVuIHRoZSBib2R5IG9mIHRoaXMgdGFnIGlzIHVzZWQgYXMgdGhlIHNvdXJjZSBvZiB0aGUgc2NoZW1hCi0gICAgICoKLSAgICAgKiBAamVsbHk6b3B0aW9uYWwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgYUZpbGUpIHsKLSAgICAgICAgZmlsZSA9IGFGaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHN5c3RlbSBJRCB1c2VkIHdoZW4gcGFyc2luZyB0aGUgc2NoZW1hCi0gICAgICoKLSAgICAgKiBAamVsbHk6b3B0aW9uYWwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JZChTdHJpbmcgc3lzdGVtSWQpIHsKLSAgICAgICAgdGhpcy5zeXN0ZW1JZCA9IHN5c3RlbUlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgbmV3IHNjaGVtYSB2ZXJpZmllciBvYmplY3RzLgotICAgICAqIElmIG5vbmUgaXMgcHJvdmlkZWQgdGhlbiB0aGUgZGVmYXVsdCBNU1YgZmFjdG9yeSBpcyB1c2VkLgotICAgICAqCi0gICAgICogQGplbGx5Om9wdGlvbmFsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmFjdG9yeShWZXJpZmllckZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyBWZXJpZmllckZhY3RvcnkgZ2V0RmFjdG9yeSgpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICggZmFjdG9yeSA9PSBudWxsICkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBDbGFzc0xvYWRlclV0aWxzLmdldENsYXNzTG9hZGVyKG51bGwsIHRydWUsIGdldENsYXNzKCkpOwotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSAoVmVyaWZpZXJGYWN0b3J5KWxvYWRlci5sb2FkQ2xhc3MoCi0gICAgICAgICAgICAgICAgICAgICJjb20uc3VuLm1zdi52ZXJpZmllci5qYXJ2LlRoZUZhY3RvcnlJbXBsIikubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy92YWxpZGF0ZS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy92YWxpZGF0ZS9wYWNrYWdlLmh0bWwgYi9qZWxseS10YWdzL3ZhbGlkYXRlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3ZhbGlkYXRlL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQyMzEyNi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3ZhbGlkYXRlL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3ZhbGlkYXRlL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08L2hlYWQ+Ci08Ym9keT4KLQotICA8cD5BIHRhZyBsaWJyYXJ5IGZvciB2YWxpZGF0aW5nIFhNTCB1c2luZyB2YXJpb3VzIHNjaGVtYSBsYW5ndWFnZXMgbGlrZSBEVEQsIFhNTCBTY2hlbWEsIAotICBSZWxheCBORyBhcyB3ZWxsIGFzIFJlbGF4IGFuZCBUUkVYLiBUaGlzIHRhZyBsaWJyYXJ5IHVzZXMgdGhlIAotICA8YSBocmVmPSJodHRwOi8vaXNvLXJlbGF4LnNvdXJjZWZvcmdlLm5ldC9KQVJWLyI+SkFSVjwvYT4gQVBJIHRvIHBlcmZvcm0gdGhlIHZhbGlkYXRpb24uCi0gIEJ5IGRlZmF1bHQgd2UgdXNlIHRoZSAKLSAgPGEgaHJlZj0iaHR0cDovL3d3d3Muc3VuLmNvbS9zb2Z0d2FyZS94bWwvZGV2ZWxvcGVycy9tdWx0aXNjaGVtYS8iPk1TVjwvYT4gCi0gIGxpYnJhcnkgYnkgS29oc3VrZSBLYXdhZ3VjaGkgYXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIEpBUlYuCi0gIDwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvdmFsaWRhdGUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdmFsaWRhdGUvVGVzdEplbGx5LmphdmEgYi9qZWxseS10YWdzL3ZhbGlkYXRlL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3ZhbGlkYXRlL1Rlc3RKZWxseS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjMxODIwLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdmFsaWRhdGUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdmFsaWRhdGUvVGVzdEplbGx5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnZhbGlkYXRlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmp1bml0LkplbGx5VGVzdFN1aXRlOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIHRvIHJ1biBqZWxseSB0ZXN0IGNhc2VzIGFzIHBhcnQgb2YgQW50J3MgSlVuaXQgdGVzdHMKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0SmVsbHkgZXh0ZW5kcyBKZWxseVRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUZXN0UnVubmVyLnJ1biggc3VpdGUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVUZXN0U3VpdGUoVGVzdEplbGx5LmNsYXNzLCAic3VpdGUuamVsbHkiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3ZhbGlkYXRlL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3ZhbGlkYXRlL2FkZHJlc3MuZHRkIGIvamVsbHktdGFncy92YWxpZGF0ZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy92YWxpZGF0ZS9hZGRyZXNzLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2ZTI1ZC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3ZhbGlkYXRlL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3ZhbGlkYXRlL2FkZHJlc3MuZHRkCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy92YWxpZGF0ZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy92YWxpZGF0ZS9hZGRyZXNzLnJuZyBiL2plbGx5LXRhZ3MvdmFsaWRhdGUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdmFsaWRhdGUvYWRkcmVzcy5ybmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZGZkMTYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy92YWxpZGF0ZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy92YWxpZGF0ZS9hZGRyZXNzLnJuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvdmFsaWRhdGUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdmFsaWRhdGUvc3VpdGUuamVsbHkgYi9qZWxseS10YWdzL3ZhbGlkYXRlL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3ZhbGlkYXRlL3N1aXRlLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2QzYTYwLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdmFsaWRhdGUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdmFsaWRhdGUvc3VpdGUuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08dGVzdDpzdWl0ZSANCi0gICAgeG1sbnM6aj0iamVsbHk6Y29yZSIgDQotICAgIHhtbG5zOnRlc3Q9ImplbGx5Omp1bml0Ig0KLSAgICB4bWxuczp2PSJqZWxseTp2YWxpZGF0ZSI+DQotDQotPCEtLSB0ZXN0IFJlbGF4TkcgLS0+IA0KLQ0KLTx0ZXN0OmNhc2UgbmFtZT0idmFsaWRhdGVSZWxheE5HIj4NCi0NCi08djp2ZXJpZmllciB1cmk9ImFkZHJlc3Mucm5nIiB2YXI9ImFkZHJlc3NTY2hlbWEiLz4NCi0NCi08djphc3NlcnRWYWxpZCB2ZXJpZmllcj0iJHthZGRyZXNzU2NoZW1hfSI+DQotICA8YWRkcmVzc0Jvb2s+DQotICAgIDxjYXJkPg0KLSAgICAgIDxuYW1lPkpvaG4gU21pdGg8L25hbWU+DQotICAgICAgPGVtYWlsPmpzQGV4YW1wbGUuY29tPC9lbWFpbD4NCi0gICAgPC9jYXJkPg0KLSAgICA8Y2FyZD4NCi0gICAgICA8bmFtZT5GcmVkIEJsb2dnczwvbmFtZT4NCi0gICAgICA8ZW1haWw+ZmJAZXhhbXBsZS5uZXQ8L2VtYWlsPg0KLSAgICA8L2NhcmQ+DQotICA8L2FkZHJlc3NCb29rPg0KLTwvdjphc3NlcnRWYWxpZD4NCi0gIA0KLTwvdGVzdDpjYXNlPg0KLQ0KLQ0KLTx0ZXN0OmNhc2UgbmFtZT0iaW52YWxpZGF0ZVJlbGF4TkciPg0KLQ0KLTx2OnZlcmlmaWVyIHVyaT0iYWRkcmVzcy5ybmciIHZhcj0iYWRkcmVzc1NjaGVtYSIvPg0KLQ0KLTxqOmNhdGNoIHZhcj0iZXhjZXB0aW9uIj4NCi08djphc3NlcnRWYWxpZCB2YXI9ImZsYWciIHZlcmlmaWVyPSIke2FkZHJlc3NTY2hlbWF9Ij4NCi0gIDxhZGRyZXNzQm9vaz4NCi0gICAgPGNhcmQ+DQotICAgICAgPGVtYWlsPmpzQGV4YW1wbGUuY29tPC9lbWFpbD4NCi0gICAgPC9jYXJkPg0KLSAgICA8Y2FyZD4NCi0gICAgICA8bmFtZT5GcmVkIEJsb2dnczwvbmFtZT4NCi0gICAgPC9jYXJkPg0KLSAgICA8Y2FyZD4NCi0gICAgICA8d3JvbmduYW1lPkZyZWQgQmxvZ2dzPC93cm9uZ25hbWU+DQotICAgIDwvY2FyZD4NCi0gICAgPGNhcmQ+DQotICAgIDwvY2FyZD4NCi0gIDwvYWRkcmVzc0Jvb2s+DQotPC92OmFzc2VydFZhbGlkPg0KLTwvajpjYXRjaD4NCi0NCi08dGVzdDphc3NlcnQgdGVzdD0iJHshZmxhZ30iPlRoZSBkb2N1bWVudCBzaG91bGQgbm90IGJlIHZhbGlkPC90ZXN0OmFzc2VydD4NCi08dGVzdDphc3NlcnQgdGVzdD0iJHtleGNlcHRpb24gIT0gbnVsbH0iPkFuIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93bjwvdGVzdDphc3NlcnQ+DQotVGhlIGV4Y2VwdGlvbiB3YXMgJHtleGNlcHRpb24ubWVzc2FnZX0NCi0gIA0KLTwvdGVzdDpjYXNlPg0KLQ0KLQ0KLTwhLS0gdGVzdCBEVERzIC0tPiANCi08dGVzdDpjYXNlIG5hbWU9InZhbGlkYXRlRFREIj4NCi0NCi08djp2ZXJpZmllciB1cmk9ImFkZHJlc3MuZHRkIiB2YXI9ImFkZHJlc3NTY2hlbWEiLz4NCi0NCi08djphc3NlcnRWYWxpZCB2ZXJpZmllcj0iJHthZGRyZXNzU2NoZW1hfSI+DQotICA8YWRkcmVzc0Jvb2s+DQotICAgIDxjYXJkPg0KLSAgICAgIDxuYW1lPkpvaG4gU21pdGg8L25hbWU+DQotICAgICAgPGVtYWlsPmpzQGV4YW1wbGUuY29tPC9lbWFpbD4NCi0gICAgPC9jYXJkPg0KLSAgICA8Y2FyZD4NCi0gICAgICA8bmFtZT5GcmVkIEJsb2dnczwvbmFtZT4NCi0gICAgICA8ZW1haWw+ZmJAZXhhbXBsZS5uZXQ8L2VtYWlsPg0KLSAgICA8L2NhcmQ+DQotICA8L2FkZHJlc3NCb29rPg0KLTwvdjphc3NlcnRWYWxpZD4NCi0gIA0KLTwvdGVzdDpjYXNlPg0KLQ0KLQ0KLTx0ZXN0OmNhc2UgbmFtZT0iaW52YWxpZGF0ZURURCI+DQotDQotPHY6dmVyaWZpZXIgdXJpPSJhZGRyZXNzLmR0ZCIgdmFyPSJhZGRyZXNzU2NoZW1hIi8+DQotDQotPGo6Y2F0Y2ggdmFyPSJleGNlcHRpb24iPg0KLTx2OmFzc2VydFZhbGlkIHZhcj0iZmxhZyIgdmVyaWZpZXI9IiR7YWRkcmVzc1NjaGVtYX0iPg0KLSAgPGFkZHJlc3NCb29rPg0KLSAgICA8Y2FyZD4NCi0gICAgICA8ZW1haWw+anNAZXhhbXBsZS5jb208L2VtYWlsPg0KLSAgICA8L2NhcmQ+DQotICAgIDxjYXJkPg0KLSAgICAgIDxuYW1lPkZyZWQgQmxvZ2dzPC9uYW1lPg0KLSAgICA8L2NhcmQ+DQotICAgIDxjYXJkPg0KLSAgICAgIDx3cm9uZ25hbWU+RnJlZCBCbG9nZ3M8L3dyb25nbmFtZT4NCi0gICAgPC9jYXJkPg0KLSAgICA8Y2FyZD4NCi0gICAgPC9jYXJkPg0KLSAgPC9hZGRyZXNzQm9vaz4NCi08L3Y6YXNzZXJ0VmFsaWQ+DQotPC9qOmNhdGNoPg0KLQ0KLTx0ZXN0OmFzc2VydCB0ZXN0PSIkeyFmbGFnfSI+VGhlIGRvY3VtZW50IHNob3VsZCBub3QgYmUgdmFsaWQ8L3Rlc3Q6YXNzZXJ0Pg0KLTx0ZXN0OmFzc2VydCB0ZXN0PSIke2V4Y2VwdGlvbiAhPSBudWxsfSI+QW4gZXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duPC90ZXN0OmFzc2VydD4NCi1UaGUgZXhjZXB0aW9uIHdhcyAke2V4Y2VwdGlvbi5tZXNzYWdlfQ0KLSAgDQotPC90ZXN0OmNhc2U+DQotICAgDQotPC90ZXN0OnN1aXRlPg0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvdmFsaWRhdGUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdmFsaWRhdGUvdmFsaWRhdGVEVEQuamVsbHkgYi9qZWxseS10YWdzL3ZhbGlkYXRlL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3ZhbGlkYXRlL3ZhbGlkYXRlRFRELmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGY5OTQ1Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdmFsaWRhdGUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdmFsaWRhdGUvdmFsaWRhdGVEVEQuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM6dj0iamVsbHk6dmFsaWRhdGUiPgotCi1Mb2FkaW5nIHRoZSB2ZXJpZmllciBmb3IgYSBEVEQKLQotPHY6dmVyaWZpZXIgdXJpPSJhZGRyZXNzLmR0ZCIgdmFyPSJhZGRyZXNzU2NoZW1hIi8+Ci0KLUF0dGVtcHRpbmcgdG8gdmFsaWRhdGUgYSB2YWxpZCBhZGRyZXNzIC4uLgotCi08djp2YWxpZGF0ZSB2YXI9ImZsYWciIHZlcmlmaWVyPSIke2FkZHJlc3NTY2hlbWF9Ij4KLSAgPGFkZHJlc3NCb29rPgotICAgIDxjYXJkPgotICAgICAgPG5hbWU+Sm9obiBTbWl0aDwvbmFtZT4KLSAgICAgIDxlbWFpbD5qc0BleGFtcGxlLmNvbTwvZW1haWw+Ci0gICAgPC9jYXJkPgotICAgIDxjYXJkPgotICAgICAgPG5hbWU+RnJlZCBCbG9nZ3M8L25hbWU+Ci0gICAgICA8ZW1haWw+ZmJAZXhhbXBsZS5uZXQ8L2VtYWlsPgotICAgIDwvY2FyZD4KLSAgPC9hZGRyZXNzQm9vaz4KLTwvdjp2YWxpZGF0ZT4KLQotVmFsaWRhdGlvbiByZXR1cm5lZDogJHtmbGFnfQotCi1BdHRlbXB0aW5nIHRvIHZhbGlkYXRlIGEgd3JvbmcgYWRkcmVzcwotCi08djp2YWxpZGF0ZSB2YXI9ImZsYWciIHZlcmlmaWVyPSIke2FkZHJlc3NTY2hlbWF9Ij4KLSAgPGFkZHJlc3NCb29rPgotICAgIDxjYXJkPgotICAgICAgPGVtYWlsPmpzQGV4YW1wbGUuY29tPC9lbWFpbD4KLSAgICA8L2NhcmQ+Ci0gICAgPGNhcmQ+Ci0gICAgICA8bmFtZT5GcmVkIEJsb2dnczwvbmFtZT4KLSAgICA8L2NhcmQ+Ci0gICAgPGNhcmQ+Ci0gICAgICA8d3JvbmduYW1lPkZyZWQgQmxvZ2dzPC93cm9uZ25hbWU+Ci0gICAgPC9jYXJkPgotICAgIDxjYXJkPgotICAgIDwvY2FyZD4KLSAgPC9hZGRyZXNzQm9vaz4KLTwvdjp2YWxpZGF0ZT4KLQotVmFsaWRhdGlvbiByZXR1cm5lZDogJHtmbGFnfQotICAgIAotPC9qOmplbGx5PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy92YWxpZGF0ZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy92YWxpZGF0ZS92YWxpZGF0ZVJORy5qZWxseSBiL2plbGx5LXRhZ3MvdmFsaWRhdGUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdmFsaWRhdGUvdmFsaWRhdGVSTkcuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5N2NmNjkuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy92YWxpZGF0ZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy92YWxpZGF0ZS92YWxpZGF0ZVJORy5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxuczp2PSJqZWxseTp2YWxpZGF0ZSI+Ci0KLUxvYWRpbmcgdGhlIHZlcmlmaWVyIGZvciBSZWxheCBORyBzY2hlYW0KLQotPHY6dmVyaWZpZXIgdXJpPSJhZGRyZXNzLnJuZyIgdmFyPSJhZGRyZXNzU2NoZW1hIi8+Ci0KLUF0dGVtcHRpbmcgdG8gdmFsaWRhdGUgYSB2YWxpZCBhZGRyZXNzIC4uLgotCi08djp2YWxpZGF0ZSB2YXI9ImZsYWciIHZlcmlmaWVyPSIke2FkZHJlc3NTY2hlbWF9Ij4KLSAgPGFkZHJlc3NCb29rPgotICAgIDxjYXJkPgotICAgICAgPG5hbWU+Sm9obiBTbWl0aDwvbmFtZT4KLSAgICAgIDxlbWFpbD5qc0BleGFtcGxlLmNvbTwvZW1haWw+Ci0gICAgPC9jYXJkPgotICAgIDxjYXJkPgotICAgICAgPG5hbWU+RnJlZCBCbG9nZ3M8L25hbWU+Ci0gICAgICA8ZW1haWw+ZmJAZXhhbXBsZS5uZXQ8L2VtYWlsPgotICAgIDwvY2FyZD4KLSAgPC9hZGRyZXNzQm9vaz4KLTwvdjp2YWxpZGF0ZT4KLQotVmFsaWRhdGlvbiByZXR1cm5lZDogJHtmbGFnfQotCi1BdHRlbXB0aW5nIHRvIHZhbGlkYXRlIGEgd3JvbmcgYWRkcmVzcwotCi08djp2YWxpZGF0ZSB2YXI9ImZsYWciIHZlcmlmaWVyPSIke2FkZHJlc3NTY2hlbWF9Ij4KLSAgPGFkZHJlc3NCb29rPgotICAgIDxjYXJkPgotICAgICAgPGVtYWlsPmpzQGV4YW1wbGUuY29tPC9lbWFpbD4KLSAgICA8L2NhcmQ+Ci0gICAgPGNhcmQ+Ci0gICAgICA8bmFtZT5GcmVkIEJsb2dnczwvbmFtZT4KLSAgICA8L2NhcmQ+Ci0gICAgPGNhcmQ+Ci0gICAgICA8d3JvbmduYW1lPkZyZWQgQmxvZ2dzPC93cm9uZ25hbWU+Ci0gICAgPC9jYXJkPgotICAgIDxjYXJkPgotICAgIDwvY2FyZD4KLSAgPC9hZGRyZXNzQm9vaz4KLTwvdjp2YWxpZGF0ZT4KLQotVmFsaWRhdGlvbiByZXR1cm5lZDogJHtmbGFnfQotICAgIAotPC9qOmplbGx5PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy92YWxpZGF0ZS94ZG9jcy9jaGFuZ2VzLnhtbCBiL2plbGx5LXRhZ3MvdmFsaWRhdGUveGRvY3MvY2hhbmdlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZGZhYWEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy92YWxpZGF0ZS94ZG9jcy9jaGFuZ2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0gLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkNoYW5nZXM8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLSAgPGJvZHk+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4wIiBkYXRlPSIyMDA0LTA5LTEzIj48L3JlbGVhc2U+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3ZhbGlkYXRlL3hkb2NzL2luZGV4LnhtbCBiL2plbGx5LXRhZ3MvdmFsaWRhdGUveGRvY3MvaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGJiNmYwLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdmFsaWRhdGUveGRvY3MvaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+WE1MIFZhbGlkYXRpb24gVGFnIExpYnJhcnk8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLQotICA8Ym9keT4KLSAgICA8c2VjdGlvbiBuYW1lPSJPdmVydmlldyI+Ci0gICAgICA8cD4KLSAgICAgICAgQSB0YWcgbGlicmFyeSBmb3IgdmFsaWRhdGluZyBYTUwgdXNpbmcgdmFyaW91cyBzY2hlbWEgbGFuZ3VhZ2VzIGxpa2UgRFRELCBYTUwgU2NoZW1hLCAKLSAgICAgICAgUmVsYXggTkcgYXMgd2VsbCBhcyBSZWxheCBhbmQgVFJFWC4gVGhpcyB0YWcgbGlicmFyeSB1c2VzIHRoZSAKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL2lzby1yZWxheC5zb3VyY2Vmb3JnZS5uZXQvSkFSVi8iPkpBUlY8L2E+IEFQSSB0byBwZXJmb3JtIHRoZSB2YWxpZGF0aW9uLgotICAgICAgICBCeSBkZWZhdWx0IHdlIHVzZSB0aGUgCi0gICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3dzLnN1bi5jb20vc29mdHdhcmUveG1sL2RldmVsb3BlcnMvbXVsdGlzY2hlbWEvIj5NU1Y8L2E+IAotICAgICAgICBsaWJyYXJ5IGJ5IEtvaHN1a2UgS2F3YWd1Y2hpIGFzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBKQVJWLgotICAgICAgPC9wPgotICAgICAgPHA+Ci0gICAgICAgICAgU2VlIHRoZSA8YSBocmVmPSJ0YWdzLmh0bWwiPnRhZ3M8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgICAgPC9wPgotICAgIDwvc2VjdGlvbj4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy92YWxpZGF0ZS94ZG9jcy9uYXZpZ2F0aW9uLnhtbCBiL2plbGx5LXRhZ3MvdmFsaWRhdGUveGRvY3MvbmF2aWdhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZjY5YTQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy92YWxpZGF0ZS94ZG9jcy9uYXZpZ2F0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgbmFtZT0iWE1MIFZhbGlkYXRpb24gVGFnIExpYnJhcnkiPgotCi0gIDx0aXRsZT5YTUwgVmFsaWRhdGlvbiBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gIAotICA8Ym9keT4KLSAgICA8bWVudSBuYW1lPSJYTUwgVmFsaWRhdGlvbiBUYWcgTGlicmFyeSI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgICAgICAgICAgaHJlZj0iL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IlRhZ3MiICAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFncy5odG1sIi8+Ci0gICAgPC9tZW51PgotICA8L2JvZHk+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3ZlbG9jaXR5Ly5jdnNpZ25vcmUgYi9qZWxseS10YWdzL3ZlbG9jaXR5Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZDMxZjcuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy92ZWxvY2l0eS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1tYXZlbi5sb2cKLXRhcmdldAotdmVsb2NpdHkubG9nCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3ZlbG9jaXR5L2J1aWxkLnhtbCBiL2plbGx5LXRhZ3MvdmVsb2NpdHkvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDZjMmY3Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdmVsb2NpdHkvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS1idWlsZC54bWwgZ2VuZXJhdGVkIGJ5IG1hdmVuIGZyb20gcHJvamVjdC54bWwgdmVyc2lvbiAxLjAtU05BUFNIT1QKLSAgb24gZGF0ZSBNYXkgMjQgMjAwNCwgdGltZSAyMzAyLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXIiIG5hbWU9ImNvbW1vbnMtamVsbHktdGFncy12ZWxvY2l0eSIgYmFzZWRpcj0iLiI+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkZWZhdWx0dGFyZ2V0ZGlyIiB2YWx1ZT0idGFyZ2V0Ij4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYmRpciIgdmFsdWU9InRhcmdldC9saWIiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC9jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cmVwb3J0ZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtcmVwb3J0cyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0ZGlyIiB2YWx1ZT0iZGlzdCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jZGlyIiB2YWx1ZT0iZGlzdC9kb2NzL2FwaSI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJmaW5hbC5uYW1lIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLXZlbG9jaXR5LTEuMC1TTkFQU0hPVCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVzY3JpcHRpb249Im8gSW5pdGlhbGl6ZXMgc29tZSBwcm9wZXJ0aWVzIj4KLSAgICA8bWtkaXIgZGlyPSIke2xpYmRpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibm9nZXQiPgotICAgICAgPGVxdWFscyBhcmcyPSJvbmx5IiBhcmcxPSIke2J1aWxkLnN5c2NsYXNzcGF0aH0iPgotICAgICAgPC9lcXVhbHM+Ci0gICAgPC9jb25kaXRpb24+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJvIENvbXBpbGUgdGhlIGNvZGUiIGRlcGVuZHM9ImdldC1kZXBzIj4KLSAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqYXZhYyBkZXN0ZGlyPSIke2NsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy9qYXZhIj4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0gICAgPGNvcHkgdG9kaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvamF2YSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gICAgPGNvcHkgdG9kaXI9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmplbGx5Ij4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54c2wiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucm5nIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmR0ZCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmh0bWwiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJqYXIiIGRlc2NyaXB0aW9uPSJvIENyZWF0ZSB0aGUgamFyIiBkZXBlbmRzPSJjb21waWxlLHRlc3QiPgotICAgIDxqYXIgamFyZmlsZT0idGFyZ2V0LyR7ZmluYWwubmFtZX0uamFyIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIiBiYXNlZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICA8L2phcj4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJvIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZGlyZWN0b3JpZXMiPgotICAgIDxkZWxldGUgZGlyPSIke2RlZmF1bHR0YXJnZXRkaXJ9Ij4KLSAgICA8L2RlbGV0ZT4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlc2NyaXB0aW9uPSJvIENyZWF0ZSBhIGRpc3RyaWJ1dGlvbiIgZGVwZW5kcz0iamFyLCBqYXZhZG9jIj4KLSAgICA8bWtkaXIgZGlyPSJkaXN0Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb3B5IHRvZGlyPSJkaXN0Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSIgaW5jbHVkZXM9IiouamFyIj4KLSAgICAgIDwvZmlsZXNldD4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZXM9IkxJQ0VOU0UqLCBSRUFETUUqIj4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlc2NyaXB0aW9uPSJvIFJ1biB0aGUgdGVzdCBjYXNlcyIgaWY9InRlc3QuZmFpbHVyZSIgZGVwZW5kcz0iaW50ZXJuYWwtdGVzdCI+Ci0gICAgPGZhaWwgbWVzc2FnZT0iVGhlcmUgd2VyZSB0ZXN0IGZhaWx1cmVzLiI+Ci0gICAgPC9mYWlsPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJpbnRlcm5hbC10ZXN0IiBkZXBlbmRzPSJjb21waWxlLXRlc3RzIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3RyZXBvcnRkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqdW5pdCBkaXI9Ii4vIiBmYWlsdXJlcHJvcGVydHk9InRlc3QuZmFpbHVyZSIgcHJpbnRTdW1tYXJ5PSJ5ZXMiIGZvcms9InRydWUiIGhhbHRvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImJhc2VkaXIiIHZhbHVlPSIuIj4KLSAgICAgIDwvc3lzcHJvcGVydHk+Ci0gICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxmb3JtYXR0ZXIgdXNlZmlsZT0iZmFsc2UiIHR5cGU9InBsYWluIj4KLSAgICAgIDwvZm9ybWF0dGVyPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICA8YmF0Y2h0ZXN0IHRvZGlyPSIke3Rlc3RyZXBvcnRkaXJ9Ij4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovVGVzdCouamF2YSI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2JhdGNodGVzdD4KLSAgICA8L2p1bml0PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlLXRlc3RzIiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iIGRlcHJlY2F0aW9uPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSIgb3B0aW1pemU9ImZhbHNlIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIj4KLSAgICAgIDxzcmM+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL3Rlc3QiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9zcmM+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJqYXZhZG9jIiBkZXNjcmlwdGlvbj0ibyBHZW5lcmF0ZSBqYXZhZG9jIiBkZXBlbmRzPSJqYXIiPgotICAgIDxta2RpciBkaXI9IiR7amF2YWRvY2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPHRzdGFtcD4KLSAgICAgIDxmb3JtYXQgcGF0dGVybj0iMjAwMi15eXl5IiBwcm9wZXJ0eT0ieWVhciI+Ci0gICAgICA8L2Zvcm1hdD4KLSAgICA8L3RzdGFtcD4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29weXJpZ2h0IiB2YWx1ZT0iQ29weXJpZ2h0ICZhbXA7Y29weTsgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLiI+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgICA8cHJvcGVydHkgbmFtZT0idGl0bGUiIHZhbHVlPSJjb21tb25zLWplbGx5LXRhZ3MtdmVsb2NpdHkgMS4wLVNOQVBTSE9UIEFQSSI+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgICA8amF2YWRvYyB1c2U9InRydWUiIHByaXZhdGU9InRydWUiIGRlc3RkaXI9IiR7amF2YWRvY2Rpcn0iIGF1dGhvcj0idHJ1ZSIgdmVyc2lvbj0idHJ1ZSIgc291cmNlcGF0aD0ic3JjL2phdmEiIHBhY2thZ2VuYW1lcz0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MudmVsb2NpdHkuKiI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFkb2M+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImdldC1kZXBzIiB1bmxlc3M9Im5vZ2V0IiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3ZlbG9jaXR5LTEuMy5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vdmVsb2NpdHkvamFycy92ZWxvY2l0eS0xLjMuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamV4bC9qYXJzL2NvbW1vbnMtamV4bC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3htbC1hcGlzLTEuMC5iMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veG1sLWFwaXMvamFycy94bWwtYXBpcy0xLjAuYjIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWJlYW51dGlscy0xLjYuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtYmVhbnV0aWxzL2phcnMvY29tbW9ucy1iZWFudXRpbHMtMS42LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtY29sbGVjdGlvbnMvamFycy9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1sb2dnaW5nL2phcnMvY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vZG9tNGotMS41LWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vZG9tNGovamFycy9kb200ai0xLjUtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vamF4ZW4tMS4xLWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vamF4ZW4vamFycy9qYXhlbi0xLjEtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veGVyY2VzLTIuMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94ZXJjZXMvamFycy94ZXJjZXMtMi4yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qdW5pdC0zLjguMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vanVuaXQvamFycy9qdW5pdC0zLjguMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FudC0xLjUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC0xLjUuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtb3B0aW9uYWwtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtb3B0aW9uYWwtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtbWF2ZW4iPgotICAgIDxnZXQgZGVzdD0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBzcmM9IiR7cmVwb30vbWF2ZW4vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8dW5qYXIgZGVzdD0iJHttYXZlbi5ob21lfSIgc3JjPSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L3VuamFyPgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3ZlbG9jaXR5L21hdmVuLnhtbCBiL2plbGx5LXRhZ3MvdmVsb2NpdHkvbWF2ZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2M0YWNlLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdmVsb2NpdHkvbWF2ZW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgZGVmYXVsdD0iamF2YTpqYXIiPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3ZlbG9jaXR5L3Byb2plY3QucHJvcGVydGllcyBiL2plbGx5LXRhZ3MvdmVsb2NpdHkvcHJvamVjdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWMxYjYxLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdmVsb2NpdHkvcHJvamVjdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCi0jIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQIFIgTyBKIEUgQyBUICBQIFIgTyBQIEUgUiBUIEkgRSBTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvdmVsb2NpdHkvcHJvamVjdC54bWwgYi9qZWxseS10YWdzL3ZlbG9jaXR5L3Byb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjhiODMwLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdmVsb2NpdHkvcHJvamVjdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdD4KLSAgPGV4dGVuZD4ke2Jhc2VkaXJ9Ly4uL3RhZy1wcm9qZWN0LnhtbDwvZXh0ZW5kPgotICA8aWQ+Y29tbW9ucy1qZWxseS10YWdzLXZlbG9jaXR5PC9pZD4KLSAgPG5hbWU+Y29tbW9ucy1qZWxseS10YWdzLXZlbG9jaXR5PC9uYW1lPgotICA8Y3VycmVudFZlcnNpb24+MS4wPC9jdXJyZW50VmVyc2lvbj4KLSAgCi0gIDxwYWNrYWdlPm9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnZlbG9jaXR5PC9wYWNrYWdlPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgICAgIFRoaXMgaXMgYSBKZWxseSBpbnRlcmZhY2UgZm9yIFZlbG9jaXR5LgotICA8L2Rlc2NyaXB0aW9uPgotICA8c2hvcnREZXNjcmlwdGlvbj5Db21tb25zIEplbGx5IFZlbG9jaXR5IFRhZyBMaWJyYXJ5PC9zaG9ydERlc2NyaXB0aW9uPgotICAKLSAgPHZlcnNpb25zPgotICAgIDx2ZXJzaW9uPgotICAgICAgPGlkPjEuMDwvaWQ+Ci0gICAgICA8bmFtZT4xLjA8L25hbWU+Ci0gICAgICA8dGFnPkNPTU1PTlNfSkVMTFlfVkVMT0NJVFktMV8wPC90YWc+Ci0gICAgPC92ZXJzaW9uPgotICA8L3ZlcnNpb25zPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0KLSAgICA8IS0tIFNUQVJUIGZvciBjb21waWxhdGlvbiAtLT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD52ZWxvY2l0eTwvaWQ+Ci0gICAgICA8dmVyc2lvbj4xLjM8L3ZlcnNpb24+Ci0gICAgICA8dXJsPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdmVsb2NpdHkvPC91cmw+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGd1bXAucHJvamVjdD5qYWthcnRhLXZlbG9jaXR5PC9ndW1wLnByb2plY3Q+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPCEtLSBFTkQgZm9yIGNvbXBpbGF0aW9uIC0tPgotCi0gIDwvZGVwZW5kZW5jaWVzPgotICAKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvdmVsb2NpdHkvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdmVsb2NpdHkvSmVsbHlDb250ZXh0QWRhcHRlci5qYXZhIGIvamVsbHktdGFncy92ZWxvY2l0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy92ZWxvY2l0eS9KZWxseUNvbnRleHRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYTg1N2UuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy92ZWxvY2l0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy92ZWxvY2l0eS9KZWxseUNvbnRleHRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy52ZWxvY2l0eTsKLQotLyoKLSAqIENvcHlyaWdodCAyMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5jb250ZXh0LkNvbnRleHQ7Ci0KLS8qKgotICogQWRhcHRzIGEgSmVsbHlDb250ZXh0IGZvciB1c2UgYXMgYSBWZWxvY2l0eSBDb250ZXh0LiAgVGhpcyBjb250ZXh0Ci0gKiBjYW4gYmUgdXNlZCBpbiBlaXRoZXIgcmVhZC1vbmx5IG9yIHJlYWQtd3JpdGUgbW9kZS4gIFdoZW4gdXNlZCBhcyBhCi0gKiByZWFkLW9ubHkgYWRhcHRlciwgaXRlbXMgPHR0PnB1dDwvdHQ+IG9yIDx0dD5yZW1vdmU8L3R0PmVkIGZyb20gdGhlCi0gKiBWZWxvY2l0eSBjb250ZXh0IGFyZSBub3QgcGVybWl0dGVkIHRvIHByb3BvZ2F0ZSB0byB0aGUgSmVsbHlDb250ZXh0LAotICogd2hpY2ggaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IuICBUaGUgYWRhcHRlciBjYW4gYWxzbyBiZSB1c2VkIGluIGEKLSAqIHJlYWQtd3JpdGUgbW9kZS4gIFRoaXMgcGVybWl0cyBjaGFuZ2VzIG1hZGUgYnkgVmVsb2NpdHkgdG8gcHJvcG9nYXRlCi0gKiB0byB0aGUgSmVsbHlDb250ZXh0LgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnBldGUtYXBhY2hlLWRldkBrYXptaWVyLmNvbSI+UGV0ZSBLYXptaWVyPC9hPgotICogQHZlcnNpb24gJElkOiBKZWxseUNvbnRleHRBZGFwdGVyLmphdmEsdiAxLjQgMjAwNC8wOS8wOSAxMjoyMzoxNiBkaW9uIEV4cCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBKZWxseUNvbnRleHRBZGFwdGVyIGltcGxlbWVudHMgQ29udGV4dAotewotICAgIC8qKiBGbGFnIHRvIGluZGljYXRlIHJlYWQtb25seSBvciByZWFkLXdyaXRlIG1vZGUgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcmVhZE9ubHkgPSB0cnVlOwotCi0gICAgLyoqIFRoZSBKZWxseUNvbnRleHQgYmVpbmcgYWRhcHRlZCAqLwotICAgIHByaXZhdGUgSmVsbHlDb250ZXh0IGplbGx5Q29udGV4dDsKLQotICAgIC8qKiBUaGUgc3RvcmUgZm9yIFZlbG9jaXR5IGluIHRoZSBldmVudCB0aGUgYWRwYXRlciBpcyByZWFkLW9ubHkgKi8KLSAgICBwcml2YXRlIEhhc2hNYXAgcHJpdmF0ZUNvbnRleHQgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gamVsbHlDb250ZXh0IFRoZSBKZWxseUNvbnRleHQgdG8gYWRhcHQKLSAgICAgKi8KLSAgICBwdWJsaWMgSmVsbHlDb250ZXh0QWRhcHRlciggSmVsbHlDb250ZXh0IGplbGx5Q29udGV4dCApCi0gICAgewotICAgICAgICB0aGlzLmplbGx5Q29udGV4dCA9IGplbGx5Q29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSByZWFkLW9ubHkgZmxhZyBmb3IgdGhpcyBhZGFwdGVyLiAgSWYgdGhlIHJlYWQtb25seSBmbGFnCi0gICAgICogaXMgc2V0LCBjaGFuZ2VzIHRvIHRoZSBWZWxvY2l0eSBDb250ZXh0IHdpbGwgbm90IGJlIHByb3BvZ2F0ZWQgdG8KLSAgICAgKiB0aGUgSmVsbHlDb250ZXh0LiAgVHVybmluZyB0aGUgcmVhZC1vbmx5IGZsYWcgb2ZmIGVuYWJsZXMgY2hhbmdlcwotICAgICAqIHRvIHByb3BvZ2F0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZWFkT25seSBJZiB0aGlzIHBhcmFtZXRlciBpcyA8dHQ+dHJ1ZTwvdHQ+LCB0aGUgYWRhcHRlcgotICAgICAqIGJlY29tZXMgcmVhZC1vbmx5LiAgU2V0dGluZyB0aGUgcGFyYW1ldGVyIHRvIDx0dD5mYWxzZTwvdHQ+IHRoZQotICAgICAqIGFkYXB0ZXIgYmVjb21lcyByZWFkLXdyaXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpCi0gICAgewotICAgICAgICB0aGlzLnJlYWRPbmx5ID0gcmVhZE9ubHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgaWYgdGhlIGFkYXB0ZXIgaXMgcmVhZC1vbmx5LgotICAgICAqCi0gICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBhZHBhdGVyIGlzIHJlYWQtb25seTsgb3RoZXJ3aXNlCi0gICAgICogcmV0dXJucyA8dHQ+ZmFsc2U8L3R0Pi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiByZWFkT25seTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleSggT2JqZWN0IGtleSApCi0gICAgewotICAgICAgICBpZiAoIGtleSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCByZWFkT25seSAmJiBwcml2YXRlQ29udGV4dC5jb250YWluc0tleSgga2V5ICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBqZWxseUNvbnRleHQuZ2V0VmFyaWFibGUoIGtleS50b1N0cmluZygpICkgIT0gbnVsbCA/IHRydWUgOiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldCggU3RyaW5nIGtleSApCi0gICAgewotICAgICAgICBpZiAoIGtleSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHJlYWRPbmx5ICYmIHByaXZhdGVDb250ZXh0LmNvbnRhaW5zS2V5KCBrZXkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwcml2YXRlQ29udGV4dC5nZXQoIGtleSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGplbGx5Q29udGV4dC5nZXRWYXJpYWJsZSgga2V5ICk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIGdldEtleXMoKQotICAgIHsKLSAgICAgICAgU2V0IGtleXMgPSBqZWxseUNvbnRleHQuZ2V0VmFyaWFibGVzKCkua2V5U2V0KCk7Ci0KLSAgICAgICAgaWYgKCByZWFkT25seSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEhhc2hTZXQgY29tYmluZWRLZXlzID0gbmV3IEhhc2hTZXQoIGtleXMgKTsKLSAgICAgICAgICAgIGNvbWJpbmVkS2V5cy5hZGRBbGwoIHByaXZhdGVDb250ZXh0LmtleVNldCgpICk7Ci0gICAgICAgICAgICBrZXlzID0gY29tYmluZWRLZXlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGtleXMudG9BcnJheSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcHV0KCBTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUgKQotICAgIHsKLSAgICAgICAgT2JqZWN0IG9sZFZhbHVlOwotCi0gICAgICAgIGlmICgga2V5ID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCByZWFkT25seSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9sZFZhbHVlID0gcHJpdmF0ZUNvbnRleHQucHV0KCBrZXksIHZhbHVlICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBvbGRWYWx1ZSA9IGplbGx5Q29udGV4dC5nZXRWYXJpYWJsZSgga2V5ICk7Ci0gICAgICAgICAgICBqZWxseUNvbnRleHQuc2V0VmFyaWFibGUoIGtleSwgdmFsdWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvbGRWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZSggT2JqZWN0IGtleSApCi0gICAgewotICAgICAgICBPYmplY3Qgb2xkVmFsdWU7Ci0KLSAgICAgICAgaWYgKCBrZXkgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCByZWFkT25seSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9sZFZhbHVlID0gcHJpdmF0ZUNvbnRleHQucmVtb3ZlKCBrZXkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9sZFZhbHVlID0gamVsbHlDb250ZXh0LmdldFZhcmlhYmxlKCBrZXkudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgamVsbHlDb250ZXh0LnJlbW92ZVZhcmlhYmxlKCBrZXkudG9TdHJpbmcoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9sZFZhbHVlOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy92ZWxvY2l0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy92ZWxvY2l0eS9NZXJnZVRhZy5qYXZhIGIvamVsbHktdGFncy92ZWxvY2l0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy92ZWxvY2l0eS9NZXJnZVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjAzY2E1Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdmVsb2NpdHkvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdmVsb2NpdHkvTWVyZ2VUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnZlbG9jaXR5OwotCi0vKgotICogQ29weXJpZ2h0IDIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuZXhjZXB0aW9uLk1ldGhvZEludm9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5leGNlcHRpb24uUGFyc2VFcnJvckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LmV4Y2VwdGlvbi5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLS8qKgotICogQSB0YWcgdGhhdCB1c2VzIFZlbG9jaXR5IHRvIHJlbmRlciBhIHNwZWNpZmllZCB0ZW1wbGF0ZSB3aXRoIHRoZQotICogSmVsbHlDb250ZXh0IHN0b3JpbmcgdGhlIHJlc3VsdHMgaW4gZWl0aGVyIGEgdmFyaWFibGUgaW4gdGhlCi0gKiBKZWxseUNvbnRleHQgb3IgaW4gYSBzcGVjaWZpZWQgZmlsZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpwZXRlLWFwYWNoZS1kZXZAa2F6bWllci5jb20iPlBldGUgS2F6bWllcjwvYT4KLSAqIEB2ZXJzaW9uICRJZDogTWVyZ2VUYWcuamF2YSx2IDEuNCAyMDA0LzA5LzA5IDEyOjIzOjE2IGRpb24gRXhwICQKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlVGFnIGV4dGVuZHMgVmVsb2NpdHlUYWdTdXBwb3J0Ci17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HID0gIklTTy04ODU5LTEiOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYmFzZWRpcjsKLSAgICBwcml2YXRlIFN0cmluZyB0ZW1wbGF0ZTsKLSAgICBwcml2YXRlIFN0cmluZyBpbnB1dEVuY29kaW5nOwotICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dEVuY29kaW5nOwotICAgIHByaXZhdGUgYm9vbGVhbiByZWFkT25seSA9IHRydWU7Ci0KLSAgICAvLyAtLSBUYWcgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyggZmluYWwgWE1MT3V0cHV0IG91dHB1dCApIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKCBiYXNlZGlyID09IG51bGwgfHwgdGVtcGxhdGUgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlRoaXMgdGFnIG11c3QgZGVmaW5lICdiYXNlZGlyJyBhbmQgJ3RlbXBsYXRlJyIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggbmFtZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBXcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKCBuYW1lICksCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRFbmNvZGluZyA9PSBudWxsID8gRU5DT0RJTkcgOiBvdXRwdXRFbmNvZGluZyApOwotICAgICAgICAgICAgICAgIG1lcmdlVGVtcGxhdGUoIHdyaXRlciApOwotICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHZhciAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgIG1lcmdlVGVtcGxhdGUoIHdyaXRlciApOwotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSggdmFyLCB3cml0ZXIudG9TdHJpbmcoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVGhpcyB0YWcgbXVzdCBkZWZpbmUgZWl0aGVyICduYW1lJyBvciAndmFyJyIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tIFByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhciB1c2VkIHRvIHN0b3JlIHRoZSByZXN1bHRzIG9mIHRoZSBtZXJnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YXIgVGhlIHZhciB0byBzZXQgaW4gdGhlIEplbGx5Q29udGV4dCB3aXRoIHRoZSByZXN1bHRzIG9mCi0gICAgICogdGhlIG1lcmdlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhciggU3RyaW5nIHZhciApCi0gICAgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmaWxlIG5hbWUgZm9yIHRoZSBtZXJnZWQgb3V0cHV0LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUKLSAgICAgKiByZXN1bHRzIG9mIHRoZSBtZXJnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGJhc2UgZGlyZWN0b3J5IHVzZWQgZm9yIGxvYWRpbmcgb2YgdGVtcGxhdGVzIGJ5IHRoZQotICAgICAqIFZlbG9jaXR5IGZpbGUgcmVzb3VyY2UgbG9hZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGJhc2VkaXIgVGhlIGRpcmVjdG9yeSB3aGVyZSB0ZW1wbGF0ZXMgY2FuIGJlIGxvY2F0ZWQgYnkKLSAgICAgKiB0aGUgVmVsb2NpdHkgZmlsZSByZXNvdXJjZSBsb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZWRpciggU3RyaW5nIGJhc2VkaXIgKQotICAgIHsKLSAgICAgICAgdGhpcy5iYXNlZGlyID0gYmFzZWRpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmaWxlbmFtZSBvZiB0aGUgdGVtcGxhdGUgdXNlZCB0byBtZXJnZSB3aXRoIHRoZQotICAgICAqIEplbGx5Q29udGV4dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZW1wbGF0ZSBUaGUgZmlsZW5hbWUgb2YgdGhlIHRlbXBsYXRlIHRvIGJlIG1lcmdlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUZW1wbGF0ZSggU3RyaW5nIHRlbXBsYXRlICkKLSAgICB7Ci0gICAgICAgIHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSByZWFkLW9ubHkgZmxhZyBmb3IgdGhpcyBhZGFwdGVyIHdoaWNoIHByZXZlbnRzCi0gICAgICogbW9kaWZpY2F0aW9ucyBpbiB0aGUgVmVsb2NpdHkgY29udGV4dCBmcm9tIHByb3BvZ2F0aW5nIHRvIHRoZQotICAgICAqIEplbGx5Q29udGV4dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZWFkT25seSA8dHQ+dHJ1ZTwvdHQ+IHByZXZlbnRzIG1vZGlmaWNhdGlvbnMgZnJvbQotICAgICAqIHByb3BvZ2F0aW5nICh0aGUgZGVmYXVsdCksIG9yIDx0dD5mYWxzZTwvdHQ+IHdoaWNoIHBlcm1pdHMKLSAgICAgKiBtb2RpZmljYXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KCBib29sZWFuIHJlYWRPbmx5ICkKLSAgICB7Ci0gICAgICAgIHRoaXMucmVhZE9ubHkgPSByZWFkT25seTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBvdXRwdXQgZW5jb2RpbmcgbW9kZSB3aGljaCBkZWZhdWx0cyB0byBJU08tODg1OS0xIHVzZWQKLSAgICAgKiB3aGVuIHN0b3JpbmcgdGhlIHJlc3VsdHMgb2YgYSBtZXJnZSBpbiBhIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW5jb2RpbmcgIFRoZSBmaWxlIGVuY29kaW5nIHRvIHVzZSB3aGVuIHdyaXRpbmcgdGhlCi0gICAgICogb3V0cHV0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dEVuY29kaW5nKCBTdHJpbmcgZW5jb2RpbmcgKQotICAgIHsKLSAgICAgICAgdGhpcy5vdXRwdXRFbmNvZGluZyA9IGVuY29kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGlucHV0IGVuY29kaW5nIHVzZWQgaW4gdGhlIHNwZWNpZmllZCB0ZW1wbGF0ZSB3aGljaAotICAgICAqIGRlZmF1bHRzIHRvIElTTy04ODU5LTEuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW5jb2RpbmcgIFRoZSBlbmNvZGluZyB1c2VkIGluIHRoZSB0ZW1wbGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dEVuY29kaW5nKCBTdHJpbmcgZW5jb2RpbmcgKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnB1dEVuY29kaW5nID0gZW5jb2Rpbmc7Ci0gICAgfQotCi0gICAgLy8gLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogTWVyZ2VzIHRoZSBWZWxvY2l0eSB0ZW1wbGF0ZSB3aXRoIHRoZSBKZWxseSBjb250ZXh0LgotICAgICAqCi0gICAgICogQHBhcmFtIHdyaXRlciBUaGUgb3V0cHV0IHdyaXRlciB1c2VkIHRvIHdyaXRlIHRoZSBtZXJnZWQgcmVzdWx0cy4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBJZiBhbiBleGNlcHRpb24gb2NjdXJzIGR1cmluZyB0aGUgbWVyZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG1lcmdlVGVtcGxhdGUoIFdyaXRlciB3cml0ZXIgKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEplbGx5Q29udGV4dEFkYXB0ZXIgYWRhcHRlciA9IG5ldyBKZWxseUNvbnRleHRBZGFwdGVyKCBnZXRDb250ZXh0KCkgKTsKLSAgICAgICAgYWRhcHRlci5zZXRSZWFkT25seSggcmVhZE9ubHkgKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0VmVsb2NpdHlFbmdpbmUoIGJhc2VkaXIgKS5tZXJnZVRlbXBsYXRlKAotICAgICAgICAgICAgICAgIHRlbXBsYXRlLAotICAgICAgICAgICAgICAgIGlucHV0RW5jb2RpbmcgPT0gbnVsbCA/IEVOQ09ESU5HIDogaW5wdXRFbmNvZGluZywKLSAgICAgICAgICAgICAgICBhZGFwdGVyLAotICAgICAgICAgICAgICAgIHdyaXRlciApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUGFyc2VFcnJvckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1ldGhvZEludm9jYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3ZlbG9jaXR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3ZlbG9jaXR5L1ZlbG9jaXR5VGFnTGlicmFyeS5qYXZhIGIvamVsbHktdGFncy92ZWxvY2l0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy92ZWxvY2l0eS9WZWxvY2l0eVRhZ0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0NTFhNS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3ZlbG9jaXR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3ZlbG9jaXR5L1ZlbG9jaXR5VGFnTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy52ZWxvY2l0eTsKLQotLyoKLSAqIENvcHlyaWdodCAyMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ0xpYnJhcnk7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBUYWdsaWIuIFRoaXMgY2xhc3MgY291bGQgYmUgZ2VuZXJhdGVkIGJ5IFhEb2NsZXQKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpwZXRlLWFwYWNoZS1kZXZAa2F6bWllci5jb20iPlBldGUgS2F6bWllcjwvYT4KLSAqIEB2ZXJzaW9uICRJZDogVmVsb2NpdHlUYWdMaWJyYXJ5LmphdmEsdiAxLjMgMjAwNC8wOS8wOSAxMjoyMzoxNiBkaW9uIEV4cCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBWZWxvY2l0eVRhZ0xpYnJhcnkgZXh0ZW5kcyBUYWdMaWJyYXJ5Ci17Ci0gICAgcHVibGljIFZlbG9jaXR5VGFnTGlicmFyeSgpCi0gICAgewotICAgICAgICByZWdpc3RlclRhZyggIm1lcmdlIiwgTWVyZ2VUYWcuY2xhc3MgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3ZlbG9jaXR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3ZlbG9jaXR5L1ZlbG9jaXR5VGFnU3VwcG9ydC5qYXZhIGIvamVsbHktdGFncy92ZWxvY2l0eS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy92ZWxvY2l0eS9WZWxvY2l0eVRhZ1N1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZhM2UxOS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3ZlbG9jaXR5L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3ZlbG9jaXR5L1ZlbG9jaXR5VGFnU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy52ZWxvY2l0eTsKLQotLyoKLSAqIENvcHlyaWdodCAyMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuYXBwLlZlbG9jaXR5RW5naW5lOwotCi0vKioKLSAqIFN1cHBvcnQgbWV0aG9kcyBmb3IgdGhlIFZlbG9jaXR5IHRhZyBsaWJyYXJ5LiAgQ3VycmVudGx5IHRoaXMgaXMgb25seQotICogdXNlZCB0byBnZXQgYW4gaW5zdGFuY2Ugb2YgdGhlIFZlbG9jaXR5RW5naW5lLiAgRm9yIGVhY2ggdW5pcXVlIGJhc2UKLSAqIGRpcmVjdG9yeSBzcGVjaWZpZWQsIGEgbmV3IFZlbG9jaXR5RW5naW5lIGluc3RhbmNlIGlzIHN0b3JlZCBpbiB0aGUKLSAqIGNvbnRleHQgKGFzIHRoZSBhdXRob3IgaGFzbid0IGZpZ3VyZWQgb3V0IGhvdyB0byBjaGFuZ2UgdGhlIHJlc291cmNlCi0gKiBsb2FkZXIgb2YgYW4gYWxyZWFkeSBpbml0J2QgVmVsb2NpdHlFbmdpbmUpLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnBldGUtYXBhY2hlLWRldkBrYXptaWVyLmNvbSI+UGV0ZSBLYXptaWVyPC9hPgotICogQHZlcnNpb24gJElkOiBWZWxvY2l0eVRhZ1N1cHBvcnQuamF2YSx2IDEuNCAyMDA0LzA5LzA5IDEyOjIzOjE2IGRpb24gRXhwICQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZlbG9jaXR5VGFnU3VwcG9ydCBleHRlbmRzIFRhZ1N1cHBvcnQKLXsKLSAgICAvKiogVGhlIFZlbG9jaXR5RW5naW5lIHZhcmlhYmxlIG5hbWUgaW4gdGhlIEplbGx5Q29udGV4dC4gICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVMT0NJVFlfRU5HSU5FX1ZBUl9OQU1FID0KLSAgICAgICAgICAgICJvcmcuYXBhY2hlLm1hdmVuLmplbGx5LnRhZ3MudmVsb2NpdHkuVmVsb2NpdHlFbmdpbmUiOwotCi0gICAgLyoqCi0gICAgICogR2V0cyBvciBjcmVhdGVzIGEgVmVsb2NpdHlFbmdpbmUgaWYgb25lIGRvZXNuJ3QgYWxyZWFkeSBleGlzdCBmb3IKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGJhc2UgZGlyZWN0b3J5LgotICAgICAqCi0gICAgICogQHJldHVybiBBIFZlbG9jaXR5RW5naW5lIHdpdGggYSBmaWxlIHJlc291cmNlIGxvYWRlciBjb25maWd1cmVkCi0gICAgICogZm9yIHRoZSBzcGVjaWZpZWQgYmFzZSBkaXJlY3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIFZlbG9jaXR5RW5naW5lIGdldFZlbG9jaXR5RW5naW5lKCBTdHJpbmcgYmFzZWRpciApIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgVmVsb2NpdHlFbmdpbmUgdmUgPSAoIFZlbG9jaXR5RW5naW5lICkgZ2V0Q29udGV4dCgpLmdldFZhcmlhYmxlKAotICAgICAgICAgICAgICAgIGtleU5hbWUoIGJhc2VkaXIgKSApOwotCi0gICAgICAgIGlmICggdmUgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZlID0gbmV3IFZlbG9jaXR5RW5naW5lKCk7Ci0gICAgICAgICAgICB2ZS5zZXRQcm9wZXJ0eSggVmVsb2NpdHlFbmdpbmUuUlVOVElNRV9MT0dfTE9HU1lTVEVNLCB0aGlzICk7Ci0gICAgICAgICAgICB2ZS5zZXRQcm9wZXJ0eSggVmVsb2NpdHlFbmdpbmUuRklMRV9SRVNPVVJDRV9MT0FERVJfUEFUSCwgYmFzZWRpciApOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHZlLmluaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnNldFZhcmlhYmxlKCBrZXlOYW1lKCBiYXNlZGlyICksIHZlICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyB0aGUgbmFtZSBvZiB0aGUga2V5IHVzZWQgdG8gcmVmZXJlbmNlIHRoZQotICAgICAqIFZlbG9jaXR5RW5naW5lIGZvciB0aGUgc3BlY2lmaWVkIGJhc2UgZGlyZWN0b3J5LgotICAgICAqCi0gICAgICogQHBhcmFtIGJhc2VkaXIgVGhlIGJhc2UgZGlyZWN0b3J5IHVzZWQgYnkgdGhlIFZlbG9jaXR5RW5naW5lCi0gICAgICogQHJldHVybiBUaGUga2V5IHVzZWQgdG8gcmVmZXJlbmNlIHRoZSBWZWxvY2l0eUVuZ2luZSB0aGF0IGhhcwotICAgICAqIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGJhc2UgZGlyZWN0b3J5LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGtleU5hbWUoIFN0cmluZyBiYXNlZGlyICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nQnVmZmVyKCkKLSAgICAgICAgICAgIC5hcHBlbmQoIFZFTE9DSVRZX0VOR0lORV9WQVJfTkFNRSApCi0gICAgICAgICAgICAuYXBwZW5kKCAnLicgKQotICAgICAgICAgICAgLmFwcGVuZCggYmFzZWRpciApCi0gICAgICAgICAgICAudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3ZlbG9jaXR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3ZlbG9jaXR5L0plbGx5Q29udGV4dEFkYXB0ZXJUZXN0LmphdmEgYi9qZWxseS10YWdzL3ZlbG9jaXR5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3ZlbG9jaXR5L0plbGx5Q29udGV4dEFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYjllYjAuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy92ZWxvY2l0eS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy92ZWxvY2l0eS9KZWxseUNvbnRleHRBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MudmVsb2NpdHk7Ci0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkNvbGxlY3Rpb25VdGlsczsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIDxjb2RlPkplbGx5Q29udGV4dEFkYXB0ZXI8L2NvZGU+LgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnBldGUtYXBhY2hlLWRldkBrYXptaWVyLmNvbSI+UGV0ZSBLYXptaWVyPC9hPgotICogQHZlcnNpb24gJElkOiBKZWxseUNvbnRleHRBZGFwdGVyVGVzdC5qYXZhLHYgMS4zIDIwMDQvMDkvMDkgMTI6MjM6MTcgZGlvbiBFeHAgJAotICovCi1wdWJsaWMgY2xhc3MgSmVsbHlDb250ZXh0QWRhcHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIEplbGx5Q29udGV4dCBqZWxseUNvbnRleHQ7Ci0gICAgSmVsbHlDb250ZXh0QWRhcHRlciBhZGFwdGVyOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgSmVsbHlDb250ZXh0QWRhcHRlclRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEplbGx5Q29udGV4dEFkYXB0ZXJUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKQotICAgIHsKLSAgICAgICAgamVsbHlDb250ZXh0ID0gbmV3IEplbGx5Q29udGV4dCgpOwotICAgICAgICBhZGFwdGVyID0gbmV3IEplbGx5Q29udGV4dEFkYXB0ZXIoIGplbGx5Q29udGV4dCApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIGJlaGF2aW9yIG9mIG51bGwga2V5cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbEtleSgpCi0gICAgewotICAgICAgICBhZGFwdGVyLnNldFJlYWRPbmx5KCBmYWxzZSApOwotICAgICAgICBhZGFwdGVyLnB1dCggbnVsbCwgbmV3IE9iamVjdCgpICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggYWRhcHRlci5nZXQoIG51bGwgKSA9PSBudWxsICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGUgYmVoYXZpb3Igb2YgbnVsbCB2YWx1ZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE51bGxWYWx1ZSgpCi0gICAgewotICAgICAgICBhZGFwdGVyLnNldFJlYWRPbmx5KCBmYWxzZSApOwotICAgICAgICBhZGFwdGVyLnB1dCggImtleSIsIG51bGwgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCBhZGFwdGVyLmdldCggImtleSIgKSA9PSBudWxsICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IGl0ZW1zIGNhbiBiZSBhZGRlZCBhbmQgcmV0cmlldmVkIGZyb20gYSByZWFkLXdyaXRlCi0gICAgICogYWRwYXRlci4gIEFsc28gdmVyaWZ5IHRoZSBrZXkvdmFsdWUgcGFpciB3YXMgYWN0dWFsbHkgaW5zZXJ0ZWQKLSAgICAgKiBpbnRvIHRoZSBKZWxseUNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlYWRXcml0ZVB1dCgpCi0gICAgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBuZXcgT2JqZWN0KCk7Ci0KLSAgICAgICAgYWRhcHRlci5zZXRSZWFkT25seSggZmFsc2UgKTsKLSAgICAgICAgYWRhcHRlci5wdXQoICJrZXkiLCB2YWx1ZSApOwotCi0gICAgICAgIGFzc2VydFRydWUoICJhZGFwdGVyOiBkaWQgbm90IHJldHVybiB0aGUgb3JpZ2luYWwgdmFsdWUiLAotICAgICAgICAgICAgICAgIGFkYXB0ZXIuZ2V0KCAia2V5IiApID09IHZhbHVlICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggImplbGx5Q29udGV4dDogZGlkIG5vdCByZXR1cm4gdGhlIG9yaWdpbmFsIHZhbHVlIiwKLSAgICAgICAgICAgICAgICBqZWxseUNvbnRleHQuZ2V0VmFyaWFibGUoICJrZXkiICkgPT0gdmFsdWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgaXRlbXMgY2FuIGJlIGFkZGVkIGFuZCByZXRyaWV2ZWQgZnJvbSBhIHJlYWQtb25seQotICAgICAqIGFkYXB0ZXIuICBBbHNvIHZlcmlmeSB0aGUga2V5L3ZhbHVlIHBhaXIgd2FzIG5vdCBpbnNlcnRlZCBpbnRvCi0gICAgICogdGhlIEplbGx5Q29udGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZE9ubHlQdXQoKQotICAgIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbmV3IE9iamVjdCgpOwotCi0gICAgICAgIGFkYXB0ZXIuc2V0UmVhZE9ubHkoIHRydWUgKTsKLSAgICAgICAgYWRhcHRlci5wdXQoICJrZXkiLCB2YWx1ZSApOwotCi0gICAgICAgIGFzc2VydFRydWUoICJhZGFwdGVyOiBkaWQgbm90IHJldHVybiB0aGUgb3JpZ2luYWwgdmFsdWUiLAotICAgICAgICAgICAgICAgIGFkYXB0ZXIuZ2V0KCAia2V5IiApID09IHZhbHVlICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggImplbGx5Q29udGV4dDogbXVzdCByZXR1cm4gbnVsbCB3aGVuIGFkYXB0ZXIgaXMgcmVhZG9ubHkiLAotICAgICAgICAgICAgICAgIGplbGx5Q29udGV4dC5nZXRWYXJpYWJsZSggImtleSIgKSA9PSBudWxsICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IGl0ZW1zIGNhbiBiZSByZW1vdmVkIGZyb20gYSByZWFkLXdyaXRlIGNvbnRleHQuICBBbHNvCi0gICAgICogdmVyaWZ5IHRoYXQgdGhlIGl0ZW0gaXMgcmVtb3ZlZCBmcm9tIHRoZSBKZWxseUNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlYWRXcml0ZVJlbW92ZSgpCi0gICAgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBuZXcgT2JqZWN0KCk7Ci0KLSAgICAgICAgYWRhcHRlci5zZXRSZWFkT25seSggZmFsc2UgKTsKLSAgICAgICAgYWRhcHRlci5wdXQoICJrZXkiLCB2YWx1ZSApOwotICAgICAgICBPYmplY3Qgb2xkVmFsdWUgPSBhZGFwdGVyLnJlbW92ZSggImtleSIgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiVmFsdWUgcmV0dXJuZWQgZnJvbSByZW1vdmUoKSBpcyBub3QgdGhlIG9yaWdpbmFsIiwKLSAgICAgICAgICAgICAgICB2YWx1ZSA9PSBvbGRWYWx1ZSApOwotCi0gICAgICAgIGFzc2VydFRydWUoICJhZGFwdGVyOiBhZnRlciByZW1vdmFsIG9mIGtleSwgdmFsdWUgc2hvdWxkIGJlIG51bGwiLAotICAgICAgICAgICAgICAgIGFkYXB0ZXIuZ2V0KCAia2V5IiApID09IG51bGwgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiamVsbHlDb250ZXh0OiBhZnRlciByZW1vdmFsIG9mIGtleSwgdmFsdWUgc2hvdWxkIGJlIG51bGwiLAotICAgICAgICAgICAgICAgIGplbGx5Q29udGV4dC5nZXRWYXJpYWJsZSggImtleSIgKSA9PSBudWxsICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlJlbW92YWwgb2Ygbm9uLWV4aXN0ZW50IGtleSBzaG91bGQgcmV0dXJuIG51bGwiLAotICAgICAgICAgICAgICAgIGFkYXB0ZXIucmVtb3ZlKCAibm9uLWV4aXN0ZW50IGtleSIgKSA9PSBudWxsICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IGl0ZW1zIGNhbiBiZSByZW1vdmVkIGZyb20gYSByZWFkLW9ubHkgY29udGV4dC4gIEFsc28KLSAgICAgKiB2ZXJpZnkgdGhhdCB0aGUgSmVsbHlDb250ZXh0IGlzIG5vdCBpbXBhY3RlZCBieSByZW1vdmFsIG9mIGtleXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlYWRPbmx5UmVtb3ZlKCkKLSAgICB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG5ldyBPYmplY3QoKTsKLQotICAgICAgICBhZGFwdGVyLnNldFJlYWRPbmx5KCB0cnVlICk7Ci0gICAgICAgIGFkYXB0ZXIucHV0KCAia2V5IiwgdmFsdWUgKTsKLQotICAgICAgICBPYmplY3Qgb2xkVmFsdWUgPSBhZGFwdGVyLnJlbW92ZSggImtleSIgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiVmFsdWUgcmV0dXJuZWQgZnJvbSByZW1vdmUoKSBpcyBub3QgdGhlIG9yaWdpbmFsIiwKLSAgICAgICAgICAgICAgICB2YWx1ZSA9PSBvbGRWYWx1ZSApOwotCi0gICAgICAgIGFzc2VydFRydWUoICJhZGFwdGVyOiBhZnRlciByZW1vdmFsIG9mIGtleSwgdmFsdWUgc2hvdWxkIGJlIG51bGwiLAotICAgICAgICAgICAgICAgIGFkYXB0ZXIuZ2V0KCAia2V5IiApID09IG51bGwgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiamVsbHlDb250ZXh0OiB2YWx1ZSBzaG91bGQgbm90IGJlIGFmZmVjdGVkLiIsCi0gICAgICAgICAgICAgICAgamVsbHlDb250ZXh0LmdldFZhcmlhYmxlKCAia2V5IiApID09IG51bGwgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiUmVtb3ZhbCBvZiBub24tZXhpc3RlbnQga2V5IHNob3VsZCByZXR1cm4gbnVsbCIsCi0gICAgICAgICAgICAgICAgYWRhcHRlci5yZW1vdmUoICJub24tZXhpc3RlbnQga2V5IiApID09IG51bGwgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgaXRlbXMgY2FuIHNoYWRvdyBvciBoaWRlIGl0ZW1zIGluIHRoZSBKZWxseUNvbnRleHQuCi0gICAgICogUmVtb3ZhbCBvZiBhIGtleSBpbiB0aGUgcHJpdmF0ZSBjb250ZXh0IHdpbGwgdW52ZWlsIHRoZSBrZXkgaW4KLSAgICAgKiB0aGUgSmVsbHlDb250ZXh0IGlmIGl0IGV4aXN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZE9ubHlTaGFkb3dpbmdSZW1vdmUoKQotICAgIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlMSA9IG5ldyBPYmplY3QoKTsKLSAgICAgICAgT2JqZWN0IHZhbHVlMiA9IG5ldyBPYmplY3QoKTsKLQotICAgICAgICBhZGFwdGVyLnNldFJlYWRPbmx5KCB0cnVlICk7Ci0gICAgICAgIGFkYXB0ZXIucHV0KCAia2V5IiwgdmFsdWUxICk7Ci0gICAgICAgIGplbGx5Q29udGV4dC5zZXRWYXJpYWJsZSggImtleSIsIHZhbHVlMiApOwotCi0gICAgICAgIGFzc2VydFRydWUoICJhZGFwdGVyOiBiZWZvcmUgcmVtb3ZhbCBvZiBrZXksIHZhbHVlIHNob3VsZCBiZSAxIiwKLSAgICAgICAgICAgICAgICBhZGFwdGVyLmdldCggImtleSIgKSA9PSB2YWx1ZTEgKTsKLQotICAgICAgICBhZGFwdGVyLnJlbW92ZSggImtleSIgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiYWRhcHRlcjogYWZ0ZXIgcmVtb3ZhbCBvZiBrZXksIHZhbHVlIHNob3VsZCBiZSAyIiwKLSAgICAgICAgICAgICAgICBhZGFwdGVyLmdldCggImtleSIgKSA9PSB2YWx1ZTIgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiamVsbHlDb250ZXh0OiB2YWx1ZSBzaG91bGQgbm90IGJlIGFmZmVjdGVkLiIsCi0gICAgICAgICAgICAgICAgamVsbHlDb250ZXh0LmdldFZhcmlhYmxlKCAia2V5IiApID09IHZhbHVlMiApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIGNvbnRhaW5zS2V5IG1ldGhvZCBpbiBhIHJlYWQtd3JpdGUgYWRhcHRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFdyaXRlQ29udGFpbnNLZXkoKQotICAgIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlMSA9IG5ldyBPYmplY3QoKTsKLSAgICAgICAgT2JqZWN0IHZhbHVlMiA9IG5ldyBPYmplY3QoKTsKLQotICAgICAgICBhZGFwdGVyLnNldFJlYWRPbmx5KCBmYWxzZSApOwotICAgICAgICBhZGFwdGVyLnB1dCggImtleTEiLCB2YWx1ZTEgKTsKLSAgICAgICAgamVsbHlDb250ZXh0LnNldFZhcmlhYmxlKCAia2V5MiIsIHZhbHVlMiApOwotCi0gICAgICAgIGFzc2VydFRydWUoICJhZGFwdGVyOiBkaWQgbm90IGNvbnRhaW4gdGhlIGtleSIsCi0gICAgICAgICAgICAgICAgYWRhcHRlci5jb250YWluc0tleSggImtleTEiICkgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiYWRhcHRlcjogc2hvdWxkIGNvbnRhaW4gdGhlIGtleSIsCi0gICAgICAgICAgICAgICAgYWRhcHRlci5jb250YWluc0tleSggImtleTIiICkgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiamVsbHlDb250ZXh0OiBkaWQgbm90IGNvbnRhaW4gdGhlIGtleSIsCi0gICAgICAgICAgICAgICAgamVsbHlDb250ZXh0LmdldFZhcmlhYmxlKCAia2V5MSIgKSAhPSBudWxsICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGUgY29udGFpbnNLZXkgbWV0aG9kIGluIGEgcmVhZC1vbmx5IGFkYXB0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlYWRPbmx5Q29udGFpbnNLZXkoKQotICAgIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlMT0gbmV3IE9iamVjdCgpOwotICAgICAgICBPYmplY3QgdmFsdWUyID0gbmV3IE9iamVjdCgpOwotCi0gICAgICAgIGFkYXB0ZXIuc2V0UmVhZE9ubHkoIHRydWUgKTsKLSAgICAgICAgYWRhcHRlci5wdXQoICJrZXkxIiwgdmFsdWUxICk7Ci0gICAgICAgIGplbGx5Q29udGV4dC5zZXRWYXJpYWJsZSggImtleTIiLCB2YWx1ZTIgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiYWRhcHRlcjogZGlkIG5vdCBjb250YWluIHRoZSBrZXkiLAotICAgICAgICAgICAgICAgIGFkYXB0ZXIuY29udGFpbnNLZXkoICJrZXkxIiApICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggImFkYXB0ZXI6IHNob3VsZCBub3QgY29udGFpbiB0aGUga2V5IiwKLSAgICAgICAgICAgICAgICBhZGFwdGVyLmNvbnRhaW5zS2V5KCAia2V5MiIgKSApOwotCi0gICAgICAgIGFzc2VydFRydWUoICJqZWxseUNvbnRleHQ6IHNob3VsZCBub3QgY29udGFpbiB0aGUga2V5IiwKLSAgICAgICAgICAgICAgICBqZWxseUNvbnRleHQuZ2V0VmFyaWFibGUoICJrZXkxIiApID09IG51bGwgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoZSBnZXRLZXlzIG1ldGhvZCBvZiBhIHJlYWQtd3JpdGUgYWRhcHRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFdyaXRlR2V0S2V5cygpCi0gICAgewotICAgICAgICBPYmplY3QgdmFsdWUxID0gbmV3IE9iamVjdCgpOwotICAgICAgICBPYmplY3QgdmFsdWUyID0gbmV3IE9iamVjdCgpOwotICAgICAgICBPYmplY3QgdmFsdWUzID0gbmV3IE9iamVjdCgpOwotCi0gICAgICAgIGFkYXB0ZXIuc2V0UmVhZE9ubHkoIGZhbHNlICk7Ci0gICAgICAgIGFkYXB0ZXIucHV0KCAia2V5MSIsIHZhbHVlMSApOwotICAgICAgICBhZGFwdGVyLnB1dCggImtleTIiLCB2YWx1ZTIgKTsKLSAgICAgICAgamVsbHlDb250ZXh0LnNldFZhcmlhYmxlKCAia2V5MyIsIHZhbHVlMyApOwotCi0gICAgICAgIFNldCBleHBlY3RlZEtleXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBleHBlY3RlZEtleXMuYWRkKCAia2V5MSIgKTsKLSAgICAgICAgZXhwZWN0ZWRLZXlzLmFkZCggImtleTIiICk7Ci0gICAgICAgIGV4cGVjdGVkS2V5cy5hZGQoICJrZXkzIiApOwotCi0gICAgICAgIFNldCBhY3R1YWxLZXlzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgQ29sbGVjdGlvblV0aWxzLmFkZEFsbChhY3R1YWxLZXlzLCBhZGFwdGVyLmdldEtleXMoKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggImFkYXB0ZXI6IGRvZXMgbm90IGNvbnRhaW4gdGhlIGNvcnJlY3Qga2V5IHNldCIsCi0gICAgICAgICAgICAgICAgYWN0dWFsS2V5cy5jb250YWluc0FsbCggZXhwZWN0ZWRLZXlzICkgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoZSBnZXRLZXlzIG1ldGhvZCBvZiBhIHJlYWQtb25seSBhZGFwdGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkT25seUdldEtleXMoKQotICAgIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlMSA9IG5ldyBPYmplY3QoKTsKLSAgICAgICAgT2JqZWN0IHZhbHVlMiA9IG5ldyBPYmplY3QoKTsKLSAgICAgICAgT2JqZWN0IHZhbHVlMyA9IG5ldyBPYmplY3QoKTsKLQotICAgICAgICBhZGFwdGVyLnNldFJlYWRPbmx5KCB0cnVlICk7Ci0gICAgICAgIGFkYXB0ZXIucHV0KCAia2V5MSIsIHZhbHVlMSApOwotICAgICAgICBhZGFwdGVyLnB1dCggImtleTIiLCB2YWx1ZTIgKTsKLSAgICAgICAgamVsbHlDb250ZXh0LnNldFZhcmlhYmxlKCAia2V5MyIsIHZhbHVlMyApOwotCi0gICAgICAgIFNldCBleHBlY3RlZEtleXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBleHBlY3RlZEtleXMuYWRkKCAia2V5MSIgKTsKLSAgICAgICAgZXhwZWN0ZWRLZXlzLmFkZCggImtleTIiICk7Ci0KLSAgICAgICAgU2V0IGFjdHVhbEtleXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBDb2xsZWN0aW9uVXRpbHMuYWRkQWxsKGFjdHVhbEtleXMsIGFkYXB0ZXIuZ2V0S2V5cygpKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiYWRhcHRlcjogZG9lcyBub3QgY29udGFpbiB0aGUgY29ycmVjdCBrZXkgc2V0IiwKLSAgICAgICAgICAgICAgICBhY3R1YWxLZXlzLmNvbnRhaW5zQWxsKCBleHBlY3RlZEtleXMgKSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MvdmVsb2NpdHkveGRvY3MvY2hhbmdlcy54bWwgYi9qZWxseS10YWdzL3ZlbG9jaXR5L3hkb2NzL2NoYW5nZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjNlOGUxLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdmVsb2NpdHkveGRvY3MvY2hhbmdlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tIAotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotIC0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5DaGFuZ2VzPC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW9uQGFwYWNoZS5vcmciPmRJb24gR2lsbGFyZDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0gIDxib2R5PgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMCIgZGF0ZT0iMjAwNC0wOS0xMCI+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0iYWRkIj5Jbml0aWFsIFJlbGVhc2U8L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3ZlbG9jaXR5L3hkb2NzL2luZGV4LnhtbCBiL2plbGx5LXRhZ3MvdmVsb2NpdHkveGRvY3MvaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTlkMTEyLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MvdmVsb2NpdHkveGRvY3MvaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+VmVsb2NpdHkgVGFnIExpYnJhcnk8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLQotICA8Ym9keT4KLSAgICA8c2VjdGlvbiBuYW1lPSJPdmVydmlldyI+Ci0gICAgICA8cD4KLSAgICAgICAgQSBsaWJyYXJ5IGZvciBwcm9jZXNzaW5nIFZlbG9jaXR5IHRlbXBsYXRlcyBmcm9tIHdpdGhpbiBKZWxseS4KLSAgICAgICAgICBTZWUgdGhlIDxhIGhyZWY9InRhZ3MuaHRtbCI+dGFnczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICA8L3A+Ci0gICAgPC9zZWN0aW9uPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3ZlbG9jaXR5L3hkb2NzL25hdmlnYXRpb24ueG1sIGIvamVsbHktdGFncy92ZWxvY2l0eS94ZG9jcy9uYXZpZ2F0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc1ZTk2Ni4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3ZlbG9jaXR5L3hkb2NzL25hdmlnYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBuYW1lPSJWZWxvY2l0eSBUYWcgTGlicmFyeSI+Ci0KLSAgPHRpdGxlPlZlbG9jaXR5IFRhZyBMaWJyYXJ5PC90aXRsZT4KLSAgCi0gIDxib2R5PgotICAgIDxtZW51IG5hbWU9IlZlbG9jaXR5IFRhZyBMaWJyYXJ5Ij4KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICAgICAgICAgICBocmVmPSIvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iVGFncyIgICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWdzLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sLy5jdnNpZ25vcmUgYi9qZWxseS10YWdzL3htbC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2EyY2RhLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXRhcmdldAotbWF2ZW4ubG9nCi12ZWxvY2l0eS5sb2cKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL2J1aWxkLnhtbCBiL2plbGx5LXRhZ3MveG1sL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc3OGViYy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbC9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLWJ1aWxkLnhtbCBnZW5lcmF0ZWQgYnkgbWF2ZW4gZnJvbSBwcm9qZWN0LnhtbCB2ZXJzaW9uIDEuMC1TTkFQU0hPVAotICBvbiBkYXRlIE1heSAyNCAyMDA0LCB0aW1lIDIzMDEtLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImphciIgbmFtZT0iY29tbW9ucy1qZWxseS10YWdzLXhtbCIgYmFzZWRpcj0iLiI+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkZWZhdWx0dGFyZ2V0ZGlyIiB2YWx1ZT0idGFyZ2V0Ij4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYmRpciIgdmFsdWU9InRhcmdldC9saWIiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC9jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cmVwb3J0ZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtcmVwb3J0cyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0ZGlyIiB2YWx1ZT0iZGlzdCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jZGlyIiB2YWx1ZT0iZGlzdC9kb2NzL2FwaSI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJmaW5hbC5uYW1lIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLXhtbC0xLjAtU05BUFNIT1QiPgotICA8L3Byb3BlcnR5PgotICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlc2NyaXB0aW9uPSJvIEluaXRpYWxpemVzIHNvbWUgcHJvcGVydGllcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im5vZ2V0Ij4KLSAgICAgIDxlcXVhbHMgYXJnMj0ib25seSIgYXJnMT0iJHtidWlsZC5zeXNjbGFzc3BhdGh9Ij4KLSAgICAgIDwvZXF1YWxzPgotICAgIDwvY29uZGl0aW9uPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXNjcmlwdGlvbj0ibyBDb21waWxlIHRoZSBjb2RlIiBkZXBlbmRzPSJnZXQtZGVwcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8amF2YWMgZGVzdGRpcj0iJHtjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvamF2YSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotICAgIDxjb3B5IHRvZGlyPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL2phdmEiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICAgIDxjb3B5IHRvZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qZWxseSI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueHNsIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnJuZyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5kdGQiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5odG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamFyIiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgdGhlIGphciIgZGVwZW5kcz0iY29tcGlsZSx0ZXN0Ij4KLSAgICA8amFyIGphcmZpbGU9InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCIgYmFzZWRpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0ibyBDbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIGRpcmVjdG9yaWVzIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkZWZhdWx0dGFyZ2V0ZGlyfSI+Ci0gICAgPC9kZWxldGU+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGlzdGRpcn0iPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXNjcmlwdGlvbj0ibyBDcmVhdGUgYSBkaXN0cmlidXRpb24iIGRlcGVuZHM9ImphciwgamF2YWRvYyI+Ci0gICAgPG1rZGlyIGRpcj0iZGlzdCI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29weSB0b2Rpcj0iZGlzdCI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iIGluY2x1ZGVzPSIqLmphciI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iIGluY2x1ZGVzPSJMSUNFTlNFKiwgUkVBRE1FKiI+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0ibyBSdW4gdGhlIHRlc3QgY2FzZXMiIGlmPSJ0ZXN0LmZhaWx1cmUiIGRlcGVuZHM9ImludGVybmFsLXRlc3QiPgotICAgIDxmYWlsIG1lc3NhZ2U9IlRoZXJlIHdlcmUgdGVzdCBmYWlsdXJlcy4iPgotICAgIDwvZmFpbD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iaW50ZXJuYWwtdGVzdCIgZGVwZW5kcz0iY29tcGlsZS10ZXN0cyI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8anVuaXQgZGlyPSIuLyIgZmFpbHVyZXByb3BlcnR5PSJ0ZXN0LmZhaWx1cmUiIHByaW50U3VtbWFyeT0ieWVzIiBmb3JrPSJ0cnVlIiBoYWx0b25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJiYXNlZGlyIiB2YWx1ZT0iLiI+Ci0gICAgICA8L3N5c3Byb3BlcnR5PgotICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Zm9ybWF0dGVyIHVzZWZpbGU9ImZhbHNlIiB0eXBlPSJwbGFpbiI+Ci0gICAgICA8L2Zvcm1hdHRlcj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3Rlc3RjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHt0ZXN0cmVwb3J0ZGlyfSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3QiPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL1Rlc3QqLmphdmEiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgPC9qdW5pdD4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZS10ZXN0cyIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9IiBkZXByZWNhdGlvbj0idHJ1ZSIgZGVidWc9InRydWUiIG9wdGltaXplPSJmYWxzZSIgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCI+Ci0gICAgICA8c3JjPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy90ZXN0Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvc3JjPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iamF2YWRvYyIgZGVzY3JpcHRpb249Im8gR2VuZXJhdGUgamF2YWRvYyIgZGVwZW5kcz0iamFyIj4KLSAgICA8bWtkaXIgZGlyPSIke2phdmFkb2NkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDx0c3RhbXA+Ci0gICAgICA8Zm9ybWF0IHBhdHRlcm49IjIwMDIteXl5eSIgcHJvcGVydHk9InllYXIiPgotICAgICAgPC9mb3JtYXQ+Ci0gICAgPC90c3RhbXA+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvcHlyaWdodCIgdmFsdWU9IkNvcHlyaWdodCAmYW1wO2NvcHk7ICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLXhtbCAxLjAtU05BUFNIT1QgQVBJIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxqYXZhZG9jIHVzZT0idHJ1ZSIgcHJpdmF0ZT0idHJ1ZSIgZGVzdGRpcj0iJHtqYXZhZG9jZGlyfSIgYXV0aG9yPSJ0cnVlIiB2ZXJzaW9uPSJ0cnVlIiBzb3VyY2VwYXRoPSJzcmMvamF2YSIgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy54bWwuKiI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFkb2M+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImdldC1kZXBzIiB1bmxlc3M9Im5vZ2V0IiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3hhbGFuLTIuMy4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94YWxhbi9qYXJzL3hhbGFuLTIuMy4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZWxseS10YWdzLWp1bml0LVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS10YWdzLWp1bml0LVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1qZXhsLVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWpleGwvamFycy9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS94bWwtYXBpcy0xLjAuYjIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3htbC1hcGlzL2phcnMveG1sLWFwaXMtMS4wLmIyLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1iZWFudXRpbHMtMS42LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWJlYW51dGlscy9qYXJzL2NvbW1vbnMtYmVhbnV0aWxzLTEuNi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtY29sbGVjdGlvbnMtMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWNvbGxlY3Rpb25zL2phcnMvY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWxvZ2dpbmctMS4wLjMuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtbG9nZ2luZy9qYXJzL2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2RvbTRqLTEuNS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2RvbTRqL2phcnMvZG9tNGotMS41LWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2pheGVuLTEuMS1iZXRhLTIuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2pheGVuL2phcnMvamF4ZW4tMS4xLWJldGEtMi5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3hlcmNlcy0yLjIuMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veGVyY2VzL2phcnMveGVyY2VzLTIuMi4xLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vanVuaXQtMy44LjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2p1bml0L2phcnMvanVuaXQtMy44LjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vYW50LW9wdGlvbmFsLTEuNS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vYW50L2phcnMvYW50LW9wdGlvbmFsLTEuNS5qYXIiPgotICAgIDwvZ2V0PgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJpbnN0YWxsLW1hdmVuIj4KLSAgICA8Z2V0IGRlc3Q9IiR7dXNlci5ob21lfS9tYXZlbi1pbnN0YWxsLWxhdGVzdC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgc3JjPSIke3JlcG99L21hdmVuL21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPHVuamFyIGRlc3Q9IiR7bWF2ZW4uaG9tZX0iIHNyYz0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciI+Ci0gICAgPC91bmphcj4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwvbWF2ZW4ueG1sIGIvamVsbHktdGFncy94bWwvbWF2ZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2M0YWNlLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL21hdmVuLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImphdmE6amFyIj4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwvcHJvamVjdC5wcm9wZXJ0aWVzIGIvamVsbHktdGFncy94bWwvcHJvamVjdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWMxYjYxLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3Byb2plY3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQotIyBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUCBSIE8gSiBFIEMgVCAgUCBSIE8gUCBFIFIgVCBJIEUgUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbC9wcm9qZWN0LnhtbCBiL2plbGx5LXRhZ3MveG1sL3Byb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmMyOGY2Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3Q+Ci0gIDxleHRlbmQ+JHtiYXNlZGlyfS8uLi90YWctcHJvamVjdC54bWw8L2V4dGVuZD4KLSAgPGlkPmNvbW1vbnMtamVsbHktdGFncy14bWw8L2lkPgotICA8bmFtZT5jb21tb25zLWplbGx5LXRhZ3MteG1sPC9uYW1lPgotICA8Y3VycmVudFZlcnNpb24+MS4xLVNOQVBTSE9UPC9jdXJyZW50VmVyc2lvbj4KLQotICA8cGFja2FnZT5vcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy54bWw8L3BhY2thZ2U+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICAgICAgIFRoZSBKZWxseSBYTUwgVGFnIExpYnJhcnkKLSAgPC9kZXNjcmlwdGlvbj4KLSAgPHNob3J0RGVzY3JpcHRpb24+Q29tbW9ucyBKZWxseSBYTUwgVGFnIExpYnJhcnk8L3Nob3J0RGVzY3JpcHRpb24+Ci0gIAotICA8dmVyc2lvbnM+Ci0gICAgPHZlcnNpb24+Ci0gICAgICA8aWQ+MS4wPC9pZD4KLSAgICAgIDxuYW1lPjEuMDwvbmFtZT4KLSAgICAgIDx0YWc+Q09NTU9OU19KRUxMWV9YTUwtMV8wPC90YWc+Ci0gICAgPC92ZXJzaW9uPgotICA8L3ZlcnNpb25zPgotICAgIAotICA8ZGVwZW5kZW5jaWVzPgotICAgIDwhLS0gcnVuIHRpbWUgLyBpbiB0ZXN0aW5nLS0+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+eGFsYW48L2lkPgotICAgICAgPHZlcnNpb24+Mi4zLjE8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWplbGx5PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1qZWxseS10YWdzLWp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgPHVybD5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvamVsbHkvbGlicy9qdW5pdC88L3VybD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL0F0dHJpYnV0ZVRhZy5qYXZhIGIvamVsbHktdGFncy94bWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL0F0dHJpYnV0ZVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGZiNTBhLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9BdHRyaWJ1dGVUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MueG1sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLS8qKiBBZGRzIGFuIFhNTCBhdHRyaWJ1dGUgdG8gdGhlIHBhcmVudCBlbGVtZW50IHRhZyBsaWtlCi0gICogdGhlIDxjb2RlPiZsdDt4c2w6YXR0cmlidXRlJmd0OzwvY29kZT4gdGFnLgotICAqCi0gICogQGF1dGhvciBKYW1lcyBTdHJhY2hhbgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS42ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQotICAgIHB1YmxpYyBBdHRyaWJ1dGVUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIEVsZW1lbnRUYWcgdGFnID0gKEVsZW1lbnRUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyggRWxlbWVudFRhZy5jbGFzcyApOwotICAgICAgICBpZiAoIHRhZyA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCAiPGF0dHJpYnV0ZT4gdGFnIG11c3QgYmUgZW5jbG9zZWQgaW5zaWRlIGFuIDxlbGVtZW50PiB0YWciICk7Ci0gICAgICAgIH0KLSAgICAgICAgdGFnLnNldEF0dHJpYnV0ZVZhbHVlKCBnZXROYW1lKCksIGdldEJvZHlUZXh0KCBmYWxzZSApICk7Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvQ29tbWVudFRhZy5qYXZhIGIvamVsbHktdGFncy94bWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL0NvbW1lbnRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjMDkxZi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvQ29tbWVudFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy54bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkueHBhdGguWFBhdGhUYWdTdXBwb3J0OwotCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgdGFnIHdoaWNoIG91dHB1dHMgYSBjb21tZW50IHRvIHRoZSB1bmRlcmx5aW5nIFhNTE91dHB1dCBiYXNlZCBvbiB0aGUKLSAqIGNvbnRlbnRzIG9mIGl0cyBib2R5LgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIENvbW1lbnRUYWcgZXh0ZW5kcyBYUGF0aFRhZ1N1cHBvcnQgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQotICAgIHB1YmxpYyBDb21tZW50VGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdGV4dCA9IGdldFRleHQoKTsKLSAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGV4dCA9IGdldEJvZHlUZXh0KGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBjaGFyW10gY2ggPSB0ZXh0LnRvQ2hhckFycmF5KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXRwdXQuY29tbWVudChjaCwgMCwgY2gubGVuZ3RoKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0LgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjb21tZW50IHRleHQuIElmIG5vIHRleHQgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGJvZHkgb2YgdGhlIHRhZwotICAgICAqIGlzIHVzZWQgaW5zdGVhZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBjb21tZW50IHRleHQgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9Db3B5T2ZUYWcuamF2YSBiL2plbGx5LXRhZ3MveG1sL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9Db3B5T2ZUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkZTYxMi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvQ29weU9mVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy54bWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkueHBhdGguWFBhdGhUYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5kb200ai5Ob2RlOwotaW1wb3J0IG9yZy5kb200ai5pby5TQVhXcml0ZXI7Ci1pbXBvcnQgb3JnLmpheGVuLkpheGVuRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5qYXhlbi5YUGF0aDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKiBBIHRhZyB3aGljaCBwZXJmb3JtcyBhIGNvcHktb2Ygb3BlcmF0aW9uIGxpa2UgdGhlIFhTTFQgdGFnCi0gICoKLSAgKiBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCi0gICovCi1wdWJsaWMgY2xhc3MgQ29weU9mVGFnIGV4dGVuZHMgWFBhdGhUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgWFBhdGggZXhwcmVzc2lvbiB0byBldmFsdWF0ZS4gKi8KLSAgICBwcml2YXRlIFhQYXRoIHNlbGVjdDsKLQotICAgIC8qKiBTaG91bGQgd2Ugb3V0cHV0IGxleGljYWwgWE1MIGRhdGEgbGlrZSBjb21tZW50cwotICAgICAqIG9yIGVudGl0eSBuYW1lcz8KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbGV4aWNhbDsKLQotICAgIHB1YmxpYyBDb3B5T2ZUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCB4cGF0aENvbnRleHQgPSBnZXRYUGF0aENvbnRleHQoKTsKLQotICAgICAgICBpZiAoc2VsZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCAic2VsZWN0IiApOwotICAgICAgICB9Ci0KLSAgICAgICAgU0FYV3JpdGVyIHNheFdyaXRlcjsKLQotICAgICAgICBpZiAobGV4aWNhbCkgewotICAgICAgICAgICAgc2F4V3JpdGVyID0gbmV3IFNBWFdyaXRlcihvdXRwdXQsIG91dHB1dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzYXhXcml0ZXIgPSBuZXcgU0FYV3JpdGVyKG91dHB1dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3Qgb2JqOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb2JqID0gc2VsZWN0LmV2YWx1YXRlKHhwYXRoQ29udGV4dCk7Ci0gICAgICAgIH0gY2F0Y2ggKEpheGVuRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiRmFpbGVkIHRvIGV2YWx1YXRlIFhQYXRoIGV4cHJlc3Npb24iLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTGlzdCkgewotICAgICAgICAgICAgICAgIExpc3Qgbm9kZXMgPSAoTGlzdCkgb2JqOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIG9iamVjdCBpbnN0YW5jZW9mIE5vZGUgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYXhXcml0ZXIud3JpdGUoIChOb2RlKSBvYmplY3QgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvYmplY3QgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNheFdyaXRlci53cml0ZSggb2JqZWN0LnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTm9kZSkgewotICAgICAgICAgICAgICAgIHNheFdyaXRlci53cml0ZSggKE5vZGUpIG9iaiApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzYXhXcml0ZXIud3JpdGUoIG9iai50b1N0cmluZygpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIkZhaWxlZCB0byB3cml0ZSBYTUwgb3V0cHV0LiIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKiBTZXRzIHRoZSBYUGF0aCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdChYUGF0aCBzZWxlY3QpIHsKLSAgICAgICAgdGhpcy5zZWxlY3QgPSBzZWxlY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGV4aWNhbChib29sZWFuIGxleGljYWwpIHsKLSAgICAgICAgdGhpcy5sZXhpY2FsID0gbGV4aWNhbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvQ29weVRhZy5qYXZhIGIvamVsbHktdGFncy94bWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL0NvcHlUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMzZGI4MS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvQ29weVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy54bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkueHBhdGguWFBhdGhUYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5kb200ai5FbGVtZW50OwotaW1wb3J0IG9yZy5kb200ai5pby5TQVhXcml0ZXI7Ci1pbXBvcnQgb3JnLmpheGVuLkpheGVuRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5qYXhlbi5YUGF0aDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogQSB0YWcgd2hpY2ggcGVyZm9ybXMgYSBjb3B5IG9wZXJhdGlvbiBsaWtlIHRoZSBYU0xUIHRhZywKLSAqIHBlcmZvcm1pbmcgYSBzaGFsbG93IGNvcHkgb2YgdGhlIGVsZW1lbnQgYW5kIGl0cyBhdHRyaWJ1dGVzIGJ1dCBubyBjb250ZW50LgotICoKLSAqIEBhdXRob3IgSmFtZXMgU3RyYWNoYW4KLSAqLwotcHVibGljIGNsYXNzIENvcHlUYWcgZXh0ZW5kcyBYUGF0aFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBYUGF0aCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLiAqLwotICAgIHByaXZhdGUgWFBhdGggc2VsZWN0OwotCi0gICAgLyoqIFNob3VsZCB3ZSBvdXRwdXQgbGV4aWNhbCBYTUwgZGF0YSBsaWtlIGVudGl0eSBuYW1lcz8KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbGV4aWNhbDsKLQotICAgIHB1YmxpYyBDb3B5VGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBPYmplY3QgeHBhdGhDb250ZXh0ID0gZ2V0WFBhdGhDb250ZXh0KCk7Ci0KLSAgICAgICAgT2JqZWN0IG5vZGUgPSB4cGF0aENvbnRleHQ7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzZWxlY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxlY3Quc2VsZWN0U2luZ2xlTm9kZSh4cGF0aENvbnRleHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50ICkgewotICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCi0gICAgICAgICAgICAgICAgU0FYV3JpdGVyIHNheFdyaXRlcjsKLQotICAgICAgICAgICAgICAgIGlmIChsZXhpY2FsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNheFdyaXRlciA9IG5ldyBTQVhXcml0ZXIob3V0cHV0LCBvdXRwdXQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNheFdyaXRlciA9IG5ldyBTQVhXcml0ZXIob3V0cHV0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzYXhXcml0ZXIud3JpdGVPcGVuKGVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLSAgICAgICAgICAgICAgICBzYXhXcml0ZXIud3JpdGVDbG9zZShlbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSmF4ZW5FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKiBTZXRzIHRoZSBYUGF0aCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdChYUGF0aCBzZWxlY3QpIHsKLSAgICAgICAgdGhpcy5zZWxlY3QgPSBzZWxlY3Q7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldExleGljYWwoYm9vbGVhbiBsZXhpY2FsKSB7Ci0gICAgICAgIHRoaXMubGV4aWNhbCA9IGxleGljYWw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL0RvY3R5cGVUYWcuamF2YSBiL2plbGx5LXRhZ3MveG1sL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9Eb2N0eXBlVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MzJmMDAuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL0RvY3R5cGVUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnhtbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS54cGF0aC5YUGF0aFRhZ1N1cHBvcnQ7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogQSB0YWcgd2hpY2ggb3V0cHV0cyBhIERPQ1RZUEUgZGVjbGFyYXRpb24gdG8gdGhlIGN1cnJlbnQgWE1MIG91dHB1dCBwaXBlLgotICogTm90ZSB0aGF0IHRoZXJlIHNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW55IFhNTCBzdHJlYW0gYW5kCi0gKiBpdCBzaG91bGQgb2NjdXIgYmVmb3JlIGFueSBlbGVtZW50IGNvbnRlbnQuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICovCi1wdWJsaWMgY2xhc3MgRG9jdHlwZVRhZyBleHRlbmRzIFhQYXRoVGFnU3VwcG9ydCB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHB1YmxpY0lkOwotICAgIHByaXZhdGUgU3RyaW5nIHN5c3RlbUlkOwotCi0gICAgcHVibGljIERvY3R5cGVUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCAibmFtZSIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXRwdXQuc3RhcnREVEQobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICAgICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLSAgICAgICAgICAgIG91dHB1dC5lbmREVEQoKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lLgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwdWJsaWNJZC4KLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0gICAgICAgIHJldHVybiBwdWJsaWNJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzeXN0ZW1JZC4KLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0gICAgICAgIHJldHVybiBzeXN0ZW1JZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkb2N1bWVudCB0eXBlIG5hbWUgb2YgdGhlIERPQ1RZUEUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVjbGFyZWQgcHVibGljIGlkZW50aWZpZXIgZm9yIERURAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFB1YmxpY0lkKFN0cmluZyBwdWJsaWNJZCkgewotICAgICAgICB0aGlzLnB1YmxpY0lkID0gcHVibGljSWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVjbGFyZWQgc3lzdGVtIGlkZW50aWZpZXIgZm9yIHRoZSBEVEQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JZChTdHJpbmcgc3lzdGVtSWQpIHsKLSAgICAgICAgdGhpcy5zeXN0ZW1JZCA9IHN5c3RlbUlkOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL0VsZW1lbnRUYWcuamF2YSBiL2plbGx5LXRhZ3MveG1sL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9FbGVtZW50VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OGY2ZjcuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL0VsZW1lbnRUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnhtbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGw7Ci0KLS8qKiBBIHRhZyB0byBwcm9kdWNlIGFuIFhNTCBlbGVtZW50IHdoaWNoIGNhbiBjb250YWluIG90aGVyIGF0dHJpYnV0ZXMKLSAgKiBvciBlbGVtZW50cyBsaWtlIHRoZSA8Y29kZT4mbHQ7eHNsOmVsZW1lbnQmZ3Q7PC9jb2RlPiB0YWcuCi0gICoKLSAgKiBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCi0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgbmFtZXNwYWNlIFVSSSAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQotICAgIC8qKiBUaGUgcXVhbGlmaWVkIG5hbWUgKi8KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgLyoqIFRoZSBYTUwgQXR0cmlidXRlcyAqLwotICAgIHByaXZhdGUgQXR0cmlidXRlc0ltcGwgYXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOwotCi0gICAgLyoqIGZsYWcgc2V0IGlmIGF0dHJpYnV0ZXMgYXJlIG91dHB1dCAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBvdXRwdXRBdHRyaWJ1dGVzOwotCi0gICAgcHVibGljIEVsZW1lbnRUYWcoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYXR0cmlidXRlIG9mIHRoZSBnaXZlbiBuYW1lIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0gICAgICogQHBhcmFtIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICAgKiBAdGhyb3dzIEplbGx5RXhjZXB0aW9uIGlmIHRoZSBzdGFydCBlbGVtZW50IGhhcyBhbHJlYWR5IGJlZW4gb3V0cHV0LgotICAgICAqICAgQXR0cmlidXRlcyBtdXN0IGJlIHNldCBvbiB0aGUgb3V0ZXIgZWxlbWVudCBiZWZvcmUgYW55IGNvbnRlbnQKLSAgICAgKiAgIChjaGlsZCBlbGVtZW50cyBvciB0ZXh0KSBpcyBvdXRwdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVWYWx1ZSggU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSApIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChvdXRwdXRBdHRyaWJ1dGVzKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIkNhbm5vdCBzZXQgdGhlIHZhbHVlIG9mIGF0dHJpYnV0ZTogIgotICAgICAgICAgICAgICAgICsgbmFtZSArICIgYXMgd2UgaGF2ZSBhbHJlYWR5IG91dHB1dCB0aGUgc3RhcnRFbGVtZW50KCkgU0FYIGV2ZW50IgotICAgICAgICAgICAgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vICMjIyB3ZSdsbCBhc3N1bWUgdGhhdCBhbGwgYXR0cmlidXRlcyBhcmUgaW4gbm8gbmFtZXNwYWNlIQotICAgICAgICAvLyAjIyMgdGhpcyBpcyBzZXZlcmVseSBsaW1pdGluZyEKLSAgICAgICAgLy8gIyMjIHdlIHNob3VsZCBiZSBuYW1lc3BhY2UgYXdhcmUKLSAgICAgICAgaW50IGluZGV4ID0gYXR0cmlidXRlcy5nZXRJbmRleCgiIiwgbmFtZSk7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLnJlbW92ZUF0dHJpYnV0ZShpbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gdHJlYXQgbnVsbCB2YWx1ZXMgYXMgbm8gYXR0cmlidXRlCi0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZSgiIiwgbmFtZSwgbmFtZSwgIkNEQVRBIiwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBpZHggPSBuYW1lLmluZGV4T2YoJzonKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsTmFtZSA9IChpZHggPj0gMCkKLSAgICAgICAgICAgID8gbmFtZS5zdWJzdHJpbmcoaWR4ICsgMSkKLSAgICAgICAgICAgIDogbmFtZTsKLQotICAgICAgICBvdXRwdXRBdHRyaWJ1dGVzID0gZmFsc2U7Ci0KLSAgICAgICAgWE1MT3V0cHV0IG5ld091dHB1dCA9IG5ldyBYTUxPdXRwdXQob3V0cHV0KSB7Ci0KLSAgICAgICAgICAgIC8vIGFkZCBhbiBpbml0aWFsaXplIGhvb2sgdG8gdGhlIGNvcmUgY29udGVudC1nZW5lcmF0aW5nIG1ldGhvZHMKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KAotICAgICAgICAgICAgICAgIFN0cmluZyB1cmksCi0gICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgcU5hbWUsCi0gICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRzKQotICAgICAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGluaXRpYWxpemUoKTsKLSAgICAgICAgICAgICAgICBzdXBlci5zdGFydEVsZW1lbnQodXJpLCBsb2NhbE5hbWUsIHFOYW1lLCBhdHRzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgaW5pdGlhbGl6ZSgpOwotICAgICAgICAgICAgICAgIHN1cGVyLmVuZEVsZW1lbnQodXJpLCBsb2NhbE5hbWUsIHFOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgaW5pdGlhbGl6ZSgpOwotICAgICAgICAgICAgICAgIHN1cGVyLmNoYXJhY3RlcnMoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBpZ25vcmFibGVXaGl0ZXNwYWNlKGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQotICAgICAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGluaXRpYWxpemUoKTsKLSAgICAgICAgICAgICAgICBzdXBlci5pZ25vcmFibGVXaGl0ZXNwYWNlKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgICAgICAgICAgICAgc3VwZXIucHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogRW5zdXJlIHRoYXQgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQgaXMgZ2VuZXJhdGVkCi0gICAgICAgICAgICAgKiBiZWZvcmUgYW55IGNvbnRlbnQgaXMgb3V0cHV0Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBpZiAoIW91dHB1dEF0dHJpYnV0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgbG9jYWxOYW1lLCBuYW1lLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0QXR0cmlidXRlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGludm9rZUJvZHkobmV3T3V0cHV0KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFvdXRwdXRBdHRyaWJ1dGVzKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0LnN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIGxvY2FsTmFtZSwgbmFtZSwgYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0QXR0cmlidXRlcyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG91dHB1dC5lbmRFbGVtZW50KG5hbWVzcGFjZSwgbG9jYWxOYW1lLCBuYW1lKTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMuY2xlYXIoKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoZSBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZXNwYWNlIFVSSSBvZiB0aGUgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVSSShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9FeHByVGFnLmphdmEgYi9qZWxseS10YWdzL3htbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvRXhwclRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTkwZTUyLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9FeHByVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnhtbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS54cGF0aC5YUGF0aFRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmpheGVuLkpheGVuRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5qYXhlbi5YUGF0aDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKiBBIHRhZyB3aGljaCBwZXJmb3JtcyBhIHN0cmluZyBYUGF0aCBleHByZXNzaW9uOyBzaW1pbGFyIHRvICZsdDt4c2w6dmFsdWUtb2YmZ3Q7Ci0gICogaW4gWFNMVAotICAqCi0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBFeHByVGFnIGV4dGVuZHMgWFBhdGhUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgWFBhdGggZXhwcmVzc2lvbiB0byBldmFsdWF0ZS4gKi8KLSAgICBwcml2YXRlIFhQYXRoIHNlbGVjdDsKLQotICAgIHB1YmxpYyBFeHByVGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiwgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBPYmplY3QgeHBhdGhDb250ZXh0ID0gZ2V0WFBhdGhDb250ZXh0KCk7Ci0KLSAgICAgICAgaWYgKHNlbGVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiggInNlbGVjdCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGV4dCA9IHNlbGVjdC5zdHJpbmdWYWx1ZU9mKHhwYXRoQ29udGV4dCk7Ci0gICAgICAgICAgICBpZiAoIHRleHQgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUodGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEpheGVuRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKiogU2V0cyB0aGUgWFBhdGggZXhwcmVzc2lvbiB0byBldmFsdWF0ZS4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3QoWFBhdGggc2VsZWN0KSB7Ci0gICAgICAgIHRoaXMuc2VsZWN0ID0gc2VsZWN0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9Gb3JFYWNoVGFnLmphdmEgYi9qZWxseS10YWdzL3htbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvRm9yRWFjaFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjlmYmUzLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9Gb3JFYWNoVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy54bWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnhwYXRoLlhQYXRoQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkueHBhdGguWFBhdGhTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnhwYXRoLlhQYXRoVGFnU3VwcG9ydDsKLQotaW1wb3J0IG9yZy5qYXhlbi5YUGF0aDsKLWltcG9ydCBvcmcuamF4ZW4uSmF4ZW5FeGNlcHRpb247Ci0KLS8qKiBBIHRhZyB3aGljaCBwZXJmb3JtcyBhbiBpdGVyYXRpb24gb3ZlciB0aGUgcmVzdWx0cyBvZiBhbiBYUGF0aCBleHByZXNzaW9uCi0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICAqLwotcHVibGljIGNsYXNzIEZvckVhY2hUYWcgZXh0ZW5kcyBYUGF0aFRhZ1N1cHBvcnQgaW1wbGVtZW50cyBYUGF0aFNvdXJjZSB7Ci0KLSAgICAvKiogSG9sZHMgdGhlIFhQYXRoIHNlbGVjdG9yLiAqLwotICAgIHByaXZhdGUgWFBhdGggc2VsZWN0OwotCi0gICAgLyoqIFhwYXRoIGNvbXBhcmF0b3IgZm9yIHNvcnRpbmcgKi8KLSAgICBwcml2YXRlIFhQYXRoQ29tcGFyYXRvciB4cENtcCA9IG51bGw7Ci0KLSAgICAvKiogSWYgc3BlY2lmaWVkIHRoZW4gdGhlIGN1cnJlbnQgaXRlbSBpdGVyYXRlZCB0aHJvdWdoIHdpbGwgYmUgZGVmaW5lZAotICAgICAgKiBhcyB0aGUgZ2l2ZW4gdmFyaWFibGUgbmFtZS4gKi8KLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0KLSAgICAvKiogVGhlIGN1cnJlbnQgaXRlcmF0aW9uIHZhbHVlICovCi0gICAgcHJpdmF0ZSBPYmplY3QgaXRlcmF0aW9uVmFsdWU7Ci0KLQotICAgIHB1YmxpYyBGb3JFYWNoVGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAoc2VsZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Qgbm9kZXMgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBub2RlcyA9IHNlbGVjdC5zZWxlY3ROb2RlcyggZ2V0WFBhdGhDb250ZXh0KCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChKYXhlbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzb3J0IHRoZSBsaXN0IGlmIHhwQ21wIGlzIHNldC4KLSAgICAgICAgICAgIGlmICh4cENtcCAhPSBudWxsICYmICh4cENtcC5nZXRYcGF0aCgpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChub2RlcywgeHBDbXApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGl0ZXJhdGlvblZhbHVlID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUodmFyLCBpdGVyYXRpb25WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFhQYXRoU291cmNlIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCBYUGF0aCBpdGVyYXRpb24gdmFsdWUKLSAgICAgKiAgc28gdGhhdCBhbnkgb3RoZXIgWFBhdGggYXdhcmUgY2hpbGQgdGFncyB0byB1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFhQYXRoU291cmNlKCkgewotICAgICAgICByZXR1cm4gaXRlcmF0aW9uVmFsdWU7Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKiBTZXRzIHRoZSBYUGF0aCBzZWxlY3Rpb24gZXhwcmVzc2lvbgotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3QoWFBhdGggc2VsZWN0KSB7Ci0gICAgICAgIHRoaXMuc2VsZWN0ID0gc2VsZWN0OwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSB2YXJpYWJsZSBuYW1lIHRvIGV4cG9ydCBmb3IgdGhlIGl0ZW0gYmVpbmcgaXRlcmF0ZWQgb3ZlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0gICAgICAgIHRoaXMudmFyID0gdmFyOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSB4cGF0aCBleHByZXNzaW9uIHRvIHVzZSB0byBzb3J0IHNlbGVjdGVkIG5vZGVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNvcnQoWFBhdGggc29ydFhQYXRoKSB0aHJvd3MgSmF4ZW5FeGNlcHRpb24gewotICAgICAgICBpZiAoeHBDbXAgPT0gbnVsbCkgeHBDbXAgPSBuZXcgWFBhdGhDb21wYXJhdG9yKCk7Ci0gICAgICAgIHhwQ21wLnNldFhwYXRoKHNvcnRYUGF0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHdoZXRoZXIgdG8gc29ydCBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjZW5kaW5nKGJvb2xlYW4gZGVzY2VuZGluZykgewotICAgICAgICBpZiAoeHBDbXAgPT0gbnVsbCkgeHBDbXAgPSBuZXcgWFBhdGhDb21wYXJhdG9yKCk7Ci0gICAgICAgIHhwQ21wLnNldERlc2NlbmRpbmcoZGVzY2VuZGluZyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBPdmVycmlkZSBzdXBlcmNsYXNzIHNvIG1ldGhvZCBjYW4gYmUgYWNjZXNzIGJ5IElmVGFnCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRYUGF0aENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRYUGF0aENvbnRleHQoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9JZlRhZy5qYXZhIGIvamVsbHktdGFncy94bWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL0lmVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YTE0NjEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL0lmVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnhtbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS54cGF0aC5YUGF0aFRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmpheGVuLkpheGVuRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5qYXhlbi5YUGF0aDsKLQotLyoqCi0gKiBFdmFsdWF0ZXMgdGhlIFhQYXRoIGV4cHJlc3Npb24gdG8gYmUgYSBib29sZWFuIGFuZCBvbmx5IGV2YWx1YXRlcyB0aGUgYm9keQotICogaWYgdGhlIGV4cHJlc3Npb24gaXMgdHJ1ZS4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIElmVGFnIGV4dGVuZHMgWFBhdGhUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgWFBhdGggZXhwcmVzc2lvbiB0byBldmFsdWF0ZS4gKi8KLSAgICBwcml2YXRlIFhQYXRoIHNlbGVjdDsKLQotICAgIHB1YmxpYyBJZlRhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHNlbGVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiggInNlbGVjdCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCB4cGF0aENvbnRleHQgPSBnZXRYUGF0aENvbnRleHQoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCBzZWxlY3QuYm9vbGVhblZhbHVlT2YoeHBhdGhDb250ZXh0KSApIHsKLSAgICAgICAgICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEpheGVuRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKiBTZXRzIHRoZSBYUGF0aCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdChYUGF0aCBzZWxlY3QpIHsKLSAgICAgICAgdGhpcy5zZWxlY3QgPSBzZWxlY3Q7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0WFBhdGhDb250ZXh0KCkgewotICAgICAgICBGb3JFYWNoVGFnIHRhZyA9IChGb3JFYWNoVGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoIEZvckVhY2hUYWcuY2xhc3MgKTsKLSAgICAgICAgaWYgKCB0YWcgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIHJldHVybiB0YWcuZ2V0WFBhdGhDb250ZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvUGFyYW1UYWcuamF2YSBiL2plbGx5LXRhZ3MveG1sL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9QYXJhbVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTJhZjliLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9QYXJhbVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy54bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqIFNldHMgYSBwYXJhbWV0ZXIgaW4gdGhlIHBhcmVudCB0cmFuc2Zvcm0gdGFnCi0gICoKLSAgKiBAYXV0aG9yIFJvYmVydCBMZWZ0d2ljaAotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBQYXJhbVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIC8qKiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4gKi8KLSAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKLQotCi0gICAgcHVibGljIFBhcmFtVGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBUcmFuc2Zvcm1UYWcgdGFnID0gKFRyYW5zZm9ybVRhZykgdGhpcy5maW5kQW5jZXN0b3JXaXRoQ2xhc3MoIFRyYW5zZm9ybVRhZy5jbGFzcyApOwotICAgICAgICBpZiAoIHRhZyA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCAiPHBhcmFtPiB0YWcgbXVzdCBiZSBlbmNsb3NlZCBpbnNpZGUgYSA8dHJhbnNmb3JtPiB0YWciICk7Ci0gICAgICAgIH0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdmFsdWUgPSBnZXRCb2R5VGV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGFnLnNldFBhcmFtZXRlclZhbHVlKCBnZXROYW1lKCksIHZhbHVlICk7Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL1BhcnNlVGFnLmphdmEgYi9qZWxseS10YWdzL3htbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvUGFyc2VUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMyNWRkMy4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvUGFyc2VUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnhtbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5kb200ai5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZG9tNGouaW8uU0FYUmVhZGVyOwotCi0vKiogQSB0YWcgd2hpY2ggcGFyc2VzIHNvbWUgWE1MIGFuZCBkZWZpbmVzIGEgdmFyaWFibGUgd2l0aCB0aGUgcGFyc2VkIERvY3VtZW50LgotICAqIFRoZSBYTUwgY2FuIGVpdGhlciBiZSBzcGVjaWZpZWQgYXMgaXRzIGJvZHkgb3IgY2FuIGJlIHBhc3NlZCBpbiB2aWEgdGhlCi0gICogeG1sIHByb3BlcnR5IHdoaWNoIGNhbiBiZSBhIFJlYWRlciwgSW5wdXRTdHJlYW0sIFVSTCBvciBTdHJpbmcgVVJJLgotICAqCi0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS43ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBQYXJzZVRhZyBleHRlbmRzIFBhcnNlVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUGFyc2VUYWcuY2xhc3MpOwotCi0gICAgLyoqIFRoZSB4bWwgdG8gcGFyc2UsIGVpdGhlciBhIFN0cmluZyBVUkksIGEgUmVhZGVyIG9yIElucHV0U3RyZWFtICovCi0gICAgcHJpdmF0ZSBPYmplY3QgeG1sOwotCi0gICAgLy8gT3B0aW9uYWwgcHJvcGVydGllcyBub3QgZGVmaW5lZCBpbiBKU1RMCi0gICAgLyoqIHdoZXRoZXIgWE1MIHZhbGlkYXRpb24gaXMgZW5hYmxlZCBvciBkaXNhYmxlZCAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZTsKLQotICAgIHB1YmxpYyBQYXJzZVRhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdldFZhcigpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCJUaGUgdmFyIGF0dHJpYnV0ZSBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRYbWxEb2N1bWVudChvdXRwdXQpOwotICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKGdldFZhcigpLCBkb2N1bWVudCk7Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKiBHZXRzIHRoZSBzb3VyY2Ugb2YgdGhlIFhNTCB3aGljaCBpcyBlaXRoZXIgYSBTdHJpbmcgVVJJLCBSZWFkZXIgb3IgSW5wdXRTdHJlYW0gKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFhtbCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMueG1sOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSBzb3VyY2Ugb2YgdGhlIFhNTCB3aGljaCBpcyBlaXRoZXIgYSBTdHJpbmcgVVJJLCBhIEZpbGUsIFJlYWRlciBvciBJbnB1dFN0cmVhbSAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhtbChPYmplY3QgeG1sKSB7Ci0gICAgICAgIHRoaXMueG1sID0geG1sOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIHdoZXRoZXIgWE1MIHZhbGlkYXRpb24gaXMgZW5hYmxlZCBvciBkaXNhYmxlZCAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldFZhbGlkYXRlKCkgewotICAgICAgICByZXR1cm4gdmFsaWRhdGU7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgd2hldGhlciBYTUwgdmFsaWRhdGlvbiBpcyBlbmFibGVkIG9yIGRpc2FibGVkICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGUoYm9vbGVhbiB2YWxpZGF0ZSkgewotICAgICAgICB0aGlzLnZhbGlkYXRlID0gdmFsaWRhdGU7Ci0gICAgfQotCi0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgU0FYUmVhZGVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNBWFJlYWRlciBjcmVhdGVTQVhSZWFkZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU0FYUmVhZGVyKHZhbGlkYXRlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgZ2V0WG1sRG9jdW1lbnQoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICBPYmplY3QgeG1sT2JqID0gdGhpcy5nZXRYbWwoKTsKLQotICAgICAgICBpZiAoeG1sT2JqID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gZ2V0VGV4dCgpOwotICAgICAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRvY3VtZW50ID0gcGFyc2VUZXh0KHRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZG9jdW1lbnQgPSBwYXJzZUJvZHkob3V0cHV0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gcGFyc2UoeG1sT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkb2N1bWVudDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9QYXJzZVRhZ1N1cHBvcnQuamF2YSBiL2plbGx5LXRhZ3MveG1sL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9QYXJzZVRhZ1N1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RhNjA1Ny4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvUGFyc2VUYWdTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmRvbTRqLkRvY3VtZW50OwotaW1wb3J0IG9yZy5kb200ai5Eb2N1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZG9tNGouaW8uU0FYQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmRvbTRqLmlvLlNBWFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYW55IHRhZyB3aGljaCBwYXJzZXJzIGl0cyBib2R5IGFzIFhNTC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNiAkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYXJzZVRhZ1N1cHBvcnQgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhQYXJzZVRhZ1N1cHBvcnQuY2xhc3MpOwotCi0gICAgLyoqIFRoZSB2YXJpYWJsZSB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkIGZvciB0aGUgZG9jdW1lbnQgKi8KLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0KLSAgICAvKiogVGhlIG1hcmt1cCB0ZXh0IHRvIGJlIHBhcnNlZCAqLwotICAgIHByaXZhdGUgU3RyaW5nIHRleHQ7Ci0KLSAgICAvKiogVGhlIFNBWFJlYWRlciB1c2VkIHRvIHBhcnNlciB0aGUgZG9jdW1lbnQgKi8KLSAgICBwcml2YXRlIFNBWFJlYWRlciBzYXhSZWFkZXI7Ci0KLSAgICBwdWJsaWMgUGFyc2VUYWdTdXBwb3J0KCkgewotICAgIH0KLQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKiBUaGUgdmFyaWFibGUgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIERvY3VtZW50IHZhcmlhYmxlIGNyZWF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhcigpIHsKLSAgICAgICAgcmV0dXJuIHZhcjsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyB0aGUgdmFyaWFibGUgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIERvY3VtZW50IHZhcmlhYmxlIGNyZWF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IHRvIGJlIHBhcnNlZAotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0ZXh0IHRvIGJlIHBhcnNlZCBieSB0aGlzIHBhcnNlcgotICAgICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIGJlIHBhcnNlZCBieSB0aGlzIHBhcnNlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKLSAgICB9Ci0KLQotICAgIC8qKiBAcmV0dXJuIHRoZSBTQVhSZWFkZXIgdXNlZCBmb3IgcGFyc2luZywgY3JlYXRpbmcgb25lIGxhemlseSBpZiBuZWVkIGJlICAqLwotICAgIHB1YmxpYyBTQVhSZWFkZXIgZ2V0U0FYUmVhZGVyKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzYXhSZWFkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgc2F4UmVhZGVyID0gY3JlYXRlU0FYUmVhZGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNheFJlYWRlcjsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyB0aGUgU0FYUmVhZGVyIHVzZWQgZm9yIHBhcnNpbmcgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTQVhSZWFkZXIoU0FYUmVhZGVyIHNheFJlYWRlcikgewotICAgICAgICB0aGlzLnNheFJlYWRlciA9IHNheFJlYWRlcjsKLSAgICB9Ci0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBTQVhSZWFkZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU0FYUmVhZGVyIGNyZWF0ZVNBWFJlYWRlcigpIHRocm93cyBTQVhFeGNlcHRpb247Ci0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgYm9keSBvZiB0aGlzIHRhZyBhbmQgcmV0dXJucyB0aGUgcGFyc2VkIGRvY3VtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IHBhcnNlQm9keShYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBTQVhDb250ZW50SGFuZGxlciBoYW5kbGVyID0gbmV3IFNBWENvbnRlbnRIYW5kbGVyKCk7Ci0gICAgICAgIFhNTE91dHB1dCBuZXdPdXRwdXQgPSBuZXcgWE1MT3V0cHV0KGhhbmRsZXIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBoYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGludm9rZUJvZHkoIG5ld091dHB1dCk7Ci0gICAgICAgICAgICBoYW5kbGVyLmVuZERvY3VtZW50KCk7Ci0gICAgICAgICAgICByZXR1cm4gaGFuZGxlci5nZXREb2N1bWVudCgpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBnaXZlIHBpZWNlIG9mIHRleHQgYXMgYmVpbmcgbWFya3VwCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IHBhcnNlVGV4dChTdHJpbmcgdGV4dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyggIkFib3V0IHRvIHBhcnNlOiAiICsgdGV4dCApOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTQVhSZWFkZXIoKS5yZWFkKCBuZXcgU3RyaW5nUmVhZGVyKCB0ZXh0ICkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRG9jdW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBnaXZlbiBzb3VyY2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgcGFyc2UoT2JqZWN0IHNvdXJjZSkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gIyMjIyB3ZSBzaG91bGQgYWxsb3cgcGFyc2luZyB0byBvdXRwdXQgWE1MIGV2ZW50cyB0bwotICAgICAgICAvLyB0aGUgb3V0cHV0IGlmIG5vIHZhciBpcyBzcGVjaWZpZWQKLQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IChTdHJpbmcpIHNvdXJjZTsKLSAgICAgICAgICAgICAgICBzb3VyY2UgPSBjb250ZXh0LmdldFJlc291cmNlKHVyaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBVUkwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U0FYUmVhZGVyKCkucmVhZCgoVVJMKSBzb3VyY2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgRmlsZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTQVhSZWFkZXIoKS5yZWFkKChGaWxlKSBzb3VyY2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUmVhZGVyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFNBWFJlYWRlcigpLnJlYWQoKFJlYWRlcikgc291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIElucHV0U3RyZWFtKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFNBWFJlYWRlcigpLnJlYWQoKElucHV0U3RyZWFtKSBzb3VyY2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgc291cmNlIGFyZ3VtZW50LiBNdXN0IGJlIGEgU3RyaW5nLCBSZWFkZXIsIElucHV0U3RyZWFtIG9yIFVSTC4iCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgV2FzIHR5cGU7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgc291cmNlLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgd2l0aCB2YWx1ZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBzb3VyY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChEb2N1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvU2V0VGFnLmphdmEgYi9qZWxseS10YWdzL3htbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvU2V0VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMzFiMzUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL1NldFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MueG1sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnhwYXRoLlhQYXRoQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkueHBhdGguWFBhdGhUYWdTdXBwb3J0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZG9tNGouTm9kZTsKLQotaW1wb3J0IG9yZy5qYXhlbi5YUGF0aDsKLWltcG9ydCBvcmcuamF4ZW4uSmF4ZW5FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotLyoqIEEgdGFnIHdoaWNoIGRlZmluZXMgYSB2YXJpYWJsZSBmcm9tIGFuIFhQYXRoIGV4cHJlc3Npb24uCi0gICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgdmFyaWFibGUgb2YgdHlwZSB7QGxpbmsgTGlzdH0gb3Ige0BsaW5rIG9yZy5kb200ai5Ob2RlfQotICAqIChmb3IgZXhhbXBsZSB7QGxpbmsgb3JnLmRvbTRqLkVsZW1lbnR9IG9yIHtAbGluayBvcmcuZG9tNGouQXR0cmlidXRlfSkuCi0gICogVGh1cywgdGhlIHZhcmlhYmxlIGNyZWF0ZWQgZnJvbSB4bWw6c2V0IGNhbiBiZQotICAqIHVzZWQgZnJvbSB0aGUgb3RoZXIgeG1sIGxpYnJhcnkgZnVuY3Rpb25zLgotICAqCi0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMiAkCi0gICovCi1wdWJsaWMgY2xhc3MgU2V0VGFnIGV4dGVuZHMgWFBhdGhUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNldFRhZy5jbGFzcyk7Ci0KLSAgICAvKiogVGhlIHZhcmlhYmxlIG5hbWUgdG8gZXhwb3J0LiAqLwotICAgIHByaXZhdGUgU3RyaW5nIHZhcjsKLQotICAgIC8qKiBUaGUgWFBhdGggZXhwcmVzc2lvbiB0byBldmFsdWF0ZS4gKi8KLSAgICBwcml2YXRlIFhQYXRoIHNlbGVjdDsKLQotICAgIC8qKiBYcGF0aCBjb21wYXJhdG9yIGZvciBzb3J0aW5nICovCi0gICAgcHJpdmF0ZSBYUGF0aENvbXBhcmF0b3IgeHBDbXAgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBCb29sZWFuIHNpbmdsZSA9IG51bGw7Ci0gICAgCi0gICAgcHJpdmF0ZSBCb29sZWFuIGFzU3RyaW5nID0gbnVsbDsKLQotICAgIHB1YmxpYyBTZXRUYWcoKSB7Ci0KLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHZhciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiggInZhciIgKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCAic2VsZWN0IiApOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IHhwYXRoQ29udGV4dCA9IGdldFhQYXRoQ29udGV4dCgpOwotICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYoc2luZ2xlIT1udWxsICYmIHNpbmdsZS5ib29sZWFuVmFsdWUoKT09dHJ1ZSkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZWN0LnNlbGVjdFNpbmdsZU5vZGUoeHBhdGhDb250ZXh0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxlY3QuZXZhbHVhdGUoeHBhdGhDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSmF4ZW5FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgewotICAgICAgICAgICAgLy8gc29ydCB0aGUgbGlzdCBpZiB4cENtcCBpcyBzZXQuCi0gICAgICAgICAgICBpZiAoeHBDbXAgIT0gbnVsbCAmJiAoeHBDbXAuZ2V0WHBhdGgoKSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoKExpc3QpdmFsdWUsIHhwQ21wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc2luZ2xlIT1udWxsKSB7Ci0gICAgICAgICAgICBpZiAoc2luZ2xlLmJvb2xlYW5WYWx1ZSgpPT10cnVlKSB7Ci0gICAgICAgICAgICAgICAgaWYodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3QgbCA9IChMaXN0KSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGwuc2l6ZSgpPT0wKQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9bnVsbDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9bC5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKGFzU3RyaW5nIT1udWxsICYmIGFzU3RyaW5nLmJvb2xlYW5WYWx1ZSgpICYmIHZhbHVlIGluc3RhbmNlb2YgTm9kZSkKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAoKE5vZGUpIHZhbHVlKS5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsgLy8gc2luZ2xlID09IGZhbHNlCi0gICAgICAgICAgICAgICAgaWYoISAodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSApIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdCBsID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlPT1udWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsID0gbmV3IEFycmF5TGlzdCgwKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBuZXcgQXJyYXlMaXN0KDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgbC5hZGQodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL2xvZy5pbmZvKCAiRXZhbHVhdGVkIHhwYXRoOiAiICsgc2VsZWN0ICsgIiBhczogIiArIHZhbHVlICsgIiBvZiB0eXBlOiAiICsgdmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKTsKLQotICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhciwgdmFsdWUpOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKiBTZXRzIHRoZSB2YXJpYWJsZSBuYW1lIHRvIGRlZmluZSBmb3IgdGhpcyBleHByZXNzaW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIFhQYXRoIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0KFhQYXRoIHNlbGVjdCkgewotICAgICAgICB0aGlzLnNlbGVjdCA9IHNlbGVjdDsKLSAgICB9Ci0KLSAgICAvKiogSWYgc2V0IHRvIHRydWUgd2lsbCBvbmx5IHRha2UgdGhlIGZpcnN0IGVsZW1lbnQgbWF0Y2hpbmcuCi0gICAgICAgIElmIHNldCB0byBmYWxzZSwgZ3VhcmFudGVlcyB0aGF0IGEgbGlzdCBpcyByZXR1cm5lZC4KLSAgICAgICAgSXQgdGhlbiBndWFyYW50ZWVzIHRoYXQgdGhlIHJlc3VsdCBpcyBvZiB0eXBlCi0gICAgICAgIHtAbGluayBvcmcuZG9tNGouTm9kZX0gdGhlcmVieSBtYWtpbmcgc3VyZSB0aGF0LCBmb3IgZXhhbXBsZSwKLSAgICAgICAgd2hlbiBhbiBlbGVtZW50IGlzIHNlbGVjdGVkLCBvbmUgY2FuIGRpcmVjdGx5IGNhbGwgc3VjaCBtZXRob2RzCi0gICAgICAgIGFzIHNldEF0dHJpYnV0ZS4KLSAgICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTaW5nbGUoYm9vbGVhbiBzaW5nbGUpIHsKLSAgICAgICAgdGhpcy5zaW5nbGUgPSBuZXcgQm9vbGVhbihzaW5nbGUpOwotICAgIH0KLSAgICAKLSAgICAvKiogSWYgc2V0IHRvIHRydWUsIHdpbGwgZW5zdXJlIHRoYXQgdGhlIChYUGF0aCkgdGV4dC12YWx1ZQotICAgICAgKiBvZiB0aGUgc2VsZWN0ZWQgbm9kZSBpcyB0YWtlbiBpbnN0ZWFkIG9mIHRoZSBub2RlCi0gICAgICAqIGl0c2VsZi4KLSAgICAgICogVGhpcyBlbnN1cmVzIHRoYXQsIHRoZXJlYWZ0ZXIsIHN0cmluZyBtYW5pcHVsYXRpb25zCi0gICAgICAqIGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIHJlc3VsdC4KLSAgICAgICogU2V0dGluZyB0aGlzIGF0dHJpYnV0ZSB0byB0cnVlIHdpbGwgYWxzbyBzZXQgdGhlIHNpbmdsZQotICAgICAgKiBhdHRyaWJ1dGUgdG8gdHJ1ZS4KLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QXNTdHJpbmcoYm9vbGVhbiBhc1N0cmluZykgewotICAgICAgICBpZihhc1N0cmluZykKLSAgICAgICAgICAgIHRoaXMuc2luZ2xlID0gbmV3IEJvb2xlYW4oYXNTdHJpbmcpOwotICAgICAgICB0aGlzLmFzU3RyaW5nID0gbmV3IEJvb2xlYW4oYXNTdHJpbmcpOwotICAgIH0KLQotCi0gICAgLyoqIFNldHMgdGhlIHhwYXRoIGV4cHJlc3Npb24gdG8gdXNlIHRvIHNvcnQgc2VsZWN0ZWQgbm9kZXMuCi0gICAgICogIElnbm9yZWQgaWYgc2luZ2xlIGlzIHRydWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U29ydChYUGF0aCBzb3J0WFBhdGgpIHRocm93cyBKYXhlbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh4cENtcCA9PSBudWxsKSB4cENtcCA9IG5ldyBYUGF0aENvbXBhcmF0b3IoKTsKLSAgICAgICAgeHBDbXAuc2V0WHBhdGgoc29ydFhQYXRoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgd2hldGhlciB0byBzb3J0IGFzY2VuZGluZyBvciBkZXNjZW5kaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlc2NlbmRpbmcoYm9vbGVhbiBkZXNjZW5kaW5nKSB7Ci0gICAgICAgIGlmICh4cENtcCA9PSBudWxsKSB4cENtcCA9IG5ldyBYUGF0aENvbXBhcmF0b3IoKTsKLSAgICAgICAgeHBDbXAuc2V0RGVzY2VuZGluZyhkZXNjZW5kaW5nKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvU29ydFRhZy5qYXZhIGIvamVsbHktdGFncy94bWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL1NvcnRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiZTYyMS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvU29ydFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnhtbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS54cGF0aC5YUGF0aENvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnhwYXRoLlhQYXRoVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuamF4ZW4uWFBhdGg7Ci1pbXBvcnQgb3JnLmpheGVuLkpheGVuRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi0vKiogQSB0YWcgdGhhdCBjYW4gc29ydCBhIGxpc3Qgb2YgeG1sIG5vZGVzIHZpYSBhbiB4cGF0aCBleHByZXNzaW9uLgotICAqCi0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25Aamhvcm1hbi5vcmciPkphc29uIEhvcm1hbjwvYT4KLSAgKiBAdmVyc2lvbiAkSWQ6IFNvcnRUYWcuamF2YSx2IDEuNSAyMDA0LzA5LzA5IDEyOjI0OjQwIGRpb24gRXhwICQKLSAgKi8KLQotcHVibGljIGNsYXNzIFNvcnRUYWcgZXh0ZW5kcyBYUGF0aFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBsaXN0IHRvIHNvcnQgKi8KLSAgICBwcml2YXRlIExpc3QgbGlzdCA9IG51bGw7Ci0KLSAgICAvKiogWHBhdGggY29tcGFyYXRvciBmb3Igc29ydGluZyAqLwotICAgIHByaXZhdGUgWFBhdGhDb21wYXJhdG9yIHhwQ21wID0gbnVsbDsKLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh4cENtcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiggInhwQ21wIiApOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCAibGlzdCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQobGlzdCwgeHBDbXApOwotICAgIH0KLQotICAgIC8qKiBTZXQgdGhlIGxpc3QgdG8gc29ydC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMaXN0KExpc3QgbGlzdCkgewotICAgICAgICB0aGlzLmxpc3QgPSBsaXN0OwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSB4cGF0aCBleHByZXNzaW9uIHRvIHVzZSB0byBzb3J0IHNlbGVjdGVkIG5vZGVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNvcnQoWFBhdGggc29ydFhQYXRoKSB0aHJvd3MgSmF4ZW5FeGNlcHRpb24gewotICAgICAgICBpZiAoeHBDbXAgPT0gbnVsbCkgeHBDbXAgPSBuZXcgWFBhdGhDb21wYXJhdG9yKCk7Ci0gICAgICAgIHhwQ21wLnNldFhwYXRoKHNvcnRYUGF0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHdoZXRoZXIgdG8gc29ydCBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjZW5kaW5nKGJvb2xlYW4gZGVzY2VuZGluZykgewotICAgICAgICBpZiAoeHBDbXAgPT0gbnVsbCkgeHBDbXAgPSBuZXcgWFBhdGhDb21wYXJhdG9yKCk7Ci0gICAgICAgIHhwQ21wLnNldERlc2NlbmRpbmcoZGVzY2VuZGluZyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL1RyYW5zZm9ybVRhZy5qYXZhIGIvamVsbHktdGFncy94bWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL1RyYW5zZm9ybVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWQzOTA4Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9UcmFuc2Zvcm1UYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhUcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguVHJhbnNmb3JtZXJIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuU2NyaXB0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5TY3JpcHRCbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5TdGF0aWNUYWdTY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuVGFnU2NyaXB0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5kb200ai5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZG9tNGouaW8uRG9jdW1lbnRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmRvbTRqLmlvLkRvY3VtZW50U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkRUREhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MUmVhZGVyRmFjdG9yeTsKLQotLyoqIEEgdGFnIHdoaWNoIHBhcnNlcyBzb21lIFhNTCwgYXBwbGllcyBhbiB4c2x0IHRyYW5zZm9ybSB0byBpdAotICAqIGFuZCBkZWZpbmVzIGEgdmFyaWFibGUgd2l0aCB0aGUgdHJhbnNmb3JtZWQgRG9jdW1lbnQuCi0gICogVGhlIFhNTCBjYW4gZWl0aGVyIGJlIHNwZWNpZmllZCBhcyBpdHMgYm9keSBvciBjYW4gYmUgcGFzc2VkIGluIHZpYSB0aGUKLSAgKiB4bWwgcHJvcGVydHkgd2hpY2ggY2FuIGJlIGEgUmVhZGVyLCBJbnB1dFN0cmVhbSwgVVJMIG9yIFN0cmluZyBVUkkuCi0gICoKLSAgKiBUaGUgWFNMIGNhbiBiZSBwYXNzZWQgaW4gdmlhIHRoZQotICAqIHhzbHQgcHJvcGVydHkgd2hpY2ggY2FuIGJlIGEgUmVhZGVyLCBJbnB1dFN0cmVhbSwgVVJMIG9yIFN0cmluZyBVUkkuCi0gICoKLSAgKiBAYXV0aG9yIFJvYmVydCBMZWZ0d2ljaAotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS44ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1UYWcgZXh0ZW5kcyBQYXJzZVRhZyB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVHJhbnNmb3JtVGFnLmNsYXNzKTsKLQotICAgIC8qKiBQcm9wZXJ0IG5hbWUgZm9yIGxleGljYWwgaGFuZGxlciAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMRVhJQ0FMX0hBTkRMRVJfUFJPUEVSVFkgPQotICAgICAgICAiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIjsKLQotICAgIC8qKiBUaGUgeHNsdCB0byBwYXJzZSwgZWl0aGVyIGEgU3RyaW5nIFVSSSwgYSBSZWFkZXIgb3IgSW5wdXRTdHJlYW0gKi8KLSAgICBwcml2YXRlIE9iamVjdCB4c2x0OwotCi0gICAgLyoqIFRoZSB4c2wgdHJhbnNmb3JtZXIgZmFjdG9yeSAqLwotICAgIHByaXZhdGUgU0FYVHJhbnNmb3JtZXJGYWN0b3J5IHRmOwotCi0gICAgLyoqIHRoZSB0cmFuc2Zvcm1lciBoYW5kbGVyLCBkb2luZyB0aGUgcmVhbCB3b3JrICovCi0gICAgcHJpdmF0ZSBUcmFuc2Zvcm1lckhhbmRsZXIgdHJhbnNmb3JtZXJIYW5kbGVyOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFRyYW5zZm9ybVRhZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhbnNmb3JtVGFnKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLnRmID0gKFNBWFRyYW5zZm9ybWVyRmFjdG9yeSkgVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyB0aGlzIHRhZyBpbnN0YW5jZQotICAgICAqCi0gICAgICogQHBhcmFtIG91dHB1dCBUaGUgcGlwZWxpbmUgZm9yIHhtbCBldmVudHMKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiAtIHdoZW4gcmVxdWlyZWQgYXR0cmlidXRlcyBhcmUgbWlzc2luZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKG51bGwgPT0gdGhpcy5nZXRYc2x0KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCJUaGUgeHNsdCBhdHRyaWJ1dGUgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCBhIHJlc29sdmVyIHRvIGxvY2F0ZSB1cmkKLSAgICAgICAgdGhpcy50Zi5zZXRVUklSZXNvbHZlcihjcmVhdGVVUklSZXNvbHZlcigpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lckhhbmRsZXIgPQotICAgICAgICAgICAgICAgIHRoaXMudGYubmV3VHJhbnNmb3JtZXJIYW5kbGVyKHRoaXMuZ2V0T2JqQXNTQVhTb3VyY2UodGhpcy5nZXRYc2x0KCkpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJ1biBhbnkgbmVzdGVkIHBhcmFtIHRhZ3MKLSAgICAgICAgdGhpcy5kb05lc3RlZFBhcmFtVGFnKG91dHB1dCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGdldCBhIHJlYWRlciB0byBwcm92aWRlIFNBWCBldmVudHMgdG8gdHJhbnNmb3JtZXIKLSAgICAgICAgICAgIFhNTFJlYWRlciB4bWxSZWFkZXIgPSB0aGlzLmNyZWF0ZVhNTFJlYWRlcigpOwotICAgICAgICAgICAgeG1sUmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKHRoaXMudHJhbnNmb3JtZXJIYW5kbGVyKTsKLSAgICAgICAgICAgIHhtbFJlYWRlci5zZXRQcm9wZXJ0eShMRVhJQ0FMX0hBTkRMRVJfUFJPUEVSVFksIHRoaXMudHJhbnNmb3JtZXJIYW5kbGVyKTsKLQotICAgICAgICAgICAgLy8gaGFuZGxlIHJlc3VsdCBkaWZmZXJlbnRseSwgZGVwZW5kaW5nIG9uIGlmIHZhciBpcyBzcGVjaWZpZWQKLSAgICAgICAgICAgIFN0cmluZyB2YXJOYW1lID0gdGhpcy5nZXRWYXIoKTsKLSAgICAgICAgICAgIGlmIChudWxsID09IHZhck5hbWUpIHsKLSAgICAgICAgICAgICAgICAvLyBwYXNzIHRoZSByZXN1bHQgb2YgdGhlIHRyYW5zZm9ybSBvdXQgYXMgU0FYIGV2ZW50cwotICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtZXJIYW5kbGVyLnNldFJlc3VsdCh0aGlzLmNyZWF0ZVNBWFJlc3VsdChvdXRwdXQpKTsKLSAgICAgICAgICAgICAgICB4bWxSZWFkZXIucGFyc2UodGhpcy5nZXRYTUxJbnB1dFNvdXJjZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHBhc3MgdGhlIHJlc3VsdCBvZiB0aGUgdHJhbnNmb3JtIG91dCBhcyBhIGRvY3VtZW50Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRSZXN1bHQgcmVzdWx0ID0gbmV3IERvY3VtZW50UmVzdWx0KCk7Ci0gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lckhhbmRsZXIuc2V0UmVzdWx0KHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgeG1sUmVhZGVyLnBhcnNlKHRoaXMuZ2V0WE1MSW5wdXRTb3VyY2UoKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBvdXRwdXQgdGhlIHJlc3VsdCBhcyBhIHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgRG9jdW1lbnQgdHJhbnNmb3JtZWREb2MgPSByZXN1bHQuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuc2V0VmFyaWFibGUodmFyTmFtZSwgdHJhbnNmb3JtZWREb2MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNvdXJjZSBvZiB0aGUgWFNMIHdoaWNoIGlzIGVpdGhlciBhIFN0cmluZyBVUkksIFJlYWRlciBvcgotICAgICAqIElucHV0U3RyZWFtCi0gICAgICoKLSAgICAgKiBAcmV0dXJucyB4c2x0ICAgIFRoZSBzb3VyY2Ugb2YgdGhlIHhzbHQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFhzbHQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnhzbHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc291cmNlIG9mIHRoZSBYU0wgd2hpY2ggaXMgZWl0aGVyIGEgU3RyaW5nIFVSSSwgUmVhZGVyIG9yCi0gICAgICogSW5wdXRTdHJlYW0KLSAgICAgKgotICAgICAqIEBwYXJhbSB4c2x0ICAgIFRoZSBzb3VyY2Ugb2YgdGhlIHhzbHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRYc2x0KE9iamVjdCB4c2x0KSB7Ci0gICAgICAgIHRoaXMueHNsdCA9IHhzbHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyVmFsdWUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICB0aGlzLnRyYW5zZm9ybWVySGFuZGxlci5nZXRUcmFuc2Zvcm1lcigpLnNldFBhcmFtZXRlcihuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBVUkkgUmVzb2x2ZXIgc28gdGhhdCBVUklzIGluc2lkZSB0aGUgWFNMVCBkb2N1bWVudCBjYW4gYmUKLSAgICAgKiByZXNvbHZlZCB1c2luZyB0aGUgSmVsbHlDb250ZXh0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgVVJJIFJlc29sdmVyIGZvciB0aGUgSmVsbHlDb250ZXh0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFVSSVJlc29sdmVyIGNyZWF0ZVVSSVJlc29sdmVyKCkgewotICAgICAgICByZXR1cm4gbmV3IFVSSVJlc29sdmVyKCkgewotICAgICAgICAgICAgcHVibGljIFNvdXJjZSByZXNvbHZlKFN0cmluZyBocmVmLCBTdHJpbmcgYmFzZSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoICJiYXNlOiAiICsgYmFzZSArICIgaHJlZjogIiArIGhyZWYgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBwYXNzIGlmIHdlIGRvbid0IGhhdmUgYSBzeXN0ZW1JZAotICAgICAgICAgICAgICAgIGlmIChudWxsID09IGhyZWYpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICAgICAgLy8gQHRvZG8KLSAgICAgICAgICAgICAgICAvLyAjIyMjIHRoaXMgaXMgYSBwcmV0dHkgc2ltcGxpc3RpYyBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgICAgICAgICAvLyAjIyMjIHdlIHNob3VsZCByZWFsbHkgaGFuZGxlIHRoaXMgYmV0dGVyIHN1Y2ggdGhhdCBpZgotICAgICAgICAgICAgICAgIC8vICMjIyMgYmFzZSBpcyBzcGVjaWZpZWQgYXMgYW4gYWJzb2x1dGUgVVJMCi0gICAgICAgICAgICAgICAgLy8gIyMjIyB3ZSB0cmltIHRoZSBlbmQgb2ZmIGl0IGFuZCBhcHBlbmQgaHJlZgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyZWFtU291cmNlKGNvbnRleHQuZ2V0UmVzb3VyY2VBc1N0cmVhbShocmVmKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFNBWFJlc3VsdCBmb3IgdGhlIGdpdmVuCi0gICAgICogWE1MT3V0cHV0IHNvIHRoYXQgdGhlIG91dHB1dCBvZiBhbiBYU0xUIHRyYW5zZm9ybSB3aWxsIGdvCi0gICAgICogZGlyZWN0bHkgaW50byB0aGUgWE1MT3V0cHV0IHRoYXQgd2UgYXJlIGdpdmVuLgotICAgICAqCi0gICAgICogQHBhcmFtIG91dHB1dCBUaGUgZGVzdGluYXRpb24gb2YgdGhlIHRyYW5zZm9ybSBvdXRwdXQKLSAgICAgKiBAcmV0dXJuIEEgU0FYUmVzdWx0IGZvciB0aGUgdHJhbnNmcm9tIG91dHB1dAotICAgICAqLwotICAgIHByb3RlY3RlZCBSZXN1bHQgY3JlYXRlU0FYUmVzdWx0KFhNTE91dHB1dCBvdXRwdXQpIHsKLSAgICAgICAgU0FYUmVzdWx0IHJlc3VsdCA9IG5ldyBTQVhSZXN1bHQob3V0cHV0KTsKLSAgICAgICAgcmVzdWx0LnNldExleGljYWxIYW5kbGVyKG91dHB1dCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFhNTFJlYWRlciBmb3IgdGhpcyB0YWcKLSAgICAgKiBzbyB0aGF0IHRoZSBpbnB1dCBvZiB0aGUgWFNMVCB0cmFuc2Zvcm0gY29tZXMgZnJvbQotICAgICAqIGVpdGhlciB0aGUgeG1sIHZhciwgdGhlIG5lc3RlZCB0YWcgb3IgdGhlIHRhZyBib2R5LgotICAgICAqCi0gICAgICogQHJldHVybiBYTUxSZWFkZXIgZm9yIHRoZSB0cmFuc2Zvcm0gaW5wdXQKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSB2YWx1ZSBvZiB0aGUgIm9yZy54bWwuc2F4LmRyaXZlciIgc3lzdGVtIHByb3BlcnR5Ci0gICAgICogICAgICAgICAgICAgaXMgbnVsbCwgb3IgaWYgdGhlIGNsYXNzIGNhbm5vdCBiZSBsb2FkZWQgYW5kIGluc3RhbnRpYXRlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWE1MUmVhZGVyIGNyZWF0ZVhNTFJlYWRlcigpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBYTUxSZWFkZXIgeG1sUmVhZGVyID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IHhtbFJlYWRlclNvdXJjZU9iaiA9IHRoaXMuZ2V0WG1sKCk7Ci0gICAgICAgIC8vIGlmIG5vIHhtbCBzb3VyY2Ugc3BlY2lmaWVkIHRoZW4gZ2V0IGZyb20gYm9keQotICAgICAgICAvLyBvdGhlcndpc2UgY29udmVydCBpdCB0byBhIFNBWCBzb3VyY2UKLSAgICAgICAgaWYgKG51bGwgPT0geG1sUmVhZGVyU291cmNlT2JqKSB7Ci0gICAgICAgICAgICB4bWxSZWFkZXIgPSBuZXcgVGFnQm9keVhNTFJlYWRlcih0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHhtbFJlYWRlciA9IFhNTFJlYWRlckZhY3RvcnkuY3JlYXRlWE1MUmVhZGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4geG1sUmVhZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBhcHByb3ByaWF0ZSB4bWwgaW5wdXQgc291cmNlCi0gICAgICogc28gdGhhdCB0aGUgaW5wdXQgb2YgdGhlIFhTTFQgdHJhbnNmb3JtIGNvbWVzIGZyb20KLSAgICAgKiBlaXRoZXIgdGhlIHhtbCB2YXIsIHRoZSBuZXN0ZWQgdGFnIG9yIHRoZSB0YWcgYm9keS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gSW5wdXRTb3VyY2UgZm9yIHRoZSB0cmFuc2Zvcm0gaW5wdXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSW5wdXRTb3VyY2UgZ2V0WE1MSW5wdXRTb3VyY2UoKSB7Ci0gICAgICAgIElucHV0U291cmNlIHhtbElucHV0U291cmNlID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IHhtbElucHV0U291cmNlT2JqID0gdGhpcy5nZXRYbWwoKTsKLSAgICAgICAgLy8gaWYgbm8geG1sIHNvdXJjZSBzcGVjaWZpZWQgdGhlbiBnZXQgZnJvbSB0YWcgYm9keQotICAgICAgICAvLyBvdGhlcndpc2UgY29udmVydCBpdCB0byBhbiBpbnB1dCBzb3VyY2UKLSAgICAgICAgaWYgKG51bGwgPT0geG1sSW5wdXRTb3VyY2VPYmopIHsKLSAgICAgICAgICAgIHhtbElucHV0U291cmNlID0gbmV3IFRhZ0JvZHlJbnB1dFNvdXJjZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeG1sSW5wdXRTb3VyY2UgPSB0aGlzLmdldElucHV0U291cmNlRnJvbU9iaih4bWxJbnB1dFNvdXJjZU9iaik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHhtbElucHV0U291cmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdG8gY29udmVydCB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byBhIFNBWCBzb3VyY2UKLSAgICAgKgotICAgICAqIEByZXR1cm4gU0FYU291cmNlIGZyb20gdGhlIHNvdXJjZSBvYmplY3Qgb3IgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBTQVhTb3VyY2UgZ2V0T2JqQXNTQVhTb3VyY2UoT2JqZWN0IHNheFNvdXJjZU9iaikgewotICAgICAgICBTQVhTb3VyY2Ugc2F4U291cmNlID0gbnVsbDsKLSAgICAgICAgaWYgKG51bGwgIT0gc2F4U291cmNlT2JqKSB7Ci0gICAgICAgICAgICBpZiAoc2F4U291cmNlT2JqIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLSAgICAgICAgICAgICAgICBzYXhTb3VyY2UgPSAgbmV3IERvY3VtZW50U291cmNlKChEb2N1bWVudCkgc2F4U291cmNlT2JqKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTb3VyY2UgeG1sSW5wdXRTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICB0aGlzLmdldElucHV0U291cmNlRnJvbU9iaihzYXhTb3VyY2VPYmopOwotICAgICAgICAgICAgICAgIHNheFNvdXJjZSA9IG5ldyBTQVhTb3VyY2UoeG1sSW5wdXRTb3VyY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNheFNvdXJjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGdldCBhbiB4bWwgaW5wdXQgc291cmNlIGZvciB0aGUgc3VwcGxpZWQgb2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIElucHV0U291cmNlIGZvciB0aGUgb2JqZWN0IG9yIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSW5wdXRTb3VyY2UgZ2V0SW5wdXRTb3VyY2VGcm9tT2JqKE9iamVjdCBzb3VyY2VPYmogKSB7Ci0gICAgICAgIElucHV0U291cmNlIHhtbElucHV0U291cmNlID0gbnVsbDsKLSAgICAgICAgaWYgKHNvdXJjZU9iaiBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0gICAgICAgICAgICBTQVhTb3VyY2Ugc2F4U291cmNlID0gbmV3IERvY3VtZW50U291cmNlKChEb2N1bWVudCkgc291cmNlT2JqKTsKLSAgICAgICAgICAgIHhtbElucHV0U291cmNlID0gc2F4U291cmNlLmdldElucHV0U291cmNlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc291cmNlT2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IChTdHJpbmcpIHNvdXJjZU9iajsKLSAgICAgICAgICAgICAgICB4bWxJbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShjb250ZXh0LmdldFJlc291cmNlQXNTdHJlYW0odXJpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzb3VyY2VPYmogaW5zdGFuY2VvZiBSZWFkZXIpIHsKLSAgICAgICAgICAgICAgICB4bWxJbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZSgoUmVhZGVyKSBzb3VyY2VPYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc291cmNlT2JqIGluc3RhbmNlb2YgSW5wdXRTdHJlYW0pIHsKLSAgICAgICAgICAgICAgICB4bWxJbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZSgoSW5wdXRTdHJlYW0pIHNvdXJjZU9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzb3VyY2VPYmogaW5zdGFuY2VvZiBVUkwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gKChVUkwpIHNvdXJjZU9iaikudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB4bWxJbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShjb250ZXh0LmdldFJlc291cmNlQXNTdHJlYW0odXJpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzb3VyY2VPYmogaW5zdGFuY2VvZiBGaWxlKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9ICgoRmlsZSkgc291cmNlT2JqKS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbElucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKGNvbnRleHQuZ2V0UmVzb3VyY2VBc1N0cmVhbSh1cmkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBzaG91bGQgbmV2ZXIgb2NjdXIuIFdlIHNob3VsZCBhbHdheXMgYmUgYWJsZSB0byBjb252ZXJ0IGEgRmlsZSB0byBhIFVSTCIgKyBlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgc291cmNlIGFyZ3VtZW50LiBNdXN0IGJlIGEgU3RyaW5nLCBSZWFkZXIsIElucHV0U3RyZWFtIG9yIFVSTC4iCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgV2FzIHR5cGU7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgc291cmNlT2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgd2l0aCB2YWx1ZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBzb3VyY2VPYmopOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHhtbElucHV0U291cmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdG8gcnVuIGFueSBuZXN0ZWQgcGFyYW0gdGFncwotICAgICAqCi0gICAgKiBAcGFyYW0gb3V0cHV0IFRoZSBkZXN0aW5hdGlvbiBmb3IgYW55IFNBWCBvdXRwdXQgKG5vdCBhY3R1YWxseSB1c2VkKQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkb05lc3RlZFBhcmFtVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGZpbmQgYW55IG5lc3RlZCBwYXJhbSB0YWdzIGFuZCBydW4gdGhlbQotICAgICAgICBTY3JpcHQgYm9keVNjcmlwdCA9IHRoaXMuZ2V0Qm9keSgpOwotICAgICAgICAKLSAgICAgICAgaWYgKGJvZHlTY3JpcHQgaW5zdGFuY2VvZiBTY3JpcHRCbG9jaykgewotICAgICAgICAgICAgU2NyaXB0QmxvY2sgc2NyaXB0QmxvY2sgPSAoU2NyaXB0QmxvY2spIGJvZHlTY3JpcHQ7Ci0gICAgICAgICAgICBMaXN0IHNjcmlwdExpc3QgPSBzY3JpcHRCbG9jay5nZXRTY3JpcHRMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzY3JpcHRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgICAgICBTY3JpcHQgc2NyaXB0ID0gKFNjcmlwdCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNjcmlwdCBpbnN0YW5jZW9mIFRhZ1NjcmlwdCkgewotCi0gICAgICAgICAgICAgICAgICAgIFRhZyB0YWcgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGFnID0gKChUYWdTY3JpcHQpIHNjcmlwdCkuZ2V0VGFnKGdldENvbnRleHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEplbGx5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgaW5zdGFuY2VvZiBQYXJhbVRhZykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0LnJ1bihjb250ZXh0LCBvdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIAotICAgIC8qKiBBIGhlbHBlciBjbGFzcyB0aGF0IGNvbnZlcnRzIGEgdHJhbnNmb3JtIHRhZyBib2R5IHRvIGFuIFhNTFJlYWRlcgotICAgICAgKiB0byBoaWRlIHRoZSBkZXRhaWxzIG9mIHdoZXJlIHRoZSBpbnB1dCBmb3IgdGhlIHRyYW5zZm9ybSBpcyBvYnRhaW5lZAotICAgICAgKgotICAgICAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpyb2JlcnRAbGVmdHdpY2guaW5mbyI+Um9iZXJ0IExlZnR3aWNoPC9hPgotICAgICAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOCAkCi0gICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgVGFnQm9keVhNTFJlYWRlciBpbXBsZW1lbnRzIFhNTFJlYWRlciB7Ci0KLSAgICAgICAgLyoqIFRoZSB0YWcgd2hvc2UgYm9keSBpcyB0byBiZSByZWFkLiAqLwotICAgICAgICBwcml2YXRlIFRhZyB0YWc7Ci0KLSAgICAgICAgLyoqIFRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIHNheCBldmVudHMgZ2VuZXJhdGVkIGJ5IHRoZSByZWFkZXIuICovCi0gICAgICAgIHByaXZhdGUgWE1MT3V0cHV0IHhtbE91dHB1dDsKLQotICAgICAgICAvKiogU3RvcmFnZSBmb3IgYSBEVERIYW5kbGVyIGlmIHNldCBieSB0aGUgdXNlciBvZiB0aGUgcmVhZGVyLiAqLwotICAgICAgICBwcml2YXRlIERUREhhbmRsZXIgZHRkSGFuZGxlcjsKLQotICAgICAgICAvKiogU3RvcmFnZSBmb3IgYSBFcnJvckhhbmRsZXIgaWYgc2V0IGJ5IHRoZSB1c2VyIG9mIHRoZSByZWFkZXIuICovCi0gICAgICAgIHByaXZhdGUgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcjsKLQotICAgICAgICAvKiogU3RvcmFnZSBmb3IgYSBFbnRpdHlSZXNvbHZlciBpZiBzZXQgYnkgdGhlIHVzZXIgb2YgdGhlIHJlYWRlci4gKi8KLSAgICAgICAgcHJpdmF0ZSBFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlcjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0IGFuIFhNTFJlYWRlciBmb3IgdGhlIHNwZWNpZmllZCBUYWcKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHRhZyAgICBUaGUgVGFnIHRvIGNvbnZlcnQgdG8gYW4gWE1MUmVhZGVyCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgVGFnQm9keVhNTFJlYWRlcihUYWcgdGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnRhZyA9IHRhZzsKLSAgICAgICAgICAgIHRoaXMueG1sT3V0cHV0ID0gbmV3IFhNTE91dHB1dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWV0aG9kcwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUGFyc2UgYW4gWE1MIHNvdXJjZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGlucHV0ICBUaGUgc291cmNlIG9mIHRoZSB4bWwKLSAgICAgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gLQotICAgICAgICAgKiAgICAgICAgICAgICBBbnkgU0FYIGV4Y2VwdGlvbiwgcG9zc2libHkgd3JhcHBpbmcgYW5vdGhlciBleGNlcHRpb24uCi0gICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gLQotICAgICAgICAgKiAgICAgICAgICAgICBBbiBJTyBleGNlcHRpb24gZnJvbSB0aGUgcGFyc2VyLCBwb3NzaWJseSBmcm9tIGEgYnl0ZQotICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gb3IgY2hhcmFjdGVyIHN0cmVhbSBzdXBwbGllZCBieSB0aGUgYXBwbGljYXRpb24uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFNvdXJjZSBpbnB1dCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgLy8gc2FmZXR5IGNoZWNrIHRoYXQgd2UgYXJlIGJlaW5nIHVzZWQgY29ycmVjdGx5Ci0gICAgICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBUYWdCb2R5SW5wdXRTb3VyY2UpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmRvSW52b2tlQm9keSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJJbnZhbGlkIGlucHV0IHNvdXJjZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBhcnNlIGFuIFhNTCBzb3VyY2Ugc3BlY2lmaWVkIGJ5IGEgc3lzdGVtIGlkCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbnB1dCAgVGhlIHN5c3RlbSBpZGVudGlmaWVyIChVUkkpCi0gICAgICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIC0KLSAgICAgICAgICogICAgICAgICAgICAgQW55IFNBWCBleGNlcHRpb24sIHBvc3NpYmx5IHdyYXBwaW5nIGFub3RoZXIgZXhjZXB0aW9uLgotICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0KLSAgICAgICAgICogICAgICAgICAgICAgQW4gSU8gZXhjZXB0aW9uIGZyb20gdGhlIHBhcnNlciwgcG9zc2libHkgZnJvbSBhIGJ5dGUKLSAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIG9yIGNoYXJhY3RlciBzdHJlYW0gc3VwcGxpZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIHN5c3RlbUlkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmRvSW52b2tlQm9keSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSGVscGVyIG1ldGhvZHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFjdHVhbGx5IGludm9rZSB0aGUgdGFnIGJvZHkgdG8gZ2VuZXJhdGUgdGhlIFNBWCBldmVudHMKLSAgICAgICAgICoKLSAgICAgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gLQotICAgICAgICAgKiAgICAgICAgICAgICBBbnkgU0FYIGV4Y2VwdGlvbiwgcG9zc2libHkgd3JhcHBpbmcgYW5vdGhlciBleGNlcHRpb24uCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgZG9JbnZva2VCb2R5KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZFBhcnNlQm9keSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFhNTFJlYWRlciBhblhNTFJlYWRlciA9IFhNTFJlYWRlckZhY3RvcnkuY3JlYXRlWE1MUmVhZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFuWE1MUmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKHRoaXMueG1sT3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgYW5YTUxSZWFkZXIuc2V0UHJvcGVydHkoTEVYSUNBTF9IQU5ETEVSX1BST1BFUlRZLHRoaXMueG1sT3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy50YWcuaW52b2tlQm9keShYTUxPdXRwdXQuY3JlYXRlWE1MT3V0cHV0KHdyaXRlcikpOwotICAgICAgICAgICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcih3cml0ZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFuWE1MUmVhZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShyZWFkZXIpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZy5pbnZva2VCb2R5KHRoaXMueG1sT3V0cHV0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGRldGVybWluIGlmIG5lc3RlZCBib2R5IG5lZWRzIHRvIGJlIHBhcnNlZCBieSAoYW4KLSAgICAgICAgICogeG1sIHBhcnNlciwgaS5lLiBpdHMgb25seSB0ZXh0KSB0byBnZW5lcmF0ZSBTQVggZXZlbnRzIG9yIG5vdAotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGFnIGJvZHkgc2hvdWxkIGJlIHBhcnNlZCBvciBmYWxzZSBpZiBpbnZva2VkIG9ubHkKLSAgICAgICAgICogQHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZFBhcnNlQm9keSgpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gcGFyc2UgdGhlIGJvZHkgb3IganVzdCBpbnZva2UgaXQKLSAgICAgICAgICAgIFNjcmlwdCBib2R5U2NyaXB0ID0gdGhpcy50YWcuZ2V0Qm9keSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoYm9keVNjcmlwdCBpbnN0YW5jZW9mIFNjcmlwdEJsb2NrKSB7Ci0gICAgICAgICAgICAgICAgU2NyaXB0QmxvY2sgc2NyaXB0QmxvY2sgPSAoU2NyaXB0QmxvY2spIGJvZHlTY3JpcHQ7Ci0gICAgICAgICAgICAgICAgTGlzdCBzY3JpcHRMaXN0ID0gc2NyaXB0QmxvY2suZ2V0U2NyaXB0TGlzdCgpOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNjcmlwdExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgICAgICAgICBTY3JpcHQgc2NyaXB0ID0gKFNjcmlwdCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY3JpcHQgaW5zdGFuY2VvZiBTdGF0aWNUYWdTY3JpcHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUHJvcGVydGllcwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgU0FYIENvbnRlbnRIYW5kbGVyIHRvIGZlZWQgU0FYIGV2ZW50cyBpbnRvCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdGhlIFNBWCBDb250ZW50SGFuZGxlciB0byB1c2UgdG8gZmVlZCBTQVggZXZlbnRzIGludG8KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBDb250ZW50SGFuZGxlciBnZXRDb250ZW50SGFuZGxlcigpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnhtbE91dHB1dC5nZXRDb250ZW50SGFuZGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIFNBWCBDb250ZW50SGFuZGxlciB0byBmZWVkIFNBWCBldmVudHMgaW50bwotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY29udGVudEhhbmRsZXIgaXMgdGhlIENvbnRlbnRIYW5kbGVyIHRvIHVzZS4KLSAgICAgICAgICogICAgICBUaGlzIHZhbHVlIGNhbm5vdCBiZSBudWxsLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudEhhbmRsZXIoQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIpIHsKLSAgICAgICAgICAgIHRoaXMueG1sT3V0cHV0LnNldENvbnRlbnRIYW5kbGVyKGNvbnRlbnRIYW5kbGVyKTsKLSAgICAgICAgICAgIC8vIG9mdGVuIGNsYXNzZXMgd2lsbCBpbXBsZW1lbnQgTGV4aWNhbEhhbmRsZXIgYXMgd2VsbAotICAgICAgICAgICAgaWYgKGNvbnRlbnRIYW5kbGVyIGluc3RhbmNlb2YgTGV4aWNhbEhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnhtbE91dHB1dC5zZXRMZXhpY2FsSGFuZGxlcigoTGV4aWNhbEhhbmRsZXIpIGNvbnRlbnRIYW5kbGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBEVEQgSGFuZGxlciB0byBmZWVkIFNBWCBldmVudHMgaW50bwotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRoZSBEVEQgSGFuZGxlciB0byB1c2UgdG8gZmVlZCBTQVggZXZlbnRzIGludG8KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBEVERIYW5kbGVyIGdldERUREhhbmRsZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5kdGRIYW5kbGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIERURCBIYW5kbGVyIHRvIGZlZWQgU0FYIGV2ZW50cyBpbnRvCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB0aGUgRFREIEhhbmRsZXIgdG8gdXNlIHRvIGZlZWQgU0FYIGV2ZW50cyBpbnRvCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXREVERIYW5kbGVyKERUREhhbmRsZXIgZHRkSGFuZGxlcikgewotICAgICAgICAgICAgdGhpcy5kdGRIYW5kbGVyID0gZHRkSGFuZGxlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBFcnJvciBIYW5kbGVyIHRvIGZlZWQgU0FYIGV2ZW50cyBpbnRvCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdGhlIEVycm9yIEhhbmRsZXIgdG8gdXNlIHRvIGZlZWQgU0FYIGV2ZW50cyBpbnRvCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRXJyb3JIYW5kbGVyIGdldEVycm9ySGFuZGxlcigpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9ySGFuZGxlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBFcnJvciBIYW5kbGVyIHRvIGZlZWQgU0FYIGV2ZW50cyBpbnRvCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB0aGUgRXJyb3IgSGFuZGxlciB0byB1c2UgdG8gZmVlZCBTQVggZXZlbnRzIGludG8KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEVycm9ySGFuZGxlcihFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7Ci0gICAgICAgICAgICAvLyBzYXZlIHRoZSBlcnJvciBoYW5kbGVyCi0gICAgICAgICAgICB0aGlzLmVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBFbnRpdHkgUmVzb2x2ZXIgdG8gZmVlZCBTQVggZXZlbnRzIGludG8KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiB0aGUgRW50aXR5IFJlc29sdmVyIHRvIHVzZSB0byBmZWVkIFNBWCBldmVudHMgaW50bwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEVudGl0eVJlc29sdmVyIGdldEVudGl0eVJlc29sdmVyKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW50aXR5UmVzb2x2ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgRW50aXR5IFJlc29sdmVyIHRvIGZlZWQgU0FYIGV2ZW50cyBpbnRvCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB0aGUgRW50aXR5IFJlc29sdmVyIHRvIHVzZSB0byBmZWVkIFNBWCBldmVudHMgaW50bwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RW50aXR5UmVzb2x2ZXIoRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIpIHsKLSAgICAgICAgICAgIHRoaXMuZW50aXR5UmVzb2x2ZXIgPSBlbnRpdHlSZXNvbHZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBMb29rdXAgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIG5hbWUgLSBUaGUgcHJvcGVydHkgbmFtZSwgd2hpY2ggaXMgYSBmdWxseS1xdWFsaWZpZWQgVVJJLgotICAgICAgICAgKiBAcmV0dXJuIC0gVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotICAgICAgICAgKiBAdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gLQotICAgICAgICAgKiAgICAgICAgICAgIFdoZW4gdGhlIFhNTFJlYWRlciBkb2VzIG5vdCByZWNvZ25pemUgdGhlIHByb3BlcnR5IG5hbWUuCi0gICAgICAgICAqIEB0aHJvd3MgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIC0KLSAgICAgICAgICogICAgICAgICAgICBXaGVuIHRoZSBYTUxSZWFkZXIgcmVjb2duaXplcyB0aGUgcHJvcGVydHkgbmFtZSBidXQKLSAgICAgICAgICogICAgICAgICAgICBjYW5ub3QgZGV0ZXJtaW5lIGl0cyB2YWx1ZSBhdCB0aGlzIHRpbWUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBuYW1lKQotICAgICAgICB0aHJvd3MgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiwgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHJlc3BvbmQgdG8gdGhlIGxleGljYWwgaGFuZGxlciByZXF1ZXN0Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKExFWElDQUxfSEFORExFUl9QUk9QRVJUWSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy54bWxPdXRwdXQuZ2V0TGV4aWNhbEhhbmRsZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eQotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBwcm9wZXJ0eSBuYW1lLCB3aGljaCBpcyBhIGZ1bGx5LXF1YWxpZmllZCBVUkkuCi0gICAgICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBwcm9wZXJ0eSB2YWx1ZQotICAgICAgICAgKiBAdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gLQotICAgICAgICAgKiAgICAgICAgICAgIFdoZW4gdGhlIFhNTFJlYWRlciBkb2VzIG5vdCByZWNvZ25pemUgdGhlIHByb3BlcnR5IG5hbWUuCi0gICAgICAgICAqIEB0aHJvd3MgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIC0KLSAgICAgICAgICogICAgICAgICAgICBXaGVuIHRoZSBYTUxSZWFkZXIgcmVjb2duaXplcyB0aGUgcHJvcGVydHkgbmFtZSBidXQKLSAgICAgICAgICogICAgICAgICAgICBjYW5ub3QgZGV0ZXJtaW5lIGl0cyB2YWx1ZSBhdCB0aGlzIHRpbWUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKQotICAgICAgICB0aHJvd3MgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiwgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHJlc3BvbmQgdG8gdGhlIGxleGljYWwgaGFuZGxlciBzZXR0aW5nCi0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKExFWElDQUxfSEFORExFUl9QUk9QRVJUWSkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnhtbE91dHB1dC5zZXRMZXhpY2FsSGFuZGxlcigoTGV4aWNhbEhhbmRsZXIpIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBMb29rdXAgdGhlIHZhbHVlIG9mIGEgZmVhdHVyZQotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBmZWF0dXJlIG5hbWUsIHdoaWNoIGlzIGEgZnVsbHktcXVhbGlmaWVkIFVSSS4KLSAgICAgICAgICogQHJldHVybiAtIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBmZWF0dXJlICh0cnVlIG9yIGZhbHNlKQotICAgICAgICAgKiBAdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gLQotICAgICAgICAgKiAgICAgICAgICAgIFdoZW4gdGhlIFhNTFJlYWRlciBkb2VzIG5vdCByZWNvZ25pemUgdGhlIGZlYXR1cmUgbmFtZS4KLSAgICAgICAgICogQHRocm93cyBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gLQotICAgICAgICAgKiAgICAgICAgICAgIFdoZW4gdGhlIFhNTFJlYWRlciByZWNvZ25pemVzIHRoZSBmZWF0dXJlIG5hbWUgYnV0Ci0gICAgICAgICAqICAgICAgICAgICAgY2Fubm90IGRldGVybWluZSBpdHMgdmFsdWUgYXQgdGhpcyB0aW1lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZShTdHJpbmcgbmFtZSkKLSAgICAgICAgdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24sIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IHRoZSB2YWx1ZSBvZiBhIGZlYXR1cmUKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIG5hbWUgLSBUaGUgZmVhdHVyZSBuYW1lLCB3aGljaCBpcyBhIGZ1bGx5LXF1YWxpZmllZCBVUkkuCi0gICAgICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBmZWF0dXJlICh0cnVlIG9yIGZhbHNlKQotICAgICAgICAgKiBAdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gLQotICAgICAgICAgKiAgICAgICAgICAgIFdoZW4gdGhlIFhNTFJlYWRlciBkb2VzIG5vdCByZWNvZ25pemUgdGhlIGZlYXR1cmUgbmFtZS4KLSAgICAgICAgICogQHRocm93cyBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gLQotICAgICAgICAgKiAgICAgICAgICAgIFdoZW4gdGhlIFhNTFJlYWRlciByZWNvZ25pemVzIHRoZSBmZWF0dXJlIG5hbWUgYnV0Ci0gICAgICAgICAqICAgICAgICAgICAgY2Fubm90IGRldGVybWluZSBpdHMgdmFsdWUgYXQgdGhpcyB0aW1lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RmVhdHVyZShTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkKLSAgICAgICAgdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24sIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogQSBtYXJrZXIgY2xhc3MgdXNlZCBieSB0aGUgVGFnQm9keVhNTFJlYWRlciBhcyBhIHNhbml0eSBjaGVjawotICAgICAgKiAoaS5lLiBUaGUgc291cmNlIGlzIG5vdCBhY3R1YWxseSB1c2VkKQotICAgICAgKgotICAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFRhZ0JvZHlJbnB1dFNvdXJjZSBleHRlbmRzIElucHV0U291cmNlIHsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoaXMgbWFya2VyIGNsYXNzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgVGFnQm9keUlucHV0U291cmNlKCkgewotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvWE1MVGFnTGlicmFyeS5qYXZhIGIvamVsbHktdGFncy94bWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL1hNTFRhZ0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUxODI4ZC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvWE1MVGFnTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy54bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ0xpYnJhcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5FeHByZXNzaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5Db21wb3NpdGVFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLmpleGwuSmV4bEV4cHJlc3Npb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLnhwYXRoLlhQYXRoRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5UYWdTY3JpcHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotCi0vKiogRGVzY3JpYmVzIHRoZSBUYWdsaWIuIFRoaXMgY2xhc3MgY291bGQgYmUgZ2VuZXJhdGVkIGJ5IFhEb2NsZXQKLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gICovCi1wdWJsaWMgY2xhc3MgWE1MVGFnTGlicmFyeSBleHRlbmRzIFRhZ0xpYnJhcnkgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coWE1MVGFnTGlicmFyeS5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIEpleGxFeHByZXNzaW9uRmFjdG9yeSBqZXhsRmFjdG9yeTsKLQotICAgIHB1YmxpYyBYTUxUYWdMaWJyYXJ5KCkgewotICAgICAgICByZWdpc3RlclRhZygib3V0IiwgRXhwclRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJpZiIsIElmVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImZvckVhY2giLCBGb3JFYWNoVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInBhcnNlIiwgUGFyc2VUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygic2V0IiwgU2V0VGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInRyYW5zZm9ybSIsIFRyYW5zZm9ybVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJwYXJhbSIsIFBhcmFtVGFnLmNsYXNzKTsKLQotICAgICAgICAvLyBleHRlbnNpb25zIHRvIEpTVEwKLSAgICAgICAgcmVnaXN0ZXJUYWcoImV4cHIiLCBFeHByVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImVsZW1lbnQiLCBFbGVtZW50VGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImF0dHJpYnV0ZSIsIEF0dHJpYnV0ZVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJjb3B5IiwgQ29weVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJjb3B5T2YiLCBDb3B5T2ZUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygiY29tbWVudCIsIENvbW1lbnRUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygiZG9jdHlwZSIsIERvY3R5cGVUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygic29ydCIsIFNvcnRUYWcuY2xhc3MpOwotCi0gICAgICAgIHRoaXMuamV4bEZhY3RvcnkgPSBuZXcgSmV4bEV4cHJlc3Npb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEV4cHJlc3Npb24gY3JlYXRlRXhwcmVzc2lvbigKLSAgICAgICAgRXhwcmVzc2lvbkZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgVGFnU2NyaXB0IHRhZ1NjcmlwdCwKLSAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsCi0gICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLQotICAgICAgICAvLyAjIyMjIG1heSBuZWVkIHRvIGluY2x1ZGUgc29tZSBuYW1lc3BhY2UgVVJJIGluZm9ybWF0aW9uIGluIHRoZSBYUGF0aCBpbnN0YW5jZT8KLQotICAgICAgICBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoInNlbGVjdCIpIHx8IGF0dHJpYnV0ZU5hbWUuZXF1YWxzKCJzb3J0IikpIHsKLSAgICAgICAgICAgIGlmICggbG9nLmlzRGVidWdFbmFibGVkKCkgKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCAiUGFyc2luZyBYUGF0aCBleHByZXNzaW9uOiAiICsgYXR0cmlidXRlVmFsdWUgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRXhwcmVzc2lvbiB4cGF0aEV4cHIgPSBjcmVhdGVYUGF0aFRleHRFeHByZXNzaW9uKCBhdHRyaWJ1dGVWYWx1ZSApOwotCi0gICAgICAgICAgICByZXR1cm4gbmV3IFhQYXRoRXhwcmVzc2lvbihhdHRyaWJ1dGVWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwYXRoRXhwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1NjcmlwdCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB3aWxsIHVzZSB0aGUgZGVmYXVsdCBleHByZXNzaW9uIGluc3RlYWQKLSAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUV4cHJlc3Npb24oZmFjdG9yeSwgdGFnU2NyaXB0LCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gY3JlYXRlWFBhdGhUZXh0RXhwcmVzc2lvbihTdHJpbmcgZXhwclRleHQpIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBDb21wb3NpdGVFeHByZXNzaW9uLnBhcnNlKCBleHByVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuamV4bEZhY3RvcnkgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvcGFja2FnZS5odG1sIGIvamVsbHktdGFncy94bWwvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ3MjYwMC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci0KLSAgPHA+VGhlIFhNTCBUYWdzIGZyb20gdGhlIEpTVEwKLSAgPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL1Rlc3RJbXBvcnQuamF2YSBiL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9UZXN0SW1wb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNmI0MTAuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL1Rlc3RJbXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MueG1sOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlNjcmlwdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5wYXJzZXIuWE1MUGFyc2VyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0IHRoYXQgY29tcGlsZWQgc2NyaXB0cyBjYW4gYWNjZXNzIHJlc291cmNlcwotICovCi1wdWJsaWMgY2xhc3MgVGVzdEltcG9ydCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBleHBlY3RlZCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIKLSAgICAgICAgKyAiPGh0bWwgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvc3RyaWN0XCIgIgotICAgICAgICArICJ4bWxucz1cImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9zdHJpY3RcIj4iCi0gICAgICAgICsgIjxoZWFkPjx0aXRsZT5FeHBlbnNlIFJlcG9ydCBTdW1tYXJ5PC90aXRsZT48L2hlYWQ+IgotICAgICAgICArICI8Ym9keT48cD5Ub3RhbCBBbW91bnQ6IDEyPC9wPjwvYm9keT48L2h0bWw+IjsKLSAgICBwdWJsaWMgVGVzdEltcG9ydChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEltcG9ydFJlc291cmNlcygpIHRocm93cyBKZWxseUV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBKZWxseUNvbnRleHQgY29udGV4dCA9IG5ldyBKZWxseUNvbnRleHQoKTsKLSAgICAgICAgVVJMIHVybCA9IFRlc3RJbXBvcnQuY2xhc3MuZ2V0UmVzb3VyY2UoIi9yZXNvdXJjZXMvaW1wb3J0LmplbGx5Iik7Ci0gICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIFhNTE91dHB1dCBvdXQgPSBYTUxPdXRwdXQuY3JlYXRlWE1MT3V0cHV0KHdyaXRlcik7Ci0vLyAgICAgICAgIHRoaXMgd29ya3MgYmVjYXVzZSBvZiB0aGUgY3JlYXRlZCBjaGlsZCBjb250ZXh0IHRoYXQgaGFzIGtub3dsZWRnZQotLy8gICAgICAgICBvZiB0aGUgVVJMCi0gICAgICAgIGNvbnRleHQucnVuU2NyaXB0KHVybCwgb3V0KTsKLSAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnRSZXNvdXJjZXNDb21waWxlZCgpIHRocm93cyBKZWxseUV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBKZWxseUNvbnRleHQgY29udGV4dCA9IG5ldyBKZWxseUNvbnRleHQoKTsKLSAgICAgICAgVVJMIHVybCA9IFRlc3RJbXBvcnQuY2xhc3MuZ2V0UmVzb3VyY2UoIi9yZXNvdXJjZXMvaW1wb3J0LmplbGx5Iik7Ci0gICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIFhNTE91dHB1dCBvdXQgPSBYTUxPdXRwdXQuY3JlYXRlWE1MT3V0cHV0KHdyaXRlcik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBjb250ZXh0LmNvbXBpbGVTY3JpcHQodXJsKTsKLSAgICAgICAgc2NyaXB0LnJ1bihjb250ZXh0LCBvdXQpOwotICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEltcG9ydFJlc291cmNlc0Zyb21VbmNvbXBpbGVkU2NyaXB0KCkgdGhyb3dzIEplbGx5RXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgSmVsbHlDb250ZXh0IGNvbnRleHQgPSBuZXcgSmVsbHlDb250ZXh0KCk7Ci0gICAgICAgIFVSTCB1cmwgPSBUZXN0SW1wb3J0LmNsYXNzLmdldFJlc291cmNlKCIvcmVzb3VyY2VzL2ltcG9ydC5qZWxseSIpOwotICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBYTUxPdXRwdXQgb3V0ID0gWE1MT3V0cHV0LmNyZWF0ZVhNTE91dHB1dCh3cml0ZXIpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gbmV3IFhNTFBhcnNlcigpLnBhcnNlKHVybCk7Ci0gICAgICAgIHNjcmlwdC5ydW4oY29udGV4dCwgb3V0KTsKLSAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9UZXN0SmVsbHkuamF2YSBiL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9UZXN0SmVsbHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0ZTkwOC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvVGVzdEplbGx5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnhtbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qdW5pdC5KZWxseVRlc3RTdWl0ZTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyB0byBydW4gamVsbHkgdGVzdCBjYXNlcyBhcyBwYXJ0IG9mIEFudCdzIEpVbml0IHRlc3RzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjQgJAotICovCi1wdWJsaWMgY2xhc3MgVGVzdEplbGx5IGV4dGVuZHMgSmVsbHlUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oIHN1aXRlKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3JlYXRlVGVzdFN1aXRlKFRlc3RKZWxseS5jbGFzcywgInN1aXRlLmplbGx5Iik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL1Rlc3RQYXJzZXIuamF2YSBiL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9UZXN0UGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMDBjNjguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL1Rlc3RQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MueG1sOwotCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5TY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLlNjcmlwdEJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLlRhZ1NjcmlwdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkucGFyc2VyLlhNTFBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqIFRlc3RzIHRoZSBjb3JlIHRhZ3MKLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNiAkCi0gICovCi1wdWJsaWMgY2xhc3MgVGVzdFBhcnNlciBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUZXN0UGFyc2VyLmNsYXNzKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShUZXN0UGFyc2VyLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdFBhcnNlcihTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgcGFyc2luZyBhbiBleGFtcGxlIHNjcmlwdCBjb3JyZWN0bHkgY3JlYXRlcyB0aGUgcGFyZW50Ci0gICAgICogcmVsYXRpb25zaGlwcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKCJzcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvZXhhbXBsZTIuamVsbHkiKTsKLSAgICAgICAgWE1MUGFyc2VyIHBhcnNlciA9IG5ldyBYTUxQYXJzZXIoKTsKLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IHBhcnNlci5wYXJzZShpbik7Ci0gICAgICAgIHNjcmlwdCA9IHNjcmlwdC5jb21waWxlKCk7Ci0KLSAgICAgICAgbG9nLmRlYnVnKCJGb3VuZDogIiArIHNjcmlwdCk7Ci0KLSAgICAgICAgYXNzZXJ0VGFnc0hhdmVQYXJlbnQoIHNjcmlwdCwgbnVsbCwgbnVsbCApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgdGhlIFRhZyBpbiB0aGUgVGFnU2NyaXB0IGhhcyB0aGUgZ2l2ZW4gcGFyZW50IGFuZCB0aGVuCi0gICAgICogcmVjdXJzZSB0byBjaGVjayBpdHMgY2hpbGRyZW4gaGFzIHRoZSBjb3JyZWN0IHBhcmVudCBhbmQgc28gZm9ydGguCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0VGFnc0hhdmVQYXJlbnQoU2NyaXB0IHNjcmlwdCwgVGFnIHBhcmVudCwgSmVsbHlDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIGNvbnRleHQgPT0gbnVsbCApCi0gICAgICAgICAgICBjb250ZXh0ID0gbmV3IEplbGx5Q29udGV4dCgpOwotICAgICAgICBpZiAoIHNjcmlwdCBpbnN0YW5jZW9mIFRhZ1NjcmlwdCApIHsKLSAgICAgICAgICAgIFRhZ1NjcmlwdCB0YWdTY3JpcHQgPSAoVGFnU2NyaXB0KSBzY3JpcHQ7Ci0gICAgICAgICAgICBUYWcgdGFnID0gdGFnU2NyaXB0LmdldFRhZyhjb250ZXh0KTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCAiVGFnOiAiICsgdGFnICsgIiBoYXMgdGhlIGluY29ycmVjdCBwYXJlbnQiLCBwYXJlbnQsIHRhZy5nZXRQYXJlbnQoKSApOwotCi0gICAgICAgICAgICBhc3NlcnRUYWdzSGF2ZVBhcmVudCggdGFnLmdldEJvZHkoKSwgdGFnLCBjb250ZXh0ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHNjcmlwdCBpbnN0YW5jZW9mIFNjcmlwdEJsb2NrICkgewotICAgICAgICAgICAgU2NyaXB0QmxvY2sgYmxvY2sgPSAoU2NyaXB0QmxvY2spIHNjcmlwdDsKLSAgICAgICAgICAgIGZvciAoIEl0ZXJhdG9yIGl0ZXIgPSBibG9jay5nZXRTY3JpcHRMaXN0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgICAgIGFzc2VydFRhZ3NIYXZlUGFyZW50KCAoU2NyaXB0KSBpdGVyLm5leHQoKSwgcGFyZW50LCBjb250ZXh0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL1Rlc3RYTUxUYWdzLmphdmEgYi9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvVGVzdFhNTFRhZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmYWRiMS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvVGVzdFhNTFRhZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuU2NyaXB0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnBhcnNlci5YTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmRvbTRqLkRvY3VtZW50OwotaW1wb3J0IG9yZy5kb200ai5Eb2N1bWVudEhlbHBlcjsKLWltcG9ydCBvcmcuZG9tNGouTm9kZTsKLQotLyoqIFRlc3RzIHRoZSBwYXJzZXIsIHRoZSBlbmdpbmUgYW5kIHRoZSBYTUwgdGFncwotICAqCi0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBUZXN0WE1MVGFncyBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUZXN0WE1MVGFncy5jbGFzcyk7Ci0KLSAgICAvKiogYmFzZWRpciBmb3IgdGVzdCBzb3VyY2UgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdGVzdEJhc2VEaXIgPSJzcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwiOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3RYTUxUYWdzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdFhNTFRhZ3MoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pdFRlc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJ1blVuaXRUZXN0KCB0ZXN0QmFzZURpciArICIvdGVzdEZvckVhY2guamVsbHkiICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4cHJlc3Npb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJ1blVuaXRUZXN0KCB0ZXN0QmFzZURpciArICIvdGVzdEV4cHJlc3Npb25zLmplbGx5Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0ZXN0QmFzZURpciArICIvZXhhbXBsZS5qZWxseSIpOwotICAgICAgICBYTUxQYXJzZXIgcGFyc2VyID0gbmV3IFhNTFBhcnNlcigpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gcGFyc2VyLnBhcnNlKGluKTsKLSAgICAgICAgc2NyaXB0ID0gc2NyaXB0LmNvbXBpbGUoKTsKLSAgICAgICAgbG9nLmRlYnVnKCJGb3VuZDogIiArIHNjcmlwdCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlBhcnNlZCBhIFNjcmlwdCIsIHNjcmlwdCBpbnN0YW5jZW9mIFNjcmlwdCk7Ci0gICAgICAgIFN0cmluZ1dyaXRlciBidWZmZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIHNjcmlwdC5ydW4ocGFyc2VyLmdldENvbnRleHQoKSwgWE1MT3V0cHV0LmNyZWF0ZVhNTE91dHB1dChidWZmZXIpKTsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBidWZmZXIudG9TdHJpbmcoKS50cmltKCk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJFdmFsdWF0ZWQgc2NyaXB0IGFzLi4uIik7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9kdWNlcyB0aGUgY29ycmVjdCBvdXRwdXQiLCAiSXQgd29ya3MhIiwgdGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRyYW5zZm9ybSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdGV4dCA9IGV2YWx1dGVTY3JpcHRBc1RleHQodGVzdEJhc2VEaXIgKyAiL3RyYW5zZm9ybUV4YW1wbGUuamVsbHkiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9kdWNlcyB0aGUgY29ycmVjdCBvdXRwdXQiLCAiSXQgd29ya3MhIiwgdGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRyYW5zZm9ybUFsbEluTGluZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdGV4dCA9IGV2YWx1dGVTY3JpcHRBc1RleHQodGVzdEJhc2VEaXIgKyAiL3RyYW5zZm9ybUV4YW1wbGVBbGxJbkxpbmUuamVsbHkiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9kdWNlcyB0aGUgY29ycmVjdCBvdXRwdXQiLCAiSXQgd29ya3MhIiwgdGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRyYW5zZm9ybVBhcmFtcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdGV4dCA9IGV2YWx1dGVTY3JpcHRBc1RleHQodGVzdEJhc2VEaXIgKyAiL3RyYW5zZm9ybVBhcmFtRXhhbXBsZS5qZWxseSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlByb2R1Y2VzIHRoZSBjb3JyZWN0IG91dHB1dCIsICJJdCB3b3JrcyEiLCB0ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmb3JtUGFyYW1zSW5MaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIHRleHQgPSBldmFsdXRlU2NyaXB0QXNUZXh0KHRlc3RCYXNlRGlyICsgIi90cmFuc2Zvcm1QYXJhbUV4YW1wbGUyLmplbGx5Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUHJvZHVjZXMgdGhlIGNvcnJlY3Qgb3V0cHV0IiwgIkl0IHdvcmtzISIsIHRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2Zvcm1TQVhPdXRwdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBldmFsdXRlU2NyaXB0QXNUZXh0KHRlc3RCYXNlRGlyICsgIi90cmFuc2Zvcm1FeGFtcGxlU0FYT3V0cHV0LmplbGx5Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUHJvZHVjZXMgdGhlIGNvcnJlY3Qgb3V0cHV0IiwgIkl0IHdvcmtzISIsIHRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2Zvcm1TQVhPdXRwdXROZXN0ZWRUcmFuc2Zvcm1zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gZXZhbHV0ZVNjcmlwdEFzVGV4dCh0ZXN0QmFzZURpciArCi0gICAgICAgICAgICAiL3RyYW5zZm9ybUV4YW1wbGVTQVhPdXRwdXROZXN0ZWRUcmFuc2Zvcm1zLmplbGx5Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUHJvZHVjZXMgdGhlIGNvcnJlY3Qgb3V0cHV0IiwgIkl0IHdvcmtzISIsIHRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2Zvcm1TY2hlbWF0cm9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gZXZhbHV0ZVNjcmlwdEFzVGV4dCh0ZXN0QmFzZURpciArCi0gICAgICAgICAgICAiL3NjaGVtYXRyb24vdHJhbnNmb3JtU2NoZW1hdHJvbkV4YW1wbGUuamVsbHkiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9kdWNlcyB0aGUgY29ycmVjdCBvdXRwdXQiLCAiUmVwb3J0IGNvdW50PTE6YXNzZXJ0IGNvdW50PTIiLCB0ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmb3JtWG1sVmFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gZXZhbHV0ZVNjcmlwdEFzVGV4dCh0ZXN0QmFzZURpciArCi0gICAgICAgICAgICAiL3RyYW5zZm9ybUV4YW1wbGVYbWxWYXIuamVsbHkiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9kdWNlcyB0aGUgY29ycmVjdCBvdXRwdXQiLCAiSXQgd29ya3MhIiwgdGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERvY3R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBldmFsdXRlU2NyaXB0QXNUZXh0KHRlc3RCYXNlRGlyICsKLSAgICAgICAgICAgICIvdGVzdERvY3R5cGUuamVsbHkiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9kdWNlcyB0aGUgY29ycmVjdCBvdXRwdXQiLCAiPCFET0NUWVBFIGZvbyBQVUJMSUMgXCJwdWJsaWNJRFwiIFwiZm9vLmR0ZFwiPlxuPGZvbz48L2Zvbz4iLCB0ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW5Vbml0VGVzdChTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gcGFyc2VVbml0VGVzdChuYW1lKTsKLQotICAgICAgICBMaXN0IGZhaWx1cmVzID0gZG9jdW1lbnQuc2VsZWN0Tm9kZXMoICIvKi9mYWlsIiApOwotICAgICAgICBmb3IgKCBJdGVyYXRvciBpdGVyID0gZmFpbHVyZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgZmFpbCggbm9kZS5nZXRTdHJpbmdWYWx1ZSgpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnQgcGFyc2VVbml0VGVzdChTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHBhcnNlIHNjcmlwdAotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmFtZSk7Ci0gICAgICAgIFhNTFBhcnNlciBwYXJzZXIgPSBuZXcgWE1MUGFyc2VyKCk7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBwYXJzZXIucGFyc2UoaW4pOwotICAgICAgICBzY3JpcHQgPSBzY3JpcHQuY29tcGlsZSgpOwotICAgICAgICBhc3NlcnRUcnVlKCJQYXJzZWQgYSBTY3JpcHQiLCBzY3JpcHQgaW5zdGFuY2VvZiBTY3JpcHQpOwotICAgICAgICBTdHJpbmdXcml0ZXIgYnVmZmVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBzY3JpcHQucnVuKHBhcnNlci5nZXRDb250ZXh0KCksIFhNTE91dHB1dC5jcmVhdGVYTUxPdXRwdXQoYnVmZmVyKSk7Ci0KLSAgICAgICAgU3RyaW5nIHRleHQgPSBidWZmZXIudG9TdHJpbmcoKS50cmltKCk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJFdmFsdWF0ZWQgc2NyaXB0IGFzLi4uIik7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3cgbGV0cyBwYXJzZSB0aGUgb3V0cHV0Ci0gICAgICAgIHJldHVybiBEb2N1bWVudEhlbHBlci5wYXJzZVRleHQoIHRleHQgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFdmFsdWF0ZXMgdGhlIHNjcmlwdCBieSB0aGUgZ2l2ZW4gZmlsZSBuYW1lIGFuZAotICAgICAqIHJldHVybnMgdGhlIHdoaXRlc3BhY2UgdHJpbW1lZCBvdXRwdXQgYXMgdGV4dAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZXZhbHV0ZVNjcmlwdEFzVGV4dChTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBKZWxseUNvbnRleHQgY29udGV4dCA9IG5ldyBKZWxseUNvbnRleHQoKTsKLQotICAgICAgICAvLyBhbGxvdyBzY3JpcHRzIHRvIHJlZmVyIHRvIGFueSByZXNvdXJjZSBpbnNpZGUgdGhpcyBwcm9qZWN0Ci0gICAgICAgIC8vIHVzaW5nIGFuIGFic29sdXRlIFVSSSBsaWtlIC9zcmMvdGVzdC9vcmcvYXBhY2hlL2Zvby54bWwKLSAgICAgICAgY29udGV4dC5zZXRSb290VVJMKG5ldyBGaWxlKCIuIikudG9VUkwoKSk7Ci0KLSAgICAgICAgLy8gY2F0dXJlIHRoZSBvdXRwdXQKLSAgICAgICAgU3RyaW5nV3JpdGVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgWE1MT3V0cHV0IG91dHB1dCA9IFhNTE91dHB1dC5jcmVhdGVYTUxPdXRwdXQoYnVmZmVyKTsKLQotICAgICAgICBjb250ZXh0LnJ1blNjcmlwdCggbmV3IEZpbGUoZmlsZU5hbWUpLCBvdXRwdXQgKTsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBidWZmZXIudG9TdHJpbmcoKS50cmltKCk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJFdmFsdWF0ZWQgc2NyaXB0IGFzLi4uIik7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL2JldHdpeHQvaW5wdXQueG1sIGIvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL2JldHdpeHQvaW5wdXQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2YwNjI0Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9iZXR3aXh0L2lucHV0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08dHJhbnNhY3Rpb25CZWFuCi0gIGNsYXNzTmFtZT0ib3JnLnplbnBsZXgudGFtYm9yYS50cmFuc2FjdGlvbi5QTyIKLSAgcHJpbWl0aXZlVHlwZXM9ImF0dHJpYnV0ZXMiCi0gIHJvb3ROYW1lPSJQTyI+Ci0KLSAgPGZpZWxkcz4KLSAgICA8ZmllbGQgbmFtZT0iaWQiIHR5cGU9ImludCIvPgotICAgIDxmaWVsZCBuYW1lPSJuYW1lIiB0eXBlPSJTdHJpbmciLz4KLSAgPC9maWVsZHM+Ci08L3RyYW5zYWN0aW9uQmVhbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvYmV0d2l4dC9tYWtlQmV0d2l4dC5qZWxseSBiL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9iZXR3aXh0L21ha2VCZXR3aXh0LmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2NiMGM2Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9iZXR3aXh0L21ha2VCZXR3aXh0LmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiIHhtbG5zOng9ImplbGx5OnhtbCI+Ci0KLTx4OnBhcnNlIHhtbD0iJHtpbnB1dEZpbGV9IiB2YXI9ImRvYyIvPgotPHg6c2V0IHZhcj0icm9vdEVsZW1lbnROYW1lIiBzZWxlY3Q9InN0cmluZygkZG9jL3RyYW5zYWN0aW9uQmVhbi9Acm9vdE5hbWUpIi8+Ci0KLTxpbmZvIHByaW1pdGl2ZVR5cGVzPSJlbGVtZW50Ij4KLSAgPGVsZW1lbnQgbmFtZT0iJHtyb290RWxlbWVudE5hbWV9Ij4KLSAgICA8eDpmb3JFYWNoIHNlbGVjdD0iJGRvYy90cmFuc2FjdGlvbkJlYW4vZmllbGRzL2ZpZWxkIj4KLSAgICAgIDx4OnNldCB2YXI9ImZpZWxkTmFtZSIgc2VsZWN0PSJzdHJpbmcoQG5hbWUpIi8+Ci0gICAgICA8eDpzZXQgdmFyPSJmaWVsZFR5cGUiIHNlbGVjdD0ic3RyaW5nKEB0eXBlKSIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iJHtmaWVsZE5hbWV9IiBwcm9wZXJ0eT0iJHtmaWVsZE5hbWV9Ii8+Ci0gICAgPC94OmZvckVhY2g+Ci0gIDwvZWxlbWVudD4KLTwvaW5mbz4KLTwvajpqZWxseT4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9kdW1teS54bWwgYi9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvZHVtbXkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmNhMDA1Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9kdW1teS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGR1bW15PgotICA8ZW50cnkgaWQ9IjEiPlRoaXMgaXMgc29tZSBzYW1wbGUgWE1MPC9lbnRyeT4KLSAgPGVudHJ5IGlkPSIyIj5BbmQgc29tZSBtb3JlIFhNTDwvZW50cnk+Ci0gIDxlbXB0eS8+Ci08L2R1bW15PiAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL2VudGl0eS54bWwgYi9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvZW50aXR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA5NDQ3OC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvZW50aXR5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgYSBbCi08IUVOVElUWSB4ICJ5Ij4KLV0+Ci08YT4meDs8L2E+IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9leGFtcGxlLmplbGx5IGIvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL2V4YW1wbGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MjlkNzguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL2V4YW1wbGUuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM6eD0iamVsbHk6eG1sIj4KLQotICA8eDpwYXJzZSB2YXI9ImRvYyI+Ci0gICAgPGh0bWw+Ci0gICAgICA8dGl0bGU+SXQgd29ya3MhPC90aXRsZT4KLSAgICAgIDxib2R5PgotICAgICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLSAgPC94OnBhcnNlPgotCi0gIDx4OmV4cHIgc2VsZWN0PSIkZG9jL2h0bWwvdGl0bGUiLz4KLQotPC9qOmplbGx5PgotCi0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9leGFtcGxlMi5qZWxseSBiL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9leGFtcGxlMi5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0NmJmMC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvZXhhbXBsZTIuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0NCi0gISBGSVhNRTogTW92ZSB0aGlzIHRvIHhtbCB0YWdsaWINCi0gIS0tPg0KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiIHhtbG5zOng9ImplbGx5OnhtbCI+DQotDQotICA8eDpwYXJzZSB2YXI9ImRvYyI+DQotICAgIDx3ZWItYXBwPg0KLSAgICAgIDxzZXJ2bGV0Pg0KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5zbm9vcDwvc2VydmxldC1uYW1lPg0KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+U25vb3BTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPg0KLSAgICAgIDwvc2VydmxldD4NCi0gICAgICA8c2VydmxldD4NCi0gICAgICAgIDxzZXJ2bGV0LW5hbWU+ZmlsZTwvc2VydmxldC1uYW1lPg0KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+Vmlld0ZpbGU8L3NlcnZsZXQtY2xhc3M+DQotICAgICAgICA8aW5pdC1wYXJhbT4NCi0gICAgICAgICAgPHBhcmFtLW5hbWU+aW5pdGlhbDwvcGFyYW0tbmFtZT4NCi0gICAgICAgICAgPHBhcmFtLXZhbHVlPjEwMDA8L3BhcmFtLXZhbHVlPg0KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgVGhlIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBjb3VudGVyICA8IS0tIG9wdGlvbmFsIC0tPg0KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPC9pbml0LXBhcmFtPg0KLSAgICAgIDwvc2VydmxldD4NCi0gICAgICA8c2VydmxldC1tYXBwaW5nPg0KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5zbm9vcDwvc2VydmxldC1uYW1lPg0KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9mb28vc25vb3A8L3VybC1wYXR0ZXJuPg0KLSAgICAgIDwvc2VydmxldC1tYXBwaW5nPg0KLSAgICA8L3dlYi1hcHA+DQotICA8L3g6cGFyc2U+DQotDQotICA8eDpzZXQgdmFyPSJjb3VudCIgc2VsZWN0PSJjb3VudCgkZG9jLy9zZXJ2bGV0KSIvPg0KLSAgPHg6Zm9yRWFjaCB2YXI9InMiIHNlbGVjdD0iJGRvYy8vc2VydmxldCI+DQotICAgIG5hbWU6IDx4OmV4cHIgc2VsZWN0PSIkcy9zZXJ2bGV0LW5hbWUiLz4NCi0gICAgY2xhc3M6IDx4OmV4cHIgc2VsZWN0PSIkcy9zZXJ2bGV0LWNsYXNzIi8+DQotICA8L3g6Zm9yRWFjaD4NCi0NCi0gIFRoZXJlIGFyZSA8eDpleHByIHNlbGVjdD0iJGNvdW50Ii8+IHNlcnZsZXQocykNCi0NCi08L2o6amVsbHk+DQotDQotDQotDQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL2ZpbGVzZXRFeGFtcGxlLmplbGx5IGIvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL2ZpbGVzZXRFeGFtcGxlLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODkyZGQ2Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9maWxlc2V0RXhhbXBsZS5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM6eD0iamVsbHk6eG1sIiB4bWxucz0iamVsbHk6YW50Ij4NCi0NCi0gICAgPGZpbGVTY2FubmVyIHZhcj0ic2Nhbm5lciI+DQotICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS94bWwiIGluY2x1ZGVzPSIqKi8qLnhtbCIvPg0KLSAgICA8L2ZpbGVTY2FubmVyPg0KLSAgICANCi0gICAgPGo6Zm9yRWFjaCB2YXI9ImZpbGUiIGl0ZW1zPSIke3NjYW5uZXIuaXRlcmF0b3IoKX0iPg0KLSAgICAgICAgPGo6c2V0IHZhcj0iZmlsZUZ1bGxOYW1lIiB2YWx1ZT0iJHtmaWxlLm5hbWV9Ii8+DQotICAgICAgICA8ajpzZXQgdmFyPSJmaWxlTmFtZSIgdmFsdWU9IiR7ZmlsZUZ1bGxOYW1lLnN1YnN0cmluZygwLCBmaWxlRnVsbE5hbWUubGVuZ3RoKCkgLSA0KX0iLz4NCi0gICAgICAgIEFib3V0IHRvIHByb2Nlc3MgZmlsZSAke2ZpbGV9IGFuZCBnZW5lcmF0ZSBmaWxlIG5hbWUgJHtmaWxlTmFtZX0uaHRtbA0KLQ0KLSAgICAgICAgPGo6ZmlsZSBuYW1lPSJ0YXJnZXQvJHtmaWxlTmFtZX0uaHRtbCI+DQotICAgICAgICAgICAgPHg6dHJhbnNmb3JtIHhtbD0iJHtmaWxlfSIgeHNsdD0idHJhbnNmb3JtRXhhbXBsZS54c2wiPg0KLSAgICAgICAgICAgICAgICA8eDpwYXJhbSBuYW1lPSJmaWxlbmFtZSIgdmFsdWU9IiR7ZmlsZS5jYW5vbmljYWxQYXRofSIvPg0KLSAgICAgICAgICAgIDwveDp0cmFuc2Zvcm0+DQotICAgICAgICA8L2o6ZmlsZT4NCi0gICAgPC9qOmZvckVhY2g+DQotDQotPC9qOmplbGx5Pg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9zY2hlbWF0cm9uL3NjaGVtYXRyb24td3JhcHBlci54c2wgYi9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvc2NoZW1hdHJvbi9zY2hlbWF0cm9uLXdyYXBwZXIueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDVjMjRjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9zY2hlbWF0cm9uL3NjaGVtYXRyb24td3JhcHBlci54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotCi0gICAgICA8IS0tIGltcG9ydCB0aGUgYmFzaWMgZnJhbWV3b3JrIC0tPgotICAgICAgPHhzbDppbXBvcnQgaHJlZj0ic2tlbGV0b24xLTUueHNsIi8+Ci0KLSAgICAgIDwhLS0gb3ZlcnJpZGUgdGhlIHByb2Nlc3Mtcm9vdCB0ZW1wbGF0ZSBhbmQgd3JhcCBvdXRwdXQgYXMgSFRNTCAtLT4KLSAgICAgIDwhLS14c2w6dGVtcGxhdGUgbmFtZT0icHJvY2Vzcy1yb290Ij4KLSAgICAgICAgIDx4c2w6cGFyYW0gbmFtZT0idGl0bGUiLz4KLSAgICAgICAgIDx4c2w6cGFyYW0gbmFtZT0iY29udGVudHMiIC8+Ci0gICAgICAgICA8aHRtbD4KLSAgICAgICAgICAgIDxoZWFkPjx0aXRsZT5WYWxpZGF0aW9uIFJlcG9ydCBGb3I6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L3RpdGxlPjwvaGVhZD4KLSAgICAgICAgICAgIDxib2R5PgotICAgICAgICAgICAgPGgxPlZhbGlkYXRpb24gUmVwb3J0IEZvciA6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L2gxPgotCi0gICAgICAgICAgICA8cHJlPgotICAgICAgICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iJGNvbnRlbnRzIiAvPgotICAgICAgICAgICAgPC9wcmU+Ci0KLSAgICAgICAgICAgIDwvYm9keT4KLSAgICAgICAgIDwvaHRtbD4KLSAgICAgIDwveHNsOnRlbXBsYXRlLS0+Ci0KLSAgICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0icHJvY2Vzcy1yb290Ij4KLSAgICAgICAgIDx4c2w6cGFyYW0gbmFtZT0idGl0bGUiLz4KLSAgICAgICAgIDx4c2w6cGFyYW0gbmFtZT0iY29udGVudHMiIC8+Ci0gICAgICAgICA8c2NoZW1hdHJvbi12YWxpZGF0aW9uPlZhbGlkYXRpb24gUmVwb3J0IEZvcjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPgotICAgICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iJGNvbnRlbnRzIiAvPgotICAgICAgICAgPC9zY2hlbWF0cm9uLXZhbGlkYXRpb24+Ci0gICAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgICAgPCEtLSBvdmVycmlkZSBhZGRpdGlvbmFsIHRlbXBsYXRlcyBhcyBuZWVkZWQgLS0+Ci0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9jZXNzLWFzc2VydCI+Ci0gICAgICAgIDx4c2w6cGFyYW0gbmFtZT0icm9sZSIvPgotICAgICAgICA8eHNsOnBhcmFtIG5hbWU9ImlkIi8+Ci0gICAgICAgIDx4c2w6cGFyYW0gbmFtZT0idGVzdCIvPgotICAgICAgICA8eHNsOnBhcmFtIG5hbWU9InN1YmplY3QiLz4KLSAgICAgICAgPHhzbDpwYXJhbSBuYW1lPSJkaWFnbm9zdGljcyIvPgotICAgICAgICA8IS0tIHVudXNlZCBwYXJhbWV0ZXJzOiBpY29uIC0tPgotICAgICAgICA8YXNzZXJ0PgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkcm9sZSI+Ci0gICAgICAgICAgICAgICAgPHJvbGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlIiAvPjwvcm9sZT4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkaWQiPgotICAgICAgICAgICAgICAgIDxpZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJvbGUiIC8+PC9pZD4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHRlc3Q+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZXN0IiAvPjwvdGVzdD4KLSAgICAgICAgICAgIDxyZXN1bHQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgbW9kZT0idGV4dCIgLz48L3Jlc3VsdD4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJHN1YmplY3QiPgotICAgICAgICAgICAgICAgIDxzdWJqZWN0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3ViamVjdCIgLz48L3N1YmplY3Q+Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGRpYWdub3N0aWNzIj4KLSAgICAgICAgICAgICAgICA8ZGlhZ25vc3RpY3M+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaWFnbm9zdGljc1NwbGl0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHIiIHNlbGVjdD0iJGRpYWdub3N0aWNzIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgICAgICAgICAgIDwvZGlhZ25vc3RpY3M+Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgPC9hc3NlcnQ+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICAgIDwhLS0gb3ZlcnJpZGUgYWRkaXRpb25hbCB0ZW1wbGF0ZXMgYXMgbmVlZGVkIC0tPgotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0icHJvY2Vzcy1yZXBvcnQiPgotICAgICAgICA8eHNsOnBhcmFtIG5hbWU9InJvbGUiLz4KLSAgICAgICAgPHhzbDpwYXJhbSBuYW1lPSJ0ZXN0Ii8+Ci0gICAgICAgIDx4c2w6cGFyYW0gbmFtZT0iaWQiLz4KLSAgICAgICAgPHhzbDpwYXJhbSBuYW1lPSJzdWJqZWN0Ii8+Ci0gICAgICAgIDx4c2w6cGFyYW0gbmFtZT0iZGlhZ25vc3RpY3MiLz4KLSAgICAgICAgPCEtLSB1bnVzZWQgcGFyYW1ldGVyczogaWNvbiAtLT4KLSAgICAgICAgPHJlcG9ydD4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJHJvbGUiPgotICAgICAgICAgICAgICAgIDxyb2xlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZSIgLz48L3JvbGU+Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGlkIj4KLSAgICAgICAgICAgICAgICA8aWQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlIiAvPjwvaWQ+Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDx0ZXN0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVzdCIgLz48L3Rlc3Q+Ci0gICAgICAgICAgICA8cmVzdWx0Pjx4c2w6YXBwbHktdGVtcGxhdGVzIG1vZGU9InRleHQiIC8+PC9yZXN1bHQ+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRzdWJqZWN0Ij4KLSAgICAgICAgICAgICAgICA8c3ViamVjdD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN1YmplY3QiIC8+PC9zdWJqZWN0PgotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRkaWFnbm9zdGljcyI+Ci0gICAgICAgICAgICAgICAgPGRpYWdub3N0aWNzPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlhZ25vc3RpY3NTcGxpdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3RyIiBzZWxlY3Q9IiRkaWFnbm9zdGljcyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgICAgICAgICA8L2RpYWdub3N0aWNzPgotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgIDwvcmVwb3J0PgotICAgIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvc2NoZW1hdHJvbi9za2VsZXRvbjEtNS54c2wgYi9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvc2NoZW1hdHJvbi9za2VsZXRvbjEtNS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZTU0ZTUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3NjaGVtYXRyb24vc2tlbGV0b24xLTUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLSBCZXRhIFNrZWxldG9uIE1vZHVsZSBmb3IgdGhlIFNjaGVtYXRyb24gMS41IFhNTCBTY2hlbWEgTGFuZ3VhZ2UuCi0JaHR0cDovL3d3dy5hc2NjLm5ldC94bWwvc2NoZW1hdHJvbi8KLSAKLSBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMSBSaWNrIEplbGxpZmZlIGFuZCBBY2FkZW1pYSBTaW5pY2EgQ29tcHV0aW5nIENlbnRlciwgVGFpd2FuCi0KLSBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4gCi0gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBmcm9tIAotIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLQotIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLCAKLSBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0IGZyZWVseSwKLSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QgY2xhaW0KLSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZSBpbiBhIHByb2R1Y3QsIAotIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUgYXBwcmVjaWF0ZWQgYnV0IGlzIAotIG5vdCByZXF1aXJlZC4KLQotIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlIAotIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLQotIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0tLT4KLTwhLS0gCi0gICAgVmVyc2lvbjogMjAwMS0wNi0xMgotICAgICAgICAgICAqIHNhbWUgc2tlbGV0b24gbm93IHN1cHBvcnRzIG5hbWVzcGFjZSBvciBubyBuYW1lc3BhY2UKLSAgICAgICAgICAgKiBwYXJhbWV0ZXJzIHRvIGhhbmRsZXJzIHVwZGF0ZWQgZm9yIGFsbCAxLjUgYXR0cmlidXRlcyAKLSAgICAgICAgICAgKiBkaWFnbm9zdGljIGhpbnRzIHN1cHBvcnRlZDogY29tbWFuZC1saW5lIG9wdGlvbiBkaWFnbm9zZT15ZXN8bm8KLSAgICAgICAgICAgKiBwaGFzZXMgc3VwcG9ydGVkOiBjb21tYW5kLWxpbmUgb3B0aW9uIHBoYXNlPSNBTEx8Li4uCi0gICAgICAgICAgICogYWJzdHJhY3QgcnVsZXMKLSAgICAgICAgICAgKiBjb21waWxlLXRpbWUgZXJyb3IgbWVzc2FnZXMKLSAgICAgICAgICAgKiAxLjYgZmVhdHVyZTogQG1hdGNoIG9uIHNjaDprZXkgIAotICAgICAgICAgIAotICAgIENvbnRyaWJ1dG9yczogUmljayBKZWxsaWZmZSAob3JpZ2luYWwpLCBPbGl2ZXIgQmVja2VyIChhcmNoaXRlY3R1cmUpLCAKLSAgICAgICAgICAgICBNaWxvc2xhdiBOaWMgKGRpYWdub3N0aWMsIHBoYXNlLCBvcHRpb25zKSwgTHVkd2lnIFN2ZW5vbml1cyAoYWJzdHJhY3QpCi0gICAgICAgICAgICAgVWNoZSBPZ2J1amkgKG1pc2MuIGJ1ZyBmaXhlcyksIEppbSBBbmNvbmEgKFNBWE9OIHdvcmthcm91bmQpLAotICAgICAgICAgICAgIEVkZGllIFJvYmVydHNzb24gKG1pc2MuIGJ1ZyBmaXhlcykKLQotICAgIFhTTFQgdmVyc2lvbnMgdGVzdGVkIGFuZCB3b3JraW5nIGFzLWlzOiAKLSAgICAgICAgICAgKiBNUyBYTUwgMwotICAgICAgICAgICAqIE9yYWNsZSAKLSAgICAgICAgICAgKiBTQVhPTiArIEluc3RhbnQgU2F4b24gIAotICAgICAgICAgICAqIFhUIG4uYi4ga2V5KCkgbm90IGF2YWlsYWJsZSwgd2lsbCBkaWUKLQotICAgWFNMVCB2ZXJzaW9uIHJlbGlhYmx5IHJlcG9ydGVkIHdvcmtpbmcKLSAgICAgICAgICAgKiAgRm91clRob3VnaHQncyBQeXRob24gaW1wbGVtZW50YXRpb24KLQotICAgIFhTTFQgdmVyc2lvbnMgdGVzdGVkIGFuZCByZXF1aXJlcyBzbWFsbCB3b3JrYXJvdW5kIGZyb20geW91Ci0gICAgICAgICAgICogU2FibG90cm9uIGRvZXMgbm90IHN1cHBvcnQgaW1wb3J0LCBzbyBtZXJnZSBtZXRhLXN0eWxlc2hlZXRzIGJ5IGhhbmQKLSAgICAgICAgICAgKiBYYWxhbiBmb3IgSmF2YSAyLjAgb3V0cHV0cyB3cm9uZyBuYW1lc3BhY2UgVVJJLCBzbyBhbHRlciBieSBoYW5kIG9yIHNjcmlwdAotICAgICAgICAgICAqIFhhbGFuIGZvciBDIDEuMCBoYXMgcHJvYmxlbSB3aXRoIGtleSwgc28gZWRpdCBieSBoYW5kLiBGaW5kICJLRVkiIGJlbG93ICAKLQotICAgSWYgeW91IGNyZWF0ZSB5b3VyIG93biBtZXRhLXN0eWxlc2hlZXQgdG8gb3ZlcnJpZGUgdGhpcyBvbmUsIGl0IGlzIGEKLSAgIGdvb2QgaWRlYSB0byBoYXZlIGJvdGggaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFuZCB0byBydW4gdGhlIHN0eWxlc2hlZXQKLSAgIGZyb20gdGhhdCBkaXJlY3RvcnksIGFzIG1hbnkgWFNMVCBpbXBsZW1lbnRhdGlvbnMgaGF2ZSBpZGVvc3luY3JhdGljCi0gICBoYW5kbGluZyBvZiBVUkxzOiBrZWVwIGl0IHNpbXBsZS4KLSAgICAgICAgIAotLS0+Ci08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiAKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgCi0JeG1sbnM6YXhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtQWxpYXMiIAotCXhtbG5zOnNjaD0iaHR0cDovL3d3dy5hc2NjLm5ldC94bWwvc2NoZW1hdHJvbiIKLQkgPgotPCEtLSBOb3RlIHRoYXQgdGhpcyBuYW1lc3BhY2UgaXMgbm90IHZlcnNpb24gc3BlY2lmaWMuCi1UaGlzIHByb2dyYW0gaW1wbGVtZW50cyBzY2hlbWF0cm9uIDEuNSB3aXRoIHNvbWUgMS42IGV4dGVuc2lvbnMgLS0+Ci08eHNsOm5hbWVzcGFjZS1hbGlhcyBzdHlsZXNoZWV0LXByZWZpeD0iYXhzbCIgcmVzdWx0LXByZWZpeD0ieHNsIi8+Ci08IS0tIENhdGVnb3J5OiB0b3AtbGV2ZWwtZWxlbWVudCAtLT4KLTx4c2w6b3V0cHV0IG1ldGhvZD0ieG1sIiBvbWl0LXhtbC1kZWNsYXJhdGlvbj0ibm8iIHN0YW5kYWxvbmU9InllcyIgIGluZGVudD0ieWVzIi8+Ci08eHNsOnBhcmFtIG5hbWU9ImJsb2NrIj48L3hzbDpwYXJhbT48IS0tIHJlc2VydmVkIC0tPgotPHhzbDpwYXJhbSBuYW1lPSJwaGFzZSI+Ci0gIDx4c2w6Y2hvb3NlPgotICAgIDx4c2w6d2hlbiB0ZXN0PSIvL3NjaDpzY2hlbWEvQGRlZmF1bHRQaGFzZSI+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLy9zY2g6c2NoZW1hL0BkZWZhdWx0UGhhc2UiLz4KLSAgICA8L3hzbDp3aGVuPgotICAgIDx4c2w6b3RoZXJ3aXNlPiNBTEw8L3hzbDpvdGhlcndpc2U+Ci0gIDwveHNsOmNob29zZT4KLTwveHNsOnBhcmFtPgotPHhzbDpwYXJhbSBuYW1lPSJoaWRkZW5LZXkiPiBrZXkgPC94c2w6cGFyYW0+PCEtLSB3b3JrYXJvdW5kIGZvciBYYWxhbjRKIDIuMCAtLT4KLQotPCEtLSBTQ0hFTUEgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJzY2g6c2NoZW1hIHwgc2NoZW1hIj4KLQk8YXhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCI+Ci0JCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJzY2g6bnMgfCBucyI+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ7Y29uY2F0KEBwcmVmaXgsJzpkdW1teS1mb3IteG1sbnMnKX0iIG5hbWVzcGFjZT0ie0B1cml9Ii8+Ci0JCTwveHNsOmZvci1lYWNoPgotIAotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KHNjaDp0aXRsZS8qIHwgdGl0bGUvKiApIj4KLQkJCTx4c2w6bWVzc2FnZT4KLQkJCQk8eHNsOnRleHQ+V2FybmluZzogPC94c2w6dGV4dD4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSguKSIvPgotCQkJCTx4c2w6dGV4dD4gbXVzdCBub3QgY29udGFpbiBhbnkgY2hpbGQgZWxlbWVudHM8L3hzbDp0ZXh0PgotCQkJPC94c2w6bWVzc2FnZT4KLQkJPC94c2w6aWY+Ci0gCi0JCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9jZXNzLXByb2xvZyIvPgotCQk8IS0tIHV0aWxpdHkgcm91dGluZSBmb3IgaW1wbGVtZW50YXRpb25zIC0tPgotICAgCQk8YXhzbDp0ZW1wbGF0ZSBtYXRjaD0iKnxAKiIgbW9kZT0ic2NoZW1hdHJvbi1nZXQtZnVsbC1wYXRoIj4KLQotCQkJPGF4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icGFyZW50OjoqIiBtb2RlPSJzY2hlbWF0cm9uLWdldC1mdWxsLXBhdGgiLz4KLQkJCTxheHNsOnRleHQ+LzwvYXhzbDp0ZXh0PgotCQkJPGF4c2w6aWYgdGVzdD0iY291bnQoLiB8IC4uL0AqKSA9IGNvdW50KC4uL0AqKSI+QDwvYXhzbDppZj4KLQkJCTxheHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSgpIi8+Ci0JCQk8YXhzbDp0ZXh0Pls8L2F4c2w6dGV4dD4KLQkgIAkJPGF4c2w6dmFsdWUtb2Ygc2VsZWN0PSIxK2NvdW50KHByZWNlZGluZy1zaWJsaW5nOjoqW25hbWUoKT1uYW1lKGN1cnJlbnQoKSldKSIvPgotCSAgCQk8YXhzbDp0ZXh0Pl08L2F4c2w6dGV4dD4KLSAgICAgICAJIAk8L2F4c2w6dGVtcGxhdGU+Ci0KLQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgbW9kZT0iZG8ta2V5cyIgCi0gICAgICAgICAgICAgICAgc2VsZWN0PSJzY2g6cGF0dGVybi9zY2g6cnVsZS9zY2g6a2V5IHwgcGF0dGVybi9ydWxlL2tleSB8IHNjaDprZXkgfCBrZXkgIi8+Ci0KLQotCQk8YXhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvY2Vzcy1yb290Ij4KLQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZnBpIiBzZWxlY3Q9IkBmcGkiLz4KLQkJCQk8eHNsOndpdGgtcGFyYW0gCXhtbG5zOnNjaD0iaHR0cDovL3d3dy5hc2NjLm5ldC94bWwvc2NoZW1hdHJvbiIKLQkJCQluYW1lPSJ0aXRsZSIgc2VsZWN0PSIuL3NjaDp0aXRsZSB8IHRpdGxlIi8+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImlkIiBzZWxlY3Q9IkBpZCIvPgotCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpY29uIiBzZWxlY3Q9IkBpY29uIi8+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImxhbmciIHNlbGVjdD0iQHhtbDpsYW5nIi8+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZlcnNpb24iIHNlbGVjdD0iQHZlcnNpb24iIC8+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNjaGVtYVZlcnNpb24iIHNlbGVjdD0iQHNjaGVtYVZlcnNpb24iIC8+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnRzIj4KLQkJCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgbW9kZT0iZG8tYWxsLXBhdHRlcm5zIi8+Ci0JCQkJPC94c2w6d2l0aC1wYXJhbT4KLQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCTwvYXhzbDp0ZW1wbGF0ZT4KLSAKLQkJPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotCQk8YXhzbDp0ZW1wbGF0ZSBtYXRjaD0idGV4dCgpIiBwcmlvcml0eT0iLTEiPgotCQkJPCEtLSBzdHJpcCBjaGFyYWN0ZXJzIC0tPgotCQk8L2F4c2w6dGVtcGxhdGU+Ci0JPC9heHNsOnN0eWxlc2hlZXQ+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCTwhLS0gQUNUSVZFIC0tPgotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9InNjaDphY3RpdmUgfCBhY3RpdmUiPgotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBwYXR0ZXJuKSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6bWVzc2FnZT5NYXJrdXAgRXJyb3I6IG5vIHBhdHRlcm4gYXR0cmlidXRlIGluICZsdDthY3RpdmU+PC94c2w6bWVzc2FnZT4KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Ii8vc2NoOnJ1bGVbQGlkPSBjdXJyZW50KCkvQHBhdHRlcm5dIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDptZXNzYWdlPlJlZmVyZW5jZSBFcnJvcjogdGhlIHBhdHRlcm4gICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhdHRlcm4iLz4iIGhhcyBiZWVuIGFjdGl2YXRlZCBidXQgaXMgbm90IGRlY2xhcmVkPC94c2w6bWVzc2FnZT4KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgPC94c2w6dGVtcGxhdGU+Ci0KLQk8IS0tIEFTU0VSVCBhbmQgUkVQT1JUIC0tPgotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9InNjaDphc3NlcnQgfCBhc3NlcnQiPgotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEB0ZXN0KSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6bWVzc2FnZT5NYXJrdXAgRXJyb3I6IG5vIHRlc3QgYXR0cmlidXRlIGluICZsdDthc3NlcnQ+PC94c2w6bWVzc2FnZT4KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQkJPGF4c2w6Y2hvb3NlPgotCQkJPGF4c2w6d2hlbiB0ZXN0PSJ7QHRlc3R9Ii8+Ci0JCQk8YXhzbDpvdGhlcndpc2U+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb2Nlc3MtYXNzZXJ0Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJvbGUiIHNlbGVjdD0iQHJvbGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImlkIiBzZWxlY3Q9IkBpZCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idGVzdCIgc2VsZWN0PSJub3JtYWxpemUtc3BhY2UoQHRlc3QpIiAvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iaWNvbiIgc2VsZWN0PSJAaWNvbiIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3ViamVjdCIgc2VsZWN0PSJAc3ViamVjdCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGlhZ25vc3RpY3MiIHNlbGVjdD0iQGRpYWdub3N0aWNzIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4gIAotCQkJPC9heHNsOm90aGVyd2lzZT4KLQkJPC9heHNsOmNob29zZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSJzY2g6cmVwb3J0IHwgcmVwb3J0Ij4KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAdGVzdCkiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm1lc3NhZ2U+TWFya3VwIEVycm9yOiBubyB0ZXN0IGF0dHJpYnV0ZSBpbiAmbHQ7cmVwb3J0PjwveHNsOm1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0JCTxheHNsOmlmIHRlc3Q9IntAdGVzdH0iPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb2Nlc3MtcmVwb3J0Ij4KLQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icm9sZSIgc2VsZWN0PSJAcm9sZSIvPgotCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0ZXN0IiBzZWxlY3Q9Im5vcm1hbGl6ZS1zcGFjZShAdGVzdCkiIC8+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imljb24iIHNlbGVjdD0iQGljb24iLz4KLQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iaWQiIHNlbGVjdD0iQGlkIi8+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN1YmplY3QiIHNlbGVjdD0iQHN1YmplY3QiLz4KLQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGlhZ25vc3RpY3MiIHNlbGVjdD0iQGRpYWdub3N0aWNzIi8+Ci0JCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQk8L2F4c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQotCTwhLS0gRElBR05PU1RJQyAtLT4KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSJzY2g6ZGlhZ25vc3RpYyB8IGRpYWdub3N0aWMiCi0gICAgICAgICAgICAgID48eHNsOmlmIHRlc3Q9Im5vdChAaWQpIgotICAgICAgICAgICAgICAgICAgICA+PHhzbDptZXNzYWdlPk1hcmt1cCBFcnJvcjogbm8gaWQgYXR0cmlidXRlIGluICZsdDtkaWFnbm9zdGljPjwveHNsOm1lc3NhZ2UKLSAgICAgICAgICAgICAgICA+PC94c2w6aWY+PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb2Nlc3MtZGlhZ25vc3RpYyI+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImlkIiBzZWxlY3Q9IkBpZCIgLz4KLSAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwveHNsOnRlbXBsYXRlPgotCi0JPCEtLSBESUFHTk9TVElDUyAtLT4KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSJzY2g6ZGlhZ25vc3RpY3MgfCBkaWFnbm9zdGljcyIvPgotCi0JPCEtLSBESVIgLS0+Ci0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic2NoOmRpciB8IGRpciIgIG1vZGU9InRleHQiCi0JCT48eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvY2Vzcy1kaXIiPgotCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IkB2YWx1ZSIvPgotCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPCEtLSBFTVBIIC0tPgotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9InNjaDplbXBoIHwgZW1waCIgIG1vZGU9InRleHQiCi0JCT48eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvY2Vzcy1lbXBoIi8+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8IS0tIEVYVEVORFMgLS0+Ci0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic2NoOmV4dGVuZHMgfCBleHRlbmRzIj4KLQkJPHhzbDppZiB0ZXN0PSJub3QoQHJ1bGUpIgotICAgICAgICAgICAgICAgICAgICA+PHhzbDptZXNzYWdlPk1hcmt1cCBFcnJvcjogbm8gcnVsZSBhdHRyaWJ1dGUgaW4gJmx0O2V4dGVuZHM+PC94c2w6bWVzc2FnZQotICAgICAgICAgICAgICAgID48L3hzbDppZj4KLSAgICAgCQk8eHNsOmlmIHRlc3Q9Im5vdCgvL3NjaDpydWxlW0BhYnN0cmFjdD0ndHJ1ZSddW0BpZD0gY3VycmVudCgpL0BydWxlXSApCi0gICAgICAgICAgICAgICAgICAgIGFuZCBub3QoLy9ydWxlW0BhYnN0cmFjdD0ndHJ1ZSddW0BpZD0gY3VycmVudCgpL0BydWxlXSkiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm1lc3NhZ2U+UmVmZXJlbmNlIEVycm9yOiB0aGUgYWJzdHJhY3QgcnVsZSAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcnVsZSIvPiIgaGFzIGJlZW4gcmVmZXJlbmNlZCBidXQgaXMgbm90IGRlY2xhcmVkPC94c2w6bWVzc2FnZT4KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQkgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJJYW1FbXB0eSIgLz4KLQotICAJCTx4c2w6aWYgdGVzdD0iLy9zY2g6cnVsZVtAaWQ9Y3VycmVudCgpL0BydWxlXSI+Ci0gICAgCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIvL3NjaDpydWxlW0BpZD1jdXJyZW50KCkvQHJ1bGVdIgotCQkJCW1vZGU9ImV4dGVuZHMiLz4KLSAgCQk8L3hzbDppZj4KLQotCTwveHNsOnRlbXBsYXRlPgotCi0JPCEtLSBLRVkgLS0+Ci0JPCEtLSBkbyB3ZSBuZWVkIHNvbWV0aGluZyB0byB0ZXN0IHVuaXF1ZW5lc3MgdG9vPyAtLT4gCi0JPCEtLSBOT1RFOiBpZiB5b3UgZ2V0IGNvbXBsYWludCBhYm91dCAia2V5IiBoZXJlIChlLmcuIFhhbGFuNEMgMS4wKSByZXBsYWNlCi0JCSJrZXkiIHdpdGggIiRoaWRkZW5LZXkiIC0tPgotCTx4c2w6dGVtcGxhdGUgIG1hdGNoPSJzY2g6a2V5IHwga2V5ICIgbW9kZT0iZG8ta2V5cyIgPgotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBuYW1lKSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6bWVzc2FnZT5NYXJrdXAgRXJyb3I6IG5vIG5hbWUgYXR0cmlidXRlIGluICZsdDtrZXk+PC94c2w6bWVzc2FnZT4KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBtYXRjaCkgYW5kIG5vdCguLi9zY2g6cnVsZSkiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm1lc3NhZ2U+TWFya3VwIEVycm9yOiAgbm8gbWF0Y2ggYXR0cmlidXRlIG9uICZsdDtrZXk+IG91dHNpZGUgJmx0O3J1bGU+PC94c2w6bWVzc2FnZT4KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAcGF0aCkiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm1lc3NhZ2U+TWFya3VwIEVycm9yOiBubyBwYXRoIGF0dHJpYnV0ZSBpbiAmbHQ7a2V5PjwveHNsOm1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0JICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iSWFtRW1wdHkiIC8+Ci0KLSAgICAgICAgICAgICA8eHNsOmNob29zZT4KLQkJCTx4c2w6d2hlbiB0ZXN0PSJAbWF0Y2giPgotCQkJCTxheHNsOmtleSBtYXRjaD0ie0BtYXRjaH0iIG5hbWU9IntAbmFtZX0iIHVzZT0ie0BwYXRofSIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCTxheHNsOmtleSBuYW1lPSJ7QG5hbWV9IiBtYXRjaD0ie3BhcmVudDo6c2NoOnJ1bGUvQGNvbnRleHR9IiB1c2U9IntAcGF0aH0iLz4KLQkJCTwveHNsOm90aGVyd2lzZT4KLQkJPC94c2w6Y2hvb3NlPgotCTwveHNsOnRlbXBsYXRlPgotCi0gICAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzY2g6a2V5IHwga2V5IiAgLz48IS0tIHN3YWxsb3cgLS0+IAotCi0JPCEtLSBOQU1FIC0tPgotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9InNjaDpuYW1lIHwgbmFtZSIgbW9kZT0idGV4dCI+Ci0JCTxheHNsOnRleHQgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+IDwvYXhzbDp0ZXh0PgotCQkJPHhzbDppZiB0ZXN0PSJAcGF0aCIKLQkJCQk+PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb2Nlc3MtbmFtZSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJuYW1lIiBzZWxlY3Q9ImNvbmNhdCgnbmFtZSgnLEBwYXRoLCcpJykiLz4KLQkJCQkJPCEtLSBTQVhPTiBuZWVkcyB0aGF0IGluc3RlYWQgb2YgIHNlbGVjdD0iJ25hbWUoe0BwYXRofSknIiAgLS0+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCTwveHNsOmlmPgotCQkJPHhzbDppZiB0ZXN0PSJub3QoQHBhdGgpIgotCQkJCT48eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvY2Vzcy1uYW1lIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5hbWUiIHNlbGVjdD0iJ25hbWUoLiknIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCTwveHNsOmlmPgotCSAgICAgICAgCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJJYW1FbXB0eSIgLz4KLQkJPGF4c2w6dGV4dCB4bWw6c3BhY2U9InByZXNlcnZlIj4gPC9heHNsOnRleHQ+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8IS0tIE5TIC0tPgotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9InNjaDpucyB8IG5zIiAgbW9kZT0iZG8tYWxsLXBhdHRlcm5zIiA+Ci0gICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAdXJpKSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6bWVzc2FnZT5NYXJrdXAgRXJyb3I6IG5vIHVyaSBhdHRyaWJ1dGUgaW4gJmx0O25zPjwveHNsOm1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAcHJlZml4KSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6bWVzc2FnZT5NYXJrdXAgRXJyb3I6IG5vIHByZWZpeCBhdHRyaWJ1dGUgaW4gJmx0O25zPjwveHNsOm1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0JICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iSWFtRW1wdHkiIC8+Ci0JCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9jZXNzLW5zIiA+Ci0JCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icHJlZml4IiBzZWxlY3Q9IkBwcmVmaXgiLz4KLQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ1cmkiIHNlbGVjdD0iQHVyaSIvPgotCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9InNjaDpucyB8IG5zIiAgLz48IS0tIHN3YWxsb3cgLS0+Ci0KLQk8IS0tIFAgLS0+Ci0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic2NoOnNjaGVtYS9zY2g6cCB8IHNjaGVtYS9wIiBtb2RlPSJkby1zY2hlbWEtcCIgPgotCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvY2Vzcy1wIj4KLQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjbGFzcyIgc2VsZWN0PSJAY2xhc3MiLz4KLQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpY29uIiBzZWxlY3Q9IkBpY29uIi8+Ci0JCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iaWQiIHNlbGVjdD0iQGlkIi8+Ci0JCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ibGFuZyIgc2VsZWN0PSJAeG1sOmxhbmciLz4KLQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSJzY2g6cGF0dGVybi9zY2g6cCB8IHBhdHRlcm4vcCIgbW9kZT0iZG8tcGF0dGVybi1wIiA+Ci0JCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9jZXNzLXAiPgotCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNsYXNzIiBzZWxlY3Q9IkBjbGFzcyIvPgotCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imljb24iIHNlbGVjdD0iQGljb24iLz4KLQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpZCIgc2VsZWN0PSJAaWQiLz4KLQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJsYW5nIiBzZWxlY3Q9IkB4bWw6bGFuZyIvPgotCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9InNjaDpwaGFzZS9zY2g6cCIgLz48IS0tIFdlIGRvbid0IHVzZSB0aGVzZSAtLT4KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSJzY2g6cCB8IHAiIC8+Ci0KLQk8IS0tIFBBVFRFUk4gLS0+Ci0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic2NoOnBhdHRlcm4gfCBwYXR0ZXJuIiBtb2RlPSJkby1hbGwtcGF0dGVybnMiPgotCTx4c2w6aWYgdGVzdD0iKCRwaGFzZSA9ICcjQUxMJykgCi0Jb3IgKC4uL3NjaDpwaGFzZVtAaWQ9ICgkcGhhc2UpXS9zY2g6YWN0aXZlW0BwYXR0ZXJuPSBjdXJyZW50KCkvQGlkXSkKLQlvciAoLi4vcGhhc2VbQGlkPSAoJHBoYXNlKV0vYWN0aXZlW0BpZD0gY3VycmVudCgpL0BpZF0pIj4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb2Nlc3MtcGF0dGVybiI+Ci0JCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ibmFtZSIgc2VsZWN0PSJAbmFtZSIvPgotCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImlkIiBzZWxlY3Q9IkBpZCIvPgotCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNlZSIgc2VsZWN0PSJAc2VlIi8+Ci0JCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZnBpIiBzZWxlY3Q9IkBmcGkiLz4KLQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpY29uIiBzZWxlY3Q9IkBpY29uIi8+Ci0JCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCTxheHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii8iIG1vZGU9Ik17Y291bnQocHJlY2VkaW5nLXNpYmxpbmc6OiopfSIvPgotICAgICAgICA8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSJzY2g6cGF0dGVybiB8IHBhdHRlcm4iPgotICAgICAgICA8eHNsOmlmIHRlc3Q9IigkcGhhc2UgPSAnI0FMTCcpIAotCW9yICguLi9zY2g6cGhhc2VbQGlkPSAoJHBoYXNlKV0vc2NoOmFjdGl2ZVtAcGF0dGVybj0gY3VycmVudCgpL0BpZF0pCi0Jb3IgKC4uL3BoYXNlW0BpZD0gKCRwaGFzZSldL2FjdGl2ZVtAaWQ9IGN1cnJlbnQoKS9AaWRdKSI+Ci0JCTx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLQkJPGF4c2w6dGVtcGxhdGUgbWF0Y2g9InRleHQoKSIgcHJpb3JpdHk9Ii0xIiBtb2RlPSJNe2NvdW50KHByZWNlZGluZy1zaWJsaW5nOjoqKX0iPgotCQkJPCEtLSBzdHJpcCBjaGFyYWN0ZXJzIC0tPgotCQk8L2F4c2w6dGVtcGxhdGU+Ci0gICAgICAgIDwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPCEtLSBQSEFTRSAtLT4KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSJzY2g6cGhhc2UgfCBwaGFzZSIgPgotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBpZCkiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm1lc3NhZ2U+TWFya3VwIEVycm9yOiBubyBpZCBhdHRyaWJ1dGUgaW4gJmx0O3BoYXNlPjwveHNsOm1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8IS0tIFJVTEUgLS0+Ci0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic2NoOnJ1bGVbbm90KEBhYnN0cmFjdD0ndHJ1ZScpXSB8IHJ1bGVbbm90KEBhYnN0cmFjdD0ndHJ1ZScpXSI+Ci0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQGNvbnRleHQpIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDptZXNzYWdlPk1hcmt1cCBFcnJvcjogbm8gY29udGV4dCBhdHRyaWJ1dGUgaW4gJmx0O3J1bGU+PC94c2w6bWVzc2FnZT4KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQkJPGF4c2w6dGVtcGxhdGUgbWF0Y2g9IntAY29udGV4dH0iIHByaW9yaXR5PSJ7NDAwMCAtIGNvdW50KHByZWNlZGluZy1zaWJsaW5nOjoqKX0iIG1vZGU9Ik17Y291bnQoLi4vcHJlY2VkaW5nLXNpYmxpbmc6OiopfSI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvY2Vzcy1ydWxlIj4KLQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iaWQiIHNlbGVjdD0iQGlkIi8+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRleHQiIHNlbGVjdD0iQGNvbnRleHQiLz4KLQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icm9sZSIgc2VsZWN0PSJAcm9sZSIvPgotCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLQkJCTxheHNsOmFwcGx5LXRlbXBsYXRlcyBtb2RlPSJNe2NvdW50KC4uL3ByZWNlZGluZy1zaWJsaW5nOjoqKX0iLz4KLQkJPC9heHNsOnRlbXBsYXRlPgotCTwveHNsOnRlbXBsYXRlPgotCi0KLQk8IS0tIEFCU1RSQUNUIFJVTEUgLS0+Ci0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic2NoOnJ1bGVbQGFic3RyYWN0PSd0cnVlJ10gfCBydWxlW0BhYnN0cmFjdD0ndHJ1ZSddIiA+Ci0JCTx4c2w6aWYgdGVzdD0iIG5vdChAaWQpIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDptZXNzYWdlPk1hcmt1cCBFcnJvcjogbm8gaWQgYXR0cmlidXRlIG9uIGFic3RyYWN0ICZsdDtydWxlPjwveHNsOm1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gCQk8eHNsOmlmIHRlc3Q9IkBjb250ZXh0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDptZXNzYWdlPk1hcmt1cCBFcnJvcjogKDIpIGNvbnRleHQgYXR0cmlidXRlIG9uIGFic3RyYWN0ICZsdDtydWxlPjwveHNsOm1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSJzY2g6cnVsZVtAYWJzdHJhY3Q9J3RydWUnXSB8IHJ1bGVbQGFic3RyYWN0PSd0cnVlJ10iCi0JCW1vZGU9ImV4dGVuZHMiID4KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBjb250ZXh0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDptZXNzYWdlPk1hcmt1cCBFcnJvcjogY29udGV4dCBhdHRyaWJ1dGUgb24gYWJzdHJhY3QgJmx0O3J1bGU+PC94c2w6bWVzc2FnZT4KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTwhLS0gU1BBTiAtLT4KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSJzY2g6c3BhbiB8IHNwYW4iIG1vZGU9InRleHQiPgotCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvY2Vzcy1zcGFuIgotCQkJPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjbGFzcyIgc2VsZWN0PSJAY2xhc3MiLz4KLQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTwhLS0gVElUTEUgLS0+Ci0JPCEtLSBzd2FsbG93IC0tPgotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9InNjaDp0aXRsZSB8IHRpdGxlIiAvPiAKLQotCTwhLS0gVkFMVUUtT0YgLS0+Ci0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic2NoOnZhbHVlLW9mIHwgdmFsdWUtb2YiIG1vZGU9InRleHQiID4KLSAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBzZWxlY3QpIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDptZXNzYWdlPk1hcmt1cCBFcnJvcjogbm8gc2VsZWN0IGF0dHJpYnV0ZSBpbiAmbHQ7dmFsdWUtb2Y+PC94c2w6bWVzc2FnZT4KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQkgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJJYW1FbXB0eSIgLz4KLQkJPGF4c2w6dGV4dCB4bWw6c3BhY2U9InByZXNlcnZlIj4gPC9heHNsOnRleHQ+Ci0JCTx4c2w6Y2hvb3NlPgotCQkJPHhzbDp3aGVuIHRlc3Q9IkBzZWxlY3QiCi0JCQkJPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9jZXNzLXZhbHVlLW9mIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNlbGVjdCIgc2VsZWN0PSJAc2VsZWN0Ii8+ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB3aWxsIHNheG9uIGhhdmUgcHJvYmxlbSB3aXRoIHRoaXMgdG9vPz8gLS0+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOm90aGVyd2lzZSA+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb2Nlc3MtdmFsdWUtb2YiCi0JCQkJCT48eHNsOndpdGgtcGFyYW0gbmFtZT0ic2VsZWN0IiBzZWxlY3Q9IicuJyIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQk8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCQk8YXhzbDp0ZXh0IHhtbDpzcGFjZT0icHJlc2VydmUiPiA8L2F4c2w6dGV4dD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFRleHQgLS0+Ci0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGV4dCgpIiBwcmlvcml0eT0iLTEiIG1vZGU9ImRvLWtleXMiPgotCQk8IS0tIHN0cmlwIGNoYXJhY3RlcnMgLS0+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGV4dCgpIiBwcmlvcml0eT0iLTEiIG1vZGU9ImRvLWFsbC1wYXR0ZXJucyI+Ci0JCTwhLS0gc3RyaXAgY2hhcmFjdGVycyAtLT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLSAgICAgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGV4dCgpIiBwcmlvcml0eT0iLTEiIG1vZGU9ImRvLXNjaGVtYS1wIj4KLQkJPCEtLSBzdHJpcCBjaGFyYWN0ZXJzIC0tPgotCTwveHNsOnRlbXBsYXRlPgotICAgICAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXh0KCkiIHByaW9yaXR5PSItMSIgbW9kZT0iZG8tcGF0dGVybi1wIj4KLQkJPCEtLSBzdHJpcCBjaGFyYWN0ZXJzIC0tPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRleHQoKSIgcHJpb3JpdHk9Ii0xIj4KLQkJPCEtLSBzdHJpcCBjaGFyYWN0ZXJzIC0tPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRleHQoKSIgbW9kZT0idGV4dCI+Ci0JCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJub3JtYWxpemUtc3BhY2UoLikiLz4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRleHQoKSIgbW9kZT0iaW5saW5lLXRleHQiPgotCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPgotCTwveHNsOnRlbXBsYXRlPgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSB1dGlsaXR5IHRlbXBsYXRlcyAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0iSWFtRW1wdHkiPgotCTx4c2w6aWYgdGVzdD0iY291bnQoICogKSI+Ci0JCTx4c2w6bWVzc2FnZT4KLQkJCTx4c2w6dGV4dD5XYXJuaW5nOiA8L3hzbDp0ZXh0PgotCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUoLikiLz4KLQkJCTx4c2w6dGV4dD4gbXVzdCBub3QgY29udGFpbiBhbnkgY2hpbGQgZWxlbWVudHM8L3hzbDp0ZXh0PgotCQk8L3hzbDptZXNzYWdlPgotCTwveHNsOmlmPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbmFtZT0iZGlhZ25vc3RpY3NTcGxpdCI+Ci0gIDwhLS0gUHJvY2VzcyBhdCB0aGUgY3VycmVudCBwb2ludCB0aGUgZmlyc3Qgb2YgdGhlIDxkaWFnbm9zdGljPiBlbGVtZW50cwotICAgICAgIHJlZmVycmVkIHRvIHBhcmFtZXRlciBzdHIsIGFuZCB0aGVuIHJlY3Vyc2UgLS0+Ci0gIDx4c2w6cGFyYW0gbmFtZT0ic3RyIi8+Ci0gIDx4c2w6dmFyaWFibGUgbmFtZT0ic3RhcnQiPgotICAgIDx4c2w6Y2hvb3NlPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKCRzdHIsJyAnKSI+Ci0JPHhzbDp2YWx1ZS1vZiAgc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRzdHIsJyAnKSIvPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3RyIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgIDwveHNsOmNob29zZT4KLSAgPC94c2w6dmFyaWFibGU+Ci0KLSAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlbmQiPgotICAgIDx4c2w6aWYgdGVzdD0iY29udGFpbnMoJHN0ciwnICcpIj4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoJHN0ciwnICcpIi8+Ci0gICAgPC94c2w6aWY+Ci0gIDwveHNsOnZhcmlhYmxlPgotCi0gIDx4c2w6aWYgdGVzdD0ibm90KHN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRzdGFydCkpID0gMCkKLQlhbmQgbm90KC8vc2NoOmRpYWdub3N0aWNbQGlkID0gKCRzdGFydCldKSBhbmQgbm90KC8vZGlhZ25vc3RpY1tAaWQgPSAoJHN0YXJ0KV0pIj4KLQk8eHNsOm1lc3NhZ2U+UmVmZXJlbmNlIGVycm9yOiBBIGRpYWdub3N0aWMgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdHJpbmcoJHN0YXJ0KSIvPiIgaGFzIGJlZW4gcmVmZXJlbmNlZCBidXQgaXMgbm90IGRlY2xhcmVkPC94c2w6bWVzc2FnZT4KLSAgPC94c2w6aWY+Ci0KLSAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkc3RhcnQpKSA+IDAiPgotICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAKLSAgICAgICAgc2VsZWN0PSIvL3NjaDpkaWFnbm9zdGljW0BpZCA9ICgkc3RhcnQpIF0gfCAvL2RpYWdub3N0aWNbQGlkPSAoJHN0YXJ0KSBdIi8+Ci0gIDwveHNsOmlmPgotCi0gIDx4c2w6aWYgdGVzdD0ibm90KCRlbmQ9JycpIj4KLSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlhZ25vc3RpY3NTcGxpdCI+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3RyIiBzZWxlY3Q9IiRlbmQiLz4KLSAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICA8L3hzbDppZj4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIqIj4KLQkJPHhzbDptZXNzYWdlPgotCQkJPHhzbDp0ZXh0Pldhcm5pbmc6IHVucmVjb2duaXplZCBlbGVtZW50IDwveHNsOnRleHQ+Ci0JCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSguKSIvPgotCQk8L3hzbDptZXNzYWdlPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9IioiIG1vZGU9InRleHQiPgotCQk8eHNsOm1lc3NhZ2U+Ci0JCQk8eHNsOnRleHQ+V2FybmluZzogdW5yZWNvZ25pemVkIGVsZW1lbnQgPC94c2w6dGV4dD4KLQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKC4pIi8+Ci0JCTwveHNsOm1lc3NhZ2U+Ci0JPC94c2w6dGVtcGxhdGU+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gRGVmYXVsdCBuYW1lZCB0ZW1wbGF0ZXMgLS0+Ci0JPCEtLSBUaGVzZSBhcmUgdGhlIGFjdGlvbnMgdGhhdCBhcmUgcGVyZm9ybWVkIHVubGVzcyBvdmVycmlkZGVuIC0tPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvY2Vzcy1wcm9sb2ciLz4KLQk8IS0tIG5vIHBhcmFtcyAtLT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InByb2Nlc3Mtcm9vdCI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudHMiLz4KLQkJPCEtLSB1bnVzZWQgcGFyYW1zOiBmcGksIHRpdGxlLCBpZCwgaWNvbiwgbGFuZywgdmVyc2lvbiwgc2NoZW1hVmVyc2lvbiAtLT4KLQkJPHhzbDpjb3B5LW9mIHNlbGVjdD0iJGNvbnRlbnRzIi8+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9jZXNzLWFzc2VydCI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0icm9sZSIvPgotCQk8eHNsOnBhcmFtIG5hbWU9InRlc3QiLz4KLQkJPCEtLSB1bnVzZWQgcGFyYW1ldGVyczogaWQsIGljb24sIGRpYWdub3N0aWNzLCBzdWJqZWN0IC0tPgotCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvY2Vzcy1tZXNzYWdlIj4KLQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXR0ZXJuIiBzZWxlY3Q9IiR0ZXN0Ii8+Ci0JCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icm9sZSIgc2VsZWN0PSIkcm9sZSIvPgotCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvY2Vzcy1yZXBvcnQiPgotCQk8eHNsOnBhcmFtIG5hbWU9InJvbGUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJ0ZXN0Ii8+Ci0JCTwhLS0gdW51c2VkIHBhcmFtZXRlcnM6IGlkLCBpY29uLCBkaWFnbm9zdGljcywgc3ViamVjdCAtLT4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb2Nlc3MtbWVzc2FnZSI+Ci0JCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0dGVybiIgc2VsZWN0PSIkdGVzdCIvPgotCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJvbGUiIHNlbGVjdD0iJHJvbGUiLz4KLQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InByb2Nlc3MtZGlhZ25vc3RpYyI+Ci0JCTwhLS0gcGFyYW1zOiBpZCAtLT4KLQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgbW9kZT0idGV4dCIvPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvY2Vzcy1kaXIiIAotCQk+PHhzbDphcHBseS10ZW1wbGF0ZXMgbW9kZT0iaW5saW5lLXRleHQiLz48L3hzbDp0ZW1wbGF0ZT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InByb2Nlc3MtZW1waCIgCi0JCT48eHNsOmFwcGx5LXRlbXBsYXRlcyBtb2RlPSJpbmxpbmUtdGV4dCIvPjwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvY2Vzcy1uYW1lIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJuYW1lIgotCQkvPjxheHNsOnZhbHVlLW9mIHNlbGVjdD0ieyRuYW1lfSIvPjwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvY2Vzcy1ucyIgLz4KLQk8IS0tIHVudXNlZCBwYXJhbXM6IHByZWZpeCwgdXJpIC0tPgotCTwhLS0gbm90ZSB0aGF0IHRoaXMgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiBzY2g6bnMgYnkgc2NoOnNjaGVtYSAtLT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InByb2Nlc3MtcCIvPgotCTwhLS0gdW51c2VkIHBhcmFtczogY2xhc3MsIGlkLCBpY29uLCBsYW5nIC0tPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvY2Vzcy1wYXR0ZXJuIi8+Ci0JPCEtLSB1bnVzZWQgcGFyYW1zOiBuYW1lLCBpZCwgc2VlLCBmcGksIGljb24gLS0+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9jZXNzLXJ1bGUiLz4KLQk8IS0tIHVudXNlZCBwYXJhbXM6IGlkLCBjb250ZXh0LCByb2xlIC0tPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvY2Vzcy1zcGFuIiAKLQkJPjx4c2w6YXBwbHktdGVtcGxhdGVzIG1vZGU9ImlubGluZS10ZXN0Ii8+PC94c2w6dGVtcGxhdGU+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9jZXNzLXZhbHVlLW9mIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzZWxlY3QiCi0JCS8+PGF4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ7JHNlbGVjdH0iLz48L3hzbDp0ZW1wbGF0ZT4KLQk8IS0tIGRlZmF1bHQgb3V0cHV0IGFjdGlvbjogdGhlIHNpbXBsZXN0IGN1c3RvbWl6YXRpb24gaXMgdG8ganVzdCBvdmVycmlkZSB0aGlzIC0tPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvY2Vzcy1tZXNzYWdlIj4KLQkJPCEtLSBwYXJhbXM6IHBhdHRlcm4sIHJvbGUgLS0+Ci0JCTx4c2w6YXBwbHktdGVtcGxhdGVzIG1vZGU9InRleHQiLz4KLQk8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9zY2hlbWF0cm9uL3NvdXJjZS54bWwgYi9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvc2NoZW1hdHJvbi9zb3VyY2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmVmNTBkLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9zY2hlbWF0cm9uL3NvdXJjZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGhvdXNlPgotICAgICAgICAgPHdhbGwvPgotICAgICAgICAgPHdhbGwvPgotICAgICAgICAgPHdhbGwvPgotICAgICAgICAgPHdhbGwvPgotICAgICAgICAgPGFkZHJlc3M+Ci0gICAgICAgICAgICA8c3RyZWV0PjEgVGhlIEhpZ2ggU3RyZWV0PC9zdHJlZXQ+Ci0gICAgICAgICAgICA8dG93bj5OZXcgVG93bjwvdG93bj4KLSAgICAgICAgICAgIDxwb3N0Y29kZT5OVDE8L3Bvc3Rjb2RlPgotICAgICAgICAgPC9hZGRyZXNzPgotICAgICAgICAgPGJ1aWxkZXI+Ci0gICAgICAgICAgICA8Zmlyc3RuYW1lPkJvYjwvZmlyc3RuYW1lPgotICAgICAgICAgICAgPGxhc3RuYW1lPkJ1aWxkZXI8L2xhc3RuYW1lPgotICAgICAgICAgICAgPGNlcnRpZmljYXRpb24gbnVtYmVyPSIxMjMiLz4KLSAgICAgICAgIDwvYnVpbGRlcj4KLSAgICAgIDwvaG91c2U+Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9zY2hlbWF0cm9uL3Rlc3Qtc2NoZW1hdHJvbi54bWwgYi9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvc2NoZW1hdHJvbi90ZXN0LXNjaGVtYXRyb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWY0ZjY1Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9zY2hlbWF0cm9uL3Rlc3Qtc2NoZW1hdHJvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHNjaDpzY2hlbWEgeG1sbnM6c2NoPSJodHRwOi8vd3d3LmFzY2MubmV0L3htbC9zY2hlbWF0cm9uIgotICAgICAgICAgICAgICAgICBpY29uPSJodHRwOi8vd3d3LmFzY2MubmV0L3htbC9yZXNvdXJjZS9zY2hlbWF0cm9uL2JpbGJ5LmpwZyIKLSAgICAgICAgICAgICAgICAgZGVmYXVsdFBoYXNlPSJidWlsdCI+Ci0KLSAgICAgICAgICAgICA8c2NoOnA+VGhpcyBpcyBhbiBleGFtcGxlIHNjaGVtYSBmb3IgdGhlIDxlbXBoPkJ1aWxkaW5nIFByb2plY3RzIFhNTDwvZW1waD4gbGFuZ3VhZ2UuPC9zY2g6cD4KLQotICAgICAgICAgICAgIDxzY2g6cGhhc2UgaWQ9InVuZGVyQ29uc3RydWN0aW9uIj4KLSAgICAgICAgICAgICAgICA8c2NoOmFjdGl2ZSBwYXR0ZXJuPSJjb25zdHJ1Y3Rpb24iPjwvc2NoOmFjdGl2ZT4KLSAgICAgICAgICAgICAgICA8c2NoOmFjdGl2ZSBwYXR0ZXJuPSJhZG1pbiI+PC9zY2g6YWN0aXZlPgotICAgICAgICAgICAgIDwvc2NoOnBoYXNlPgotCi0gICAgICAgICAgICAgPHNjaDpwaGFzZSBpZD0iYnVpbHQiPgotICAgICAgICAgICAgICAgIDxzY2g6YWN0aXZlIHBhdHRlcm49ImNvbXBsZXRlZCI+Y29tcGxldGVkPC9zY2g6YWN0aXZlPgotICAgICAgICAgICAgICAgIDxzY2g6YWN0aXZlIHBhdHRlcm49ImFkbWluIj5hZG1pbjwvc2NoOmFjdGl2ZT4KLSAgICAgICAgICAgICA8L3NjaDpwaGFzZT4KLQotCi0gICAgICAgICAgICAgPHNjaDpwYXR0ZXJuIG5hbWU9IkNvbnN0cnVjdGlvbiBDaGVja3MiIGlkPSJjb25zdHJ1Y3Rpb24iPgotCi0gICAgICAgICAgICAgICAgPHNjaDpwPkNvbnN0cmFpbnRzIHdoaWNoIGFyZSBhcHBsaWVkIGR1cmluZyBjb25zdHJ1Y3Rpb248L3NjaDpwPgotCi0gICAgICAgICAgICAgICAgPHNjaDpydWxlIGNvbnRleHQ9ImhvdXNlIj4KLSAgICAgICAgICAgICAgICAgICA8c2NoOmFzc2VydCB0ZXN0PSJjb3VudCh3YWxsKSA9IDQiIGRpYWdub3N0aWNzPSIxIj5BIGhvdXNlIHNob3VsZCBoYXZlIDQgd2FsbHM8L3NjaDphc3NlcnQ+Ci0gICAgICAgICAgICAgICAgICAgPHNjaDpyZXBvcnQgdGVzdD0ibm90KHJvb2YpIiBkaWFnbm9zdGljcz0iMiI+VGhlIGhvdXNlIGlzIGluY29tcGxldGUsIGl0IHN0aWxsIG5lZWRzIGEgcm9vZjwvc2NoOnJlcG9ydD4KLSAgICAgICAgICAgICAgICAgICA8c2NoOmFzc2VydCB0ZXN0PSJidWlsZGVyIj5BbiBpbmNvbXBsZXRlIGhvdXNlIG11c3QgaGF2ZQotICAgICAgICAgICAgICAgICAgIGEgYnVpbGRlciBhc3NpZ25lZCB0byBpdDwvc2NoOmFzc2VydD4KLSAgICAgICAgICAgICAgICAgICA8c2NoOmFzc2VydCB0ZXN0PSJub3Qob3duZXIpIj5BbiBpbmNvbXBsZXRlIGhvdXNlIGNhbm5vdCBoYXZlIGFuIG93bmVyPC9zY2g6YXNzZXJ0PgotICAgICAgICAgICAgICAgIDwvc2NoOnJ1bGU+Ci0KLSAgICAgICAgICAgICA8L3NjaDpwYXR0ZXJuPgotCi0gICAgICAgICAgICAgPHNjaDpwYXR0ZXJuIG5hbWU9IkZpbmFsIENoZWNrcyIgaWQ9ImNvbXBsZXRlZCI+Ci0gICAgICAgICAgICAgICAgPHNjaDpwPkNvbnN0cmFpbnRzIHdoaWNoIGFyZSBhcHBsaWVkIGFmdGVyIGNvbnN0cnVjdGlvbjwvc2NoOnA+Ci0KLSAgICAgICAgICAgICAgICA8c2NoOnJ1bGUgY29udGV4dD0iaG91c2UiPgotICAgICAgICAgICAgICAgICAgIDxzY2g6YXNzZXJ0IHRlc3Q9ImNvdW50KHdhbGwpPSA0IiBkaWFnbm9zdGljcz0iMSI+QSBob3VzZSBzaG91bGQgaGF2ZSA0IHdhbGxzPC9zY2g6YXNzZXJ0PgotICAgICAgICAgICAgICAgICAgIDxzY2g6cmVwb3J0IHRlc3Q9Im5vdChyb29mKSIgZGlhZ25vc3RpY3M9IjIiPlRoZSBob3VzZSBpcyBpbmNvbXBsZXRlLCBpdCBzdGlsbCBuZWVkcyBhIHJvb2Y8L3NjaDpyZXBvcnQ+Ci0gICAgICAgICAgICAgICAgICAgPHNjaDphc3NlcnQgdGVzdD0ib3duZXIiPkFuIGluY29tcGxldGUgaG91c2UgbXVzdCBoYXZlCi0gICAgICAgICAgICAgICAgICAgYW4gb3duZXI8L3NjaDphc3NlcnQ+Ci0gICAgICAgICAgICAgICAgICAgPHNjaDphc3NlcnQgdGVzdD0ibm90KGJ1aWxkZXIpIj5BbiBpbmNvbXBsZXRlIGhvdXNlIGRvZXNuJ3QgbmVlZCBhIGJ1aWxkZXI8L3NjaDphc3NlcnQ+Ci0gICAgICAgICAgICAgICAgPC9zY2g6cnVsZT4KLQotICAgICAgICAgICAgIDwvc2NoOnBhdHRlcm4+Ci0KLSAgICAgICAgICAgICA8c2NoOnBhdHRlcm4gbmFtZT0iQWRtaW5zdHJhdGlvbiBDaGVja3MiIGlkPSJhZG1pbiI+Ci0KLSAgICAgICAgICAgICAgICA8c2NoOnA+QWRtaW5zdHJhdGl2ZSBjb25zdHJhaW50cyB3aGljaCBhcmUgPHNjaDplbXBoPmFsd2F5czwvc2NoOmVtcGg+IGFwcGxpZWQ8L3NjaDpwPgotCi0gICAgICAgICAgICAgICAgPHNjaDpydWxlIGNvbnRleHQ9ImhvdXNlIj4KLSAgICAgICAgICAgICAgICAgICA8c2NoOmFzc2VydCB0ZXN0PSJhZGRyZXNzIj5BIGhvdXNlIG11c3QgaGF2ZSBhbiBhZGRyZXNzPC9zY2g6YXNzZXJ0PgotICAgICAgICAgICAgICAgIDwvc2NoOnJ1bGU+Ci0KLSAgICAgICAgICAgICAgICA8c2NoOnJ1bGUgY29udGV4dD0iYWRkcmVzcyI+Ci0gICAgICAgICAgICAgICAgICAgPHNjaDphc3NlcnQgdGVzdD0iY291bnQoKikgPSBjb3VudChzdHJlZXQpICsgY291bnQodG93bikgKyBjb3VudChwb3N0Y29kZSkiPgotICAgICAgICAgICAgICAgICAgIEFuIGFkZHJlc3MgbWF5IG9ubHkgaW5jbHVkZSBzdHJlZXQsIHRvd24gYW5kIHBvc3Rjb2RlIGVsZW1lbnRzLgotICAgICAgICAgICAgICAgICAgIDwvc2NoOmFzc2VydD4KLSAgICAgICAgICAgICAgICAgICA8c2NoOmFzc2VydCB0ZXN0PSJzdHJlZXQiPkFuIGFkZHJlc3MgbXVzdCBpbmNsdWRlIHRoZSBzdHJlZXQgZGV0YWlsczwvc2NoOmFzc2VydD4KLSAgICAgICAgICAgICAgICAgICA8c2NoOmFzc2VydCB0ZXN0PSJ0b3duIj5BbiBhZGRyZXNzIG11c3QgaWRlbnRpZnkgdGhlIHRvd248L3NjaDphc3NlcnQ+Ci0gICAgICAgICAgICAgICAgICAgPHNjaDphc3NlcnQgdGVzdD0icG9zdGNvZGUiPkFuIGFkZHJlc3MgbXVzdCBoYXZlIGEgcG9zdGNvZGU8L3NjaDphc3NlcnQ+Ci0gICAgICAgICAgICAgICAgPC9zY2g6cnVsZT4KLQotCi0gICAgICAgICAgICAgICAgPHNjaDpydWxlIGFic3RyYWN0PSJ0cnVlIiBpZD0ibmFtZUNoZWNrcyI+Ci0gICAgICAgICAgICAgICAgICAgPHNjaDphc3NlcnQgdGVzdD0iZmlyc3RuYW1lIj5BIDxuYW1lLz4gZWxlbWVudCBtdXN0IGhhdmUgYSBmaXJzdCBuYW1lPC9zY2g6YXNzZXJ0PgotICAgICAgICAgICAgICAgICAgIDxzY2g6YXNzZXJ0IHRlc3Q9Imxhc3RuYW1lIj5BIDxuYW1lLz4gZWxlbWVudCBtdXN0IGhhdmUgYSBsYXN0IG5hbWU8L3NjaDphc3NlcnQ+Ci0gICAgICAgICAgICAgICAgPC9zY2g6cnVsZT4KLQotICAgICAgICAgICAgICAgIDxzY2g6cnVsZSBjb250ZXh0PSJidWlsZGVyIj4KLSAgICAgICAgICAgICAgICAgICA8c2NoOmV4dGVuZHMgcnVsZT0ibmFtZUNoZWNrcyI+PC9zY2g6ZXh0ZW5kcz4KLSAgICAgICAgICAgICAgICAgICA8c2NoOmFzc2VydCB0ZXN0PSJjZXJ0aWZpY2F0aW9uIj5BIDxuYW1lLz4gbXVzdCBiZSBjZXJ0aWZpZWQ8L3NjaDphc3NlcnQ+Ci0gICAgICAgICAgICAgICAgPC9zY2g6cnVsZT4KLQotICAgICAgICAgICAgICAgIDxzY2g6cnVsZSBjb250ZXh0PSJvd25lciI+Ci0gICAgICAgICAgICAgICAgICAgPHNjaDpleHRlbmRzIHJ1bGU9Im5hbWVDaGVja3MiPjwvc2NoOmV4dGVuZHM+Ci0gICAgICAgICAgICAgICAgICAgPHNjaDphc3NlcnQgdGVzdD0idGVsZXBob25lIj5BbiA8bmFtZS8+IG11c3QgaGF2ZSBhIHRlbGVwaG9uZTwvc2NoOmFzc2VydD4KLSAgICAgICAgICAgICAgICA8L3NjaDpydWxlPgotCi0gICAgICAgICAgICAgICAgPHNjaDpydWxlIGNvbnRleHQ9ImNlcnRpZmljYXRpb24iPgotICAgICAgICAgICAgICAgICAgIDxzY2g6YXNzZXJ0IHRlc3Q9IkBudW1iZXIiPkNlcnRpZmljYXRpb24gbnVtYmVycyBtdXN0IGJlIHJlY29yZGVkCi0gICAgICAgICAgICAgICAgICAgaW4gdGhlIG51bWJlciBhdHRyaWJ1dGU8L3NjaDphc3NlcnQ+Ci0gICAgICAgICAgICAgICAgPC9zY2g6cnVsZT4KLQotICAgICAgICAgICAgIDwvc2NoOnBhdHRlcm4+Ci0KLSAgICAgICAgICAgICA8ZGlhZ25vc3RpY3M+Ci0gICAgICAgICAgICAgICAgPGRpYWdub3N0aWMgaWQ9IjEiPgotICAgICAgICAgICAgICAgICAgICBJdHMgYW4gb2RkIGhvdXNlIHdoaWNoIGhhcyBtb3JlIG9yIGxlc3MgdGhhbiBmb3VyIHdhbGxzISBDb25zdWx0IHlvdXIgYXJjaGl0ZWN0Li4uCi0gICAgICAgICAgICAgICAgPC9kaWFnbm9zdGljPgotCi0gICAgICAgICAgICAgICAgPGRpYWdub3N0aWMgaWQ9IjIiPgotICAgICAgICAgICAgICAgICAgICBJdHMgYW4gb2RkIGhvdXNlIHdoaWNoIGhhcyBubyByb29mISBDb25zdWx0IHlvdXIgYXJjaGl0ZWN0Li4uCi0gICAgICAgICAgICAgICAgPC9kaWFnbm9zdGljPgotCi0gICAgICAgICAgICAgPC9kaWFnbm9zdGljcz4KLQotICAgICAgICAgPC9zY2g6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvc2NoZW1hdHJvbi90cmFuc2Zvcm1TY2hlbWF0cm9uRXhhbXBsZS5qZWxseSBiL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9zY2hlbWF0cm9uL3RyYW5zZm9ybVNjaGVtYXRyb25FeGFtcGxlLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGY0MWU0Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC9zY2hlbWF0cm9uL3RyYW5zZm9ybVNjaGVtYXRyb25FeGFtcGxlLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxuczp4PSJqZWxseTp4bWwiPg0KLQ0KLSAgPHg6dHJhbnNmb3JtDQotICAgICB4bWw9InRlc3Qtc2NoZW1hdHJvbi54bWwiDQotICAgICB4c2x0PSJzY2hlbWF0cm9uLXdyYXBwZXIueHNsIg0KLSAgICAgdmFyPSJ0ZXN0X3NjaGVtYXRyb24iLz4NCi0NCi0gIDx4OnRyYW5zZm9ybQ0KLSAgICAgeG1sPSJzb3VyY2UueG1sIg0KLSAgICAgeHNsdD0iJHt0ZXN0X3NjaGVtYXRyb259IiB2YXI9ImRvYyIvPg0KLQ0KLSAgUmVwb3J0IGNvdW50PTx4OmV4cHIgc2VsZWN0PSJjb3VudCgkZG9jLy9yZXBvcnQpIi8+OmFzc2VydCBjb3VudD08eDpleHByIHNlbGVjdD0iY291bnQoJGRvYy8vYXNzZXJ0KSIvPg0KLQ0KLTwvajpqZWxseT4NCi0NCi0NCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvc3VpdGUuamVsbHkgYi9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvc3VpdGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMWZhZTguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3N1aXRlLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08dGVzdDpzdWl0ZSAKLSAgICB4bWxuczpqPSJqZWxseTpjb3JlIiAKLSAgICB4bWxuczp4PSJqZWxseTp4bWwiIAotICAgIHhtbG5zOnRlc3Q9ImplbGx5Omp1bml0Ij4KLQotCi0gICAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0VXJpUGFyc2UiPgotICAgICAgICA8eDpwYXJzZSB2YXI9ImRvYyIgeG1sPSJkdW1teS54bWwiLz4KLSAgICAgICAgCi0gICAgICAgIDx0ZXN0OmFzc2VydCB4cGF0aD0iJGRvYy9kdW1teS9lbnRyeVtAaWQ9JzInXSIvPiAgICAgICAgCi0gICAgPC90ZXN0OmNhc2U+Ci0gICAgCi0gIDx0ZXN0OmNhc2UgbmFtZT0idGVzdEJvZHlQYXJzZSI+Ci0gICAgICAKLSAgICAgIDx4OnBhcnNlIHZhcj0iZG9jIj4KLSAgICAgICAgICA8Zm9vPgotICAgICAgICAgICAgICA8YmFyIGE9IjEiLz4KLSAgICAgICAgICA8L2Zvbz4KLSAgICAgIDwveDpwYXJzZT4KLSAgICAKLSAgICAgICAgPHRlc3Q6YXNzZXJ0IHhwYXRoPSIkZG9jL2Zvby9iYXJbQGE9JzEnXSIvPgotICA8L3Rlc3Q6Y2FzZT4KLSAgCi0gIDx0ZXN0OmNhc2UgbmFtZT0idGVzdFRleHRQYXJzZSI+Ci0gICAgICAKLSAgICAgIDxqOnNldCB2YXI9InRleHQiIGVuY29kZT0iZmFsc2UiPgotICAgICAgICAgIDxmb28+Ci0gICAgICAgICAgICAgIDxiYXIgYT0iMSIvPgotICAgICAgICAgIDwvZm9vPgotICAgICAgPC9qOnNldD4KLSAgICAKLSAgICAgIDx4OnBhcnNlIHZhcj0iZG9jIiB0ZXh0PSIke3RleHR9Ii8+Ci0gICAgCi0gICAgICAgIDx0ZXN0OmFzc2VydCB4cGF0aD0iJGRvYy9mb28vYmFyW0BhPScxJ10iLz4KLSAgPC90ZXN0OmNhc2U+Ci0gIAotICA8dGVzdDpjYXNlIG5hbWU9InRlc3RFbGVtZW50QW5kQXR0cmlidXRlIj4KLSAgICAgIAotICAgICAgPHg6cGFyc2UgdmFyPSJkb2MiPgotICAgICAgICAgIDx4OmVsZW1lbnQgbmFtZT0iZm9vIj4KLSAgICAgICAgICAgICAgPHg6YXR0cmlidXRlIG5hbWU9IngiPjEyMzQ8L3g6YXR0cmlidXRlPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPHg6ZWxlbWVudCBuYW1lPSJiYXIiPgotICAgICAgICAgICAgICAgICAgICA8eDphdHRyaWJ1dGUgbmFtZT0ieSI+QUJDPC94OmF0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICAgICAgaGVsbG8KLSAgICAgICAgICAgICAgICA8L3g6ZWxlbWVudD4KLSAgICAgICAgICA8L3g6ZWxlbWVudD4KLSAgICAgIDwveDpwYXJzZT4KLSAgICAKLSAgICAgICAgPHRlc3Q6YXNzZXJ0IHhwYXRoPSIkZG9jL2ZvbyIvPgotICAgICAgICA8dGVzdDphc3NlcnQgeHBhdGg9IiRkb2MvZm9vW0B4PScxMjM0J10iLz4KLSAgICAgICAgPHRlc3Q6YXNzZXJ0IHhwYXRoPSJjb3VudCgkZG9jL2JhcikgPSAwIi8+Ci0KLSAgICAgICAgPCEtLSB0ZXN0IG5lc3RlZCBlbGVtZW50IGFuZCBhdHRyaWJ1dGVzIC0tPiAgICAgICAgCi0gICAgICAgIDx0ZXN0OmFzc2VydCB4cGF0aD0iJGRvYy9mb29bQHg9JzEyMzQnXS9iYXJbQHk9J0FCQyddIi8+Ci0gICAgICAgIDx0ZXN0OmFzc2VydCB4cGF0aD0iJGRvYy9mb29bQHg9JzEyMzQnXS9iYXJbQHk9J0FCQyddPSdoZWxsbyciLz4KLSAgPC90ZXN0OmNhc2U+Ci0gIAotICA8dGVzdDpjYXNlIG5hbWU9InRlc3RCYWRFbGVtZW50QW5kQXR0cmlidXRlIj4KLQotICAgICAgICAKLSAgICAgICAgICAgIDxqOmNhdGNoIHZhcj0iZXgiPgotICAgICAgICAgICAgICAgIDx4OmVsZW1lbnQgbmFtZT0iZm9vIj4KLSAgICAgICAgICAgICAgICAgICAgc29tZSB0ZXh0Ci0gICAgICAgICAgICAgICAgICAgIDx4OmF0dHJpYnV0ZSBuYW1lPSJ4Ij4xMjM0PC94OmF0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICA8L3g6ZWxlbWVudD4KLSAgICAgICAgICAgIDwvajpjYXRjaD4gICAgICAgIAotICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2V4ICE9IG51bGx9Ij4KLSAgICAgICAgICAgIFdlIHNob3VsZCBoYXZlIGNyZWF0ZWQgYW4gZXhjZXB0aW9uIGFzIHNvbWUgdGV4dCBpcyBvdXRwdXQgYmVmb3JlIHRoZSBhdHRyaWJ1dGVzCi0gICAgICAgIDwvdGVzdDphc3NlcnQ+Ci0gIDwvdGVzdDpjYXNlPgotICAKLSAgPHRlc3Q6Y2FzZSBuYW1lPSJhc3NlcnRYUGF0aFRlc3RzIj4KLSAgCi0gICAgPHg6cGFyc2UgdmFyPSJkb2MiPgotICAgICAgPGZvbz4KLSAgICAgICAgICA8YmFyPmNoZWVzZTwvYmFyPgotICAgICAgPC9mb28+Ci0gICAgPC94OnBhcnNlPiAgCi0gICAgIAotICAKLSAgICA8dGVzdDphc3NlcnQgeHBhdGg9IiRkb2MvZm9vL2JhciI+VGhpcyBzaG91bGQgbmV2ZXIgZmFpbDwvdGVzdDphc3NlcnQ+Ci0gICAgPHRlc3Q6YXNzZXJ0IHhwYXRoPSIkZG9jL2Zvby9iYXIgPSAnY2hlZXNlJyI+VGhpcyBzaG91bGQgbmV2ZXIgZmFpbDwvdGVzdDphc3NlcnQ+Ci0gICAgCi0gICAgPGo6Y2F0Y2ggdmFyPSJleCI+Ci0gICAgICAgICAgPHRlc3Q6YXNzZXJ0IHhwYXRoPSIkZG9jL2Zvby94eXoiPlRoaXMgc2hvdWxkIGFsd2F5cyBmYWlsPC90ZXN0OmFzc2VydD4KLSAgICAgICAgPC9qOmNhdGNoPiAgICAgICAgCi0gICAgICAgIAotICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtleCAhPSBudWxsfSI+V2Ugc2hvdWxkIGhhdmUgY3JlYXRlZCBhbiBleGNlcHRpb248L3Rlc3Q6YXNzZXJ0PgotICAgICAgICAKLSAgICAgICAgVGhlIGV4Y2VwdGlvbiB3YXM6ICR7ZXgubWVzc2FnZX0KLSAgPC90ZXN0OmNhc2U+Ci0KLSAgICA8IS0tIHRlc3QgdGhlIHVzZSBvZiBuYW1lc3BhY2VzIHdpdGggWFBhdGggLS0+Ci0gIDx0ZXN0OmNhc2UgbmFtZT0iYXNzZXJ0WFBhdGhXaXRoTmFtZXNwYWNlVGVzdHMiIHhtbG5zOmE9ImZvb1VSSSIgeG1sbnM6ej0iZG9lc05vdE1hdGNoIiB4bWxucz0iZGlmZmVyZW50Ij4KLSAgCi0gICAgPHg6cGFyc2UgdmFyPSJkb2MiPgotICAgICAgPGZvbyB4bWxucz0iZm9vVVJJIj4KLSAgICAgICAgICA8YmFyPmNoZWVzZTwvYmFyPgotICAgICAgPC9mb28+Ci0gICAgPC94OnBhcnNlPiAgCi0gICAgIAotICAgIDx0ZXN0OmFzc2VydCB4cGF0aD0iJGRvYy9hOmZvby9hOmJhciI+VGhpcyBzaG91bGQgbmV2ZXIgZmFpbDwvdGVzdDphc3NlcnQ+Ci0gICAgPHRlc3Q6YXNzZXJ0IHhwYXRoPSIkZG9jL2I6Zm9vL2I6YmFyIiB4bWxuczpiPSJmb29VUkkiPlRoaXMgc2hvdWxkIG5ldmVyIGZhaWw8L3Rlc3Q6YXNzZXJ0PgotICAgIAotICAgIDxqOmNhdGNoIHZhcj0iZXgiPgotICAgICAgICAgIDx0ZXN0OmFzc2VydCB4cGF0aD0iJGRvYy96OmZvby96OmJhciI+VGhpcyBzaG91bGQgYWx3YXlzIGZhaWw8L3Rlc3Q6YXNzZXJ0PgotICAgICAgICA8L2o6Y2F0Y2g+ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2V4ICE9IG51bGx9Ij5XZSBzaG91bGQgaGF2ZSBjcmVhdGVkIGFuIGV4Y2VwdGlvbjwvdGVzdDphc3NlcnQ+Ci0gICAgICAgIAotICAgIDxqOmNhdGNoIHZhcj0iZXgiPgotICAgICAgICAgIDx0ZXN0OmFzc2VydCB4cGF0aD0iJGRvYy9mb28vYmFyIj5UaGlzIHNob3VsZCBhbHdheXMgZmFpbCwgc2luY2UgZm9vIGlzIG5vdCBpbiB0aGUgZW1wdHkgbmFtZXNwYWNlPC90ZXN0OmFzc2VydD4KLSAgICAgICAgPC9qOmNhdGNoPiAgICAgICAgCi0gICAgICAgIAotICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtleCAhPSBudWxsfSI+V2Ugc2hvdWxkIGhhdmUgY3JlYXRlZCBhbiBleGNlcHRpb248L3Rlc3Q6YXNzZXJ0PgotICAgICAgICAKLSAgICAgICAgPCEtLSAKLSAgICAgICAgICAgIHx8IG5vdyBsZXRzIHRlc3QgdGhhdCB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgJ2RpZmZlcmVudCcgaXMgaWdub3JlZCBieSB0aGUgWFBhdGggZXhwcmVzc2lvbnMKLSAgICAgICAgICAgIHx8IHNpbmNlIFhQYXRoIHNob3VsZCBpZ25vcmUgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIC0geW91IG11c3QgdXNlIGEgcHJlZml4IGluIFhQYXRoIHRvIGRlbm90ZQotICAgICAgICAgICAgfHwgYSBuYW1lc3BhY2UKLSAgICAgICAgICAgIC0tPgotICAgICAgICA8dGVzdDphc3NlcnQgeHBhdGg9IiRkb2MvKltsb2NhbC1uYW1lKCk9J2ZvbyddIi8+Ci0gIDwvdGVzdDpjYXNlPgotCi0gICAgPCEtLSB0ZXN0IHhwYXRoIHNvcnRpbmcgLS0+Ci0gICAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0WHBhdGhTb3J0aW5nIj4KLSAgICAgICAgPHg6cGFyc2UgdmFyPSJudW1zIj4KLSAgICAgICAgICAgIDxhPgotICAgICAgICAgICAgICAgIDxiIHY9IjMiLz4KLSAgICAgICAgICAgICAgICA8YiB2PSIyIi8+Ci0gICAgICAgICAgICAgICAgPGIgdj0iMSIvPgotICAgICAgICAgICAgICAgIDxiIHY9IjExIi8+Ci0gICAgICAgICAgICAgICAgPGIgdj0iMS40Ii8+Ci0gICAgICAgICAgICAgICAgPGIgdj0iMS4yIi8+Ci0gICAgICAgICAgICA8L2E+Ci0gICAgICAgIDwveDpwYXJzZT4KLQotICAgICAgICA8eDpwYXJzZSB2YXI9ImRlZXBlciI+Ci0gICAgICAgICAgICA8YT4KLSAgICAgICAgICAgICAgICA8Yj48Yz48ZD4zPGU+MTwvZT48L2Q+PC9jPjwvYj4KLSAgICAgICAgICAgICAgICA8Yj48Yz48ZD4yPGU+MTE8L2U+PC9kPjwvYz48L2I+Ci0gICAgICAgICAgICAgICAgPGI+PGM+PGQ+MTwvZD48L2M+PC9iPgotICAgICAgICAgICAgICAgIDxiPjxjPjxkPjExPC9kPjwvYz48L2I+Ci0gICAgICAgICAgICA8L2E+Ci0gICAgICAgIDwveDpwYXJzZT4KLQotICAgICAgICA8IS0tIHRlc3QgYXNjZW5kaW5nIC0tPgotICAgICAgICA8ajpzZXQgdmFyPSJyZXN1bHQiIHZhbHVlPSIiLz4KLSAgICAgICAgPHg6Zm9yRWFjaCBzZWxlY3Q9IiRudW1zL2EvYiIgdmFyPSJ4IiBzb3J0PSJudW1iZXIoQHYpIj4KLSAgICAgICAgICAgIDx4OnNldCB2YXI9Im51bSIgc2VsZWN0PSIkeC9AdiIvPgotICAgICAgICAgICAgPGo6c2V0IHZhcj0icmVzdWx0IiB2YWx1ZT0iJHtyZXN1bHR9ICR7bnVtLmdldCgwKS5nZXRUZXh0KCl9Ii8+Ci0gICAgICAgIDwveDpmb3JFYWNoPgotCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iIDEgMS4yIDEuNCAyIDMgMTEiIGFjdHVhbD0iJHtyZXN1bHR9Ii8+Ci0KLSAgICAgICAgPCEtLSB0ZXN0IGRlc2NlbmRpbmcgLS0+Ci0gICAgICAgIDxqOnNldCB2YXI9InJlc3VsdCIgdmFsdWU9IiIvPgotICAgICAgICA8eDpmb3JFYWNoIHNlbGVjdD0iJG51bXMvYS9iIiB2YXI9IngiIHNvcnQ9Im51bWJlcihAdikiIGRlc2NlbmRpbmc9InRydWUiPgotICAgICAgICAgICAgPHg6c2V0IHZhcj0ibnVtIiBzZWxlY3Q9IiR4L0B2Ii8+Ci0gICAgICAgICAgICA8ajpzZXQgdmFyPSJyZXN1bHQiIHZhbHVlPSIke3Jlc3VsdH0gJHtudW0uZ2V0KDApLmdldFRleHQoKX0iLz4KLSAgICAgICAgPC94OmZvckVhY2g+Ci0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSIgMTEgMyAyIDEuNCAxLjIgMSIgYWN0dWFsPSIke3Jlc3VsdH0iLz4KLQotICAgICAgICA8IS0tIHRlc3QgZGVlcGVyIG5lc3RpbmcgLS0+Ci0gICAgICAgIDxqOnNldCB2YXI9InJlc3VsdCIgdmFsdWU9IiIvPgotICAgICAgICA8eDpmb3JFYWNoIHNlbGVjdD0iJGRlZXBlci9hL2IiIHZhcj0ieCIgc29ydD0ibnVtYmVyKGMvZC90ZXh0KCkpIj4KLSAgICAgICAgICAgIDxqOnNldCB2YXI9InJlc3VsdCIgdmFsdWU9IiR7cmVzdWx0fSAke3guZ2V0U3RyaW5nVmFsdWUoKX0iLz4KLSAgICAgICAgPC94OmZvckVhY2g+Ci0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSIgMSAyMTEgMzEgMTEiIGFjdHVhbD0iJHtyZXN1bHR9Ii8+Ci0KLSAgICAgICAgPCEtLSB0ZXN0IHNvcnQgYXMgc3RyaW5ncyAtLT4KLSAgICAgICAgPGo6c2V0IHZhcj0icmVzdWx0IiB2YWx1ZT0iIi8+Ci0gICAgICAgIDx4OmZvckVhY2ggc2VsZWN0PSIkbnVtcy9hL2IiIHZhcj0ieCIgc29ydD0iQHYiPgotICAgICAgICAgICAgPHg6c2V0IHZhcj0ibnVtIiBzZWxlY3Q9IiR4L0B2Ii8+Ci0gICAgICAgICAgICA8ajpzZXQgdmFyPSJyZXN1bHQiIHZhbHVlPSIke3Jlc3VsdH0gJHtudW0uZ2V0KDApLmdldFRleHQoKX0iLz4KLSAgICAgICAgPC94OmZvckVhY2g+Ci0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSIgMSAxLjIgMS40IDExIDIgMyIgYWN0dWFsPSIke3Jlc3VsdH0iLz4KLQotICAgICAgICA8IS0tIHRlc3QgeDpzZXQgd2l0aCBzb3J0IC0tPgotICAgICAgICA8ajpzZXQgdmFyPSJyZXN1bHQiIHZhbHVlPSIiLz4KLSAgICAgICAgPHg6c2V0IHZhcj0icnNldCIgc2VsZWN0PSIkbnVtcy9hL2IiIHNvcnQ9Im51bWJlcihAdikiLz4KLSAgICAgICAgPGo6Zm9yRWFjaCB2YXI9Im51bSIgaXRlbXM9IiR7cnNldC5pdGVyYXRvcigpfSI+Ci0gICAgICAgICAgICA8ajpzZXQgdmFyPSJyZXN1bHQiIHZhbHVlPSIke3Jlc3VsdH0gJHtudW0uYXR0cmlidXRlVmFsdWUoJ3YnKX0iLz4KLSAgICAgICAgPC9qOmZvckVhY2g+Ci0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSIgMSAxLjIgMS40IDIgMyAxMSIgYWN0dWFsPSIke3Jlc3VsdH0iLz4KLQotICAgICAgICA8IS0tIHRlc3QgeDpzZXQgd2l0aCBzb3J0IC0tPgotICAgICAgICA8ajpzZXQgdmFyPSJyZXN1bHQiIHZhbHVlPSIiLz4KLSAgICAgICAgPHg6c2V0IHZhcj0icnNldCIgc2VsZWN0PSIkbnVtcy9hL2IiLz4KLSAgICAgICAgPHg6c29ydCBsaXN0PSIke3JzZXR9IiBzb3J0PSJudW1iZXIoQHYpIi8+Ci0gICAgICAgIDxqOmZvckVhY2ggdmFyPSJudW0iIGl0ZW1zPSIke3JzZXQuaXRlcmF0b3IoKX0iPgotICAgICAgICAgICAgPGo6c2V0IHZhcj0icmVzdWx0IiB2YWx1ZT0iJHtyZXN1bHR9ICR7bnVtLmF0dHJpYnV0ZVZhbHVlKCd2Jyl9Ii8+Ci0gICAgICAgIDwvajpmb3JFYWNoPgotCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iIDEgMS4yIDEuNCAyIDMgMTEiIGFjdHVhbD0iJHtyZXN1bHR9Ii8+Ci0KLSAgICA8L3Rlc3Q6Y2FzZT4KLQotCi0gIDx0ZXN0OmNhc2UgbmFtZT0idGVzdENvbW1lbnRXaXRoTGV4aWNhbCI+Ci0gICAgICAKLSAgICAgIDx4OnBhcnNlIHZhcj0iZG9jIj4KLSAgICAgICAgICA8Zm9vPgotICAgICAgICAgICAgICAgIDwhLS0gdGhpcyB3aWxsIG5vdCBiZSBvdXRwdXQgLS0+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPHg6Y29tbWVudCB0ZXh0PSJ0aGlzIGlzIGEgY29tbWVudCIvPgotICAgICAgICAgIDwvZm9vPgotICAgICAgPC94OnBhcnNlPgotICAgIAotICAgICAgICA8dGVzdDphc3NlcnQgeHBhdGg9IiRkb2MvZm9vIi8+Ci0KLSAgICAgICAgPGo6c2V0IHZhcj0idCI+PHg6Y29weU9mIHNlbGVjdD0iJGRvYy9mb28vY29tbWVudCgpIiBsZXhpY2FsPSJ0cnVlIi8+PC9qOnNldD4KLSAgICAgICAgCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iJmx0OyEtLXRoaXMgaXMgYSBjb21tZW50LS0mZ3Q7IiBhY3R1YWw9IiR7dC50cmltKCl9Ii8+Ci0KLSAgICA8L3Rlc3Q6Y2FzZT4KLSAgICAKLSAgICA8dGVzdDpjYXNlIG5hbWU9InRlc3RDb21tZW50V2l0aG91dExleGljYWwiPgotICAgICAgCi0gICAgICA8eDpwYXJzZSB2YXI9ImRvYyI+Ci0gICAgICAgICAgPGZvbz4KLSAgICAgICAgICAgICAgICA8IS0tIHRoaXMgd2lsbCBub3QgYmUgb3V0cHV0IC0tPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDx4OmNvbW1lbnQgdGV4dD0idGhpcyBpcyBhIGNvbW1lbnQiLz4KLSAgICAgICAgICA8L2Zvbz4KLSAgICAgIDwveDpwYXJzZT4KLSAgICAKLSAgICAgICAgPHRlc3Q6YXNzZXJ0IHhwYXRoPSIkZG9jL2ZvbyIvPgotCi0gICAgICAgIDxqOnNldCB2YXI9InQiPjx4OmNvcHlPZiBzZWxlY3Q9InN0cmluZygkZG9jL2Zvby9jb21tZW50KCkpIiBsZXhpY2FsPSJ0cnVlIi8+PC9qOnNldD4KLSAgICAgICAgCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0idGhpcyBpcyBhIGNvbW1lbnQiIGFjdHVhbD0iJHt0LnRyaW0oKX0iLz4KLQotICAgIDwvdGVzdDpjYXNlPgotCi0gIDx0ZXN0OmNhc2UgbmFtZT0idGVzdENvbW1lbnRXaXRoVGV4dEF0dHJpYnV0ZVdpdGhMZXhpY2FsIj4KLSAgICAgIAotICAgICAgPHg6cGFyc2UgdmFyPSJkb2MiPgotICAgICAgICAgIDxmb28+Ci0gICAgICAgICAgICAgICAgPCEtLSB0aGlzIHdpbGwgbm90IGJlIG91dHB1dCAtLT4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8eDpjb21tZW50IHRleHQ9InRoaXMgaXMgYSBjb21tZW50Ii8+Ci0gICAgICAgICAgPC9mb28+Ci0gICAgICA8L3g6cGFyc2U+Ci0gICAgCi0gICAgICAgIDx0ZXN0OmFzc2VydCB4cGF0aD0iJGRvYy9mb28iLz4KLQotICAgICAgICA8ajpzZXQgdmFyPSJ0Ij48eDpjb3B5T2Ygc2VsZWN0PSIkZG9jL2Zvby9jb21tZW50KCkiIGxleGljYWw9InRydWUiLz48L2o6c2V0PgotICAgICAgICAKLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSImbHQ7IS0tdGhpcyBpcyBhIGNvbW1lbnQtLSZndDsiIGFjdHVhbD0iJHt0LnRyaW0oKX0iLz4KLSAgPC90ZXN0OmNhc2U+Ci0gIAotICA8dGVzdDpjYXNlIG5hbWU9InRlc3RGaWxlUGFyc2UiPgotICAgIDxqOm5ldyB2YXI9InRoZVN1aXRlIiBjbGFzc05hbWU9ImphdmEuaW8uRmlsZSI+Ci0gICAgICA8ajphcmcgdmFsdWU9IiR7YmFzZWRpcn0vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3N1aXRlLmplbGx5Ii8+Ci0gICAgPC9qOm5ldz4KLSAgICBleGlzdHMgPSAke3RoZVN1aXRlLmV4aXN0cygpfSwgcmVhZGFibGUgPSAke3RoZVN1aXRlLmNhblJlYWQoKX0sIGNsYXNzPSR7dGhlU3VpdGUuY2xhc3MubmFtZX0KLSAgICA8IS0tIHRoaXMgdGVzdCBmYWlscyB3aXRoIGJlYW51dGlscyAxLjYgCi0gICAgPHg6cGFyc2UgdmFyPSJzdWl0ZSIgeG1sPSIke3RoZVN1aXRlfSIvPiAtLT4KLSAgPC90ZXN0OmNhc2U+Ci0KLSAgICAKLSAgICA8dGVzdDpjYXNlIG5hbWU9InRlc3RTZXRTaW5nbGVOb2RlQW5kQXNTdHJpbmciPgotICAgICAgICA8eDpwYXJzZSB2YXI9ImJsb3BFbGVtZW50cyI+Ci0gICAgICAgICAgICA8cm9vdD4KLSAgICAgICAgICAgIDxibG9wPmJsb3AxPC9ibG9wPgotICAgICAgICAgICAgPGJsaXAvPgotICAgICAgICAgICAgPGJsb3AgaWQ9ImJsYSI+YmxvcDA8L2Jsb3A+PC9yb290PgotICAgICAgICA8L3g6cGFyc2U+Ci0gICAgICAgIDx4OnNldCB2YXI9ImJsb3BTaW5nbGUiIHNlbGVjdD0iJGJsb3BFbGVtZW50cy9yb290L2Jsb3AiIHNpbmdsZT0idHJ1ZSIvPgotICAgICAgICA8IS0tIHNob3VsZCByZXR1cm4gdGhlIHNlY29uZCAtLT4KLSAgICAgICAgPGo6aW52b2tlU3RhdGljIHZhcj0iZWx0Q2xhc3MiIGNsYXNzTmFtZT0iamF2YS5sYW5nLkNsYXNzIiBtZXRob2Q9ImZvck5hbWUiPjxqOmFyZyB2YWx1ZT0ib3JnLmRvbTRqLkVsZW1lbnQiLz48L2o6aW52b2tlU3RhdGljPgotICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtlbHRDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGJsb3BTaW5nbGUuZ2V0Q2xhc3MoKSl9Ii8+Ci0gICAgICAgIDxqOnNldCB2YXI9ImJsb3BTaW5nbGVUZXh0Ij48eDpleHByIHNlbGVjdD0iJGJsb3BTaW5nbGUvdGV4dCgpIi8+PC9qOnNldD4KLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGFjdHVhbD0iJHtibG9wU2luZ2xlVGV4dH0iIGV4cGVjdGVkPSJibG9wMSIvPgotICAgICAgICA8IS0tIGNoZWNrIGlmIHNlbGVjdGluZyByb290L2JsaXAgcmV0dXJucyBhIGxpc3QgLS0+Ci0gICAgICAgIDx4OnNldCB2YXI9ImJsaXAiIHNlbGVjdD0iJGJsb3BFbGVtZW50cy9yb290L2JsaXAiIHNpbmdsZT0iZmFsc2UiLz4KLSAgICAgICAgPGo6aW52b2tlU3RhdGljIHZhcj0ibGlzdENsYXNzIiBjbGFzc05hbWU9ImphdmEubGFuZy5DbGFzcyIgbWV0aG9kPSJmb3JOYW1lIj48ajphcmcgdmFsdWU9ImphdmEudXRpbC5MaXN0Ii8+PC9qOmludm9rZVN0YXRpYz4KLSAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7bGlzdENsYXNzLmlzQXNzaWduYWJsZUZyb20oYmxpcC5nZXRDbGFzcygpKX0iLz4KLSAgICAgICAgPCEtLSBjaGVjayBpZiBzZWxlY3RpbmcgYmxvcC9AaWQgYXNTdHJpbmcgcmV0dXJucyBhIHN0cmluZyAtLT4KLSAgICAgICAgPHg6c2V0IHZhcj0iYmxvcElkIiBzZWxlY3Q9IiRibG9wRWxlbWVudHMvcm9vdC9ibG9wL0BpZCIgYXNTdHJpbmc9InRydWUiLz4KLSAgICAgICAgPGo6aW52b2tlU3RhdGljIHZhcj0ic3RyaW5nQ2xhc3MiIGNsYXNzTmFtZT0iamF2YS5sYW5nLkNsYXNzIiBtZXRob2Q9ImZvck5hbWUiPjxqOmFyZyB2YWx1ZT0iamF2YS5sYW5nLlN0cmluZyIvPjwvajppbnZva2VTdGF0aWM+Ci0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke3N0cmluZ0NsYXNzLmlzQXNzaWduYWJsZUZyb20oYmxvcElkLmdldENsYXNzKCkpfSIvPgotICA8L3Rlc3Q6Y2FzZT4KLSAgIAotICA8dGVzdDpjYXNlIG5hbWU9InRlc3RFbnRpdGllcyI+Ci0gICAgPHg6cGFyc2UgdmFyPSJkb2MiIHhtbD0iZW50aXR5LnhtbCIvPiAKLSAgICAKLSAgICA8IS0tanVzdCB0aGUgZW50aXR5IGlzIG91dHB1dC0tPgotICAgIDxqOnNldCB2YXI9InZhbHVlIj48eDpjb3B5T2Ygc2VsZWN0PSIkZG9jL2Evbm9kZSgpIi8+PC9qOnNldD4KLSAgICA8dGVzdDphc3NlcnRFcXVhbHMgYWN0dWFsPSIke3ZhbHVlfSIgZXhwZWN0ZWQ9InkiLz4KLSAgICAKLSAgICA8IS0tYm90aCB0aGUgZW50aXR5IGFuZCBpdCdzIGxleGljYWwgbmFtZSBhcmUgcHJvcGVybHkgb3V0cHV0LS0+Ci0gICAgPGo6c2V0IHZhcj0idmFsdWUiPjx4OmNvcHlPZiBzZWxlY3Q9IiRkb2MvYS9ub2RlKCkiIGxleGljYWw9InRydWUiLz48L2o6c2V0PgotICAgIDx0ZXN0OmFzc2VydEVxdWFscyBhY3R1YWw9IiR7dmFsdWV9IiBleHBlY3RlZD0iJmFtcDt4O3kiLz4KLSAgPC90ZXN0OmNhc2U+Ci0gICAgCi08L3Rlc3Q6c3VpdGU+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvdGVzdERvY3R5cGUuamVsbHkgYi9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvdGVzdERvY3R5cGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZjk3YTMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3Rlc3REb2N0eXBlLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseSB0cmltPSJmYWxzZSIgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM6eD0iamVsbHk6eG1sIj4NCi0NCi08eDpkb2N0eXBlIG5hbWU9ImZvbyIgcHVibGljSWQ9InB1YmxpY0lEIiBzeXN0ZW1JZD0iZm9vLmR0ZCIvPg0KLTxmb28vPg0KLQ0KLTwvajpqZWxseT4NCi0NCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvdGVzdEV4cHJlc3Npb25zLmplbGx5IGIvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3Rlc3RFeHByZXNzaW9ucy5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczZWQyMi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvdGVzdEV4cHJlc3Npb25zLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqOmplbGx5IHRyaW09ImZhbHNlIiB4bWxuczpqPSJqZWxseTpjb3JlIj4KLTx0ZXN0Y2FzZT4KLSAgICAKLSAgPGo6c2V0IHZhcj0idG9wcGluZyI+Y2hlZXNlPC9qOnNldD4KLSAgPGo6c2V0IHZhcj0iYmFzZSI+ZGVlcCBwYW48L2o6c2V0PgotCi0gIDxqOnNldCB2YXI9InRlc3QiIHZhbHVlPSJwaXp6YSBoYXMgJHt0b3BwaW5nfSBvbiB0b3AiLz4KLSAgCi0gIDxqOmlmIHRlc3Q9IiR7dGVzdCAhPSAncGl6emEgaGFzIGNoZWVzZSBvbiB0b3AnfSI+Ci0gICAgICA8ZmFpbD5hdHRyaWJ1dGUgdGVzdCBmYWlsZWQuIEZvdW5kIDxqOmV4cHIgdmFsdWU9IiR7dGVzdH0iLz4gYW5kIGV4cGVjdGVkICdwaXp6YSBoYXMgY2hlZXNlIG9uIHRvcCc8L2ZhaWw+Ci0gIDwvajppZj4KLSAgICAgIAotICA8ajpzZXQgdmFyPSJ0ZXN0Ij5waXp6YSBoYXMgJHt0b3BwaW5nfSBvbiB0b3A8L2o6c2V0PgotICAKLSAgPGo6aWYgdGVzdD0iJHt0ZXN0ICE9ICdwaXp6YSBoYXMgY2hlZXNlIG9uIHRvcCd9Ij4KLSAgICAgIDxmYWlsPmVsZW1lbnQgdGVzdCBmYWlsZWQuIEZvdW5kIDxqOmV4cHIgdmFsdWU9IiR7dGVzdH0iLz4gYW5kIGV4cGVjdGVkICdwaXp6YSBoYXMgY2hlZXNlIG9uIHRvcCc8L2ZhaWw+Ci0gIDwvajppZj4KLSAgICAgIAotPC90ZXN0Y2FzZT4KLTwvajpqZWxseT4KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3Rlc3RGb3JFYWNoLmplbGx5IGIvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3Rlc3RGb3JFYWNoLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTc4Yjg2Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC90ZXN0Rm9yRWFjaC5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxuczp4PSJqZWxseTp4bWwiPgotCi08dGVzdGNhc2U+Ci0KLSAgPHg6cGFyc2UgdmFyPSJkb2MiPgotCi0gICAgPGE+Ci0gICAgICA8YiB2PSIxIi8+Ci0gICAgICA8YiB2PSIyIi8+Ci0gICAgICA8YiB2PSIzIi8+Ci0gICAgPC9hPgotICA8L3g6cGFyc2U+Ci0KLSAgPGo6c2V0IHZhcj0iaSIgdmFsdWU9IjAiLz4KLSAgPGo6c2V0IHZhcj0iaTIiIHZhbHVlPSIwIi8+Ci0gICAgCi0gIDx4OmZvckVhY2ggc2VsZWN0PSIkZG9jL2EvYiIgdmFyPSJ4Ij4KLSAgICA8eDpzZXQgdmFyPSJpMiIgc2VsZWN0PSIkaTIgKyBudW1iZXIoJHgvQHYpIi8+Ci0gIDwveDpmb3JFYWNoPgotICAgIAotICA8eDpmb3JFYWNoIHNlbGVjdD0iJGRvYy9hIj4KLSAgICAgIDx4OmZvckVhY2ggc2VsZWN0PSJiIj4KLSAgICAgIDx4OnNldCB2YXI9ImkiIHNlbGVjdD0iJGkgKyBAdiIvPgotICAgIDwveDpmb3JFYWNoPgotICA8L3g6Zm9yRWFjaD4KLSAgCi0gIDx4OmlmIHNlbGVjdD0iJGkyICE9IDYuMCI+ICAgICAgICAgIAotICAgICAgPGZhaWw+VGhlIGkyIHNob3VsZCBiZSA2ISBidXQgdGhlIHZhbHVlIGlzIDx4OmV4cHIgc2VsZWN0PSIkaTIiLz48L2ZhaWw+Ci0gIDwveDppZj4KLSAgCi0gIDx4OmlmIHNlbGVjdD0iJGkgIT0gNi4wIj4gICAgICAgICAgCi0gICAgICA8ZmFpbD5UaGUgaSBzaG91bGQgYmUgNiEgYnV0IHRoZSB2YWx1ZSBpcyA8eDpleHByIHNlbGVjdD0iJGkiLz48L2ZhaWw+Ci0gIDwveDppZj4KLSAgCi08L3Rlc3RjYXNlPgotCi08L2o6amVsbHk+Ci0KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3Rlc3RUaHJlYWQuamVsbHkgYi9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvdGVzdFRocmVhZC5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkOTAxOC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvdGVzdFRocmVhZC5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLQ0KLSAhIEZJWE1FOiBtb3ZlIHRvIHhtbCB0YWdsaWINCi0gIS0tPg0KLTxqOmplbGx5IHRyaW09ImZhbHNlIiB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxuczp4PSJqZWxseTp4bWwiPg0KLQ0KLUFib3V0IHRvIHNwYXduIGFub3RoZXIgdGhyZWFkLi4uDQotDQotPGo6dGhyZWFkIG5hbWU9InRocmVhZDEiIGZpbGU9InRhcmdldC90aHJlYWQueG1sIj4NCi0gIDx4OnBhcnNlIHZhcj0iZG9jIj4NCi0gICAgPHdlYi1hcHA+DQotICAgICAgPHNlcnZsZXQ+DQotICAgICAgICA8c2VydmxldC1uYW1lPnNub29wPC9zZXJ2bGV0LW5hbWU+DQotICAgICAgICA8c2VydmxldC1jbGFzcz5Tbm9vcFNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+DQotICAgICAgPC9zZXJ2bGV0Pg0KLSAgICAgIDxzZXJ2bGV0Pg0KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5maWxlPC9zZXJ2bGV0LW5hbWU+DQotICAgICAgICA8c2VydmxldC1jbGFzcz5WaWV3RmlsZTwvc2VydmxldC1jbGFzcz4NCi0gICAgICAgIDxpbml0LXBhcmFtPg0KLSAgICAgICAgICA8cGFyYW0tbmFtZT5pbml0aWFsPC9wYXJhbS1uYW1lPg0KLSAgICAgICAgICA8cGFyYW0tdmFsdWU+MTAwMDwvcGFyYW0tdmFsdWU+DQotICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICBUaGUgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGNvdW50ZXIgIA0KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPC9pbml0LXBhcmFtPg0KLSAgICAgIDwvc2VydmxldD4NCi0gICAgICA8c2VydmxldC1tYXBwaW5nPg0KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5zbm9vcDwvc2VydmxldC1uYW1lPg0KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9mb28vc25vb3A8L3VybC1wYXR0ZXJuPg0KLSAgICAgIDwvc2VydmxldC1tYXBwaW5nPg0KLSAgICA8L3dlYi1hcHA+DQotICA8L3g6cGFyc2U+DQotDQotICA8ajp3aGl0ZXNwYWNlPiAgICANCi0gIDx4OnNldCB2YXI9ImNvdW50IiBzZWxlY3Q9ImNvdW50KCRkb2MvL3NlcnZsZXQpIi8+DQotICA8eDpmb3JFYWNoIHZhcj0icyIgc2VsZWN0PSIkZG9jLy9zZXJ2bGV0Ij4NCi0gICAgbmFtZTogPHg6ZXhwciBzZWxlY3Q9IiRzL3NlcnZsZXQtbmFtZSIvPg0KLSAgICBjbGFzczogPHg6ZXhwciBzZWxlY3Q9IiRzL3NlcnZsZXQtY2xhc3MiLz4NCi0gIDwveDpmb3JFYWNoPg0KLQ0KLSAgVGhlcmUgYXJlIDx4OmV4cHIgc2VsZWN0PSIkY291bnQiLz4gc2VydmxldChzKQ0KLSAgPC9qOndoaXRlc3BhY2U+ICAgIA0KLTwvajp0aHJlYWQ+DQotDQotVGhlIHRocmVhZCBzaG91bGQgaGF2ZSBzdGFydGVkIG5vdyENCi0NCi08L2o6amVsbHk+DQotDQotDQotDQotDQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3RyYW5zZm9ybUV4YW1wbGUuamVsbHkgYi9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvdHJhbnNmb3JtRXhhbXBsZS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3Y2Y3Zi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvdHJhbnNmb3JtRXhhbXBsZS5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM6eD0iamVsbHk6eG1sIj4NCi0NCi0gIDx4OnRyYW5zZm9ybSB4c2x0PSJ0cmFuc2Zvcm1FeGFtcGxlLnhzbCIgdmFyPSJkb2MiID4NCi0gICAgPGRvY3VtZW50Pg0KLSAgICAgIDxjaGFwdGVyPkl0IHdvcmtzITwvY2hhcHRlcj4NCi0gICAgPC9kb2N1bWVudD4NCi0gIDwveDp0cmFuc2Zvcm0+DQotDQotICA8eDpleHByIHNlbGVjdD0iJGRvYy9odG1sL3RpdGxlIi8+DQotDQotPC9qOmplbGx5Pg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC90cmFuc2Zvcm1FeGFtcGxlLnhzbCBiL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC90cmFuc2Zvcm1FeGFtcGxlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdmYmJlMC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvdHJhbnNmb3JtRXhhbXBsZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJkb2N1bWVudCI+Ci0gIDxodG1sPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8Ym9keT48L2JvZHk+Ci0gIDwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJjaGFwdGVyIj4KLSAgPHRpdGxlPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L3RpdGxlPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvdHJhbnNmb3JtRXhhbXBsZTEueHNsIGIvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3RyYW5zZm9ybUV4YW1wbGUxLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3ZjdhMC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvdHJhbnNmb3JtRXhhbXBsZTEueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZG9jdW1lbnQiPgotPGRhdGExPgotICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDxkYXRhMV9ib2R5PjwvZGF0YTFfYm9keT4KLTwvZGF0YTE+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hhcHRlciI+Ci08ZGF0YTFfdGl0bGU+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvZGF0YTFfdGl0bGU+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3RyYW5zZm9ybUV4YW1wbGUyLnhzbCBiL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC90cmFuc2Zvcm1FeGFtcGxlMi54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNTNlMTUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3RyYW5zZm9ybUV4YW1wbGUyLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRhdGExIj4KLTxkYXRhMj4KLSAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICA8ZGF0YTJfYm9keT48L2RhdGEyX2JvZHk+Ci08L2RhdGEyPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRhdGExX3RpdGxlIj4KLTxkYXRhMl90aXRsZT48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9kYXRhMl90aXRsZT4KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvdHJhbnNmb3JtRXhhbXBsZTMueHNsIGIvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3RyYW5zZm9ybUV4YW1wbGUzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmYWE3Yi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvdHJhbnNmb3JtRXhhbXBsZTMueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZGF0YTIiPgotPGRhdGEzPgotICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDxkYXRhM19ib2R5PjwvZGF0YTNfYm9keT4KLTwvZGF0YTM+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZGF0YTJfdGl0bGUiPgotPGRhdGEzX3RpdGxlPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2RhdGEzX3RpdGxlPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC90cmFuc2Zvcm1FeGFtcGxlNC54c2wgYi9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvdHJhbnNmb3JtRXhhbXBsZTQueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDMwYTJhLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC90cmFuc2Zvcm1FeGFtcGxlNC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJkYXRhMyI+Ci08ZGF0YTQ+Ci0gIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgPGRhdGE0X2JvZHk+PC9kYXRhNF9ib2R5PgotPC9kYXRhND4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJkYXRhM190aXRsZSI+Ci08ZGF0YTRfdGl0bGU+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvZGF0YTRfdGl0bGU+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KLQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3RyYW5zZm9ybUV4YW1wbGU1LnhzbCBiL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC90cmFuc2Zvcm1FeGFtcGxlNS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmODdjN2IuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3RyYW5zZm9ybUV4YW1wbGU1LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRhdGE0Ij4KLTxkYXRhNT4KLSAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICA8ZGF0YTVfYm9keT48L2RhdGE1X2JvZHk+Ci08L2RhdGE1PgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRhdGE0X3RpdGxlIj4KLTxkYXRhNV90aXRsZT48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9kYXRhNV90aXRsZT4KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvdHJhbnNmb3JtRXhhbXBsZUFsbEluTGluZS5qZWxseSBiL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC90cmFuc2Zvcm1FeGFtcGxlQWxsSW5MaW5lLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWY0YzBlLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC90cmFuc2Zvcm1FeGFtcGxlQWxsSW5MaW5lLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxuczp4PSJqZWxseTp4bWwiPg0KLQ0KLSAgPHg6cGFyc2UgdmFyPSJ4c2xfZG9jIj4NCi0gICAgICAgICAgICAgICAgPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPg0KLQ0KLSAgICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvY3VtZW50Ij4NCi0gICAgICAgIDxodG1sPg0KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQotICAgICAgICAgIDxib2R5PjwvYm9keT4NCi0gICAgICAgIDwvaHRtbD4NCi0gICAgICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gICAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjaGFwdGVyIj4NCi0gICAgICAgIDx0aXRsZT48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC90aXRsZT4NCi0gICAgICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gICAgPC94c2w6c3R5bGVzaGVldD4NCi0gICAgICAgIDwveDpwYXJzZT4NCi0NCi0gIDx4OnRyYW5zZm9ybSB4c2x0PSIke3hzbF9kb2N9IiB2YXI9ImRvYyIgPg0KLSAgICA8ZG9jdW1lbnQ+DQotICAgICAgPGNoYXB0ZXI+SXQgd29ya3MhPC9jaGFwdGVyPg0KLSAgICA8L2RvY3VtZW50Pg0KLSAgPC94OnRyYW5zZm9ybT4NCi0NCi0gIDx4OmV4cHIgc2VsZWN0PSIkZG9jL2h0bWwvdGl0bGUiLz4NCi0NCi08L2o6amVsbHk+DQotDQotDQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3RyYW5zZm9ybUV4YW1wbGVTQVhPdXRwdXQuamVsbHkgYi9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvdHJhbnNmb3JtRXhhbXBsZVNBWE91dHB1dC5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkOGZhMC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvdHJhbnNmb3JtRXhhbXBsZVNBWE91dHB1dC5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM6eD0iamVsbHk6eG1sIj4NCi0NCi0gIDx4OnBhcnNlIHZhcj0ieHNsX2RvYyI+DQotICAgICAgICAgICAgICAgIDx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4NCi0NCi0gICAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkb2N1bWVudCI+DQotICAgICAgICA8aHRtbD4NCi0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPg0KLSAgICAgICAgICA8Ym9keT48L2JvZHk+DQotICAgICAgICA8L2h0bWw+DQotICAgICAgPC94c2w6dGVtcGxhdGU+DQotDQotICAgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hhcHRlciI+DQotICAgICAgICA8dGl0bGU+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvdGl0bGU+DQotICAgICAgPC94c2w6dGVtcGxhdGU+DQotDQotICAgIDwveHNsOnN0eWxlc2hlZXQ+DQotICAgICAgICA8L3g6cGFyc2U+DQotDQotICAgICAgICA8IS0tIGhlcmUgd2UncmUgdGVzdGluZyBpZiB0aGUgb3V0cHV0IG9mIHRoZSBYU0xUIGNvbWVzIG91dCBhcyBTQVggZXZlbnRzDQotICAgICAgICAgICAgICAgIHx8IHRoYXQgdGhlIDx4OnBhcnNlPiB0YWcgY2FuIHRoZW4gcGFyc2UuDQotICAgICAgICAgICAgICAgIHx8IFdlJ3JlIHVzaW5nIHRoZSA8eDpwYXJzZT4gYXJvdW5kIHRoZSA8eDp0cmFuc2Zvcm0+IHB1cmVseSB0byB0ZXN0DQotICAgICAgICAgICAgICAgIHx8IHRoYXQgdGhlIDx4OnRyYW5zZm9ybT4gaXMgY2FwYWJsZSBvZiBvdXRwdXR0aW5nIFNBWCBldmVudHMgLS0+DQotICAgICAgICA8eDpwYXJzZSB2YXI9ImRvYyI+ICAgICAgICAgICAgIA0KLSAgICAgICAgICA8eDp0cmFuc2Zvcm0geHNsdD0iJHt4c2xfZG9jfSI+DQotICAgICAgICAgICAgPGRvY3VtZW50Pg0KLSAgICAgICAgICAgICAgPGNoYXB0ZXI+SXQgd29ya3MhPC9jaGFwdGVyPg0KLSAgICAgICAgICAgIDwvZG9jdW1lbnQ+DQotICAgICAgICAgIDwveDp0cmFuc2Zvcm0+DQotICAgICAgICA8L3g6cGFyc2U+ICAgICAgDQotICAgICAgICANCi0gIDx4OmV4cHIgc2VsZWN0PSIkZG9jL2h0bWwvdGl0bGUiLz4NCi0NCi08L2o6amVsbHk+DQotDQotDQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3RyYW5zZm9ybUV4YW1wbGVTQVhPdXRwdXROZXN0ZWRUcmFuc2Zvcm1zLmplbGx5IGIvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3RyYW5zZm9ybUV4YW1wbGVTQVhPdXRwdXROZXN0ZWRUcmFuc2Zvcm1zLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmI4OGZhLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC90cmFuc2Zvcm1FeGFtcGxlU0FYT3V0cHV0TmVzdGVkVHJhbnNmb3Jtcy5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM6eD0iamVsbHk6eG1sIj4NCi0NCi0gIDx4OnRyYW5zZm9ybSB4c2x0PSJ0cmFuc2Zvcm1FeGFtcGxlNS54c2wiIHZhcj0iZG9jIj4NCi0gICAgICA8eDp0cmFuc2Zvcm0geHNsdD0idHJhbnNmb3JtRXhhbXBsZTQueHNsIj4NCi0gICAgICAgIDx4OnRyYW5zZm9ybSB4c2x0PSJ0cmFuc2Zvcm1FeGFtcGxlMy54c2wiPg0KLSAgICAgICAgICAgIDx4OnRyYW5zZm9ybSB4c2x0PSJ0cmFuc2Zvcm1FeGFtcGxlMi54c2wiPg0KLSAgICAgICAgICAgICAgICA8eDp0cmFuc2Zvcm0geHNsdD0idHJhbnNmb3JtRXhhbXBsZTEueHNsIj4NCi0gICAgICAgICAgICAgICAgICAgIDxkb2N1bWVudD4NCi0gICAgICAgICAgICAgICAgICAgICAgPGNoYXB0ZXI+SXQgd29ya3MhPC9jaGFwdGVyPg0KLSAgICAgICAgICAgICAgICAgICAgPC9kb2N1bWVudD4NCi0gICAgICAgICAgICAgICAgPC94OnRyYW5zZm9ybT4NCi0gICAgICAgICAgICA8L3g6dHJhbnNmb3JtPg0KLSAgICAgICAgPC94OnRyYW5zZm9ybT4NCi0gICAgICA8L3g6dHJhbnNmb3JtPg0KLSAgPC94OnRyYW5zZm9ybT4NCi0NCi0gIDx4OmV4cHIgc2VsZWN0PSIkZG9jL2RhdGE1L2RhdGE1X3RpdGxlIi8+DQotDQotPC9qOmplbGx5Pg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC90cmFuc2Zvcm1FeGFtcGxlWG1sVmFyLmplbGx5IGIvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3RyYW5zZm9ybUV4YW1wbGVYbWxWYXIuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYjNhNjYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3RyYW5zZm9ybUV4YW1wbGVYbWxWYXIuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiIHhtbG5zOng9ImplbGx5OnhtbCI+DQotDQotICA8eDp0cmFuc2Zvcm0geHNsdD0idHJhbnNmb3JtRXhhbXBsZS54c2wiIHhtbD0idHJhbnNmb3JtRXhhbXBsZVhtbFZhci54bWwiIHZhcj0iZG9jIi8+DQotDQotICA8eDpleHByIHNlbGVjdD0iJGRvYy9odG1sL3RpdGxlIi8+DQotDQotPC9qOmplbGx5Pg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC90cmFuc2Zvcm1FeGFtcGxlWG1sVmFyLnhtbCBiL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC90cmFuc2Zvcm1FeGFtcGxlWG1sVmFyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkNWI1YS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvdHJhbnNmb3JtRXhhbXBsZVhtbFZhci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotICAgIDxkb2N1bWVudD4KLSAgICAgIDxjaGFwdGVyPkl0IHdvcmtzITwvY2hhcHRlcj4KLSAgICA8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3RyYW5zZm9ybVBhcmFtRXhhbXBsZS5qZWxseSBiL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC90cmFuc2Zvcm1QYXJhbUV4YW1wbGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOTdmMTguLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3RyYW5zZm9ybVBhcmFtRXhhbXBsZS5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSIgeG1sbnM6eD0iamVsbHk6eG1sIj4NCi0NCi0gIDx4OnRyYW5zZm9ybSB4c2x0PSJ0cmFuc2Zvcm1QYXJhbUV4YW1wbGUueHNsIiB2YXI9ImRvYyIgeG1sPSJ0cmFuc2Zvcm1QYXJhbUV4YW1wbGUueG1sIj4NCi0gICAgPHg6cGFyYW0gbmFtZT0icGFyYW0xIiB2YWx1ZT0iSXQgd29ya3MhIi8+DQotICA8L3g6dHJhbnNmb3JtPg0KLQ0KLSAgPHg6ZXhwciBzZWxlY3Q9IiRkb2Mvb3V0Ii8+DQotDQotPC9qOmplbGx5Pg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC90cmFuc2Zvcm1QYXJhbUV4YW1wbGUueG1sIGIvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3RyYW5zZm9ybVBhcmFtRXhhbXBsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MmViZmMuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3RyYW5zZm9ybVBhcmFtRXhhbXBsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGRvYz5IZWxsbzwvZG9jPgotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWwvdHJhbnNmb3JtUGFyYW1FeGFtcGxlLnhzbCBiL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC90cmFuc2Zvcm1QYXJhbUV4YW1wbGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjAwOWRlLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC90cmFuc2Zvcm1QYXJhbUV4YW1wbGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLSAgPHhzbDpwYXJhbSBuYW1lPSJwYXJhbTEiIHNlbGVjdD0iJ2RlZmF1bHQgdmFsdWUnIi8+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYyI+Ci0gICAgPG91dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhcmFtMSIvPjwvb3V0PgotICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+Ci0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC90cmFuc2Zvcm1QYXJhbUV4YW1wbGUyLmplbGx5IGIvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3RyYW5zZm9ybVBhcmFtRXhhbXBsZTIuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZDAzYmEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3RyYW5zZm9ybVBhcmFtRXhhbXBsZTIuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiIHhtbG5zOng9ImplbGx5OnhtbCI+DQotDQotICAgIDx4OnBhcnNlIHZhcj0ieHNsX2RvYyI+DQotICAgICAgICA8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+DQotICAgICAgICAgIDx4c2w6cGFyYW0gbmFtZT0icGFyYW0xIiBzZWxlY3Q9IidkZWZhdWx0IHZhbHVlIDEnIi8+DQotICAgICAgICAgIDx4c2w6cGFyYW0gbmFtZT0icGFyYW0yIiBzZWxlY3Q9IidkZWZhdWx0IHZhbHVlIDInIi8+DQotICAgICAgICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYyI+DQotICAgICAgICAgICAgPG91dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhcmFtMSIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFyYW0yIi8+PC9vdXQ+DQotICAgICAgICAgIDwveHNsOnRlbXBsYXRlPg0KLSAgICAgICAgPC94c2w6c3R5bGVzaGVldD4NCi0gICAgPC94OnBhcnNlPg0KLQ0KLSAgPHg6dHJhbnNmb3JtIHhzbHQ9IiR7eHNsX2RvY30iIHZhcj0iZG9jIj4NCi0gICAgPGRvYz5IZWxsbzwvZG9jPg0KLSAgICA8eDpwYXJhbSBuYW1lPSJwYXJhbTEiIHZhbHVlPSJJdCAiLz4NCi0gICAgPHg6cGFyYW0gbmFtZT0icGFyYW0yIj53b3JrcyE8L3g6cGFyYW0+DQotICA8L3g6dHJhbnNmb3JtPg0KLQ0KLSAgPHg6ZXhwciBzZWxlY3Q9IiRkb2Mvb3V0Ii8+DQotDQotPC9qOmplbGx5Pg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbC94cGF0aFNvcnRFeGFtcGxlLmplbGx5IGIvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3hwYXRoU29ydEV4YW1wbGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YTk2OTEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sL3hwYXRoU29ydEV4YW1wbGUuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiIHhtbG5zOnRlc3Q9ImplbGx5Omp1bml0IiB4bWxuczp4PSJqZWxseTp4bWwiPg0KLSAgICA8eDpwYXJzZSB2YXI9Im51bXMiPg0KLSAgICAgICAgPGE+DQotICAgICAgICAgICAgPGIgdj0iMyIvPg0KLSAgICAgICAgICAgIDxiIHY9IjIiLz4NCi0gICAgICAgICAgICA8YiB2PSIxIi8+DQotICAgICAgICAgICAgPGIgdj0iMTEiLz4NCi0gICAgICAgICAgICA8YiB2PSIxLjQiLz4NCi0gICAgICAgICAgICA8YiB2PSIxLjIiLz4NCi0gICAgICAgIDwvYT4NCi0gICAgPC94OnBhcnNlPg0KLQ0KLSAgICA8eDpwYXJzZSB2YXI9InN0cnMiPg0KLSAgICAgICAgPGE+DQotICAgICAgICAgICAgPGIgdj0ieiIvPg0KLSAgICAgICAgICAgIDxiIHY9ImciLz4NCi0gICAgICAgICAgICA8YiB2PSJkIi8+DQotICAgICAgICAgICAgPGIgdj0iYSIvPg0KLSAgICAgICAgPC9hPg0KLSAgICA8L3g6cGFyc2U+DQotDQotICAgIDx4OnBhcnNlIHZhcj0iZGVlcGVyIj4NCi0gICAgICAgIDxhPg0KLSAgICAgICAgICAgIDxiPjxjPjxkPjM8ZT4xPC9lPjwvZD48L2M+PC9iPg0KLSAgICAgICAgICAgIDxiPjxjPjxkPjI8ZT4xMTwvZT48L2Q+PC9jPjwvYj4NCi0gICAgICAgICAgICA8Yj48Yz48ZD4xPC9kPjwvYz48L2I+DQotICAgICAgICAgICAgPGI+PGM+PGQ+MTE8L2Q+PC9jPjwvYj4NCi0gICAgICAgIDwvYT4NCi0gICAgPC94OnBhcnNlPg0KLQ0KLSAgICA8ajpzZXQgdmFyPSJyZXN1bHQiIHZhbHVlPSIiLz4NCi0gICAgPHg6Zm9yRWFjaCBzZWxlY3Q9IiRudW1zL2EvYiIgdmFyPSJ4IiBzb3J0PSJAdiI+DQotICAgICAgICA8eDpzZXQgdmFyPSJudW0iIHNlbGVjdD0iJHgvQHYiLz4NCi0gICAgICAgIDxqOnNldCB2YXI9InJlc3VsdCIgdmFsdWU9IiR7cmVzdWx0fSAke251bS5nZXQoMCkuZ2V0VGV4dCgpfSIvPg0KLSAgICA8L3g6Zm9yRWFjaD4NCi0gICAgJHtyZXN1bHR9DQotDQotICAgIDxqOnNldCB2YXI9InJlc3VsdCIgdmFsdWU9IiIvPg0KLSAgICA8eDpmb3JFYWNoIHNlbGVjdD0iJG51bXMvYS9iIiB2YXI9IngiIHNvcnQ9IkB2IiBkZXNjZW5kaW5nPSJ0cnVlIj4NCi0gICAgICAgIDx4OnNldCB2YXI9Im51bSIgc2VsZWN0PSIkeC9AdiIvPg0KLSAgICAgICAgPGo6c2V0IHZhcj0icmVzdWx0IiB2YWx1ZT0iJHtyZXN1bHR9ICR7bnVtLmdldCgwKS5nZXRUZXh0KCl9Ii8+DQotICAgIDwveDpmb3JFYWNoPg0KLSAgICAke3Jlc3VsdH0NCi0NCi0gICAgPGo6c2V0IHZhcj0icmVzdWx0IiB2YWx1ZT0iIi8+DQotICAgIDx4OmZvckVhY2ggc2VsZWN0PSIkbnVtcy9hL2IiIHZhcj0ieCIgc29ydD0iQHYiIHNvcnREYXRhVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+DQotICAgICAgICA8eDpzZXQgdmFyPSJudW0iIHNlbGVjdD0iJHgvQHYiLz4NCi0gICAgICAgIDxqOnNldCB2YXI9InJlc3VsdCIgdmFsdWU9IiR7cmVzdWx0fSAke251bS5nZXQoMCkuZ2V0VGV4dCgpfSIvPg0KLSAgICA8L3g6Zm9yRWFjaD4NCi0gICAgJHtyZXN1bHR9DQotDQotICAgIDxqOnNldCB2YXI9InJlc3VsdCIgdmFsdWU9IiIvPg0KLSAgICA8eDpmb3JFYWNoIHNlbGVjdD0iJHN0cnMvYS9iIiB2YXI9IngiIHNvcnQ9IkB2Ij4NCi0gICAgICAgIDx4OnNldCB2YXI9InN0ciIgc2VsZWN0PSIkeC9AdiIvPg0KLSAgICAgICAgPGo6c2V0IHZhcj0icmVzdWx0IiB2YWx1ZT0iJHtyZXN1bHR9ICR7c3RyLmdldCgwKS5nZXRUZXh0KCl9Ii8+DQotICAgIDwveDpmb3JFYWNoPg0KLSAgICAke3Jlc3VsdH0NCi0NCi0gICAgPGo6c2V0IHZhcj0icmVzdWx0IiB2YWx1ZT0iIi8+DQotICAgIDx4OmZvckVhY2ggc2VsZWN0PSIkZGVlcGVyL2EvYiIgdmFyPSJ4IiBzb3J0PSJjL2QiPg0KLSAgICAgICAgPGo6c2V0IHZhcj0icmVzdWx0IiB2YWx1ZT0iJHtyZXN1bHR9ICR7eC5nZXRTdHJpbmdWYWx1ZSgpfSIvPg0KLSAgICA8L3g6Zm9yRWFjaD4NCi0gICAgJHtyZXN1bHR9DQotDQotICAgIDxqOnNldCB2YXI9InJlc3VsdCIgdmFsdWU9IiIvPg0KLSAgICA8eDpzZXQgdmFyPSJyc2V0IiBzZWxlY3Q9IiRudW1zL2EvYiIgc29ydD0iQHYiLz4NCi0gICAgPGo6Zm9yRWFjaCB2YXI9Im51bSIgaXRlbXM9IiR7cnNldC5pdGVyYXRvcigpfSI+DQotICAgICAgICA8ajpzZXQgdmFyPSJyZXN1bHQiIHZhbHVlPSIke3Jlc3VsdH0gJHtudW0uYXR0cmlidXRlVmFsdWUoJ3YnKX0iLz4NCi0gICAgPC9qOmZvckVhY2g+DQotICAgICR7cmVzdWx0fQ0KLQ0KLSAgICA8ajpzZXQgdmFyPSJyZXN1bHQiIHZhbHVlPSIiLz4NCi0gICAgPHg6c2V0IHZhcj0icnNldCIgc2VsZWN0PSIkbnVtcy9hL2IiLz4NCi0gICAgPHg6c29ydCBsaXN0PSIke3JzZXR9IiBzb3J0PSJAdiIvPg0KLSAgICA8ajpmb3JFYWNoIHZhcj0ibnVtIiBpdGVtcz0iJHtyc2V0Lml0ZXJhdG9yKCl9Ij4NCi0gICAgICAgIDxqOnNldCB2YXI9InJlc3VsdCIgdmFsdWU9IiR7cmVzdWx0fSAke251bS5hdHRyaWJ1dGVWYWx1ZSgndicpfSIvPg0KLSAgICA8L2o6Zm9yRWFjaD4NCi0gICAgJHtyZXN1bHR9DQotDQotPC9qOmplbGx5PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L3Jlc291cmNlcy9pbXBvcnQuamVsbHkgYi9qZWxseS10YWdzL3htbC9zcmMvdGVzdC9yZXNvdXJjZXMvaW1wb3J0LmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjk2NzY5Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L3Jlc291cmNlcy9pbXBvcnQuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiIHhtbG5zOng9ImplbGx5OnhtbCIgPgotPHg6dHJhbnNmb3JtIHhzbHQ9ImltcG9ydC54c2wiPgotPHg6cGFyYW0gbmFtZT0ibGFuZ3VhZ2UiIHZhbHVlPSJERSIvPgotPHJvb3QvPgotPC94OnRyYW5zZm9ybT4KLTwvajpqZWxseT4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sL3NyYy90ZXN0L3Jlc291cmNlcy9pbXBvcnQueHNsIGIvamVsbHktdGFncy94bWwvc3JjL3Rlc3QvcmVzb3VyY2VzL2ltcG9ydC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3Nzk0NWUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWwvc3JjL3Rlc3QvcmVzb3VyY2VzL2ltcG9ydC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gICAgICAgICAgICAgICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9zdHJpY3QiPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICA8aHRtbD4KLSAgICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+RXhwZW5zZSBSZXBvcnQgU3VtbWFyeTwvdGl0bGU+Ci0gICAgICA8L2hlYWQ+Ci0gICAgICA8Ym9keT4KLSAgICAgICAgPHA+VG90YWwgQW1vdW50OiAxMjwvcD4KLSAgICAgIDwvYm9keT4KLSAgICA8L2h0bWw+Ci0gIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbC94ZG9jcy9jaGFuZ2VzLnhtbCBiL2plbGx5LXRhZ3MveG1sL3hkb2NzL2NoYW5nZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjk5ZjY3Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3hkb2NzL2NoYW5nZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLSAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSAtLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+Q2hhbmdlczwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotICA8Ym9keT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjAiIGRhdGU9IjIwMDQtMDktMTEiPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImFkZCI+SW5pdGlhbCByZWxlYXNlPC9hY3Rpb24+Ci0gICAgPC9yZWxlYXNlPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWwveGRvY3MvaW5kZXgueG1sIGIvamVsbHktdGFncy94bWwveGRvY3MvaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2E2MTM2Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3hkb2NzL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPlhNTCBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotICAgIDxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KLSAgICAgIDxwPgotICAgICAgICBUaGUgWE1MIFRhZ3MgZnJvbSB0aGUgSlNUTC4KLSAgICAgICAgICBTZWUgdGhlIDxhIGhyZWY9InRhZ3MuaHRtbCI+dGFnczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICA8L3A+Ci0gICAgPC9zZWN0aW9uPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbC94ZG9jcy9uYXZpZ2F0aW9uLnhtbCBiL2plbGx5LXRhZ3MveG1sL3hkb2NzL25hdmlnYXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmI1ZjNjLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sL3hkb2NzL25hdmlnYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBuYW1lPSJYTUwgVGFnIExpYnJhcnkiPgotCi0gIDx0aXRsZT5YTUwgVGFnIExpYnJhcnk8L3RpdGxlPgotICAKLSAgPGJvZHk+Ci0gICAgPG1lbnUgbmFtZT0iWE1MIFRhZyBMaWJyYXJ5Ij4KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICAgICAgICAgICBocmVmPSIvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iVGFncyIgICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWdzLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sdW5pdC8uY3ZzaWdub3JlIGIvamVsbHktdGFncy94bWx1bml0Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYmYxYTYuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWx1bml0Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLW1hdmVuLmxvZwotdGFyZ2V0Ci1saWIKLXZlbG9jaXR5LmxvZwpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWx1bml0L2J1aWxkLnhtbCBiL2plbGx5LXRhZ3MveG1sdW5pdC9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNzE3YTUuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWx1bml0L2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tYnVpbGQueG1sIGdlbmVyYXRlZCBieSBtYXZlbiBmcm9tIHByb2plY3QueG1sIHZlcnNpb24gMS4wLVNOQVBTSE9UCi0gIG9uIGRhdGUgTWF5IDI0IDIwMDQsIHRpbWUgMjMwMS0tPgotPHByb2plY3QgZGVmYXVsdD0iamFyIiBuYW1lPSJjb21tb25zLWplbGx5LXRhZ3MteG1sdW5pdCIgYmFzZWRpcj0iLiI+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkZWZhdWx0dGFyZ2V0ZGlyIiB2YWx1ZT0idGFyZ2V0Ij4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYmRpciIgdmFsdWU9InRhcmdldC9saWIiPgotICA8L3Byb3BlcnR5PgotICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlc2RpciIgdmFsdWU9InRhcmdldC9jbGFzc2VzIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RjbGFzc2VzZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cmVwb3J0ZGlyIiB2YWx1ZT0idGFyZ2V0L3Rlc3QtcmVwb3J0cyI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0ZGlyIiB2YWx1ZT0iZGlzdCI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jZGlyIiB2YWx1ZT0iZGlzdC9kb2NzL2FwaSI+Ci0gIDwvcHJvcGVydHk+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJmaW5hbC5uYW1lIiB2YWx1ZT0iY29tbW9ucy1qZWxseS10YWdzLXhtbHVuaXQtMS4wLVNOQVBTSE9UIj4KLSAgPC9wcm9wZXJ0eT4KLSAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0ibyBJbml0aWFsaXplcyBzb21lIHByb3BlcnRpZXMiPgotICAgIDxta2RpciBkaXI9IiR7bGliZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJub2dldCI+Ci0gICAgICA8ZXF1YWxzIGFyZzI9Im9ubHkiIGFyZzE9IiR7YnVpbGQuc3lzY2xhc3NwYXRofSI+Ci0gICAgICA8L2VxdWFscz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249Im8gQ29tcGlsZSB0aGUgY29kZSIgZGVwZW5kcz0iZ2V0LWRlcHMiPgotICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGphdmFjIGRlc3RkaXI9IiR7Y2xhc3Nlc2Rpcn0iIGRlcHJlY2F0aW9uPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSIgb3B0aW1pemU9ImZhbHNlIiBleGNsdWRlcz0iKiovcGFja2FnZS5odG1sIj4KLSAgICAgIDxzcmM+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL2phdmEiPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgPC9zcmM+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLSAgICA8Y29weSB0b2Rpcj0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy9qYXZhIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgICA8Y29weSB0b2Rpcj0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdCI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamVsbHkiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhzbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5ybmciPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouZHRkIj4KLSAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiPgotICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouaHRtbCI+Ci0gICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphciIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIHRoZSBqYXIiIGRlcGVuZHM9ImNvbXBpbGUsdGVzdCI+Ci0gICAgPGphciBqYXJmaWxlPSJ0YXJnZXQvJHtmaW5hbC5uYW1lfS5qYXIiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiIGJhc2VkaXI9IiR7Y2xhc3Nlc2Rpcn0iPgotICAgIDwvamFyPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249Im8gQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBkaXJlY3RvcmllcyI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGVmYXVsdHRhcmdldGRpcn0iPgotICAgIDwvZGVsZXRlPgotICAgIDxkZWxldGUgZGlyPSIke2Rpc3RkaXJ9Ij4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVzY3JpcHRpb249Im8gQ3JlYXRlIGEgZGlzdHJpYnV0aW9uIiBkZXBlbmRzPSJqYXIsIGphdmFkb2MiPgotICAgIDxta2RpciBkaXI9ImRpc3QiPgotICAgIDwvbWtkaXI+Ci0gICAgPGNvcHkgdG9kaXI9ImRpc3QiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2RlZmF1bHR0YXJnZXRkaXJ9IiBpbmNsdWRlcz0iKi5qYXIiPgotICAgICAgPC9maWxlc2V0PgotICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRlcz0iTElDRU5TRSosIFJFQURNRSoiPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249Im8gUnVuIHRoZSB0ZXN0IGNhc2VzIiBpZj0idGVzdC5mYWlsdXJlIiBkZXBlbmRzPSJpbnRlcm5hbC10ZXN0Ij4KLSAgICA8ZmFpbCBtZXNzYWdlPSJUaGVyZSB3ZXJlIHRlc3QgZmFpbHVyZXMuIj4KLSAgICA8L2ZhaWw+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImludGVybmFsLXRlc3QiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdHMiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdHJlcG9ydGRpcn0iPgotICAgIDwvbWtkaXI+Ci0gICAgPGp1bml0IGRpcj0iLi8iIGZhaWx1cmVwcm9wZXJ0eT0idGVzdC5mYWlsdXJlIiBwcmludFN1bW1hcnk9InllcyIgZm9yaz0idHJ1ZSIgaGFsdG9uZXJyb3I9InRydWUiPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYmFzZWRpciIgdmFsdWU9Ii4iPgotICAgICAgPC9zeXNwcm9wZXJ0eT4KLSAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIj4KLSAgICAgIDwvZm9ybWF0dGVyPgotICAgICAgPGZvcm1hdHRlciB1c2VmaWxlPSJmYWxzZSIgdHlwZT0icGxhaW4iPgotICAgICAgPC9mb3JtYXR0ZXI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHt0ZXN0Y2xhc3Nlc2Rpcn0iPgotICAgICAgICA8L3BhdGhlbGVtZW50PgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjbGFzc2VzZGlyfSI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdHJlcG9ydGRpcn0iPgotICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9UZXN0Ki5qYXZhIj4KLSAgICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvYmF0Y2h0ZXN0PgotICAgIDwvanVuaXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtdGVzdHMiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdGNsYXNzZXNkaXJ9Ij4KLSAgICA8L21rZGlyPgotICAgIDxqYXZhYyBkZXN0ZGlyPSIke3Rlc3RjbGFzc2VzZGlyfSIgZGVwcmVjYXRpb249InRydWUiIGRlYnVnPSJ0cnVlIiBvcHRpbWl6ZT0iZmFsc2UiIGV4Y2x1ZGVzPSIqKi9wYWNrYWdlLmh0bWwiPgotICAgICAgPHNyYz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvdGVzdCI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L3NyYz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJkaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciI+Ci0gICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzZXNkaXJ9Ij4KLSAgICAgICAgPC9wYXRoZWxlbWVudD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MiIGRlc2NyaXB0aW9uPSJvIEdlbmVyYXRlIGphdmFkb2MiIGRlcGVuZHM9ImphciI+Ci0gICAgPG1rZGlyIGRpcj0iJHtqYXZhZG9jZGlyfSI+Ci0gICAgPC9ta2Rpcj4KLSAgICA8dHN0YW1wPgotICAgICAgPGZvcm1hdCBwYXR0ZXJuPSIyMDAyLXl5eXkiIHByb3BlcnR5PSJ5ZWFyIj4KLSAgICAgIDwvZm9ybWF0PgotICAgIDwvdHN0YW1wPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb3B5cmlnaHQiIHZhbHVlPSJDb3B5cmlnaHQgJmFtcDtjb3B5OyAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIj4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSIgdmFsdWU9ImNvbW1vbnMtamVsbHktdGFncy14bWx1bml0IDEuMC1TTkFQU0hPVCBBUEkiPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPGphdmFkb2MgdXNlPSJ0cnVlIiBwcml2YXRlPSJ0cnVlIiBkZXN0ZGlyPSIke2phdmFkb2NkaXJ9IiBhdXRob3I9InRydWUiIHZlcnNpb249InRydWUiIHNvdXJjZXBhdGg9InNyYy9qYXZhIiBwYWNrYWdlbmFtZXM9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnhtbHVuaXQuKiI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiPgotICAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InRhcmdldC8ke2ZpbmFsLm5hbWV9LmphciI+Ci0gICAgICAgIDwvcGF0aGVsZW1lbnQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFkb2M+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImdldC1kZXBzIiB1bmxlc3M9Im5vZ2V0IiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWplbGx5LVNOQVBTSE9ULmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2phcnMvY29tbW9ucy1qZWxseS1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3htbHVuaXQtMC44LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94bWx1bml0L2phcnMveG1sdW5pdC0wLjguamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qdW5pdC0zLjguMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vanVuaXQvamFycy9qdW5pdC0zLjguMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktdGFncy1qdW5pdC1TTkFQU0hPVC5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1qZWxseS9qYXJzL2NvbW1vbnMtamVsbHktdGFncy1qdW5pdC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtamVsbHktdGFncy14bWwtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamVsbHkvamFycy9jb21tb25zLWplbGx5LXRhZ3MteG1sLVNOQVBTSE9ULmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veGFsYW4tMi4zLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3hhbGFuL2phcnMveGFsYW4tMi4zLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWpleGwtU05BUFNIT1QuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtamV4bC9qYXJzL2NvbW1vbnMtamV4bC1TTkFQU0hPVC5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L3htbC1hcGlzLTEuMC5iMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veG1sLWFwaXMvamFycy94bWwtYXBpcy0xLjAuYjIuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9jb21tb25zLWJlYW51dGlscy0xLjYuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtYmVhbnV0aWxzL2phcnMvY29tbW9ucy1iZWFudXRpbHMtMS42LmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vY29tbW9ucy1jb2xsZWN0aW9ucy0yLjEuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2NvbW1vbnMtY29sbGVjdGlvbnMvamFycy9jb21tb25zLWNvbGxlY3Rpb25zLTIuMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2NvbW1vbnMtbG9nZ2luZy0xLjAuMy5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vY29tbW9ucy1sb2dnaW5nL2phcnMvY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vZG9tNGotMS41LWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vZG9tNGovamFycy9kb200ai0xLjUtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0vamF4ZW4tMS4xLWJldGEtMi5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vamF4ZW4vamFycy9qYXhlbi0xLjEtYmV0YS0yLmphciI+Ci0gICAgPC9nZXQ+Ci0gICAgPGdldCBkZXN0PSIke2xpYmRpcn0veGVyY2VzLTIuMi4xLmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94ZXJjZXMvamFycy94ZXJjZXMtMi4yLjEuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9qdW5pdC0zLjguMS5qYXIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgaWdub3JlZXJyb3JzPSJ0cnVlIiBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vanVuaXQvamFycy9qdW5pdC0zLjguMS5qYXIiPgotICAgIDwvZ2V0PgotICAgIDxnZXQgZGVzdD0iJHtsaWJkaXJ9L2FudC0xLjUuamFyIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2FudC9qYXJzL2FudC0xLjUuamFyIj4KLSAgICA8L2dldD4KLSAgICA8Z2V0IGRlc3Q9IiR7bGliZGlyfS9hbnQtb3B0aW9uYWwtMS41LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9hbnQvamFycy9hbnQtb3B0aW9uYWwtMS41LmphciI+Ci0gICAgPC9nZXQ+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtbWF2ZW4iPgotICAgIDxnZXQgZGVzdD0iJHt1c2VyLmhvbWV9L21hdmVuLWluc3RhbGwtbGF0ZXN0LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiBzcmM9IiR7cmVwb30vbWF2ZW4vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L2dldD4KLSAgICA8dW5qYXIgZGVzdD0iJHttYXZlbi5ob21lfSIgc3JjPSIke3VzZXIuaG9tZX0vbWF2ZW4taW5zdGFsbC1sYXRlc3QuamFyIj4KLSAgICA8L3VuamFyPgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbHVuaXQvbWF2ZW4ueG1sIGIvamVsbHktdGFncy94bWx1bml0L21hdmVuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdjNGFjZS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbHVuaXQvbWF2ZW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgZGVmYXVsdD0iamF2YTpqYXIiPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbHVuaXQvcHJvamVjdC5wcm9wZXJ0aWVzIGIvamVsbHktdGFncy94bWx1bml0L3Byb2plY3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzljMWI2MS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbHVuaXQvcHJvamVjdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCi0jIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQIFIgTyBKIEUgQyBUICBQIFIgTyBQIEUgUiBUIEkgRSBTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sdW5pdC9wcm9qZWN0LnhtbCBiL2plbGx5LXRhZ3MveG1sdW5pdC9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE4YTVkZi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbHVuaXQvcHJvamVjdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3Q+Ci0gIDxleHRlbmQ+JHtiYXNlZGlyfS8uLi90YWctcHJvamVjdC54bWw8L2V4dGVuZD4KLSAgPGlkPmNvbW1vbnMtamVsbHktdGFncy14bWx1bml0PC9pZD4KLSAgPG5hbWU+Y29tbW9ucy1qZWxseS10YWdzLXhtbHVuaXQ8L25hbWU+Ci0gIDxjdXJyZW50VmVyc2lvbj4xLjA8L2N1cnJlbnRWZXJzaW9uPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy54bWx1bml0PC9wYWNrYWdlPgotICA8ZGVzY3JpcHRpb24+VGhpcyBpcyBhIEplbGx5IGludGVyZmFjZSBmb3IgdW5pdCB0ZXN0aW5nIFhNTCBhcHBsaWNhdGlvbnMuPC9kZXNjcmlwdGlvbj4KLSAgPHNob3J0RGVzY3JpcHRpb24+Q29tbW9ucyBKZWxseSBYTUxVbml0IFRhZyBMaWJyYXJ5PC9zaG9ydERlc2NyaXB0aW9uPgotICA8dmVyc2lvbnM+Ci0gICAgPHZlcnNpb24+Ci0gICAgICA8aWQ+MS4wPC9pZD4KLSAgICAgIDxuYW1lPjEuMDwvbmFtZT4KLSAgICAgIDx0YWc+Q09NTU9OUy1KRUxMWS1YTUxVTklULTFfMDwvdGFnPgotICAgIDwvdmVyc2lvbj4KLSAgPC92ZXJzaW9ucz4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8IS0tIFNUQVJUIGZvciBjb21waWxhdGlvbiAtLT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD54bWx1bml0PC9pZD4KLSAgICAgIDx2ZXJzaW9uPjAuODwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPCEtLSBmb3Igc29tZSByZWFzb24gSSBoYWQgdG8gYWRkIHRoaXMgaW4gb3IgdGhlIDEuMy4xIGNvbXBpbGVyIGJhcmZlZCAtLT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPmp1bml0PC9pZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8IS0tIEVORCBmb3IgY29tcGlsYXRpb24gLS0+Ci0gICAgPCEtLSBTVEFSVCBmb3IgdGVzdGluZyAtLT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1qZWxseTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtamVsbHktdGFncy1qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgIDx1cmw+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvPC91cmw+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1qZWxseTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtamVsbHktdGFncy14bWw8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPnhhbGFuPC9pZD4KLSAgICAgIDx2ZXJzaW9uPjIuMy4xPC92ZXJzaW9uPgotICAgICAgPHVybD5odHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4tai88L3VybD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPCEtLSBFTkQgZm9yIHRlc3RpbmcgLS0+Ci0KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbHVuaXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sdW5pdC9BY3R1YWxUYWcuamF2YSBiL2plbGx5LXRhZ3MveG1sdW5pdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWx1bml0L0FjdHVhbFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzBlYjBmLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sdW5pdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWx1bml0L0FjdHVhbFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnhtbHVuaXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuZG9tNGouRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmRvbTRqLmlvLlNBWFJlYWRlcjsKLQotcHVibGljIGNsYXNzIEFjdHVhbFRhZyBleHRlbmRzIFhNTFVuaXRUYWdTdXBwb3J0IHsKLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50IGFjdHVhbERvY3VtZW50ID0gcGFyc2VCb2R5KCk7Ci0KLSAgICAgICAgQXNzZXJ0RG9jdW1lbnRzRXF1YWxUYWcgYXNzZXJ0VGFnID0KLSAgICAgICAgICAgIChBc3NlcnREb2N1bWVudHNFcXVhbFRhZykgZmluZEFuY2VzdG9yV2l0aENsYXNzKEFzc2VydERvY3VtZW50c0VxdWFsVGFnCi0gICAgICAgICAgICAgICAgLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0VGFnLnNldEFjdHVhbChhY3R1YWxEb2N1bWVudCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNBWFJlYWRlciBjcmVhdGVTQVhSZWFkZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU0FYUmVhZGVyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWx1bml0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbHVuaXQvQXNzZXJ0RG9jdW1lbnRzRXF1YWxUYWcuamF2YSBiL2plbGx5LXRhZ3MveG1sdW5pdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWx1bml0L0Fzc2VydERvY3VtZW50c0VxdWFsVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmODJkNTcuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWx1bml0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbHVuaXQvQXNzZXJ0RG9jdW1lbnRzRXF1YWxUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MueG1sdW5pdDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5EaWZmOwotaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxVbml0OwotaW1wb3J0IG9yZy5kb200ai5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZG9tNGouaW8uU0FYUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDb21wYXJlcyB0d28gWE1MIGRvY3VtZW50cyB1c2luZyBYTUxVbml0IChodHRwOi8veG1sdW5pdC5zb3VyY2Vmb3JnZS5uZXQvKS4KLSAqIElmIHRoZXkgYXJlIGRpZmZlcmVudCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NlcnREb2N1bWVudHNFcXVhbFRhZyBleHRlbmRzIFhNTFVuaXRUYWdTdXBwb3J0IHsKLQotICAgIHByaXZhdGUgT2JqZWN0IGFjdHVhbDsKLSAgICBwcml2YXRlIERvY3VtZW50IGFjdHVhbERvY3VtZW50OwotCi0gICAgcHJpdmF0ZSBPYmplY3QgZXhwZWN0ZWQ7Ci0gICAgcHJpdmF0ZSBEb2N1bWVudCBleHBlY3RlZERvY3VtZW50OwotCi0gICAgLyoqCi0gICAgICogQ29udHJvbHMgd2hldGhlciB3aGl0ZXNwYWNlIGRpZmZlcmVuY2VzIGFyZSByZXBvcnRlZCBhcyBkaWZmZXJlbmNlcy4KLSAgICAgKgotICAgICAqIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwgc28gaWYgPGNvZGU+dHJpbTwvY29kZT4gaXMgc2V0IHRvCi0gICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IHdoaXRlc3BhY2UgZGlmZmVyZW5jZXMgYXJlIGRldGVjdGVkLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpZ25vcmVXaGl0ZXNwYWNlID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0KLSAgICAgICAgaWYgKGFjdHVhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoYWN0dWFsRG9jdW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhaWwoIkNhbm5vdCBzcGVjaWZ5IGJvdGggYWN0dWFsIGF0dHJpYnV0ZSBhbmQgZWxlbWVudCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWN0dWFsRG9jdW1lbnQgPSBwYXJzZShhY3R1YWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4cGVjdGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChleHBlY3RlZERvY3VtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJDYW5ub3Qgc3BlY2lmeSBib3RoIGV4cGVjdGVkIGF0dHJpYnV0ZSBhbmQgZWxlbWVudCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXhwZWN0ZWREb2N1bWVudCA9IHBhcnNlKGV4cGVjdGVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoZXhwZWN0ZWREb2N1bWVudCA9PSBudWxsCi0gICAgICAgICAgICB8fCBleHBlY3RlZERvY3VtZW50LmdldFJvb3RFbGVtZW50KCkgPT0gbnVsbCkKLSAgICAgICAgICAgICYmIChhY3R1YWxEb2N1bWVudCA9PSBudWxsCi0gICAgICAgICAgICAgICAgfHwgYWN0dWFsRG9jdW1lbnQuZ2V0Um9vdEVsZW1lbnQoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFjdHVhbERvY3VtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFhNTFVuaXQuc2V0SWdub3JlV2hpdGVzcGFjZShpZ25vcmVXaGl0ZXNwYWNlKTsKLQotICAgICAgICAgICAgRGlmZiBkZWx0YSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRlbHRhID0gWE1MVW5pdC5jb21wYXJlKAotICAgICAgICAgICAgICAgICAgICBleHBlY3RlZERvY3VtZW50LmFzWE1MKCksCi0gICAgICAgICAgICAgICAgICAgIGFjdHVhbERvY3VtZW50LmFzWE1MKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZGVsdGEuaWRlbnRpY2FsKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmYWlsKGRlbHRhLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYWN0dWFsIFhNTCBkb2N1bWVudCB3aGljaCBpcyBlaXRoZXIgYSBEb2N1bWVudCwgU3RyaW5nIChvZiBhbgotICAgICAqIFVSSSksIFVSSSwgUmVhZGVyLCBvciBJbnB1dFN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3R1YWwoT2JqZWN0IGFjdHVhbCkgewotICAgICAgICB0aGlzLmFjdHVhbCA9IGFjdHVhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBleHBlY3RlZCBYTUwgZG9jdW1lbnQgd2hpY2ggaXMgZWl0aGVyIGEgRG9jdW1lbnQsIFN0cmluZyAob2YgYW4KLSAgICAgKiBVUkkpLCBVUkksIFJlYWRlciwgb3IgSW5wdXRTdHJlYW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWQoT2JqZWN0IGV4cGVjdGVkKSB7Ci0gICAgICAgIHRoaXMuZXhwZWN0ZWQgPSBleHBlY3RlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb250cm9scyB3aGV0aGVyIHdoaXRlc3BhY2UgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGludGVycHJldGVkIGFzCi0gICAgICogZGlmZmVyZW5jZXMgb3Igbm90LiAgVGhlIGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LiAgTm90ZSB0aGF0IHRoZQotICAgICAqIHVzZSBvZiB0aGUgPGNvZGU+dHJpbTwvY29kZT4gYXR0cmlidXRlIGlzIGNydWNpYWwgaGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVXaGl0ZXNwYWNlKGJvb2xlYW4gaWdub3JlV2hpdGVzcGFjZSkgewotICAgICAgICB0aGlzLmlnbm9yZVdoaXRlc3BhY2UgPSBpZ25vcmVXaGl0ZXNwYWNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTQVhSZWFkZXIgY3JlYXRlU0FYUmVhZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IFNBWFJlYWRlcigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWx1bml0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbHVuaXQvRXhwZWN0ZWRUYWcuamF2YSBiL2plbGx5LXRhZ3MveG1sdW5pdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWx1bml0L0V4cGVjdGVkVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MmM0YTQuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWx1bml0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbHVuaXQvRXhwZWN0ZWRUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy54bWx1bml0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmRvbTRqLkRvY3VtZW50OwotaW1wb3J0IG9yZy5kb200ai5pby5TQVhSZWFkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFeHBlY3RlZFRhZyBleHRlbmRzIFhNTFVuaXRUYWdTdXBwb3J0IHsKLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50IGV4cGVjdGVkRG9jdW1lbnQgPSBwYXJzZUJvZHkoKTsKLQotICAgICAgICBBc3NlcnREb2N1bWVudHNFcXVhbFRhZyBhc3NlcnRUYWcgPQotICAgICAgICAgICAgKEFzc2VydERvY3VtZW50c0VxdWFsVGFnKSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoQXNzZXJ0RG9jdW1lbnRzRXF1YWxUYWcKLSAgICAgICAgICAgICAgICAuY2xhc3MpOwotICAgICAgICBhc3NlcnRUYWcuc2V0RXhwZWN0ZWQoZXhwZWN0ZWREb2N1bWVudCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNBWFJlYWRlciBjcmVhdGVTQVhSZWFkZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU0FYUmVhZGVyKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbHVuaXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sdW5pdC9YTUxVbml0VGFnTGlicmFyeS5qYXZhIGIvamVsbHktdGFncy94bWx1bml0L3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbHVuaXQvWE1MVW5pdFRhZ0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQxODY4ZC4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbHVuaXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sdW5pdC9YTUxVbml0VGFnTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnhtbHVuaXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnTGlicmFyeTsKLQotcHVibGljIGNsYXNzIFhNTFVuaXRUYWdMaWJyYXJ5IGV4dGVuZHMgVGFnTGlicmFyeSB7Ci0KLSAgICBwdWJsaWMgWE1MVW5pdFRhZ0xpYnJhcnkoKSB7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJhc3NlcnREb2N1bWVudHNFcXVhbCIsIEFzc2VydERvY3VtZW50c0VxdWFsVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImFjdHVhbCIsIEFjdHVhbFRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJleHBlY3RlZCIsIEV4cGVjdGVkVGFnLmNsYXNzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sdW5pdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWx1bml0L1hNTFVuaXRUYWdTdXBwb3J0LmphdmEgYi9qZWxseS10YWdzL3htbHVuaXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sdW5pdC9YTUxVbml0VGFnU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzMxMDE5Li4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sdW5pdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWx1bml0L1hNTFVuaXRUYWdTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnhtbHVuaXQ7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmp1bml0LkFzc2VydFRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmRvbTRqLkRvY3VtZW50OwotaW1wb3J0IG9yZy5kb200ai5Eb2N1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZG9tNGouaW8uU0FYQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmRvbTRqLmlvLlNBWFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYTUxVbml0VGFnU3VwcG9ydCBleHRlbmRzIEFzc2VydFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBTQVhSZWFkZXIgdXNlZCB0byBwYXJzZXIgdGhlIGRvY3VtZW50ICovCi0gICAgcHJpdmF0ZSBTQVhSZWFkZXIgc2F4UmVhZGVyOwotCi0gICAgLyoqIEByZXR1cm4gdGhlIFNBWFJlYWRlciB1c2VkIGZvciBwYXJzaW5nLCBjcmVhdGluZyBvbmUgbGF6aWx5IGlmIG5lZWQgYmUgICovCi0gICAgcHVibGljIFNBWFJlYWRlciBnZXRTQVhSZWFkZXIoKSB7Ci0gICAgICAgIGlmIChzYXhSZWFkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgc2F4UmVhZGVyID0gY3JlYXRlU0FYUmVhZGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNheFJlYWRlcjsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyB0aGUgU0FYUmVhZGVyIHVzZWQgZm9yIHBhcnNpbmcgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTQVhSZWFkZXIoU0FYUmVhZGVyIHNheFJlYWRlcikgewotICAgICAgICB0aGlzLnNheFJlYWRlciA9IHNheFJlYWRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgU0FYUmVhZGVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFNBWFJlYWRlciBjcmVhdGVTQVhSZWFkZXIoKTsKLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgYm9keSBvZiB0aGlzIHRhZyBhbmQgcmV0dXJucyB0aGUgcGFyc2VkIGRvY3VtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IHBhcnNlQm9keSgpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNBWENvbnRlbnRIYW5kbGVyIGhhbmRsZXIgPSBuZXcgU0FYQ29udGVudEhhbmRsZXIoKTsKLSAgICAgICAgWE1MT3V0cHV0IG5ld091dHB1dCA9IG5ldyBYTUxPdXRwdXQoaGFuZGxlcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBoYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGludm9rZUJvZHkobmV3T3V0cHV0KTsKLSAgICAgICAgICAgIGhhbmRsZXIuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGFuZGxlci5nZXREb2N1bWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gc291cmNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IHBhcnNlKE9iamVjdCBzb3VyY2UpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKERvY3VtZW50KSBzb3VyY2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSAoU3RyaW5nKSBzb3VyY2U7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBjb250ZXh0LmdldFJlc291cmNlQXNTdHJlYW0odXJpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U0FYUmVhZGVyKCkucmVhZChpbiwgdXJpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUmVhZGVyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFNBWFJlYWRlcigpLnJlYWQoKFJlYWRlcikgc291cmNlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgSW5wdXRTdHJlYW0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U0FYUmVhZGVyKCkucmVhZCgoSW5wdXRTdHJlYW0pIHNvdXJjZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFVSTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTQVhSZWFkZXIoKS5yZWFkKChVUkwpIHNvdXJjZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHNvdXJjZSBhcmd1bWVudC4gTXVzdCBiZSBhIERvY3VtZW50LCBTdHJpbmcsIFJlYWRlciwgSW5wdXRTdHJlYW0gb3IgVVJMLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBXYXMgdHlwZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBzb3VyY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3aXRoIHZhbHVlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHNvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKERvY3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sdW5pdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWx1bml0L3BhY2thZ2UuaHRtbCBiL2plbGx5LXRhZ3MveG1sdW5pdC9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWx1bml0L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE4ZjY4MS4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbHVuaXQvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sdW5pdC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci0KLSAgPHA+Ci0gICAgQ29tcGFyZXMgdHdvIFhNTCBkb2N1bWVudHMgdXNpbmcgPGEgaHJlZj0iaHR0cDovL3htbHVuaXQuc291cmNlZm9yZ2UubmV0LyI+WE1MVW5pdDwvYT4KLSAgPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWx1bml0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbHVuaXQvVGVzdEplbGx5LmphdmEgYi9qZWxseS10YWdzL3htbHVuaXQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sdW5pdC9UZXN0SmVsbHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhNDc3Yi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbHVuaXQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MveG1sdW5pdC9UZXN0SmVsbHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy54bWx1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmp1bml0LkplbGx5VGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgVGVzdEplbGx5IGV4dGVuZHMgSmVsbHlUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVUZXN0U3VpdGUoVGVzdEplbGx5LmNsYXNzLCAic3VpdGUuamVsbHkiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2plbGx5LXRhZ3MveG1sdW5pdC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy94bWx1bml0L3N1aXRlLmplbGx5IGIvamVsbHktdGFncy94bWx1bml0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbHVuaXQvc3VpdGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYzVlZmIuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWx1bml0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3htbHVuaXQvc3VpdGUuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx0ZXN0OnN1aXRlIAotICAgIHhtbG5zOmo9ImplbGx5OmNvcmUiIAotICAgIHhtbG5zOng9ImplbGx5OnhtbCIgCi0gICAgeG1sbnM6dGVzdD0iamVsbHk6anVuaXQiIAotICAgIHhtbG5zOnh1PSJqZWxseTp4bWx1bml0Ij4KLQotICAgIDx0ZXN0OmNhc2UgbmFtZT0iaWxsZWdhbEFyZ3VtZW50Ij4KLQotICAgICAgICA8ajpjYXRjaCB2YXI9ImV4Ij4KLSAgICAgICAgICAgIDxqOm5ldyB2YXI9ImlsbGVnYWxEb2MiIGNsYXNzTmFtZT0iamF2YS51dGlsLkFycmF5TGlzdCIvPgotICAgICAgICAgICAgPHh1OmFzc2VydERvY3VtZW50c0VxdWFsIGFjdHVhbD0iJHtpbGxlZ2FsRG9jfSI+Ci0gICAgICAgICAgICAgICAgPHh1OmV4cGVjdGVkLz4KLSAgICAgICAgICAgIDwveHU6YXNzZXJ0RG9jdW1lbnRzRXF1YWw+Ci0gICAgICAgIDwvajpjYXRjaD4KLQotICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtleCAhPSBudWxsfSI+QW4gZXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duPC90ZXN0OmFzc2VydD4KLSAgICAgICAgVGhlIGV4Y2VwdGlvbiB3YXMgJHtleC5tZXNzYWdlfQotCi0gICAgPC90ZXN0OmNhc2U+Ci0KLSAgICA8dGVzdDpjYXNlIG5hbWU9ImVtcHR5RG9jdW1lbnRzIj4KLQotICAgICAgICA8eHU6YXNzZXJ0RG9jdW1lbnRzRXF1YWw+Ci0gICAgICAgICAgICA8eHU6YWN0dWFsLz4KLSAgICAgICAgICAgIDx4dTpleHBlY3RlZC8+Ci0gICAgICAgIDwveHU6YXNzZXJ0RG9jdW1lbnRzRXF1YWw+Ci0KLSAgICA8L3Rlc3Q6Y2FzZT4KLQotICAgIDx0ZXN0OmNhc2UgbmFtZT0ic2FtZURvY3VtZW50Ij4KLQotICAgICAgICA8eDpwYXJzZSB2YXI9ImRvYyI+Ci0gICAgICAgICAgICA8dGVzdERvYy8+Ci0gICAgICAgIDwveDpwYXJzZT4KLQotICAgICAgICA8eHU6YXNzZXJ0RG9jdW1lbnRzRXF1YWwgYWN0dWFsPSIke2RvY30iIGV4cGVjdGVkPSIke2RvY30iLz4KLQotICAgICAgICA8eHU6YXNzZXJ0RG9jdW1lbnRzRXF1YWwgZXhwZWN0ZWQ9IiR7ZG9jfSI+Ci0gICAgICAgICAgICA8eHU6YWN0dWFsPgotICAgICAgICAgICAgICAgIDx0ZXN0RG9jLz4KLSAgICAgICAgICAgIDwveHU6YWN0dWFsPgotICAgICAgICA8L3h1OmFzc2VydERvY3VtZW50c0VxdWFsPgotCi0gICAgPC90ZXN0OmNhc2U+Ci0KLSAgICA8dGVzdDpjYXNlIG5hbWU9ImRpZmZlcmVudERvY3VtZW50cyI+Ci0KLSAgICAgICAgPGo6Y2F0Y2ggdmFyPSJleCI+Ci0gICAgICAgICAgICA8eDpwYXJzZSB2YXI9ImRvYzEiPgotICAgICAgICAgICAgICAgIDx0ZXN0RG9jMS8+Ci0gICAgICAgICAgICA8L3g6cGFyc2U+Ci0gICAgICAgICAgICA8eDpwYXJzZSB2YXI9ImRvYzIiPgotICAgICAgICAgICAgICAgIDx0ZXN0RG9jMi8+Ci0gICAgICAgICAgICA8L3g6cGFyc2U+Ci0gICAgICAgICAgICA8eHU6YXNzZXJ0RG9jdW1lbnRzRXF1YWwgYWN0dWFsPSIke2RvYzF9IiBleHBlY3RlZD0iJHtkb2MyfSIvPgotICAgICAgICA8L2o6Y2F0Y2g+Ci0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7ZXggIT0gbnVsbH0iPkFuIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93bjwvdGVzdDphc3NlcnQ+Ci0gICAgICAgIFRoZSBleGNlcHRpb24gd2FzICR7ZXgubWVzc2FnZX0KLQotICAgIDwvdGVzdDpjYXNlPgotCi0gICAgPHRlc3Q6Y2FzZSBuYW1lPSJpZ25vcmVXaGl0ZXNwYWNlIj4KLQotICAgICAgICA8eHU6YXNzZXJ0RG9jdW1lbnRzRXF1YWwgdHJpbT0iZmFsc2UiIGlnbm9yZVdoaXRlc3BhY2U9InRydWUiPgotICAgICAgICAgICAgPHh1OmFjdHVhbD4KLSAgICAgICAgICAgICAgICA8YXBhPiA8L2FwYT4KLSAgICAgICAgICAgIDwveHU6YWN0dWFsPgotICAgICAgICAgICAgPHh1OmV4cGVjdGVkPgotICAgICAgICAgICAgICAgIDxhcGEvPgotICAgICAgICAgICAgPC94dTpleHBlY3RlZD4KLSAgICAgICAgPC94dTphc3NlcnREb2N1bWVudHNFcXVhbD4KLQotICAgICAgICA8ajpjYXRjaCB2YXI9ImV4Ij4KLSAgICAgICAgICAgIDx4dTphc3NlcnREb2N1bWVudHNFcXVhbCB0cmltPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgPHh1OmFjdHVhbD4KLSAgICAgICAgICAgICAgICAgICAgPGFwYT4gPC9hcGE+Ci0gICAgICAgICAgICAgICAgPC94dTphY3R1YWw+Ci0gICAgICAgICAgICAgICAgPHh1OmV4cGVjdGVkPgotICAgICAgICAgICAgICAgICAgICA8YXBhLz4KLSAgICAgICAgICAgICAgICA8L3h1OmV4cGVjdGVkPgotICAgICAgICAgICAgPC94dTphc3NlcnREb2N1bWVudHNFcXVhbD4KLSAgICAgICAgPC9qOmNhdGNoPgotCi0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2V4ICE9IG51bGx9Ij5BbiBleGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd248L3Rlc3Q6YXNzZXJ0PgotICAgICAgICBUaGUgZXhjZXB0aW9uIHdhcyAke2V4Lm1lc3NhZ2V9Ci0KLSAgICA8L3Rlc3Q6Y2FzZT4KLQotPC90ZXN0OnN1aXRlPgpkaWZmIC0tZ2l0IGEvamVsbHktdGFncy94bWx1bml0L3hkb2NzL2NoYW5nZXMueG1sIGIvamVsbHktdGFncy94bWx1bml0L3hkb2NzL2NoYW5nZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDMwODEwLi4wMDAwMDAwCi0tLSBhL2plbGx5LXRhZ3MveG1sdW5pdC94ZG9jcy9jaGFuZ2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0gLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkNoYW5nZXM8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLSAgPGJvZHk+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4wIiBkYXRlPSIyMDA0LTA5LTEyIj48L3JlbGVhc2U+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbHVuaXQveGRvY3MvaW5kZXgueG1sIGIvamVsbHktdGFncy94bWx1bml0L3hkb2NzL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlmNWM4Zi4uMDAwMDAwMAotLS0gYS9qZWxseS10YWdzL3htbHVuaXQveGRvY3MvaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+WE1MVW5pdCBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5kSW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotICAgIDxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KLSAgICAgIDxwPgotICAgICAgICBDb21wYXJlcyB0d28gWE1MIGRvY3VtZW50cyB1c2luZyA8YSBocmVmPSJodHRwOi8veG1sdW5pdC5zb3VyY2Vmb3JnZS5uZXQvIj5YTUxVbml0PC9hPi4KLSAgICAgICAgICBTZWUgdGhlIDxhIGhyZWY9InRhZ3MuaHRtbCI+dGFnczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICA8L3A+Ci0gICAgPC9zZWN0aW9uPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgotCmRpZmYgLS1naXQgYS9qZWxseS10YWdzL3htbHVuaXQveGRvY3MvbmF2aWdhdGlvbi54bWwgYi9qZWxseS10YWdzL3htbHVuaXQveGRvY3MvbmF2aWdhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYmEzMzEuLjAwMDAwMDAKLS0tIGEvamVsbHktdGFncy94bWx1bml0L3hkb2NzL25hdmlnYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBuYW1lPSJYTUxVbml0IFRhZyBMaWJyYXJ5Ij4KLQotICA8dGl0bGU+WE1MVW5pdCBUYWcgTGlicmFyeTwvdGl0bGU+Ci0gIAotICA8Ym9keT4KLSAgICA8bWVudSBuYW1lPSJYTUxVbml0IFRhZyBMaWJyYXJ5Ij4KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICAgICAgICAgICBocmVmPSIvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iVGFncyIgICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWdzLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLnhtbCBiL21hdmVuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhNjY1OS4uMDAwMDAwMAotLS0gYS9tYXZlbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ODggKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgZGVmYXVsdD0iamFyIiB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxuczptYXZlbj0iamVsbHk6bWF2ZW4iIHhtbG5zOnV0aWw9ImplbGx5OnV0aWwiPgotCi0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIFNUQVJUIDogQyBPIE0gTSBPIE4gUyAtIEIgVSBJIEwgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gUmVxdWlyZWQ6IExvb2sgYW5kIEZlZWwgZm9yIGRvY3VtZW50YXRpb24gd2l0aGluIGRpc3RyaWJ1dGlvbnMgICAgIC0tPgotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPHBvc3RHb2FsIG5hbWU9Inhkb2M6Y29weS1yZXNvdXJjZXMiPgotICAgIDwhLS0gY2hlY2sgY29tbW9ucy1idWlsZCBpcyBhdmFpbGFibGUgYmVmb3JlIHVzaW5nIC0tPgotICAgIDxqOnNldCB2YXI9ImNvbW1vbnNCdWlsZFN0eWxlIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi9jb21tb25zLWJ1aWxkL3hkb2NzL3N0eWxlIiAvPgotICAgIDx1dGlsOmF2YWlsYWJsZSBmaWxlPSIke2NvbW1vbnNCdWlsZFN0eWxlfSI+Ci0gICAgICA8Y29weSB0b2Rpcj0iJHtiYXNlZGlyfS90YXJnZXQvZG9jcy9zdHlsZS8iIGZhaWxvbmVycm9yPSJmYWxzZSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjb21tb25zQnVpbGRTdHlsZX0iPgotICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0nKiovKicvPgotICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0nKiovQ1ZTLyoqJy8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvY29weT4KLSAgICA8L3V0aWw6YXZhaWxhYmxlPgotICAgIDwhLS0gY2hlY2sgY29tbW9ucy1idWlsZCBpcyBhdmFpbGFibGUgZm9yIGEgdGFnbGliIGJlZm9yZSB1c2luZyAtLT4KLSAgICA8ajpzZXQgdmFyPSJjb21tb25zQnVpbGRTdHlsZSIgdmFsdWU9IiR7YmFzZWRpcn0vLi4vLi4vLi9jb21tb25zLWJ1aWxkL3hkb2NzL3N0eWxlIiAvPgotICAgIDx1dGlsOmF2YWlsYWJsZSBmaWxlPSIke2NvbW1vbnNCdWlsZFN0eWxlfSI+Ci0gICAgICA8Y29weSB0b2Rpcj0iJHtiYXNlZGlyfS90YXJnZXQvZG9jcy9zdHlsZS8iIGZhaWxvbmVycm9yPSJmYWxzZSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjb21tb25zQnVpbGRTdHlsZX0iPgotICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0nKiovKicvPgotICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0nKiovQ1ZTLyoqJy8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvY29weT4KLSAgICA8L3V0aWw6YXZhaWxhYmxlPgotICA8L3Bvc3RHb2FsPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIEVORDogQyBPIE0gTSBPIE4gUyAtIEIgVSBJIEwgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPCEtLSBidWlsZCB0aGUgdGltZXN0YW1wIGFmdGVyIGNvbXBpbGluZyAtLT4KLSAgPHBvc3RHb2FsIG5hbWU9ImphdmE6amFyLXJlc291cmNlcyI+Ci0gICAgPGo6ZmlsZSBuYW1lPSIke21hdmVuLmJ1aWxkLmRlc3R9L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9qZWxseS12ZXJzaW9uLnR4dCIgb21pdFhtbERlY2xhcmF0aW9uPSJ0cnVlIgotICAgICAgPiR7cG9tLmN1cnJlbnRWZXJzaW9ufTwvajpmaWxlPgotICAgIDx0c3RhbXA+PGZvcm1hdCBwcm9wZXJ0eT0ibm93IiBwYXR0ZXJuPSJ5eXl5LU1NLWRkIGtrOm1tOnNzIHp6eiIvPjwvdHN0YW1wPgotICAgIDxqOmZpbGUgbmFtZT0iJHttYXZlbi5idWlsZC5kZXN0fS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvamVsbHktYnVpbGQtZGF0ZS50eHQiIG9taXRYbWxEZWNsYXJhdGlvbj0idHJ1ZSIKLSAgICAgID4ke25vd308L2o6ZmlsZT4KLSAgPC9wb3N0R29hbD4KLSAgCi0gIDwhLS0gY3JlYXRlIHRoZSBsaWIgYW5kIGJpbiBkaXJlY3RvcmllcyBpbiB0aGUgYmluYXJ5IGRpc3RybyAtLT4KLSAgPHByZUdvYWwgbmFtZT0iZGlzdDpidWlsZCI+Ci0gICAgPGVjaG8+QWJvdXQgdG8gY3JlYXRlIGxpYiBhbmQgYmluIGRpcmVjdG9yaWVzIGluICR7bWF2ZW4uZGlzdC5hc3NlbWJseS5kaXJ9PC9lY2hvPgotCi0gICAgPG1rZGlyIGRpcj0iJHttYXZlbi5kaXN0LmFzc2VtYmx5LmRpcn0vYmluIi8+Ci0gICAgPG1rZGlyIGRpcj0iJHttYXZlbi5kaXN0LmFzc2VtYmx5LmRpcn0vbGliIi8+Ci0gICAgPG1rZGlyIGRpcj0iJHttYXZlbi5kaXN0LmFzc2VtYmx5LmRpcn0vY3VzdG9tIi8+Ci0KLSAgICA8Y29weSB0b2Rpcj0iJHttYXZlbi5kaXN0LmFzc2VtYmx5LmRpcn0vYmluIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL2JpbiIvPgotICAgIDwvY29weT4KLQotICAgIDxjaG1vZCBmaWxlPSIke21hdmVuLmRpc3QuYXNzZW1ibHkuZGlyfS9iaW4vamVsbHkiIHBlcm09InVnbytyeCIgLz4KLQotICAgIDxqOmZvckVhY2ggdmFyPSJkZXAiIGl0ZW1zPSIke3BvbS5kZXBlbmRlbmNpZXN9Ij4KLSAgICAgIDxqOmNob29zZT4KLSAgICAgICAgPGo6d2hlbiB0ZXN0PSIke2RlcC5pZCA9PSAnZm9yZWhlYWQnfSI+Ci0gICAgICAgICAgPGNvcHkgdG9maWxlPSIke21hdmVuLmRpc3QuYXNzZW1ibHkuZGlyfS9saWIvZm9yZWhlYWQuamFyIgotICAgICAgICAgICAgICBmaWxlPSIke21hdmVuLnJlcG8ubG9jYWx9LyR7ZGVwLmFydGlmYWN0RGlyZWN0b3J5fS8ke2RlcC50eXBlfXMvJHtkZXAuYXJ0aWZhY3R9Ii8+Ci0gICAgICAgIDwvajp3aGVuPgotICAgICAgICA8ajpvdGhlcndpc2U+Ci0gICAgICAgICAgPGNvcHkgdG9kaXI9IiR7bWF2ZW4uZGlzdC5hc3NlbWJseS5kaXJ9L2xpYiIKLSAgICAgICAgICAgICAgZmlsZT0iJHttYXZlbi5yZXBvLmxvY2FsfS8ke2RlcC5hcnRpZmFjdERpcmVjdG9yeX0vJHtkZXAudHlwZX1zLyR7ZGVwLmFydGlmYWN0fSIvPgotICAgICAgICA8L2o6b3RoZXJ3aXNlPgotICAgICAgPC9qOmNob29zZT4KLSAgICA8L2o6Zm9yRWFjaD4KLQotICAgIDwhLS0gcHV0IGEgY29weSBvZiBKZWxseSdzIGphciB0aGVyZSB0b28gLS0+Ci0gICAgPGNvcHkgdG9kaXI9IiR7bWF2ZW4uZGlzdC5hc3NlbWJseS5kaXJ9L2xpYiIKLSAgICAgICAgICAgIGZpbGU9IiR7bWF2ZW4uYnVpbGQuZGlyfS8ke21hdmVuLmZpbmFsLm5hbWV9LmphciIvPgotICA8L3ByZUdvYWw+Ci0KLSAgPCEtLSBUQUcgTElCUyBCVUlMRCAtLT4KLSAgPGdvYWwgCi0gICAgbmFtZT0idGFnczpidWlsZCIKLSAgICBkZXNjcmlwdGlvbj0iQnVpbGQgZWFjaCB0YWcgaW50byBhbiBpbnN0YWxsYWJsZSBqYXIiPgotCi0gICAgPG1hdmVuOnJlYWN0b3IKLSAgICAgIGJhc2VkaXI9ImplbGx5LXRhZ3MiCi0gICAgICBpbmNsdWRlcz0iKi9wcm9qZWN0LnhtbCIKLSAgICAgIGdvYWxzPSJjbGVhbixqYXI6aW5zdGFsbCIKLSAgICAgIGJhbm5lcj0iQnVpbGRpbmcgdGFnIgotICAgICAgaWdub3JlRmFpbHVyZXM9ImZhbHNlIi8+Ci0gIDwvZ29hbD4KLQotICA8IS0tIFRBRyBET0NVTUVOVEFUSU9OIC0tPgotICA8Z29hbCAKLSAgICBuYW1lPSJ0YWdzOmRvYyIKLSAgICBkZXNjcmlwdGlvbj0iQnVpbGQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGVhY2ggdGFnIGxpYnJhcnkiPgotCi0gICAgPGo6c2V0IHZhcj0ibWF2ZW4uamVsbHlkb2MucGFja2FnZXMiIHZhbHVlPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuKiIvPgotICAgIAotICAgIDxtYXZlbjpyZWFjdG9yCi0gICAgICBiYXNlZGlyPSJqZWxseS10YWdzIgotICAgICAgaW5jbHVkZXM9IiovcHJvamVjdC54bWwiCi0gICAgICBnb2Fscz0iamVsbHlkb2MseGRvYyIKLSAgICAgIGJhbm5lcj0iQnVpbGRpbmcgdGFnIgotICAgICAgaWdub3JlRmFpbHVyZXM9ImZhbHNlIi8+Ci0gIDwvZ29hbD4KLQotICA8IS0tIERvIHRoZSBzYW1lIGdvYWwgb24gYWxsIFRhZyBMaWJzIC0tPgotICA8Z29hbCAKLSAgICBuYW1lPSJ0YWdzOmRvIgotICAgIGRlc2NyaXB0aW9uPSJEbyBhIHNwZWNpZmljIGdvYWwgb24gZWFjaCB0YWdsaWIiPgotCi0gICAgPG1hdmVuOnJlYWN0b3IKLSAgICAgIGJhc2VkaXI9ImplbGx5LXRhZ3MiCi0gICAgICBpbmNsdWRlcz0iKi9wcm9qZWN0LnhtbCIKLSAgICAgIGdvYWxzPSIke2dvYWx9IgotICAgICAgYmFubmVyPSJCdWlsZGluZyB0YWciCi0gICAgICBpZ25vcmVGYWlsdXJlcz0iZmFsc2UiLz4KLSAgPC9nb2FsPgotCi0KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gICAgICAgICAgICAgICAgICAgICAgRCBJIFMgVCA6IEkgTiBTIFQgQSBMIEwgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPCEtLSBUaGlzIGluc3RhbGxzIEplbGx5IG9uIHlvdXIgc3lzdGVtLiBXaXRoIGFuIGluc3RhbGxlZCBKZWxseSwgeW91J2xsICAgLS0+Ci0gIDwhLS0gYmUgYWJsZSB0byBydW4gSmVsbHkgc2NyaXB0cyBmcm9tIHdoZXJldmVyIHlvdXIgYXJlLCB1c2luZyA6ICAgICAgICAgIC0tPgotICA8IS0tICJqZWxseSA8c2NyaXB0PiA8b3V0cHV0ZmlsZT4iLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSBUaGUgaW5zdGFsbGF0aW9uIGRpciBpcyBzZXQgaW4gdGhlIHByb2plY3QucHJvcGVydGllcyBmaWxlLCB1bmRlciB0aGUgLS0+Ci0gIDwhLS0gbmFtZSAibWF2ZW4uZGlzdC5pbnN0YWxsLmRpciIsIHdoaWNoIGRlZmF1bHRzIHRvICIvdXNyL2xvY2FsL2plbGx5IiAgIC0tPgotICA8IS0tICh5ZXAsIHRoYXQncyBhIExpbnV4IHBhdGggOikuIFBsZWFzZSBvdmVycmlkZSBpdCB0byBzdWl0IHlvdXIgbmVlZHMgICAtLT4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPGdvYWwgbmFtZT0iZGlzdDppbnN0YWxsIgotICAgICAgICAgICAgZGVzY3JpcHRpb249Ikluc3RhbGxzIEplbGx5IG9uIHlvdXIgc3lzdGVtLiIKLSAgICAgICAgICAgIHByZXJlcXM9ImRpc3Q6YnVpbGQiPgotCi0gICAgPGVjaG8+Ci0gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgIHwgSSBOIFMgVCBBIEwgTCBJIE4gRyAgIEogRSBMIEwgWSAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgfCB0byAke21hdmVuLmRpc3QuaW5zdGFsbC5kaXJ9ICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICA8L2VjaG8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7bWF2ZW4uZGlzdC5pbnN0YWxsLmRpcn0iLz4KLSAgICA8bWtkaXIgZGlyPSIke21hdmVuLmRpc3QuaW5zdGFsbC5kaXJ9Ii8+Ci0KLSAgICA8Y29weSB0b2Rpcj0iJHttYXZlbi5kaXN0Lmluc3RhbGwuZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7bWF2ZW4uZGlzdC5hc3NlbWJseS5kaXJ9Ii8+Ci0gICAgPC9jb3B5PgotCi0gICAgPGNobW9kIGZpbGU9IiR7bWF2ZW4uZGlzdC5pbnN0YWxsLmRpcn0vYmluL2plbGx5IiBwZXJtPSJ1Z28rcngiIC8+Ci0KLSAgICA8ZWNobz4KLSAgICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKgotICAgICAgKiAgICAgICAgICAgICAgICAgICAgVyBBIFIgTiBJIE4gRyAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICoKLSAgICAgICogSmVsbHkgaXMgbm93IGFsbW9zdCBpbnN0YWxsZWQgb24geW91ciBzeXN0ZW0gISAgICAgICAgKgotICAgICAgKiBOZXh0LCB5b3UgbXVzdCBzZXQgSkVMTFlfSE9NRSB0byBwb2ludCB0byAgICAgICAgICAgICAqCi0gICAgICAqICIke21hdmVuLmRpc3QuaW5zdGFsbC5kaXJ9IiwgYW5kIGFkZCBKRUxMWV9IT01FL2JpbiAgICoKLSAgICAgICogdG8geW91ciBQQVRILiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICAqIFRoZW4sIHlvdSB3aWxsIGJlIGFibGUgdG8gcnVuIEplbGx5IHNjcmlwdHMgdXNpbmcgdGhlICoKLSAgICAgICogY29tbWFuZCA6ICJqZWxseSBzY3JpcHQgb3V0cHV0ZmlsZSIuICAgICAgICAgICAgICAgICAgKgotICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICAqIEVuam95ICEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgKiBwLnMuIGlmICR7bWF2ZW4uZGlzdC5pbnN0YWxsLmRpcn0gaXNuJ3Qgd2hlcmUgeW91J2QgICAqCi0gICAgICAqIGxpa2UgSmVsbHkgaW5zdGFsbGVkLCBwbGVhc2Ugc2V0IGEgcHJvcGVydHkgY2FsbGVkICAgICoKLSAgICAgICogbWF2ZW4uZGlzdC5pbnN0YWxsLmRpciB0byB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3J5ICAgKgotICAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqCi0gICAgPC9lY2hvPgotICA8L2dvYWw+Ci0KLQotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPCEtLSBHRU5FUkFURSBUSEUgVEFHLUxJQlJBUlkgTElTVCAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8cHJlR29hbCBuYW1lPSJ4ZG9jOnRyYW5zZm9ybSI+Ci0gICAgICAKLSAgICA8IS0tIGNhbid0IHBhc3MgYW55dGhpbmcgaW50byB0aGUgamVsbHlkb2MgZG9jbGV0IHNvIGl0cyBoYXJkIGNvZGVkIHRvIHRhcmdldCAtLT4gICAgICAKLSAgICA8bWtkaXIgZGlyPSJ0YXJnZXQiLz4KLSAgICAgICAgICAKLSAgICA8bWtkaXIgZGlyPSIke21hdmVuLmdlbi5kb2NzfS9saWJzLyIvPgotICAgIDxqOmZpbGUgbmFtZT0iJHttYXZlbi5nZW4uZG9jc30vbGlicy9pbmRleC54bWwiCi0gICAgICBwcmV0dHlQcmludD0idHJ1ZSI+Ci0gICAgICA8ZG9jdW1lbnQ+Ci0gICAgICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICAgIDx0aXRsZT5KZWxseSBMaWJyYXJpZXM8L3RpdGxlPgotICAgICAgICAgIDxhdXRob3IgZW1haWw9ImRpb25AbXVsdGl0YXNrLmNvbS5hdSI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gICAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgICAgPGJvZHk+Ci0gICAgICAgICAgPHNlY3Rpb24gbmFtZT0iSmVsbHkgTGlicmFyaWVzIj4KLSAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIGxpYnJhcmllcyBhcmUgYXZhaWxhYmxlIGZvciBKZWxseSBhcyBwYXJ0IG9mIHRoZSBzdGFuZGFyZCBkaXN0cmlidXRpb24uCi0gICAgICAgICAgICAgIE90aGVyIGxpYnJhcmllcyBhcmUgbWFpbnRhaW5lZCBlbHNld2hlcmUgLSBwbGVhc2Ugc2VlIHRoZSAKLSAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vcG93ZXJlZGJ5Lmh0bWwiPnBvd2VyZWQgYnk8L2E+IHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGZpbGVTY2FubmVyIHZhcj0icGx1Z2luUHJvamVjdHMiPgotICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSI+Ci0gICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJqZWxseS10YWdzLyovcHJvamVjdC54bWwiIC8+Ci0gICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgIDwvZmlsZVNjYW5uZXI+Ci0gICAgICAgICAgICAgPGo6Zm9yRWFjaCBpdGVtcz0iJHtwbHVnaW5Qcm9qZWN0cy5pdGVyYXRvcigpfSIgdmFyPSJwbHVnaW4iPgotICAgICAgICAgICAgICAgPGo6c2V0IHZhcj0icGx1Z2luTmFtZSIgdmFsdWU9IiR7cGx1Z2luLnBhcmVudEZpbGUubmFtZX0iIC8+Ci0gICAgICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vJHtwbHVnaW5OYW1lfS9pbmRleC5odG1sIj4ke3BsdWdpbk5hbWV9PC9hPiA6Ci0gICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vJHtwbHVnaW5OYW1lfS90YWdzLmh0bWwiPnRhZ3M8L2E+IAotICAgICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgICA8L2o6Zm9yRWFjaD4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9zZWN0aW9uPgotICAgICAgICA8L2JvZHk+Ci0gICAgICA8L2RvY3VtZW50PgotICAgIDwvajpmaWxlPgotCi0gICAgPCEtLSBub3cgbGV0cyBpbXBsZW1lbnQgdGhlIGplbGx5ZG9jIGZvciB0aGUgY29yZSBwYWNrYWdlIC0tPiAgICAKLSAgICA8ajpzZXQgdmFyPSJtYXZlbi5qZWxseWRvYy5wYWNrYWdlcyIgdmFsdWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmUuKiIvPgotICAgIDxhdHRhaW5Hb2FsIG5hbWU9ImplbGx5ZG9jIi8+Ci0gIDwvcHJlR29hbD4KLQotICA8cHJlR29hbCBuYW1lPSJ4ZG9jIj4KLQotICAgIDxqOmlmIHRlc3Q9IiR7IWVtcHR5KGZ1bGxTaXRlKX0iPgotICAgICAgPGVjaG8+QnVpbGRpbmcgc2l0ZSBmb3IgSmVsbHkgYW5kIGFsbCB0YWdsaWJzPC9lY2hvPgotICAgICAgPHNsZWVwIHNlY29uZHM9IjUiIC8+Ci0gICAgICA8IS0tICAgICAgICAKLSAgICAgIFRoaXMgcnVucyBvdXQgb2YgbWVtb3J5IC0gaGF2ZSBhIGZlZWxpbmcgaXRzIHRoZSB2ZWxvY2l0eSAmIHhkb2MgcGx1Z2luCi0gICAgICAtLT4KLSAgICAgIDwhLS0gPG1hdmVuOnJlYWN0b3IKLSAgICAgICAgYmFzZWRpcj0iJHtiYXNlZGlyfSIKLSAgICAgICAgaW5jbHVkZXM9ImplbGx5LXRhZ3MvKi9wcm9qZWN0LnhtbCIKLSAgICAgICAgZ29hbHM9InNpdGUiCi0gICAgICAgIGJhbm5lcj0iR2VuZXJhdGluZyBzaXRlIGZvciIKLSAgICAgICAgaWdub3JlRmFpbHVyZXM9ImZhbHNlIgotICAgICAgLz4tLT4KLSAgICAgIDwhLS0gUEw6IGluc3RlYWQuLi4gaW52b2tlIG1hdmVuIGZyb20gdGhlIGNvbW1hbmQtbGluZSBkaXJlY3RseSBmb3IKLSAgICAgICBlYWNoIGRpcmVjdG9yeSBpbiBqZWxseS10YWdzLiAtLT4KLSAgICAgIDxhdHRhaW5Hb2FsIG5hbWU9InRhZ3M6YnVpbGQtc2l0ZS1pbmRpdmlkdWFsbHkiLz4KLSAgICAgICAgCi0gICAgICA8IS0tIHRoZW4gY29weSBhbGwgdGhlIHJlc3VsdHMgdG8gZG9jcy9saWJzIC0tPgotICAgICAgPGo6aWYgdGVzdD0iJHtjb250ZXh0LmdldFZhcmlhYmxlKCdtYXZlbi5kb2NzLmRlc3QnKSA9PSBudWxsfSI+Ci0gICAgICAgIDxqOnNldCB2YXI9Im1hdmVuLmRvY3MuZGVzdCIgdmFsdWU9InRhcmdldC9kb2NzIi8+Ci0gICAgICA8L2o6aWY+Ci0gICAgCi0gICAgICA8IS0tIGNyZWF0ZSB0aGUgcGFyZW50IGRpcmVjdG9yeSBmb3IgdGhlIGRvY3MgLS0+Ci0gICAgICA8bWtkaXIgZGlyPSIke21hdmVuLmRvY3MuZGVzdH0vbGlicyIgLz4KLSAgICAKLSAgICAgIDwhLS0gY29weSB0aGVtIGFsbCB0byAke21hdmVuLmRvY3MuZGVzdH0vbGlicy8ke3BsdWdpbi5pZH0vIC0tPgotICAgICAgPGo6Zm9yRWFjaCBpdGVtcz0iJHtwbHVnaW5Qcm9qZWN0cy5pdGVyYXRvcigpfSIgdmFyPSJwbHVnaW4iPgotICAgICAgICA8ajpzZXQgdmFyPSJwbHVnaW5OYW1lIiB2YWx1ZT0iJHtwbHVnaW4ucGFyZW50RmlsZS5uYW1lfSIgLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHttYXZlbi5kb2NzLmRlc3R9L2xpYnMvJHtwbHVnaW5OYW1lfS8iIC8+Ci0gICAgICAgIDxjb3B5IHRvRGlyPSIke21hdmVuLmRvY3MuZGVzdH0vbGlicy8ke3BsdWdpbk5hbWV9LyI+Ci0gICAgICAgICAgPGZpbGVzZXQgZGlyPSJqZWxseS10YWdzLyR7cGx1Z2luTmFtZX0vdGFyZ2V0L2RvY3MvIj4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqIiAvPgotICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotICAgICAgPC9qOmZvckVhY2g+Ci0gICAgPC9qOmlmPgotICA8L3ByZUdvYWw+Ci0KLSAgPGdvYWwgbmFtZT0idGFnczpidWlsZC1zaXRlLWluZGl2aWR1YWxseSI+Ci0KLSAgICA8ZmlsZVNjYW5uZXIgdmFyPSJ0YWdsaWJQcm9qZWN0cyI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJqZWxseS10YWdzLyovcHJvamVjdC54bWwiIC8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9maWxlU2Nhbm5lcj4KLSAgICAgICAgICAgIAotICAgIDxqOmNob29zZT4KLSAgICAgIDxqOndoZW4gdGVzdD0iJHtzeXN0ZW1TY29wZVsnb3MubmFtZSddLnN0YXJ0c1dpdGgoJ1dpbmRvd3MnKX0iPgotICAgICAgICA8ajpzZXQgdmFyPSJtYXZlbkNtZCIgdmFsdWU9IiR7bWF2ZW4uaG9tZX0vYmluL21hdmVuLmJhdCIvPgotICAgICAgPC9qOndoZW4+Ci0gICAgICA8ajpvdGhlcndpc2U+Ci0gICAgICAgIDxqOnNldCB2YXI9Im1hdmVuQ21kIiB2YWx1ZT0iJHttYXZlbi5ob21lfS9iaW4vbWF2ZW4iLz4KLSAgICAgIDwvajpvdGhlcndpc2U+Ci0gICAgPC9qOmNob29zZT4KLSAgICAgICAgCi0gICAgPGo6Zm9yRWFjaCBpdGVtcz0iJHt0YWdsaWJQcm9qZWN0cy5pdGVyYXRvcigpfSIgdmFyPSJ0YWdsaWIiPgotICAgICAgPGo6c2V0IHZhcj0idGxOYW1lIiB2YWx1ZT0iJHt0YWdsaWIucGFyZW50RmlsZS5uYW1lfSIgLz4KLSAgICAgIDxlY2hvPlByb2Nlc3NpbmcgdGFnLWxpYnJhcnkgJHt0bE5hbWV9LjwvZWNobz4KLSAgICAgIDxqOnNldCB2YXI9ImRpciIgdmFsdWU9IiR7YmFzZWRpcn0vamVsbHktdGFncy8ke3RsTmFtZX0iLz4KLSAgICAgIDxqOnNldCB2YXI9InRlc3RWYXIiIHZhbHVlPSJzaXRlSXNCdWlsdCR7dGxOYW1lfSIvPgotICAgICAgPHVwdG9kYXRlIHByb3BlcnR5PSIke3Rlc3RWYXJ9Ij4KLSAgICAgICAgPHNyY2ZpbGVzIGRpcj0iJHtkaXJ9IiBleGNsdWRlcz0idGFyZ2V0LyoqLyoiLz4KLSAgICAgICAgPG1hcHBlciB0eXBlPSJtZXJnZSIgdG89IiR7ZGlyfS90YXJnZXQvZG9jcy9pbmRleC5odG1sIi8+Ci0gICAgICA8L3VwdG9kYXRlPgotICAgICAgPGVjaG8+VGFnLWxpYnJhcnkgJHt0bG5hbWV9J3Mgc2l0ZSBpcyB1cC10by1kYXRlID8gIiR7Y29udGV4dC5nZXRWYXJpYWJsZSh0ZXN0VmFyKX0iPC9lY2hvPgotICAgICAgPGo6aWYgdGVzdD0iJHshY29udGV4dC5nZXRWYXJpYWJsZSh0ZXN0VmFyKX0iPgotICAgICAgICA8ZWNobz5CdWlsZGluZyB0YWctbGlicmFyeSAke3RsbmFtZX0ncyBzaXRlLjwvZWNobz4KLQotICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSIke21hdmVuQ21kfSIgZmFpbG9uZXJyb3I9InRydWUiIGRpcj0iJHtkaXJ9Ij4KLSAgICAgICAgICA8YXJnIHZhbHVlPSJzaXRlIi8+Ci0gICAgICAgIDwvZXhlYz4KLSAgICAgIDwvajppZj4KLSAgICA8L2o6Zm9yRWFjaD4KLSAgICAgICAgCi0gIDwvZ29hbD4KLQotCi0gIDwhLS0gZGVtbyBwcm9ncmFtcyAtLT4KLQotICA8IS0tIGEgc2FtcGxlIG9mIHVzaW5nIHRoZSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlIHRvIGludm9rZSBKZWxseSAtLT4KLSAgPGdvYWwgbmFtZT0iZGVtbzpjbWRsaW5lIiBwcmVyZXFzPSJjcmVhdGUtY2xhc3NwYXRoIgotICAgIGRlc2NyaXB0aW9uPSJEZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSB0aGUgY29tbWFuZCBsaW5lIGludGVyZmFjZSB0byBKZWxseSI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHkiIGZvcms9InllcyI+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgPGFyZyB2YWx1ZT0ic3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rlc3RDbWRMaW5lT3B0aW9ucy5qZWxseSIvPgotICAgICAgPGFyZyB2YWx1ZT0iLWEiLz4KLSAgICAgIDxhcmcgdmFsdWU9InZhbHVlT2ZBIi8+Ci0gICAgICA8YXJnIHZhbHVlPSItYiIvPgotICAgICAgPGFyZyB2YWx1ZT0idmFsdWVPZkIiLz4KLSAgICAgIDxhcmcgdmFsdWU9Ii1jIi8+Ci0gICAgICA8YXJnIHZhbHVlPSJ2YWx1ZU9mQyIvPgotICAgICAgPGFyZyB2YWx1ZT0iLUR0ZXN0c3lzcHJvcD12YWx1ZU9mVGVzdFN5c3RlbVByb3AiLz4KLSAgICA8L2phdmE+Ci0gIDwvZ29hbD4KLQotCi0gIDxnb2FsIG5hbWU9InRlc3Q6YmVuY2htYXJrIiBwcmVyZXFzPSJjcmVhdGUtY2xhc3NwYXRoIgotICAgIGRlc2NyaXB0aW9uPSJBIHNpbXBsZSBiaXQgb2YgSmVsbHkgc2NyaXB0IHVzZWQgYXMgYSBiZW5jaG1hcmsgdG8gZ3VhZ2UgcGVyZm9ybWFuY2UiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5IiBmb3JrPSJ5ZXMiPgotICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KLSAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9iZW5jaG1hcmsvYmVuY2htYXJrLmplbGx5Ii8+Ci0gICAgPC9qYXZhPgotICA8L2dvYWw+Ci0KLSAgPGdvYWwgbmFtZT0iZGVtbzplbWJlZCIgcHJlcmVxcz0iY3JlYXRlLWNsYXNzcGF0aCIKLSAgICBkZXNjcmlwdGlvbj0iQSBzYW1wbGUgU3dpbmcgYXBwIHdoaWNoIGxldHMgeW91IGJ1aWxkIGEgcGVyc29uYWxpemVkIGhvbWVwYWdlLCBhbmQgdXNlcyBKZWxseSBhcyBhIHRlbXBsYXRpbmcgZW5naW5lIj4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5kZW1vcy5Ib21lcGFnZUJ1aWxkZXIiIGZvcms9InllcyI+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgotICAgIDwvamF2YT4KLSAgPC9nb2FsPgotCi0gIDxnb2FsIG5hbWU9ImRlbW86YXN5bmMiCi0gICAgZGVzY3JpcHRpb249IkFuIGV4YW1wbGUgb2YgdXNpbmcgYXN5bmNocm9ub3VzIGludm9jYXRpb24gb2YgZ29hbHMiPgotCi0gICAgPGo6dGhyZWFkPgotICAgICAgPGF0dGFpbkdvYWwgbmFtZT0iZGVtbzphc3luY090aGVyVGhyZWFkIi8+Ci0gICAgPC9qOnRocmVhZD4KLQotICAgIDxlY2hvPlhYWFg8L2VjaG8+Ci0gIDwvZ29hbD4KLQotICA8Z29hbCBuYW1lPSJkZW1vOmFzeW5jT3RoZXJUaHJlYWQiCi0gICAgZGVzY3JpcHRpb249IkEgcHJpdmF0ZSB0YXJnZXQgaW52b2tlZCBieSB0aGUgYXN5bmMgZGVtbyI+Ci0gICAgPGVjaG8+WVlZWTwvZWNobz4KLSAgPC9nb2FsPgotCi0KLSAgPCEtLSBkZWZpbmUgdGhlIGNsYXNzcGF0aCB1c2VkIHRvIHJ1biBleGFtcGxlcyAtLT4KLSAgPGdvYWwgbmFtZT0iY3JlYXRlLWNsYXNzcGF0aCIgcHJlcmVxcz0iamF2YTpjb21waWxlLHRlc3Q6Y29tcGlsZSI+Ci0gICAgPHBhdGggaWQ9InRlc3QuY2xhc3NwYXRoIj4KLSAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke21hdmVuLmJ1aWxkLmRlc3R9Ii8+Ci0gICAgICA8cGF0aGVsZW1lbnQgcGF0aD0idGFyZ2V0L2NsYXNzZXMiLz4KLSAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIi8+Ci0gICAgICA8cGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiLz4KLSAgICA8L3BhdGg+Ci0gIDwvZ29hbD4KLSAgICAKLSAgICAKLSAgPGdvYWwgbmFtZT0iY2xlYW4tYnVpbGQiPgotICAgIDxhdHRhaW5Hb2FsIG5hbWU9ImNsZWFuIi8+Ci0gICAgPGF0dGFpbkdvYWwgbmFtZT0iamFyOmluc3RhbGwtc25hcHNob3QiLz4KLSAgICAke3N5c3RlbVNjb3BlLnB1dCgnZ29hbCcsJ2NsZWFuLGphcjppbnN0YWxsLXNuYXBzaG90Jyl9Ci0gICAgPGF0dGFpbkdvYWwgbmFtZT0ibXVsdGlwcm9qZWN0OmdvYWwiLz4KLSAgPC9nb2FsPgotICAKLSAgPGdvYWwgbmFtZT0icGFjay1mYXQtamFyIiBwcmVyZXFzPSIiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlcyBhIGphciB3aXRoIGFsbCB0aGUgZGVwZW5kZW5jaWVzIG9mIGplbGx5IGFuZCB0aGUgdGFnbGlicyBpbmRpY2F0ZWQgaW4gJHt0YWdMaWJzfS4iPgotICAgICAgPCEtLSB2YXJpYWJsZXM6IAotICAgICAgICAtIHRhZ0xpYnM6IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGFnbGliLW5hbWVzICh3aXRob3V0IHRoZSAiamVsbHk6IikKLSAgICAgICAgLSBkb0J1aWxkQWxsOiBhIGJvb2xlYW4gdGhhdCBzYXlzIHdldGhlciB3ZSBpbnZva2UgYnVpbGQgKG9mIGplbGx5LCBhbmQgdGhlIHRhZ2xpYnMpCi0gICAgICAgICAgIFdoZW4gdHJ1ZSwgaW52b2tlcyBqYXI6aW5zdGFsbC1zbmFwc2hvdCBvbiBqZWxseSBhbmQgZWFjaCB0YWdsaWIgaW5jbHVkZWQKLSAgICAgICAgLSBmYXRKYXJOYW1lOiB0aGUgbG9jYXRpb24gb2YgdGhlIGZhdC1qYXIgY29sbGVjdGVkCi0gICAgICAgIC0tPgotICAgICAgPCEtLSB0aGlzIGdvYWwgaXNuJ3QgcmVhbGx5IG11Y2ggdGVzdGVkIHlldCBidXQgY291bGQgYmUgdGhlIGtleQotICAgICAgICB0byBnZXQgYSBiZXR0ZXIgcGFja2FnaW5nIC0tPgotICAgICAgICAKLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdMaWJzIiB2YWx1ZT0iYW50LGJlYW4sYmVhbnNoZWxsLGJldHdpeHQsZGVmaW5lLGR5bmFiZWFuLGZtdCxodG1sLGh0dHAsaW50ZXJhY3Rpb24sanVuaXQsanNsLGxvZyxzd2luZyx0aHJlYWRzLHV0aWwsdmFsaWRhdGUsdmVsb2NpdHkseG1sLHhtbHVuaXQiLz4KLSAgICAgIDwhLS0gYXJiaXRyYXJ5IHNldCBvZiB0YWdsaWJzIHdpdGggZGVwZW5kZW5jaWVzIHRoYXQgc2hvdWxkIGhhdmUgbm8gcHJvYmxlbXMgLS0+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZG9CdWlsZEFsbCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZmF0SmFyUGF0aCIgdmFsdWU9IiR7bWF2ZW4uYnVpbGQuZGlyfS9mYXRqZWxseS5qYXIiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc3BhdGhGaWxlIiB2YWx1ZT0iJHttYXZlbi5idWlsZC5kaXJ9L2NsYXNzcGF0aC13aXRoLWRlcHMudHh0Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ibWVyZ2VkRGVwc0ZpbGUiIHZhbHVlPSIke21hdmVuLmJ1aWxkLmRpcn0vbWVyZ2VkRGVwcy54bWwiLz4KLSAgICAgICAgCi0gICAgICA8IS0tIGlmIHdlIG5lZWQgdG8gYnVpbGQsIHdlIG5lZWQgdG8gYnVpbGQgZmlyc3QgamVsbHkgLS0+Ci0gICAgICA8ajppZiB0ZXN0PSIke2RvQnVpbGRBbGx9Ij48YXR0YWluR29hbCBuYW1lPSJqYXI6aW5zdGFsbC1zbmFwc2hvdCIvPjwvajppZj4KLSAgICAgIDxqOm5ldyB2YXI9ImplbGx5VGFnbGliTmFtZXMiIGNsYXNzTmFtZT0iamF2YS51dGlsLkhhc2hTZXQiLz4KLSAgICAgIDxqOnNldCB2YXI9InRhZ2xpYnNfcHJvamVjdHMiIHZhbHVlPSIiLz4KLSAgICAgIDx1dGlsOnRva2VuaXplIGRlbGltPSIsIiB2YXI9InRhZ0xpYm5hbWVzIj4ke3RhZ0xpYnN9PC91dGlsOnRva2VuaXplPgotICAgICAgPGo6Zm9yRWFjaCB2YXI9InRsTmFtZSIgaXRlbXM9IiR7dGFnTGlibmFtZXN9Ij4KLSAgICAgICAgPGVjaG8+Q29uc2lkZXJpbmcgdGFnbGliIHRsTmFtZSAiJHt0bE5hbWV9Ii48L2VjaG8+Ci0gICAgICAgIDxqOmlmIHRlc3Q9IiR7J2NvcmUnIG5lIHRsTmFtZX0iPgotICAgICAgICAgIDxqOmlmIHRlc3Q9IiR7dGFnbGlic19wcm9qZWN0cy5sZW5ndGgoKSA+IDB9Ij48ajpzZXQgdmFyPSJ0YWdsaWJzX3Byb2plY3RzIiB0cmltPSJmYWxzZSI+JHt0YWdsaWJzX3Byb2plY3RzfSw8L2o6c2V0PjwvajppZj4KLSAgICAgICAgICA8ajpzZXQgdmFyPSJ0YWdsaWJzX3Byb2plY3RzIj4ke3RhZ2xpYnNfcHJvamVjdHN9amVsbHktdGFncy8ke3RsTmFtZX0vcHJvamVjdC54bWw8L2o6c2V0PgotICAgICAgICAgICR7amVsbHlUYWdsaWJOYW1lcy5hZGQodGxOYW1lKX0KLSAgICAgICAgPC9qOmlmPgotICAgICAgPC9qOmZvckVhY2g+IAotICAgIAotICAgICAgPCEtLSBjb2xsZWN0IGFsbCBkZXBlbmRlbmNpZXMgaW4gYSBzZXQgLS0+Ci0gICAgICA8ajpuZXcgdmFyPSJkZXBzIiBjbGFzc05hbWU9ImphdmEudXRpbC5IYXNoU2V0Ii8+Ci0KLSAgICAgIDxqOmNob29zZT4KLSAgICAgICAgPGo6d2hlbiB0ZXN0PSIke2RvQnVpbGRBbGx9Ij4KLSAgICAgICAgICA8bWF2ZW46cmVhY3RvciBiYXNlZGlyPSIuIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0UHJvY2Vzc2luZz0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBnb2Fscz0iamFyOmluc3RhbGwtc25hcHNob3QiCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXM9IiR7dGFnbGlic19wcm9qZWN0c30iIAotICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZUZhaWx1cmVzPSJmYWxzZSIvPgotICAgICAgICA8L2o6d2hlbj4KLSAgICAgICAgPGo6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICA8bWF2ZW46cmVhY3RvciBiYXNlZGlyPSIuIiBwb3N0UHJvY2Vzc2luZz0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGluY2x1ZGVzPSIke3RhZ2xpYnNfcHJvamVjdHN9IiBpZ25vcmVGYWlsdXJlcz0iZmFsc2UiLz4KLSAgICAgICAgPC9qOm90aGVyd2lzZT4KLSAgICAgIDwvajpjaG9vc2U+Ci0gICAgICAgIAotICAgICAgPGo6Zm9yRWFjaCB2YXI9InJlYWN0b3JQcm9qZWN0IiBpdGVtcz0iJHtyZWFjdG9yUHJvamVjdHN9Ij4KLSAgICAgICAgPGo6Zm9yRWFjaCB2YXI9ImRlcCIgaXRlbXM9IiR7cmVhY3RvclByb2plY3QuZGVwZW5kZW5jaWVzfSI+Ci0gICAgICAgICAgPGo6aWYgdGVzdD0iJHtkZXAuYXJ0aWZhY3RJZCBlcSAnY29tbW9ucy1qZWxseSd9Ij4ke2RlcC5zZXRWZXJzaW9uKCJTTkFQU0hPVCIpfTwvajppZj4KLSAgICAgICAgICAke2RlcHMuYWRkKGRlcCl9Ci0gICAgICAgIDwvajpmb3JFYWNoPgotICAgICAgPC9qOmZvckVhY2g+Ci0gICAgICA8ajpmb3JFYWNoIHZhcj0idGwiIGl0ZW1zPSIke2plbGx5VGFnbGliTmFtZXN9Ij4KLSAgICAgICAgPGo6bmV3IHZhcj0idGxEIiBjbGFzc05hbWU9Im9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5EZXBlbmRlbmN5Ii8+Ci0gICAgICAgICR7dGxELnNldEdyb3VwSWQoImNvbW1vbnMtamVsbHkiKX0KLSAgICAgICAgPGo6c2V0IHZhcj0iYXJ0SWQiIHZhbHVlPSJjb21tb25zLWplbGx5LXRhZ3MtJHt0bH0iLz4KLSAgICAgICAgJHt0bEQuc2V0QXJ0aWZhY3RJZChhcnRJZCl9Ci0gICAgICAgICR7dGxELnNldFR5cGUoImphciIpfQotICAgICAgICAke3RsRC5zZXRWZXJzaW9uKCJTTkFQU0hPVCIpfQotICAgICAgICAke2RlcHMuYWRkKHRsRCl9Ci0gICAgICA8L2o6Zm9yRWFjaD4KLSAgCi0gICAgICA8IS0tIDxtYXZlbjpyZWFjdG9yCi0gICAgICAgICAgIGJhc2VkaXI9Ii4iCi0gICAgICAgICAgIHBvc3RQcm9jZXNzaW5nPSJ0cnVlIgotICAgICAgICAgICBpbmNsdWRlcz0icHJvamVjdC54bWwiCi0gICAgICAgICAgIGlnbm9yZUZhaWx1cmVzPSJmYWxzZSI+Ci0gICAgICAgICAgIDwvbWF2ZW46cmVhY3Rvcj4KLSAgICAgICAgPGo6Zm9yRWFjaCB2YXI9InJlYWN0b3JQcm9qZWN0IiBpdGVtcz0iJHtyZWFjdG9yUHJvamVjdHN9Ij4KLSAgICAgICAgICA8ajpmb3JFYWNoIHZhcj0iZGVwIiBpdGVtcz0iJHtyZWFjdG9yUHJvamVjdC5kZXBlbmRlbmNpZXN9Ij4ke2RlcHMuYWRkKGRlcCl9PC9qOmZvckVhY2g+Ci0gICAgICAgIDwvajpmb3JFYWNoPiAtLT4KLQotCi0gICAgICA8ajppZiB0ZXN0PSIkeycnIG5lIGNsYXNzcGF0aEZpbGV9Ij4gICAgCi0gICAgICAgIDxqOmZpbGUgbmFtZT0iJHtjbGFzc3BhdGhGaWxlfSIgb21pdFhtbERlY2xhcmF0aW9uPSJ0cnVlIj48ajpmb3JFYWNoIGl0ZW1zPSIke2RlcHN9IiB0cmltPSJ0cnVlIiB2YXI9ImRlcCI+JHttYXZlbi5yZXBvLmxvY2FsfS8ke2RlcC5ncm91cElkfS8ke2RlcC50eXBlfXMvJHtkZXAuYXJ0aWZhY3RJZH0tJHtkZXAudmVyc2lvbn0uJHtkZXAudHlwZX0ke3BhdGguc2VwYXJhdG9yfTwvajpmb3JFYWNoPjwvajpmaWxlPgotICAgICAgPC9qOmlmPgotICAgIAotICAgICAgPCEtLSBtZXJnaW5nIGl0IGFsbCAtLT4KLSAgICAgIDxqOmlmIHRlc3Q9IiR7JycgbmUgZmF0SmFyUGF0aH0iPgotICAgICAgICA8amFyIGRlc3RmaWxlPSIke2ZhdEphclBhdGh9IiB1cGRhdGU9InllcyI+Ci0gICAgICAgICAgPG1hbmlmZXN0PjxhdHRyaWJ1dGUgbmFtZT0iTWFpbi1DbGFzcyIgdmFsdWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseSIvPjwvbWFuaWZlc3Q+Ci0gICAgICAgICAgPGo6Zm9yRWFjaCB2YXI9ImRlcCIgaXRlbXM9IiR7ZGVwc30iPgotICAgICAgICAgICAgPHppcGZpbGVzZXQgc3JjPSIke21hdmVuLnJlcG8ubG9jYWx9LyR7ZGVwLmdyb3VwSWR9LyR7ZGVwLnR5cGV9cy8ke2RlcC5hcnRpZmFjdH0iIC8+Ci0gICAgICAgICAgICA8ZWNobz5BZGRpbmcgamFyICR7bWF2ZW4ucmVwby5sb2NhbH0vJHtkZXAuZ3JvdXBJZH0vJHtkZXAudHlwZX1zLyR7ZGVwLmFydGlmYWN0fS48L2VjaG8+Ci0gICAgICAgICAgPC9qOmZvckVhY2g+Ci0gICAgICAgIDwvamFyPgotICAgICAgPC9qOmlmPgotICAgICAgCi0gICAgPGo6aWYgdGVzdD0iJHshZW1wdHkobWVyZ2VkRGVwc0ZpbGUpfSI+Ci0gICAgICA8ajpmaWxlIHByZXR0eVByaW50PSJ0cnVlIiBuYW1lPSIke21lcmdlZERlcHNGaWxlfSI+Ci0gICAgICAgIDxkZXBlbmRlbmN5TGlzdCBwcm9qZWN0PSJjb21tb25zLWplbGx5IgotICAgICAgICAgICAgICB3aXRoQWRkT25zPSIke3RhZ0xpYnN9Ij4KLSAgICAgICAgICA8ajpmb3JFYWNoIHZhcj0iZGVwIiBpdGVtcz0iJHtkZXBzfSI+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSIke2RlcC5ncm91cElkfSIgYXJ0aWZhY3RJZD0iJHtkZXAuYXJ0aWZhY3RJZH0iIHZlcnNpb249IiR7ZGVwLnZlcnNpb259Ii8+Ci0gICAgICAgICAgICA8L2o6Zm9yRWFjaD4KLSAgICAgICAgICA8L2RlcGVuZGVuY3lMaXN0PgotICAgICAgICA8L2o6ZmlsZT4KLSAgICAgIDwvajppZj4KLSAgICAgICAgICAgIAotICAgIDwvZ29hbD4KLQotICAgIDxnb2FsIG5hbWU9ImdlbmVyYXRlLWd1bXAiPgotICAgICAgPGo6c2V0IHZhcj0ibWF2ZW4ubXVsdGlwcm9qZWN0LmluY2x1ZGVzIiB2YWx1ZT0icHJvamVjdC54bWwsamVsbHktdGFncy8qL3Byb2plY3QueG1sIiAvPgotICAgICAgPGo6c2V0IHZhcj0ibWF2ZW4ubXVsdGlwcm9qZWN0LmV4Y2x1ZGVzIiB2YWx1ZT0iIiAvPgotICAgICAgPGF0dGFpbkdvYWwgbmFtZT0iZ3VtcDptdWx0aXByb2plY3QiIC8+Ci0gICAgPC9nb2FsPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGFyZW50LXByb2plY3QueG1sIGIvcGFyZW50LXByb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjFlZDAwLi4wMDAwMDAwCi0tLSBhL3BhcmVudC1wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0PgotICA8IS0tIFRPRE86IHNob3VsZCB0aGlzIGluaGVyaXQgY29tbW9ucy1idWlsZD8gLS0+Ci0gIDxhcnRpZmFjdElkPmNvbW1vbnMtamVsbHktcGFyZW50PC9hcnRpZmFjdElkPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPCEtLSAKLSAgICAgIHRoZSBjb21tb24gTWF2ZW4gZGVwZW5kZW5jaWVzIGZvciBKZWxseSBzaGFyZWQgYnkgdGhlIGNvcmUKLSAgICAgIGJ1aWxkIGFuZCBhbGwgaW5kaXZpZHVhbCB0YWdsaWIgYnVpbGRzLiAgVXNlIHRoaXMKLSAgICAgIGZpbGUgdG8ga2VlcCBhbGwgZGVwZW5kZW5jeSB2ZXJzaW9ucyBpbiBzeW5jLgotICAgICAgRG9lcyBub3QgaW5jbHVkZSBDTEkgKENvbW1hbmQgTGluZSBJbnRlcmZhY2UpLgotICAgIC0tPgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPmNvbW1vbnMtamV4bDwvaWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPnhtbC1hcGlzPC9pZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC5iMjwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+Y29tbW9ucy1iZWFudXRpbHM8L2lkPgotICAgICAgPHZlcnNpb24+MS42PC92ZXJzaW9uPgotICAgICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxndW1wLnJ1bnRpbWU+dHJ1ZTwvZ3VtcC5ydW50aW1lPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5jb21tb25zLWNvbGxlY3Rpb25zPC9pZD4KLSAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KLSAgICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8Z3VtcC5ydW50aW1lPnRydWU8L2d1bXAucnVudGltZT4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+Y29tbW9ucy1sb2dnaW5nPC9pZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC4zPC92ZXJzaW9uPgotICAgICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxndW1wLnJ1bnRpbWU+dHJ1ZTwvZ3VtcC5ydW50aW1lPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5kb200ajwvaWQ+Ci0gICAgICA8dmVyc2lvbj4xLjU8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+amF4ZW48L2lkPgotICAgICAgPHZlcnNpb24+MS4xLWJldGEtMjwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD54ZXJjZXM8L2lkPgotICAgICAgPHZlcnNpb24+Mi4yLjE8L3ZlcnNpb24+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGd1bXAucHJvamVjdD54bWwteGVyY2VzPC9ndW1wLnByb2plY3Q+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Byb2plY3QucHJvcGVydGllcyBiL3Byb2plY3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJkYzE2Ni4uMDAwMDAwMAotLS0gYS9wcm9qZWN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIyAKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFAgUiBPIEogRSBDIFQgIFAgUiBPIFAgRSBSIFQgSSBFIFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1tYXZlbi5qdW5pdC5mb3JrPXRydWUKLW1hdmVuLmNvbXBpbGUuZm9yaz10cnVlCi0KLW1hdmVuLmNvbXBpbGUuZGVidWcgPSBvbgotbWF2ZW4uY29tcGlsZS5vcHRpbWl6ZSA9IG9mZgotbWF2ZW4uY29tcGlsZS5kZXByZWNhdGlvbiA9IG9uCi0KLW1hdmVuLmp1bml0LnVzZWZpbGUgPSB0cnVlCi0KLSMgY29waWVkIGZyb20gbWF2ZW4gdGVzdCBwbHVnaW4gZHVlIHRvIGEgYnVnL2NhY2hpbmcgaXNzdWUKLW1hdmVuLnRlc3QuZGVzdCA9ICR7bWF2ZW4uYnVpbGQuZGlyfS90ZXN0LWNsYXNzZXMKLSAKLSMgSW5zdGFsbGF0aW9uIGRpcgotbWF2ZW4uZGlzdC5pbnN0YWxsLmRpciA9IC91c3IvbG9jYWwvamVsbHkKLQotbWF2ZW4uY2hhbmdlcy5pc3N1ZS50ZW1wbGF0ZT1odHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvJUlTU1VFJQotCi1tYXZlbi54ZG9jLmpzbD0uLi9jb21tb25zLWJ1aWxkL2NvbW1vbnMtc2l0ZS5qc2wKLW1hdmVuLnhkb2MuZGF0ZT1sZWZ0Ci1tYXZlbi54ZG9jLnZlcnNpb249JHtwb20uY3VycmVudFZlcnNpb259Ci1tYXZlbi54ZG9jLmRldmVsb3BtZW50UHJvY2Vzc1VybD1odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvY2hhcnRlci5odG1sCi1tYXZlbi54ZG9jLnBvd2VyZWRieS5pbWFnZSA9bWF2ZW4tZmVhdGhlci5wbmcKLW1hdmVuLnhkb2MuZGlzdHJpYnV0aW9uVXJsPWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2phdmEtcmVwb3NpdG9yeS9jb21tb25zLWplbGx5L2phcnMKLQotYXBhY2hlLmN2cz1wc2VydmVyOmFub25jdnNAY3ZzLmFwYWNoZS5vcmc6L2hvbWUvY3ZzcHVibGljCi0KLW1hdmVuLm11bHRpcHJvamVjdC5leGNsdWRlcz1wcm9qZWN0LnhtbAotbWF2ZW4ubXVsdGlwcm9qZWN0LmluY2x1ZGVzPWplbGx5LXRhZ3MvKi9wcm9qZWN0LnhtbAotbWF2ZW4ubXVsdGlwcm9qZWN0Lm5hdmlnYXRpb249aW5kZXBlbmRlbnQKLQotbWF2ZW4ubGlua2NoZWNrLmVuYWJsZT1mYWxzZQotCi1tYXZlbi5jaGVja3N0eWxlLnByb3BlcnRpZXM9amVsbHktdGFncy90YWctY2hlY2tzdHlsZS54bWwKLW1hdmVuLmNoZWNrc3R5bGUuaGVhZGVyLmZpbGU9JHtiYXNlZGlyfS9zaG9ydC1saWNlbnNlLnR4dAotbWF2ZW4ubGljZW5zZS5saWNlbnNlRmlsZT0ke2Jhc2VkaXJ9L0xJQ0VOU0UudHh0Ci0KLW1hdmVuLnBtZC5ydWxlc2V0ZmlsZXM9XAotICBydWxlc2V0cy9iYXNpYy54bWwsXAotICBydWxlc2V0cy91bnVzZWRjb2RlLnhtbCxcCi0gIHJ1bGVzZXRzL2ltcG9ydHMueG1sLFwKLSAgcnVsZXNldHMvY29kZXNpemUueG1sLFwKLSAgcnVsZXNldHMvY291cGxpbmcueG1sLFwKLSAgcnVsZXNldHMvZGVzaWduLnhtbCxcCi0gIHJ1bGVzZXRzL3N0cmluZ3MueG1sCmRpZmYgLS1naXQgYS9wcm9qZWN0LnhtbCBiL3Byb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjEzNTZjLi4wMDAwMDAwCi0tLSBhL3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdD4KLSAgPGV4dGVuZD5wYXJlbnQtcHJvamVjdC54bWw8L2V4dGVuZD4KLSAgPHBvbVZlcnNpb24+MzwvcG9tVmVyc2lvbj4KLSAgPG5hbWU+Y29tbW9ucy1qZWxseTwvbmFtZT4KLSAgPGlkPmNvbW1vbnMtamVsbHk8L2lkPgotICA8Y3VycmVudFZlcnNpb24+MS4wLVJDMi1TTkFQU0hPVDwvY3VycmVudFZlcnNpb24+Ci0gIDxvcmdhbml6YXRpb24+Ci0gICAgPG5hbWU+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+Ci0gICAgPHVybD5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnPC91cmw+Ci0gICAgPGxvZ28+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9pbWFnZXMvb3JpZ2luYWwtamFrYXJ0YS1sb2dvLmdpZjwvbG9nbz4KLSAgPC9vcmdhbml6YXRpb24+Ci0gIDxsb2dvPi9pbWFnZXMvbG9nby5qcGc8L2xvZ28+Ci0gIDxwYWNrYWdlPm9yZy5hcGFjaGUuY29tbW9ucy4qPC9wYWNrYWdlPgotICA8Z3VtcFJlcG9zaXRvcnlJZD5qYWthcnRhPC9ndW1wUmVwb3NpdG9yeUlkPgotICA8aW5jZXB0aW9uWWVhcj4yMDAyPC9pbmNlcHRpb25ZZWFyPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmNvbW1vbnMuamVsbHk8L3BhY2thZ2U+Ci0gIDxwYWNrYWdlR3JvdXBzPgotICAgIDxwYWNrYWdlR3JvdXA+Ci0gICAgICA8dGl0bGU+Q29yZSBQdWJsaWMgQVBJPC90aXRsZT4KLSAgICAgIDxwYWNrYWdlcz5vcmcuYXBhY2hlLmNvbW1vbnMuamVsbHk8L3BhY2thZ2VzPgotICAgIDwvcGFja2FnZUdyb3VwPgotICAgIDxwYWNrYWdlR3JvdXA+Ci0gICAgICA8dGl0bGU+VXRpbGl0eSBjbGFzc2VzIGZvciB1c2luZyBKZWxseSBmcm9tIEFudDwvdGl0bGU+Ci0gICAgICA8cGFja2FnZXM+b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhc2s8L3BhY2thZ2VzPgotICAgIDwvcGFja2FnZUdyb3VwPgotICAgIDxwYWNrYWdlR3JvdXA+Ci0gICAgICA8dGl0bGU+VXRpbGl0eSBjbGFzc2VzIGZvciB1c2luZyBKZWxseSBmcm9tIFNlcnZsZXRzPC90aXRsZT4KLSAgICAgIDxwYWNrYWdlcz5vcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuc2VydmxldDwvcGFja2FnZXM+Ci0gICAgPC9wYWNrYWdlR3JvdXA+Ci0gICAgPHBhY2thZ2VHcm91cD4KLSAgICAgIDx0aXRsZT5DbGFzc2VzIHVzZWQgYnkgVGFnIEltcGxlbWVudG9yczwvdGl0bGU+Ci0gICAgICA8cGFja2FnZXM+b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwsb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Msb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb248L3BhY2thZ2VzPgotICAgIDwvcGFja2FnZUdyb3VwPgotICAgIDxwYWNrYWdlR3JvdXA+Ci0gICAgICA8dGl0bGU+VGFnIEltcGxlbWVudGF0aW9uczwvdGl0bGU+Ci0gICAgICA8cGFja2FnZXM+b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuKjwvcGFja2FnZXM+Ci0gICAgPC9wYWNrYWdlR3JvdXA+Ci0gIDwvcGFja2FnZUdyb3Vwcz4KLSAgPHNob3J0RGVzY3JpcHRpb24+Q29tbW9ucyBKZWxseTwvc2hvcnREZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPkplbGx5IGlzIGEgSmF2YSBhbmQgWE1MIGJhc2VkIHNjcmlwdGluZyBlbmdpbmUuIEplbGx5IGNvbWJpbmVzIHRoZSBiZXN0IGlkZWFzIGZyb20gSlNUTCwgVmVsb2NpdHksIERWU0wsIEFudCBhbmQgQ29jb29uIGFsbCB0b2dldGhlciBpbiBhIHNpbXBsZSB5ZXQgcG93ZXJmdWwgc2NyaXB0aW5nIGVuZ2luZS48L2Rlc2NyaXB0aW9uPgotICA8dXJsPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9qZWxseS88L3VybD4KLSAgPGlzc3VlVHJhY2tpbmdVcmw+aHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvc2VjdXJlL0Jyb3dzZVByb2plY3QuanNwYT9pZD0xMDAxMjwvaXNzdWVUcmFja2luZ1VybD4KLSAgPHNpdGVBZGRyZXNzPmpha2FydGEuYXBhY2hlLm9yZzwvc2l0ZUFkZHJlc3M+Ci0gIDxzaXRlRGlyZWN0b3J5Pi93d3cvamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvJHtwb20uYXJ0aWZhY3RJZC5zdWJzdHJpbmcoOCl9Lzwvc2l0ZURpcmVjdG9yeT4KLSAgPGRpc3RyaWJ1dGlvbkRpcmVjdG9yeT4vd3d3L2pha2FydGEuYXBhY2hlLm9yZy9idWlsZHMvamFrYXJ0YS1jb21tb25zLyR7cG9tLmFydGlmYWN0SWQuc3Vic3RyaW5nKDgpfS88L2Rpc3RyaWJ1dGlvbkRpcmVjdG9yeT4KLSAgPHJlcG9zaXRvcnk+Ci0gICAgPGNvbm5lY3Rpb24+c2NtOmN2czpwc2VydmVyOmFub25jdnNAY3ZzLmFwYWNoZS5vcmc6L2hvbWUvY3ZzcHVibGljOmpha2FydGEtY29tbW9ucy9qZWxseTwvY29ubmVjdGlvbj4KLSAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206Y3ZzOmV4dDoke21hdmVuLnVzZXJuYW1lfUBjdnMuYXBhY2hlLm9yZzovaG9tZS9jdnM6amFrYXJ0YS1jb21tb25zL2plbGx5PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgIDx1cmw+aHR0cDovL2N2cy5hcGFjaGUub3JnL3ZpZXdjdnMvamFrYXJ0YS1jb21tb25zLyR7cG9tLmFydGlmYWN0SWQuc3Vic3RyaW5nKDgpfS88L3VybD4KLSAgPC9yZXBvc2l0b3J5PgotICA8bWFpbGluZ0xpc3RzPgotICAgIDxtYWlsaW5nTGlzdD4KLSAgICAgIDxuYW1lPkNvbW1vbnMgRGV2IExpc3Q8L25hbWU+Ci0gICAgICA8c3Vic2NyaWJlPmNvbW1vbnMtZGV2LXN1YnNjcmliZUBqYWthcnRhLmFwYWNoZS5vcmc8L3N1YnNjcmliZT4KLSAgICAgIDx1bnN1YnNjcmliZT5jb21tb25zLWRldi11bnN1YnNjcmliZUBqYWthcnRhLmFwYWNoZS5vcmc8L3Vuc3Vic2NyaWJlPgotICAgICAgPGFyY2hpdmU+aHR0cDovL21haWwtYXJjaGl2ZXMuYXBhY2hlLm9yZy9leWVicm93c2UvU3VtbWFyaXplTGlzdD9saXN0TmFtZT1jb21tb25zLWRldkBqYWthcnRhLmFwYWNoZS5vcmc8L2FyY2hpdmU+Ci0gICAgPC9tYWlsaW5nTGlzdD4KLSAgICA8bWFpbGluZ0xpc3Q+Ci0gICAgICA8bmFtZT5Db21tb25zIFVzZXIgTGlzdDwvbmFtZT4KLSAgICAgIDxzdWJzY3JpYmU+Y29tbW9ucy11c2VyLXN1YnNjcmliZUBqYWthcnRhLmFwYWNoZS5vcmc8L3N1YnNjcmliZT4KLSAgICAgIDx1bnN1YnNjcmliZT5jb21tb25zLXVzZXItdW5zdWJzY3JpYmVAamFrYXJ0YS5hcGFjaGUub3JnPC91bnN1YnNjcmliZT4KLSAgICAgIDxhcmNoaXZlPmh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvZXllYnJvd3NlL1N1bW1hcml6ZUxpc3Q/bGlzdE5hbWU9Y29tbW9ucy11c2VyQGpha2FydGEuYXBhY2hlLm9yZzwvYXJjaGl2ZT4KLSAgICA8L21haWxpbmdMaXN0PgotICA8L21haWxpbmdMaXN0cz4KLSAgPHZlcnNpb25zPgotICAgIDx2ZXJzaW9uPgotICAgICAgPGlkPjEuMC1iZXRhLTE8L2lkPgotICAgICAgPG5hbWU+MS4wLWJldGEtMTwvbmFtZT4KLSAgICAgIDx0YWc+MS4wLWJldGEtMTwvdGFnPgotICAgIDwvdmVyc2lvbj4KLSAgICA8dmVyc2lvbj4KLSAgICAgIDxpZD4xLjAtYmV0YS00PC9pZD4KLSAgICAgIDxuYW1lPjEuMC1iZXRhLTQ8L25hbWU+Ci0gICAgICA8dGFnPkNPTU1PTlMtSkVMTFktMV8wLWJldGEtNDwvdGFnPgotICAgIDwvdmVyc2lvbj4KLSAgICA8dmVyc2lvbj4KLSAgICAgIDxpZD4xLjAtUkMxPC9pZD4KLSAgICAgIDxuYW1lPjEuMC1SQzE8L25hbWU+Ci0gICAgICA8dGFnPkNPTU1PTlNfSkVMTFktMV8wX1JDMTwvdGFnPgotICAgIDwvdmVyc2lvbj4KLSAgPC92ZXJzaW9ucz4KLSAgPGJyYW5jaGVzLz4KLSAgPGRldmVsb3BlcnM+Ci0gICAgPGRldmVsb3Blcj4KLSAgICAgIDxuYW1lPkphbWVzIFN0cmFjaGFuPC9uYW1lPgotICAgICAgPGlkPmpzdHJhY2hhbjwvaWQ+Ci0gICAgICA8ZW1haWw+anN0cmFjaGFuQGFwYWNoZS5vcmc8L2VtYWlsPgotICAgICAgPG9yZ2FuaXphdGlvbj5TcGlyaXRTb2Z0LCBJbmMuPC9vcmdhbml6YXRpb24+Ci0gICAgPC9kZXZlbG9wZXI+Ci0gICAgPGRldmVsb3Blcj4KLSAgICAgIDxuYW1lPkdlaXIgTWFnbnVzc29uIEpyLjwvbmFtZT4KLSAgICAgIDxpZD5nZWlybTwvaWQ+Ci0gICAgICA8ZW1haWw+Z2Vpcm1AYWRlcHRyYS5jb208L2VtYWlsPgotICAgICAgPG9yZ2FuaXphdGlvbj5BZGVwdHJhLCBJbmMuPC9vcmdhbml6YXRpb24+Ci0gICAgPC9kZXZlbG9wZXI+Ci0gICAgPGRldmVsb3Blcj4KLSAgICAgIDxuYW1lPkJvYiBNY1doaXJ0ZXI8L25hbWU+Ci0gICAgICA8aWQ+d2Vya2VuPC9pZD4KLSAgICAgIDxlbWFpbD5ib2JAZW5nLndlcmtlbi5jb208L2VtYWlsPgotICAgICAgPG9yZ2FuaXphdGlvbj5UaGUgV2Vya2VuIENvbXBhbnk8L29yZ2FuaXphdGlvbj4KLSAgICA8L2RldmVsb3Blcj4KLSAgICA8ZGV2ZWxvcGVyPgotICAgICAgPG5hbWU+ZElvbiBHaWxsYXJkPC9uYW1lPgotICAgICAgPGlkPmRpb248L2lkPgotICAgICAgPGVtYWlsPmRpb25AbXVsdGl0YXNrLmNvbS5hdTwvZW1haWw+Ci0gICAgICA8b3JnYW5pemF0aW9uPk11bHRpdGFzayBDb25zdWx0aW5nPC9vcmdhbml6YXRpb24+Ci0gICAgICA8cm9sZXM+Ci0gICAgICAgIDxyb2xlPkludGVyZXN0ZWQgcGFydHk8L3JvbGU+Ci0gICAgICA8L3JvbGVzPgotICAgIDwvZGV2ZWxvcGVyPgotICAgIDxkZXZlbG9wZXI+Ci0gICAgICA8bmFtZT5Nb3JnYW4gRGVsYWdyYW5nZTwvbmFtZT4KLSAgICAgIDxpZD5tb3JnYW5kPC9pZD4KLSAgICAgIDxlbWFpbD5tb3JnYW5kQGFwYWNoZS5vcmc8L2VtYWlsPgotICAgIDwvZGV2ZWxvcGVyPgotICAgIDxkZXZlbG9wZXI+Ci0gICAgICA8bmFtZT5Sb2RuZXkgV2FsZGhvZmY8L25hbWU+Ci0gICAgICA8aWQ+cndhbGRob2ZmPC9pZD4KLSAgICAgIDxlbWFpbD5yd2FsZGhvZmZAYXBhY2hlLm9yZzwvZW1haWw+Ci0gICAgPC9kZXZlbG9wZXI+Ci0gICAgPGRldmVsb3Blcj4KLSAgICAgIDxuYW1lPlBldGVyIFJveWFsPC9uYW1lPgotICAgICAgPGlkPnByb3lhbDwvaWQ+Ci0gICAgICA8ZW1haWw+cHJveWFsQGFwYWNoZS5vcmc8L2VtYWlsPgotICAgIDwvZGV2ZWxvcGVyPgotICAgIDxkZXZlbG9wZXI+Ci0gICAgICA8bmFtZT5NYXJ0aW4gdmFuIGRlbiBCZW10PC9uYW1lPgotICAgICAgPGlkPm12ZGI8L2lkPgotICAgICAgPGVtYWlsPm1hcnRpbkBtdmRiLm5ldDwvZW1haWw+Ci0gICAgPC9kZXZlbG9wZXI+Ci0gICAgPGRldmVsb3Blcj4KLSAgICAgIDxuYW1lPlBhdWwgTGliYnJlY2h0PC9uYW1lPgotICAgICAgPGVtYWlsPnBhdWxAYWN0aXZlbWF0aC5vcmc8L2VtYWlsPgotICAgIDwvZGV2ZWxvcGVyPgotICAgIDxkZXZlbG9wZXI+Ci0gICAgICA8bmFtZT5Sb2JlcnQgQnVycmVsbCBEb25raW48L25hbWU+Ci0gICAgICA8aWQ+cmRvbmtpbjwvaWQ+Ci0gICAgICA8ZW1haWw+cmRvbmtpbkBhcGFjaGUub3JnPC9lbWFpbD4KLSAgICA8L2RldmVsb3Blcj4KLSAgICA8ZGV2ZWxvcGVyPgotICAgICAgPG5hbWU+RGFuaWVsIEYuIFNhdmFyZXNlPC9uYW1lPgotICAgICAgPGlkPmRmczwvaWQ+Ci0gICAgICA8ZW1haWw+ZGZzIC0mZ3Q7IGFwYWNoZS5vcmc8L2VtYWlsPgotICAgIDwvZGV2ZWxvcGVyPgotICAgIDxkZXZlbG9wZXI+Ci0gICAgICA8bmFtZT5CcmV0dCBQb3J0ZXI8L25hbWU+Ci0gICAgICA8aWQ+YnJldHQ8L2lkPgotICAgICAgPGVtYWlsPmJyZXR0QGFwYWNoZS5vcmc8L2VtYWlsPgotICAgIDwvZGV2ZWxvcGVyPgotICAgIDxkZXZlbG9wZXI+Ci0gICAgICA8bmFtZT5IYW5zIEdpbGRlPC9uYW1lPgotICAgICAgPGlkPmhnaWxkZTwvaWQ+Ci0gICAgICA8ZW1haWw+aGdpbGRlQGFwYWNoZS5vcmc8L2VtYWlsPgotICAgIDwvZGV2ZWxvcGVyPgotICA8L2RldmVsb3BlcnM+Ci0gIDxjb250cmlidXRvcnM+Ci0gICAgPGNvbnRyaWJ1dG9yPgotICAgICAgPG5hbWU+RXJpayBGcmFuc2VuPC9uYW1lPgotICAgICAgPGVtYWlsPmVyaWsxNjdAeHM0YWxsLm5sPC9lbWFpbD4KLSAgICAgIDxyb2xlcz4KLSAgICAgICAgPHJvbGU+TG9nbyBkZXNpZ25lcjwvcm9sZT4KLSAgICAgIDwvcm9sZXM+Ci0gICAgPC9jb250cmlidXRvcj4KLSAgICA8Y29udHJpYnV0b3I+Ci0gICAgICA8bmFtZT5DYWx2aW4gWXU8L25hbWU+Ci0gICAgPC9jb250cmlidXRvcj4KLSAgICA8Y29udHJpYnV0b3I+Ci0gICAgICA8bmFtZT5TdGVwaGVuIEhhYmVybWFuPC9uYW1lPgotICAgICAgPGVtYWlsPnN0ZXBoZW5oQGNoYXNlMzAwMC5jb208L2VtYWlsPgotICAgIDwvY29udHJpYnV0b3I+Ci0gICAgPGNvbnRyaWJ1dG9yPgotICAgICAgPG5hbWU+VmluYXkgQ2hhbmRyYW48L25hbWU+Ci0gICAgICA8ZW1haWw+c2FoaWx2aW5heUB5YWhvby5jb208L2VtYWlsPgotICAgICAgPHJvbGVzPgotICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+Ci0gICAgICA8L3JvbGVzPgotICAgIDwvY29udHJpYnV0b3I+Ci0gICAgPGNvbnRyaWJ1dG9yPgotICAgICAgPG5hbWU+VGhlbyBOaWVtZWlqZXI8L25hbWU+Ci0gICAgPC9jb250cmlidXRvcj4KLSAgICA8Y29udHJpYnV0b3I+Ci0gICAgICA8bmFtZT5Kb2UgV2FsbmVzPC9uYW1lPgotICAgICAgPGVtYWlsPmpvZXdAdGhvdWdodHdvcmtzLmNvbTwvZW1haWw+Ci0gICAgICA8b3JnYW5pemF0aW9uPlRob3VnaHRXb3JrcywgSW5jLjwvb3JnYW5pemF0aW9uPgotICAgICAgPHJvbGVzPgotICAgICAgICA8cm9sZT5JbnZlbnRvciBvZiBNb2NrIFRhZ3M8L3JvbGU+Ci0gICAgICA8L3JvbGVzPgotICAgIDwvY29udHJpYnV0b3I+Ci0gICAgPGNvbnRyaWJ1dG9yPgotICAgICAgPG5hbWU+T3R0byB2b24gV2FjaHRlcjwvbmFtZT4KLSAgICAgIDxlbWFpbD52b253YW9AeWFob28uY29tPC9lbWFpbD4KLSAgICAgIDxvcmdhbml6YXRpb24vPgotICAgICAgPHJvbGVzPgotICAgICAgICA8cm9sZT5BdXRob3Igb2YgdGhlIHR1dG9yaWFsczwvcm9sZT4KLSAgICAgICAgPHJvbGU+RGV2ZWxvcGVyPC9yb2xlPgotICAgICAgPC9yb2xlcz4KLSAgICA8L2NvbnRyaWJ1dG9yPgotICAgIDxjb250cmlidXRvcj4KLSAgICAgIDxuYW1lPlJvYmVydCBMZWZ0d2ljaDwvbmFtZT4KLSAgICAgIDxlbWFpbD5yb2JlcnRAbGVmdHdpY2guaW5mbzwvZW1haWw+Ci0gICAgICA8cm9sZXM+Ci0gICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KLSAgICAgIDwvcm9sZXM+Ci0gICAgPC9jb250cmlidXRvcj4KLSAgICA8Y29udHJpYnV0b3I+Ci0gICAgICA8bmFtZT5KaW0gQmlyY2hmaWVsZDwvbmFtZT4KLSAgICAgIDxlbWFpbD5qaW0uYmlyY2hmaWVsZEBnZW5zY2FwZS5jb208L2VtYWlsPgotICAgICAgPG9yZ2FuaXphdGlvbj5HZW5zY2FwZSwgSW5jLjwvb3JnYW5pemF0aW9uPgotICAgICAgPHJvbGVzPgotICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+Ci0gICAgICA8L3JvbGVzPgotICAgIDwvY29udHJpYnV0b3I+Ci0gICAgPGNvbnRyaWJ1dG9yPgotICAgICAgPG5hbWU+SmFzb24gSG9ybWFuPC9uYW1lPgotICAgICAgPGVtYWlsPmpob3JtYW5AbXVzaWNtYXRjaC5jb208L2VtYWlsPgotICAgICAgPHJvbGVzPgotICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+Ci0gICAgICA8L3JvbGVzPgotICAgIDwvY29udHJpYnV0b3I+Ci0gICAgPGNvbnRyaWJ1dG9yPgotICAgICAgPG5hbWU+VGltIEFuZGVyc29uPC9uYW1lPgotICAgICAgPGVtYWlsPnRpbWFAaW50YWxpby5jb208L2VtYWlsPgotICAgICAgPG9yZ2FuaXphdGlvbj5JbnRhbGlvLCBJbmMuPC9vcmdhbml6YXRpb24+Ci0gICAgICA8cm9sZXM+Ci0gICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KLSAgICAgIDwvcm9sZXM+Ci0gICAgPC9jb250cmlidXRvcj4KLSAgICA8Y29udHJpYnV0b3I+Ci0gICAgICA8bmFtZT5UaGVvIE5pZW1laWplcjwvbmFtZT4KLSAgICAgIDxlbWFpbD50aGVvLm5pZW1laWplckBnZXR0aGVyZS5ubDwvZW1haWw+Ci0gICAgICA8b3JnYW5pemF0aW9uLz4KLSAgICAgIDxyb2xlcz4KLSAgICAgICAgPHJvbGU+RGV2ZWxvcGVyPC9yb2xlPgotICAgICAgPC9yb2xlcz4KLSAgICA8L2NvbnRyaWJ1dG9yPgotICAgIDxjb250cmlidXRvcj4KLSAgICAgIDxuYW1lPkouIE1hdHRoZXcgUHJ5b3I8L25hbWU+Ci0gICAgICA8ZW1haWw+bWF0dGhld19wcnlvckB2ZXJzYXRhLmNvbTwvZW1haWw+Ci0gICAgICA8b3JnYW5pemF0aW9uLz4KLSAgICAgIDxyb2xlcz4KLSAgICAgICAgPHJvbGU+RGV2ZWxvcGVyPC9yb2xlPgotICAgICAgPC9yb2xlcz4KLSAgICA8L2NvbnRyaWJ1dG9yPgotICAgIDxjb250cmlidXRvcj4KLSAgICAgIDxuYW1lPktudXQgV2FubmhlZGVuPC9uYW1lPgotICAgICAgPGVtYWlsLz4KLSAgICAgIDxvcmdhbml6YXRpb24vPgotICAgICAgPHJvbGVzPgotICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+Ci0gICAgICA8L3JvbGVzPgotICAgIDwvY29udHJpYnV0b3I+Ci0gICAgPGNvbnRyaWJ1dG9yPgotICAgICAgPG5hbWU+S2VsdmluIFRhbjwvbmFtZT4KLSAgICAgIDxlbWFpbC8+Ci0gICAgICA8b3JnYW5pemF0aW9uLz4KLSAgICAgIDxyb2xlcz4KLSAgICAgICAgPHJvbGU+RGV2ZWxvcGVyPC9yb2xlPgotICAgICAgPC9yb2xlcz4KLSAgICA8L2NvbnRyaWJ1dG9yPgotICAgIDxjb250cmlidXRvcj4KLSAgICAgIDxuYW1lPlRvZGQgSm9ua2VyPC9uYW1lPgotICAgICAgPGVtYWlsLz4KLSAgICAgIDxvcmdhbml6YXRpb24vPgotICAgICAgPHJvbGVzPgotICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+Ci0gICAgICA8L3JvbGVzPgotICAgIDwvY29udHJpYnV0b3I+Ci0gICAgPGNvbnRyaWJ1dG9yPgotICAgICAgPG5hbWU+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXI8L25hbWU+Ci0gICAgICA8ZW1haWwvPgotICAgICAgPG9yZ2FuaXphdGlvbi8+Ci0gICAgICA8cm9sZXM+Ci0gICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KLSAgICAgIDwvcm9sZXM+Ci0gICAgPC9jb250cmlidXRvcj4KLSAgICA8Y29udHJpYnV0b3I+Ci0gICAgICA8bmFtZT5QZXRlIEthem1pZXI8L25hbWU+Ci0gICAgICA8ZW1haWw+a2F6QGFwYWNoZS5vcmc8L2VtYWlsPgotICAgICAgPG9yZ2FuaXphdGlvbi8+Ci0gICAgICA8cm9sZXM+Ci0gICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KLSAgICAgIDwvcm9sZXM+Ci0gICAgPC9jb250cmlidXRvcj4KLSAgPC9jb250cmlidXRvcnM+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPCEtLSBmb3Igc2VydmxldCBzdXBwb3J0IC0tPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGlkPnNlcnZsZXRhcGk8L2lkPgotICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxndW1wLnByb2plY3Q+amFrYXJ0YS1zZXJ2bGV0YXBpLTUtc2VydmxldDwvZ3VtcC5wcm9qZWN0PgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDwhLS0gZm9yIGNvbW1hbmQgbGluZSBpbnRlcmZhY2Ugc3VwcG9ydCAtLT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxpZD5jb21tb25zLWNsaTwvaWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPCEtLSB0aGlzIGlzIGJyb3VnaHQgaW4gYnkgdGhlIGNvbW1vbnMtY2xpIGRlcGVuZGVuY3kgLS0+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+Y29tbW9ucy1sYW5nPC9pZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8Z3VtcC5ydW50aW1lPnRydWU8L2d1bXAucnVudGltZT4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+Y29tbW9ucy1kaXNjb3Zlcnk8L2lkPgotICAgICAgPHZlcnNpb24+MjAwMzAyMTEuMjEzMzU2PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDwhLS0gZm9yIHRoZSBqZWxseSBzdGFydHVwIHNjcmlwdHMgLS0+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+Zm9yZWhlYWQ8L2lkPgotICAgICAgPHZlcnNpb24+MS4wLWJldGEtNTwvdmVyc2lvbj4KLSAgICAgIDx1cmw+aHR0cDovL2ZvcmVoZWFkLndlcmtlbi5jb20vPC91cmw+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPCEtLSBmb3IgdGhlIGpzdGwgaW50ZXJmYWNlcyAtLT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmpzdGw8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qc3RsPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wLjY8L3ZlcnNpb24+Ci0gICAgICA8dXJsPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFnbGlicy9kb2Mvc3RhbmRhcmQtMS4wLWRvYy9pbnRyby5odG1sPC91cmw+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGd1bXAucHJvamVjdD5qYWthcnRhLXRhZ2xpYnMtc3RhbmRhcmQ8L2d1bXAucHJvamVjdD4KLSAgICAgICAgPGd1bXAuaWQ+anN0bDwvZ3VtcC5pZD4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8dXJsPmh0dHA6Ly9qdW5pdC5vcmc8L3VybD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICA8YnVpbGQ+Ci0gICAgPG5hZ0VtYWlsQWRkcmVzcz5jb21tb25zLWRldkBqYWthcnRhLmFwYWNoZS5vcmc8L25hZ0VtYWlsQWRkcmVzcz4KLSAgICA8c291cmNlRGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL2phdmE8L3NvdXJjZURpcmVjdG9yeT4KLSAgICA8cmVzb3VyY2VzPgotICAgICAgPHJlc291cmNlPgotICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL2phdmE8L2RpcmVjdG9yeT4KLSAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgIDxpbmNsdWRlPioqLyoucHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDwvcmVzb3VyY2U+Ci0gICAgPC9yZXNvdXJjZXM+Ci0gICAgPHVuaXRUZXN0U291cmNlRGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL3Rlc3Q8L3VuaXRUZXN0U291cmNlRGlyZWN0b3J5PgotICAgIDwhLS0gVW5pdCB0ZXN0IGNsYXNzZXMgLS0+Ci0KLSAgICA8dW5pdFRlc3Q+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPioqL1Rlc3QqLmphdmE8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICA8ZXhjbHVkZT4qKi9UZXN0Q29yZU1lbW9yeUxlYWsuamF2YTwvZXhjbHVkZT4KLSAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICA8cmVzb3VyY2VzPgotICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgPGRpcmVjdG9yeT5zcmMvdGVzdDwvZGlyZWN0b3J5PgotICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgIDxpbmNsdWRlPk1FVEEtSU5GL3NlcnZpY2VzLyo8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8aW5jbHVkZT4qKi8qLmplbGx5PC9pbmNsdWRlPgotICAgICAgICAgICAgPGluY2x1ZGU+KiovKi54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnhzbDwvaW5jbHVkZT4KLSAgICAgICAgICAgIDxpbmNsdWRlPioqLyoucm5nPC9pbmNsdWRlPgotICAgICAgICAgICAgPGluY2x1ZGU+KiovKi5kdGQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8aW5jbHVkZT4qKi8qLmh0bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgIDwvcmVzb3VyY2VzPgotICAgIDwvdW5pdFRlc3Q+Ci0gIDwvYnVpbGQ+Ci0gIDxyZXBvcnRzPgotICAgIDxyZXBvcnQ+bWF2ZW4tY2hhbmdlbG9nLXBsdWdpbjwvcmVwb3J0PgotICAgIDxyZXBvcnQ+bWF2ZW4tY2hhbmdlcy1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9yZXBvcnQ+Ci0gICAgPHJlcG9ydD5tYXZlbi1kZXZlbG9wZXItYWN0aXZpdHktcGx1Z2luPC9yZXBvcnQ+Ci0gICAgPHJlcG9ydD5tYXZlbi1maWxlLWFjdGl2aXR5LXBsdWdpbjwvcmVwb3J0PgotICAgIDxyZXBvcnQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLWpjb3ZlcmFnZS1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLWpkZXBlbmQtcGx1Z2luPC9yZXBvcnQ+Ci0gICAgPHJlcG9ydD5tYXZlbi1qdW5pdC1yZXBvcnQtcGx1Z2luPC9yZXBvcnQ+Ci0gICAgPHJlcG9ydD5tYXZlbi1qeHItcGx1Z2luPC9yZXBvcnQ+Ci0gICAgPHJlcG9ydD5tYXZlbi1saWNlbnNlLXBsdWdpbjwvcmVwb3J0PgotICAgIDxyZXBvcnQ+bWF2ZW4tcG1kLXBsdWdpbjwvcmVwb3J0PgotICAgIDxyZXBvcnQ+bWF2ZW4tdGFza2xpc3QtcGx1Z2luPC9yZXBvcnQ+Ci0gIDwvcmVwb3J0cz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Nob3J0LWxpY2Vuc2UudHh0IGIvc2hvcnQtbGljZW5zZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NjBjM2EuLjAwMDAwMDAKLS0tIGEvc2hvcnQtbGljZW5zZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2Jpbi9mb3JlaGVhZC5jb25mIGIvc3JjL2Jpbi9mb3JlaGVhZC5jb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDNlYTljLi4wMDAwMDAwCi0tLSBhL3NyYy9iaW4vZm9yZWhlYWQuY29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIyAgCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAgCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAgCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotK2plbGx5LmhvbWUKLSt0b29scy5qYXIKLQotPVtyb290LmplbGx5XSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHkKLQotW3Jvb3RdCi0KLVtyb290LmplbGx5XQotICAke2plbGx5LmhvbWV9L2xpYi8qLmphcgotICAke2plbGx5LmhvbWV9L2N1c3RvbS8qLmphcgotCmRpZmYgLS1naXQgYS9zcmMvYmluL2plbGx5IGIvc3JjL2Jpbi9qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1OGI3My4uMDAwMDAwMAotLS0gYS9zcmMvYmluL2plbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyEvYmluL3NoCi0jCi0jICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMgIAotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgIAotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgIAotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWlmIFsgLXogIiRGT1JFSEVBRF9DT05GIiBdIDsgdGhlbgotICBGT1JFSEVBRF9DT05GPSR7SkVMTFlfSE9NRX0vYmluL2ZvcmVoZWFkLmNvbmYgCi1maQotCi0kSkFWQV9IT01FL2Jpbi9qYXZhIC1jbGFzc3BhdGggJHtDTEFTU1BBVEh9OiR7SkVMTFlfSE9NRX0vbGliL2ZvcmVoZWFkLTEuMC1iZXRhLTUuamFyIFwKLSAgLURmb3JlaGVhZC5jb25mLmZpbGU9JHtGT1JFSEVBRF9DT05GfSBcCi0gIC1EamVsbHkuaG9tZT0ke0pFTExZX0hPTUV9IFwKLSAgLUR0b29scy5qYXI9JHtKQVZBX0hPTUV9L2xpYi90b29scy5qYXIgXAotICAke0pFTExZX09QVFN9IFwKLSAgY29tLndlcmtlbi5mb3JlaGVhZC5Gb3JlaGVhZCAkKgotCmRpZmYgLS1naXQgYS9zcmMvYmluL2plbGx5LmJhdCBiL3NyYy9iaW4vamVsbHkuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDc5ZGEyLi4wMDAwMDAwCi0tLSBhL3NyYy9iaW4vamVsbHkuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotQGVjaG8gb2ZmCi0KLUBSRU0gQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi1AUkVNIAotQFJFTSBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUBSRU0geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQFJFTSBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUBSRU0gCi1AUkVNICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1AUkVNIAotQFJFTSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AUkVNIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AUkVNIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQFJFTSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AUkVNIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQFJFTQotCi1pZiAiJUZPUkVIRUFEX0NPTkYlIj09IiIgc2V0IEZPUkVIRUFEX0NPTkY9JUpFTExZX0hPTUUlXGJpblxmb3JlaGVhZC5jb25mCi0KLSVKQVZBX0hPTUUlXGJpblxqYXZhIC1jbGFzc3BhdGggIiVDTEFTU1BBVEglOyVKRUxMWV9IT01FJVxsaWJcZm9yZWhlYWQtMS4wLWJldGEtNS5qYXIiICItRGZvcmVoZWFkLmNvbmYuZmlsZT0lRk9SRUhFQURfQ09ORiUiICItRGplbGx5LmhvbWU9JUpFTExZX0hPTUUlIiAiLUR0b29scy5qYXI9JUpBVkFfSE9NRSVcbGliXHRvb2xzLmphciIgJUpFTExZX09QVFMlIGNvbS53ZXJrZW4uZm9yZWhlYWQuRm9yZWhlYWQgJSoKLQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L0NvbXBpbGFibGVUYWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9Db21waWxhYmxlVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNzg2ZjAuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L0NvbXBpbGFibGVUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHk7Ci0KLS8qKiA8cD48Y29kZT5Db21waWxhYmxlPC9jb2RlPiByZXByZXNlbnRzIGEgVGFnIHRoYXQgaXMgY29tcGlsYWJsZS48L3A+Ci0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjExICQKLSAgKi8KLQotcHVibGljIGludGVyZmFjZSBDb21waWxhYmxlVGFnIHsKLQotICAgIC8qKiAKLSAgICAgKiBDYWxsZWQgYnkgdGhlIHBhcnNlciB0byBhbGxvdyBhIG1vcmUgdGFnIHRvIGNyZWF0ZSBhIG1vcmUgZWZmaWNpZW50IAotICAgICAqIGZvcm1hdCBvZiB0aGUgdGFnLgotICAgICAqIEB0aHJvd3MgSmVsbHlFeGNlcHRpb24gb24gYW55IGVycm9yCi0gICAgICovCi0KLSAgICAvLyAjIyMjIHNob3VsZCB0aGlzIHJldHVybiBUYWc/Ci0gICAgCi0gICAgdm9pZCBjb21waWxlKCkgdGhyb3dzIEplbGx5RXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvRHluYUJlYW5UYWdTdXBwb3J0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvRHluYUJlYW5UYWdTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZWMzNzYuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L0R5bmFCZWFuVGFnU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuRHluYUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5EeW5hUHJvcGVydHk7Ci0KLS8qKiAKLSAqIDxwPjxjb2RlPkR5bmFCZWFuVGFnPC9jb2RlPiBpcyBhIER5bmFUYWcgaW1wbGVtZW50YXRpb24gd2hpY2ggdXNlcyBhIER5bmFCZWFuCi0gKiB0byBzdG9yZSBpdHMgYXR0cmlidXRlIHZhbHVlcyBpbi4gRGVyaXZlZCB0YWdzIGNhbiB0aGVuIHByb2Nlc3MgdGhpcwotICogRHluYUJlYW4gaW4gYW55IHdheSBpdCB3aXNoZXMuCi0gKiA8L3A+Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMgJAotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEeW5hQmVhblRhZ1N1cHBvcnQgZXh0ZW5kcyBEeW5hVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogdGhlIER5bmFCZWFuIHdoaWNoIGlzIHVzZWQgdG8gc3RvcmUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhpcyB0YWcuICovCi0gICAgcHJpdmF0ZSBEeW5hQmVhbiBkeW5hQmVhbjsKLQotICAgIHB1YmxpYyBEeW5hQmVhblRhZ1N1cHBvcnQoKSB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBEeW5hQmVhblRhZ1N1cHBvcnQoRHluYUJlYW4gZHluYUJlYW4pIHsKLSAgICAgICAgdGhpcy5keW5hQmVhbiA9IGR5bmFCZWFuOwotICAgIH0KLSAgICAgCi0gICAgLyoqIFNldHMgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRhZyB3aWxsIGJlIHJ1bi4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KEplbGx5Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBiZWZvcmVTZXRBdHRyaWJ1dGVzKCk7Ci0gICAgfQotICAgIAotICAgIC8qKiBTZXRzIGFuIGF0dHJpYnV0ZSB2YWx1ZSBvZiB0aGlzIHRhZyBiZWZvcmUgdGhlIHRhZyBpcyBpbnZva2VkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGdldER5bmFCZWFuKCkuc2V0KG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBnaXZlbiBhdHRyaWJ1dGUuIEJ5IGRlZmF1bHQganVzdCByZXR1cm4KLSAgICAgKiBPYmplY3QuY2xhc3MgaWYgdGhpcyBpcyBub3Qga25vd24uCi0gICAgICovCi0gICAgcHVibGljIENsYXNzIGdldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIG5hbWUpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIER5bmFQcm9wZXJ0eSBwcm9wZXJ0eSA9IGdldER5bmFCZWFuKCkuZ2V0RHluYUNsYXNzKCkuZ2V0RHluYVByb3BlcnR5KG5hbWUpOwotICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5LmdldFR5cGUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gT2JqZWN0LmNsYXNzOwotICAgIH0KLSAgICAKLSAgICAvKiogCi0gICAgICogQHJldHVybiB0aGUgRHluYUJlYW4gd2hpY2ggaXMgdXNlZCB0byBzdG9yZSB0aGUKLSAgICAgKiAgYXR0cmlidXRlcyBvZiB0aGlzIHRhZwotICAgICAqLwotICAgIHB1YmxpYyBEeW5hQmVhbiBnZXREeW5hQmVhbigpIHsKLSAgICAgICAgcmV0dXJuIGR5bmFCZWFuOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBEeW5hQmVhbiB3aGljaCBpcyB1c2VkIHRvIHN0b3JlIHRoZQotICAgICAqICBhdHRyaWJ1dGVzIG9mIHRoaXMgdGFnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RHluYUJlYW4oRHluYUJlYW4gZHluYUJlYW4pIHsKLSAgICAgICAgdGhpcy5keW5hQmVhbiA9IGR5bmFCZWFuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIHRvIGFsbG93IHByb2Nlc3NpbmcgdG8gb2NjdXIgYmVmb3JlIHRoZSBhdHRyaWJ1dGVzIGFyZSBhYm91dCB0byBiZSBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVTZXRBdHRyaWJ1dGVzKCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvRHluYVRhZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L0R5bmFUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0Y2Y0ZS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvRHluYVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseTsKLQotLyoqIAotICogPHA+PGNvZGU+RHluYVRhZzwvY29kZT4gcmVwcmVzZW50cyBhIEplbGx5IGN1c3RvbSB0YWcgd2hpY2gKLSAqIGNhbiB0YWtlIGl0cyBhdHRyaWJ1dGVzIGR5bmFtaWNhbGx5IGFuZCBzdG9yZSB0aGVtIGluIHNvbWUgZGF0YSBzdHJ1Y3R1cmUuCi0gKiBUeXBpY2FsbHkgYSBEeW5hVGFnIG1heSB1c2UgZWl0aGVyIGEgTWFwIG9yIGEgRHluYUJlYW4gdG8gaW1wbGVtZW50IGl0c2VsZgotICogd2hpY2ggYXZvaWRzIHdyaXRpbmcgZXhwbGljaXQgZ2V0dGVyIGFuZCBzZXR0ZXIgbWV0aG9kcyBmb3IgZWFjaCBwb3NzaWJsZSBhdHRyaWJ1dGUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMga2luZCBvZiB0YWcgY2FuIGJlIGV4dHJlbWVseSB1c2VmdWwgd2hlbiBtYWtpbmcgSFRNTC1saWtlIHRhZ3Mgd2hpY2gKLSAqIGdlbmVyYWxseSBvdXRwdXQgYWxsIHRoZSBhdHRyaWJ1dGVzIHdoaWNoIGFyZSB1c2VkIGluIHRoZSBtYXJrdXAsIGV4Y2VwdAotICogb25lIG9yIHR3byBzcGVjaWFsIGF0dHJpYnV0ZXMgYXJlIHVzZWQsIGFsbCBvdGhlcnMgcGFzcyB0aHJvdWdoLjwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTEgJAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgRHluYVRhZyBleHRlbmRzIFRhZyB7Ci0KLSAgICAvKiogU2V0cyBhbiBhdHRyaWJ1dGUgdmFsdWUgb2YgdGhpcyB0YWcgYmVmb3JlIHRoZSB0YWcgaXMgaW52b2tlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBnaXZlbiBhdHRyaWJ1dGUuIEJ5IGRlZmF1bHQganVzdCByZXR1cm4KLSAgICAgKiBPYmplY3QuY2xhc3MgaWYgdGhpcyBpcyBub3Qga25vd24uCi0gICAgICogSWYgdGhpcyBtZXRob2QgcmV0dXJucyBFeHByZXNzaW9uLmNsYXNzIHRoZW4gdGhlIGV4cHJlc3Npb24gd2lsbCBub3QKLSAgICAgKiBiZSBldmFsdWF0ZWQgYW5kIGp1c3QgcGFzc2VkIGluIGFzIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIENsYXNzIGdldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIG5hbWUpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9EeW5hVGFnU3VwcG9ydC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L0R5bmFUYWdTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YjU1MjMuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L0R5bmFUYWdTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5OwotCi0vKiogCi0gKiA8cD48Y29kZT5EeW5hVGFnU3VwcG9ydDwvY29kZT4gaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcwotICogZm9yIGFueSBEeW5hVGFnIGltcGxlbWVudGF0aW9uIHRvIGRlcml2ZSBmcm9tLgotICogPC9wPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRHluYVRhZ1N1cHBvcnQgZXh0ZW5kcyBUYWdTdXBwb3J0IGltcGxlbWVudHMgRHluYVRhZyB7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBnaXZlbiBhdHRyaWJ1dGUuIEJ5IGRlZmF1bHQganVzdCByZXR1cm4KLSAgICAgKiBPYmplY3QuY2xhc3MgaWYgdGhpcyBpcyBub3Qga25vd24uCi0gICAgICovCi0gICAgcHVibGljIENsYXNzIGdldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIG5hbWUpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBPYmplY3QuY2xhc3M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L0plbGx5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvSmVsbHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UzNDM0ZC4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvSmVsbHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5wYXJzZXIuWE1MUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS51dGlsLkNsYXNzTG9hZGVyVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnV0aWwuQ29tbWFuZExpbmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKiAKLSAqIDxwPjxjb2RlPkplbGx5PC9jb2RlPiBpcyBhIGhlbHBlciBjbGFzcyB3aGljaCBpcyBjYXBhYmxlIG9mCi0gKiBydW5uaW5nIGEgSmVsbHkgc2NyaXB0LiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGZyb20gdGhlIGNvbW1hbmQgbGluZQotICogb3IgY2FuIGJlIHVzZWQgYXMgdGhlIGJhc2lzIG9mIGFuIEFudCB0YXNrLjwvcD4gQ29tbWFuZCBsaW5lIHVzYWdlIGlzIGFzIGZvbGxvd3M6Ci0gKgotICogPHByZT4KLSAqIGplbGx5IFtzY3JpcHRGaWxlXSBbLXNjcmlwdCBzY3JpcHRGaWxlIC1vIG91dHB1dEZpbGUgLURzeXNwcm9wPXN5c3Byb3B2YWxdCi0gKiA8L3ByZT4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMzUgJAotICovCi1wdWJsaWMgY2xhc3MgSmVsbHkgewotICAgIAotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKZWxseS5jbGFzcyk7Ci0gICAgCi0gICAgLyoqIFRoZSBKZWxseUNvbnRleHQgdG8gdXNlICovCi0gICAgcHJpdmF0ZSBKZWxseUNvbnRleHQgY29udGV4dDsKLSAgICAKLSAgICAvKiogVGhlIFVSTCBvZiB0aGUgc2NyaXB0IHRvIGV4ZWN1dGUgKi8KLSAgICBwcml2YXRlIFVSTCB1cmw7Ci0gICAgCi0gICAgLyoqIFRoZSBVUkwgb2YgdGhlIHJvb3QgY29udGV4dCBmb3Igb3RoZXIgc2NyaXB0cyAqLwotICAgIHByaXZhdGUgVVJMIHJvb3RDb250ZXh0OwotICAgIAotICAgIC8qKiBXaGV0aGVyIHdlIGhhdmUgbG9hZGVkIHRoZSBwcm9wZXJ0aWVzIHlldCAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBsb2FkZWRQcm9wZXJ0aWVzID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiB3aGV0aGVyIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHROYW1lc3BhY2VVUkkgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogd2hldGhlciBvciBub3QgdG8gdmFsaWRhdGUgdGhlIEplbGx5IHNjcmlwdAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVhNTCA9IGZhbHNlOwotICAgICAgICAKLSAgICBwdWJsaWMgSmVsbHkoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNhZ2U6IGplbGx5IFtzY3JpcHRGaWxlXSBbLXNjcmlwdCBzY3JpcHRGaWxlIC1vIG91dHB1dEZpbGUgLURzeXNwcm9wPXN5c3Byb3B2YWxdCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogamVsbHkgW3NjcmlwdEZpbGVdIFstc2NyaXB0IHNjcmlwdEZpbGUgLW8gb3V0cHV0RmlsZSAtRHN5c3Byb3A9c3lzcHJvcHZhbF0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHBhcnNlIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyB1c2luZyBDTEkKLSAgICAgICAgICAgIC8vIHVzaW5nIGEgc2VwYXJhdGUgY2xhc3MgdG8gYXZvaWQgdW5uZWNlc3NhcnkgCi0gICAgICAgICAgICAvLyBkZXBlbmRlbmNpZXMKLSAgICAgICAgICAgIENvbW1hbmRMaW5lUGFyc2VyLmdldEluc3RhbmNlKCkuaW52b2tlQ29tbWFuZExpbmVKZWxseShhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSmVsbHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gZS5nZXRDYXVzZSgpOwotCi0gICAgICAgICAgICBpZiAoY2F1c2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNhdXNlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEplbGx5VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRCdWlsZFRpbWVzdGFtcFJlc291cmNlKCJqZWxseS12ZXJzaW9uLnR4dCIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKZWxseUJ1aWxkRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRCdWlsZFRpbWVzdGFtcFJlc291cmNlKCJqZWxseS1idWlsZC1kYXRlLnR4dCIpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZEJ1aWxkVGltZXN0YW1wUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgamF2YS5pby5SZWFkZXIgaW4gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgamF2YS5pby5TdHJpbmdXcml0ZXIgdyA9IG5ldyBqYXZhLmlvLlN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgaW4gPSBuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihKZWxseS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKG5hbWUpLCJ1dGYtOCIpOwotICAgICAgICAgICAgaW50IHI7Ci0gICAgICAgICAgICB3aGlsZSAoIChyPWluLnJlYWQoKSkgPj0gMCApIHsKLSAgICAgICAgICAgICAgICB3LndyaXRlKChjaGFyKSByKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB3LnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRyeSB7IGluLmNsb3NlKCk7IH0gY2F0Y2goRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJSZXNvdXJjZSBcIiIgKyBuYW1lICsgIlwiIG5vdCBmb3VuZC4iKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLQotICAgIC8qKgotICAgICAqIENvbXBpbGVzIHRoZSBzY3JpcHQKLSAgICAgKi8KLSAgICBwdWJsaWMgU2NyaXB0IGNvbXBpbGVTY3JpcHQoKSB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotICAgICAgICBpZiAoISBsb2FkZWRQcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICBsb2FkZWRQcm9wZXJ0aWVzID0gdHJ1ZTsKLSAgICAgICAgICAgIGxvYWRKZWxseVByb3BlcnRpZXMoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgWE1MUGFyc2VyIHBhcnNlciA9IG5ldyBYTUxQYXJzZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhcnNlci5zZXRDb250ZXh0KGdldEplbGx5Q29udGV4dCgpKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseUV4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhcnNlci5zZXREZWZhdWx0TmFtZXNwYWNlVVJJKHRoaXMuZGVmYXVsdE5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICBwYXJzZXIuc2V0VmFsaWRhdGluZyh0aGlzLnZhbGlkYXRlWE1MKTsKLSAgICAgICAgICAgIHNjcmlwdCA9IHBhcnNlci5wYXJzZShnZXRVcmwoKSk7Ci0gICAgICAgICAgICBzY3JpcHQgPSBzY3JpcHQuY29tcGlsZSgpOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvbXBpbGVkIHNjcmlwdDogIiArIGdldFVybCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5RXhjZXB0aW9uKCJjb3VsZCBub3QgcGFyc2UgSmVsbHkgc2NyaXB0IixlKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseUV4Y2VwdGlvbigiY291bGQgbm90IHBhcnNlIEplbGx5IHNjcmlwdCIsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzY3JpcHQ7Ci0gICAgfQotCi0gICAgCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAKLSAgICAKLSAgICAvKiogCi0gICAgICogU2V0cyB0aGUgc2NyaXB0IFVSTCB0byB1c2UgYXMgYW4gYWJzb2x1dGUgVVJMIG9yIGEgcmVsYXRpdmUgZmlsZW5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTY3JpcHQoU3RyaW5nIHNjcmlwdCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFVybChyZXNvbHZlVVJMKHNjcmlwdCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVVJMIGdldFVybCgpIHsKLSAgICAgICAgcmV0dXJuIHVybDsKLSAgICB9Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFNldHMgdGhlIHNjcmlwdCBVUkwgdG8gdXNlIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVybChVUkwgdXJsKSB7Ci0gICAgICAgIHRoaXMudXJsID0gdXJsOwotICAgIH0KLSAgICAKLSAgICAvKiogCi0gICAgICogR2V0cyB0aGUgcm9vdCBjb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIFVSTCBnZXRSb290Q29udGV4dCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICBpZiAocm9vdENvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgcm9vdENvbnRleHQgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpLnRvVVJMKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJvb3RDb250ZXh0OwotICAgIH0KLSAgICAKLSAgICAvKiogCi0gICAgICogU2V0cyB0aGUgcm9vdCBjb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um9vdENvbnRleHQoVVJMIHJvb3RDb250ZXh0KSB7Ci0gICAgICAgIHRoaXMucm9vdENvbnRleHQgPSByb290Q29udGV4dDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGNvbnRleHQgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIEplbGx5Q29udGV4dCBnZXRKZWxseUNvbnRleHQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gdGFrZSBvZmYgdGhlIG5hbWUgb2ZmIHRoZSBVUkwKLSAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gZ2V0VXJsKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGludCBpZHggPSB0ZXh0Lmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgaWR4ICsgMSk7Ci0gICAgICAgICAgICBjb250ZXh0ID0gbmV3IEplbGx5Q29udGV4dChnZXRSb290Q29udGV4dCgpLCBuZXcgVVJMKHRleHQpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udGV4dDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgamVsbHkgbmFtZXNwYWNlIHRvIHVzZSBmb3IgdW5wcmVmaXhlZCBlbGVtZW50cy4KLSAgICAgKiBXaWxsIGJlIG92ZXJyaWRkZW4gYnkgYW4gZXhwbGljaXQgbmFtZXNwYWNlIGluIHRoZQotICAgICAqIFhNTCBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlIGplbGx5IG5hbWVzcGFjZSB0byB1c2UgKGUuZy4gJ2plbGx5OmNvcmUnKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lc3BhY2VVUkkoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLmRlZmF1bHROYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIFhNTCBwYXJzZXIgd2lsbCBhdHRlbXB0IHRvIHZhbGlkYXRlCi0gICAgICogdGhlIEplbGx5IFhNTCBiZWZvcmUgY29udmVydGluZyBpdCBpbnRvIGEgU2NyaXB0LgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWxpZGF0ZSB3aGV0aGVyIG9yIG5vdCB0byB2YWxpZGF0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRlWE1MKGJvb2xlYW4gdmFsaWRhdGUpIHsKLSAgICAgICAgdGhpcy52YWxpZGF0ZVhNTCA9IHZhbGlkYXRlOwotICAgIH0KLSAgICAKLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIFVSTCBmb3IgdGhlIHJlbGF0aXZlIGZpbGUgbmFtZSBvciBhYnNvbHV0ZSBVUkwgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFVSTCByZXNvbHZlVVJMKFN0cmluZyBuYW1lKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIFVSTCByZXNvdXJjZVVybCA9IENsYXNzTG9hZGVyVXRpbHMuZ2V0Q2xhc3NMb2FkZXIoZ2V0Q2xhc3MoKSkuZ2V0UmVzb3VyY2UobmFtZSk7Ci0gICAgICAgIGlmIChyZXNvdXJjZVVybCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShuYW1lKTsKLSAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUudG9VUkwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVVJMKG5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlVXJsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXR0ZW1wdHMgdG8gbG9hZCBqZWxseS5wcm9wZXJ0aWVzIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LAotICAgICAqIHRoZSB1c2VycyBob21lIGRpcmVjdG9yeSBvciBmcm9tIHRoZSBjbGFzc3BhdGgKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkSmVsbHlQcm9wZXJ0aWVzKCkgewotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgCi0gICAgICAgIFN0cmluZyB1c2VyRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsKLSAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUodXNlckRpciArIEZpbGUuc2VwYXJhdG9yICsgImplbGx5LnByb3BlcnRpZXMiKTsKLSAgICAgICAgbG9hZFByb3BlcnRpZXMoZik7Ci0gICAgCi0gICAgICAgIGYgPSBuZXcgRmlsZSgiamVsbHkucHJvcGVydGllcyIpOwotICAgICAgICBsb2FkUHJvcGVydGllcyhmKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBpcyA9IENsYXNzTG9hZGVyVXRpbHMuZ2V0Q2xhc3NMb2FkZXIoZ2V0Q2xhc3MoKSkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiamVsbHkucHJvcGVydGllcyIpOwotICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBsb2FkUHJvcGVydGllcyhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoICJDYXVnaHQgZXhjZXB0aW9uIHdoaWxlIGxvYWRpbmcgamVsbHkucHJvcGVydGllcyBmcm9tIHRoZSBjbGFzc3BhdGguIFJlYXNvbjogIiArIGUsIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWQgcHJvcGVydGllcyBmcm9tIGEgZmlsZSBpbnRvIHRoZSBjb250ZXh0Ci0gICAgICogQHBhcmFtIGYKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9hZFByb3BlcnRpZXMoRmlsZSBmKSB7Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChmLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGYpOwotICAgICAgICAgICAgICAgIGxvYWRQcm9wZXJ0aWVzKGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvciggIkNhdWdodCBleGNlcHRpb24gd2hpbGUgbG9hZGluZzogIiArIGYuZ2V0TmFtZSgpICsgIi4gUmVhc29uOiAiICsgZSwgZSApOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSBsb2cuZGVidWcoImVycm9yIGNsb3NpbmcgcHJvcGVydHkgaW5wdXQgc3RyZWFtIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtIAotICAgICAqLyAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkUHJvcGVydGllcyhJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSmVsbHlDb250ZXh0IHRoZUNvbnRleHQgPSBnZXRKZWxseUNvbnRleHQoKTsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHByb3BzLmxvYWQoaXMpOwotICAgICAgICBFbnVtZXJhdGlvbiBwcm9wc0VudW0gPSBwcm9wcy5wcm9wZXJ0eU5hbWVzKCk7Ci0gICAgICAgIHdoaWxlIChwcm9wc0VudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBwcm9wc0VudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHByb3BzLmdldFByb3BlcnR5KGtleSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEB0b2RvIHdlIHNob3VsZCBwYXJzZSB0aGUgdmFsdWUgaW4gY2FzZSBpdHMgYW4gRXhwcmVzc2lvbgotICAgICAgICAgICAgdGhlQ29udGV4dC5zZXRWYXJpYWJsZShrZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9KZWxseUNvbnRleHQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9KZWxseUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcxZmU2Yy4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvSmVsbHlDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkucGFyc2VyLlhNTFBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudXRpbC5DbGFzc0xvYWRlclV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gICogPHA+PGNvZGU+SmVsbHlDb250ZXh0PC9jb2RlPiByZXByZXNlbnRzIHRoZSBKZWxseSBjb250ZXh0LjwvcD4KLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTAgJAotICAqLwotcHVibGljIGNsYXNzIEplbGx5Q29udGV4dCB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSmVsbHlDb250ZXh0LmNsYXNzKTsKLQotICAgIC8qKiBEZWZhdWx0IGZvciBpbmhlcml0YW5jZSBvZiB2YXJpYWJsZXMgKiovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX0lOSEVSSVQgPSB0cnVlOwotCi0gICAgLyoqIERlZmF1bHQgZm9yIGV4cG9ydCBvZiB2YXJpYWJsZXMgKiovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX0VYUE9SVCA9IGZhbHNlOwotCi0gICAgLyoqIFN0cmluZyB1c2VkIHRvIGRlbm90ZSBhIHNjcmlwdCBjYW4ndCBiZSBwYXJzZWQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFEX1BBUlNFID0gIkNvdWxkIG5vdCBwYXJzZSBKZWxseSBzY3JpcHQiOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNsYXNzIGxvYWRlciB0byB1c2UgZm9yIGluc3RhbnRpYXRpbmcgYXBwbGljYXRpb24gb2JqZWN0cy4KLSAgICAgKiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgY29udGV4dCBjbGFzcyBsb2FkZXIsIG9yIHRoZSBjbGFzcyBsb2FkZXIKLSAgICAgKiB1c2VkIHRvIGxvYWQgdGhpcyBjbGFzcyBpdHNlbGYsIGlzIHVzZWQsIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUKLSAgICAgKiA8Y29kZT51c2VDb250ZXh0Q2xhc3NMb2FkZXI8L2NvZGU+IHZhcmlhYmxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLQotICAgIC8qKgotICAgICAqIERvIHdlIHdhbnQgdG8gdXNlIHRoZSBDb250ZXh0IENsYXNzTG9hZGVyIHdoZW4gbG9hZGluZyBjbGFzc2VzCi0gICAgICogZm9yIGluc3RhbnRpYXRpbmcgbmV3IG9iamVjdHM/ICBEZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VDb250ZXh0Q2xhc3NMb2FkZXIgPSBmYWxzZTsKLQotICAgIC8qKiBUaGUgcm9vdCBVUkwgY29udGV4dCAod2hlcmUgc2NyaXB0cyBhcmUgbG9jYXRlZCBmcm9tKSAqLwotICAgIHByaXZhdGUgVVJMIHJvb3RVUkw7Ci0KLSAgICAvKiogVGhlIGN1cnJlbnQgVVJMIGNvbnRleHQgKHdoZXJlIHJlbGF0aXZlIHNjcmlwdHMgYXJlIGxvY2F0ZWQgZnJvbSkgKi8KLSAgICBwcml2YXRlIFVSTCBjdXJyZW50VVJMOwotCi0gICAgLyoqIFRhZyBsaWJyYXJpZXMgZm91bmQgc28gZmFyICovCi0gICAgcHJpdmF0ZSBNYXAgdGFnbGlicyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgIC8qKiBzeW5jaHJvbml6ZWQgYWNjZXNzIHRvIHRoZSB2YXJpYWJsZXMgaW4gc2NvcGUgKi8KLSAgICBwcml2YXRlIE1hcCB2YXJpYWJsZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICAvKiogVGhlIHBhcmVudCBjb250ZXh0ICovCi0gICAgcHJpdmF0ZSBKZWxseUNvbnRleHQgcGFyZW50OwotCi0gICAgLyoqIERvIHdlIGluaGVyaXQgdmFyaWFibGVzIGZyb20gcGFyZW50IGNvbnRleHQ/ICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGluaGVyaXQgPSBKZWxseUNvbnRleHQuREVGQVVMVF9JTkhFUklUOwotCi0gICAgLyoqIERvIHdlIGV4cG9ydCBvdXIgdmFyaWFibGVzIHRvIHBhcmVudCBjb250ZXh0PyAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBleHBvcnQgID0gSmVsbHlDb250ZXh0LkRFRkFVTFRfRVhQT1JUOwotCi0gICAgLyoqIFNob3VsZCB3ZSBleHBvcnQgdGFnIGxpYnJhcmllcyB0byBvdXIgcGFyZW50cyBjb250ZXh0ICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGV4cG9ydExpYnJhcmllcyA9IHRydWU7Ci0KLSAgICAvKiogSG9sZHMgYSBNYXAgY29udGFpbmluZyB0aHJlYWQtc3BlY2lmaWMgZGF0YSBmb3IgU2NyaXB0cy4KLSAgICAgKiBTY3JpcHRzIG1heSBob2xkIGEgc2luZ2xlIG9iamVjdCBpbiB0aGlzIG1hcCB1c2luZyB0aGUKLSAgICAgKiB7QGxpbmsgI3NldFRocmVhZExvY2FsU2NyaXB0RGF0YShTY3JpcHQsT2JqZWN0KX0KLSAgICAgICovCi0gICAgcHJpdmF0ZSBUaHJlYWRMb2NhbCB0aHJlYWRMb2NhbFNjcmlwdERhdGEgPSBuZXcgVGhyZWFkTG9jYWwoKTsKLSAgICAvLyBUSElOS01FOiBTY3JpcHQgb2JqZWN0cyBhcmUgbGlrZSBPYmplY3QgKGZvciBlcXVhbHMgYW5kIGhhc2hDb2RlKSBJIHRoaW5rLgotICAgIC8vICAgICAgICAgIEl0IHNob3VsZCBiZSBhc3kgdG8gb3B0aW1pemUgaGFzaC1tYXAgZGlzdHJpYnV0aW9uLCBlLmcuIGJ5Ci0gICAgLy8gICAgICAgICAgc2hpZnRpbmcgdGhlIGhhc2hjb2RlIHJldHVybiB2YWx1ZSAocHJlc3VtaW5nIE9iamVjdC5oYXNoY29kZSgpCi0gICAgLy8gICAgICAgICAgaXMgc29tZXRoaW5nIGxpa2UgYW4gYWRkcmVzcykKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBjb250ZXh0IHdpdGggdGhlIGN1cnJlbnRVUkwgc2V0IHRvIHRoZSByb290VVJMCi0gICAgICovCi0gICAgcHVibGljIEplbGx5Q29udGV4dCgpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50VVJMID0gcm9vdFVSTDsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBjb250ZXh0IHdpdGggdGhlIGdpdmVuIHJvb3RVUkwKLSAgICAgKiBAcGFyYW0gcm9vdFVSTCB0aGUgcm9vdCBVUkwgdXNlZCBpbiByZXNvbHZpbmcgYWJzb2x1dGUgcmVzb3VyY2VzIGkuZS4gdGhvc2Ugc3RhcnRpbmcgd2l0aCAnLycKLSAgICAgKi8KLSAgICBwdWJsaWMgSmVsbHlDb250ZXh0KFVSTCByb290VVJMKSB7Ci0gICAgICAgIHRoaXMoIHJvb3RVUkwsIHJvb3RVUkwgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgY29udGV4dCB3aXRoIHRoZSBnaXZlbiByb290VVJMIGFuZCBjdXJyZW50VVJMCi0gICAgICogQHBhcmFtIHJvb3RVUkwgdGhlIHJvb3QgVVJMIHVzZWQgaW4gcmVzb2x2aW5nIGFic29sdXRlIHJlc291cmNlcyBpLmUuIHRob3NlIHN0YXJ0aW5nIHdpdGggJy8nCi0gICAgICogQHBhcmFtIGN1cnJlbnRVUkwgdGhlIHJvb3QgVVJMIHVzZWQgaW4gcmVzb2x2aW5nIHJlbGF0aXZlIHJlc291cmNlcwotICAgICAqLwotICAgIHB1YmxpYyBKZWxseUNvbnRleHQoVVJMIHJvb3RVUkwsIFVSTCBjdXJyZW50VVJMKSB7Ci0gICAgICAgIHRoaXMucm9vdFVSTCA9IHJvb3RVUkw7Ci0gICAgICAgIHRoaXMuY3VycmVudFVSTCA9IGN1cnJlbnRVUkw7Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBjb250ZXh0IHdpdGggdGhlIGdpdmVuIHBhcmVudCBjb250ZXh0LgotICAgICAqIFRoZSBwYXJlbnQncyByb290VVJMIGFuZCBjdXJyZW50VVJMIGFyZSBzZXQgb24gdGhlIGNoaWxkLCBhbmQgdGhlIHBhcmVudCdzIHZhcmlhYmxlcyBhcmUKLSAgICAgKiBhdmFpbGFibGUgaW4gdGhlIGNoaWxkIGNvbnRleHQgdW5kZXIgdGhlIG5hbWUgPGNvZGU+cGFyZW50U2NvcGU8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRleHQgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIEplbGx5Q29udGV4dChKZWxseUNvbnRleHQgcGFyZW50KSB7Ci0gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICB0aGlzLnJvb3RVUkwgPSBwYXJlbnQucm9vdFVSTDsKLSAgICAgICAgdGhpcy5jdXJyZW50VVJMID0gcGFyZW50LmN1cnJlbnRVUkw7Ci0gICAgICAgIHRoaXMudmFyaWFibGVzLnB1dCgicGFyZW50U2NvcGUiLCBwYXJlbnQudmFyaWFibGVzKTsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBjb250ZXh0IHdpdGggdGhlIGdpdmVuIHBhcmVudCBjb250ZXh0LgotICAgICAqIFRoZSBwYXJlbnQncyByb290VVJMIGFyZSBzZXQgb24gdGhlIGNoaWxkLCBhbmQgdGhlIHBhcmVudCdzIHZhcmlhYmxlcyBhcmUKLSAgICAgKiBhdmFpbGFibGUgaW4gdGhlIGNoaWxkIGNvbnRleHQgdW5kZXIgdGhlIG5hbWUgPGNvZGU+cGFyZW50U2NvcGU8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudEplbGx5Q29udGV4dCB0aGUgcGFyZW50IGNvbnRleHQgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHQuCi0gICAgICogQHBhcmFtIGN1cnJlbnRVUkwgdGhlIHJvb3QgVVJMIHVzZWQgaW4gcmVzb2x2aW5nIHJlbGF0aXZlIHJlc291cmNlcwotICAgICAqLwotICAgIHB1YmxpYyBKZWxseUNvbnRleHQoSmVsbHlDb250ZXh0IHBhcmVudEplbGx5Q29udGV4dCwgVVJMIGN1cnJlbnRVUkwpIHsKLSAgICAgICAgdGhpcyhwYXJlbnRKZWxseUNvbnRleHQpOwotICAgICAgICB0aGlzLmN1cnJlbnRVUkwgPSBjdXJyZW50VVJMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBjb250ZXh0IHdpdGggdGhlIGdpdmVuIHBhcmVudCBjb250ZXh0LgotICAgICAqIFRoZSBwYXJlbnQncyB2YXJpYWJsZXMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgY2hpbGQgY29udGV4dCB1bmRlciB0aGUgbmFtZSA8Y29kZT5wYXJlbnRTY29wZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50SmVsbHlDb250ZXh0IHRoZSBwYXJlbnQgY29udGV4dCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dC4KLSAgICAgKiBAcGFyYW0gcm9vdFVSTCB0aGUgcm9vdCBVUkwgdXNlZCBpbiByZXNvbHZpbmcgYWJzb2x1dGUgcmVzb3VyY2VzIGkuZS4gdGhvc2Ugc3RhcnRpbmcgd2l0aCAnLycKLSAgICAgKiBAcGFyYW0gY3VycmVudFVSTCB0aGUgcm9vdCBVUkwgdXNlZCBpbiByZXNvbHZpbmcgcmVsYXRpdmUgcmVzb3VyY2VzCi0gICAgICovCi0gICAgcHVibGljIEplbGx5Q29udGV4dChKZWxseUNvbnRleHQgcGFyZW50SmVsbHlDb250ZXh0LCBVUkwgcm9vdFVSTCwgVVJMIGN1cnJlbnRVUkwpIHsKLSAgICAgICAgdGhpcyhwYXJlbnRKZWxseUNvbnRleHQsIGN1cnJlbnRVUkwpOwotICAgICAgICB0aGlzLnJvb3RVUkwgPSByb290VVJMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgdGhlIGNvbnRleHQuCi0gICAgICogVGhpcyBpbmNsdWRlcyBhZGRpbmcgdGhlIGNvbnRleHQgdG8gaXRzZWxmIHVuZGVyIHRoZSBuYW1lIDxjb2RlPmNvbnRleHQ8L2NvZGU+IGFuZAotICAgICAqIG1ha2luZyB0aGUgU3lzdGVtIFByb3BlcnRpZXMgYXZhaWxhYmxlIGFzIDxjb2RlPnN5c3RlbVNjb3BlPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICB2YXJpYWJsZXMucHV0KCJjb250ZXh0Iix0aGlzKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhcmlhYmxlcy5wdXQoInN5c3RlbVNjb3BlIiwgU3lzdGVtLmdldFByb3BlcnRpZXMoKSApOwotICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoInNlY3VyaXR5IGV4Y2VwdGlvbiBhY2Nlc3Npbmcgc3lzdGVtIHByb3BlcnRpZXMiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCBjb250ZXh0IGZvciB0aGlzIGNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgSmVsbHlDb250ZXh0IGdldFBhcmVudCgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzY29wZSBvZiB0aGUgZ2l2ZW4gbmFtZSwgc3VjaCBhcyB0aGUgJ3BhcmVudCcgc2NvcGUuCi0gICAgICogSWYgSmVsbHkgaXMgdXNlZCBpbiBhIFNlcnZsZXQgc2l0dWF0aW9uIHRoZW4gJ3JlcXVlc3QnLCAnc2Vzc2lvbicgYW5kICdhcHBsaWNhdGlvbicgYXJlIG90aGVyIG5hbWVzCi0gICAgICogZm9yIHNjb3BlcwotICAgICAqLwotICAgIHB1YmxpYyBKZWxseUNvbnRleHQgZ2V0U2NvcGUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKCAicGFyZW50Ii5lcXVhbHMoIG5hbWUgKSApIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRQYXJlbnQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kcyB0aGUgdmFyaWFibGUgdmFsdWUgb2YgdGhlIGdpdmVuIG5hbWUgaW4gdGhpcyBjb250ZXh0IG9yIGluIGFueSBvdGhlciBwYXJlbnQgY29udGV4dC4KLSAgICAgKiBJZiB0aGlzIGNvbnRleHQgZG9lcyBub3QgY29udGFpbiB0aGUgdmFyaWFibGUsIHRoZW4gaXRzIHBhcmVudCBpcyB1c2VkIGFuZCB0aGVuIGl0cyBwYXJlbnQKLSAgICAgKiBhbmQgc28gZm9ydGggdW50aWwgdGhlIGNvbnRleHQgd2l0aCBubyBwYXJlbnQgaXMgZm91bmQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgaW4gdGhpcyBvciBvbmUgb2YgaXRzIGRlc2NlbmRhbnQgY29udGV4dHMgb3IgbnVsbAotICAgICAqICBpZiB0aGUgdmFyaWFibGUgY291bGQgbm90IGJlIGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZmluZFZhcmlhYmxlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIE9iamVjdCBhbnN3ZXIgPSB2YXJpYWJsZXMuZ2V0KG5hbWUpOwotICAgICAgICBib29sZWFuIGRlZmluZWRIZXJlID0gYW5zd2VyICE9IG51bGwgfHwgdmFyaWFibGVzLmNvbnRhaW5zS2V5KG5hbWUpOwotCi0gICAgICAgIGlmIChkZWZpbmVkSGVyZSkgcmV0dXJuIGFuc3dlcjsKLQotICAgICAgICBpZiAoIGFuc3dlciA9PSBudWxsICYmIHBhcmVudCAhPSBudWxsICkgewotICAgICAgICAgICAgYW5zd2VyID0gcGFyZW50LmZpbmRWYXJpYWJsZShuYW1lKTsKLSAgICAgICAgfQotICAgICAgICAvLyAjIyMgdGhpcyBpcyBhIGhhY2sgLSByZW1vdmUgdGhpcyB3aGVuIHdlIGhhdmUgc3VwcG9ydCBmb3IgcGx1Z2dhYmxlIFNjb3BlcwotICAgICAgICBpZiAoIGFuc3dlciA9PSBudWxsICkgewotICAgICAgICAgICAgYW5zd2VyID0gZ2V0U3lzdGVtUHJvcGVydHkobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiZmluZFZhcmlhYmxlOiAiICsgbmFtZSArICIgdmFsdWU6ICIgKyBhbnN3ZXIgKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5zd2VyOwotICAgIH0KLQotCi0gICAgLyoqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiB2YXJpYWJsZSBuYW1lICovCi0gICAgcHVibGljIE9iamVjdCBnZXRWYXJpYWJsZShTdHJpbmcgbmFtZSkgewotICAgICAgICBPYmplY3QgdmFsdWUgPSB2YXJpYWJsZXMuZ2V0KG5hbWUpOwotICAgICAgICBib29sZWFuIGRlZmluZWRIZXJlID0gdmFsdWUgIT0gbnVsbCB8fCB2YXJpYWJsZXMuY29udGFpbnNLZXkobmFtZSk7Ci0KLSAgICAgICAgaWYgKGRlZmluZWRIZXJlKSByZXR1cm4gdmFsdWU7Ci0KLSAgICAgICAgaWYgKCB2YWx1ZSA9PSBudWxsICYmIGlzSW5oZXJpdCgpICkgewotICAgICAgICAgICAgSmVsbHlDb250ZXh0IHBhcmVudENvbnRleHQgPSBnZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnRDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcmVudENvbnRleHQuZ2V0VmFyaWFibGUoIG5hbWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vICMjIyB0aGlzIGlzIGEgaGFjayAtIHJlbW92ZSB0aGlzIHdoZW4gd2UgaGF2ZSBzdXBwb3J0IGZvciBwbHVnZ2FibGUgU2NvcGVzCi0gICAgICAgIGlmICggdmFsdWUgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHZhbHVlID0gZ2V0U3lzdGVtUHJvcGVydHkobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgc3lzdGVtIHByb3BlcnR5IGFuZCBoYW5kbGUgc2VjdXJpdHkgZXhjZXB0aW9ucwotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXRyaWV2ZQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSwgb3IgbnVsbCBpZiBhIFNlY3VyaXR5RXhjZXB0aW9uIG9jY3VycwotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IGdldFN5c3RlbVByb3BlcnR5KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoInNlY3VyaXR5IGV4Y2VwdGlvbiBhY2Nlc3Npbmcgc3lzdGVtIHByb3BlcnRpZXMiLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gdmFyaWFibGUgbmFtZSBpbiB0aGUgZ2l2ZW4gdmFyaWFibGUgc2NvcGUKLSAgICAgKiBAcGFyYW0gbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUKLSAgICAgKiBAcGFyYW0gc2NvcGVOYW1lIGlzIHRoZSBvcHRpb25hbCBzY29wZSBuYW1lIHN1Y2ggYXMgJ3BhcmVudCcuIEZvciBzZXJ2bGV0IGVudmlyb25tZW50cwotICAgICAqIHRoaXMgY291bGQgYmUgJ2FwcGxpY2F0aW9uJywgJ3Nlc3Npb24nIG9yICdyZXF1ZXN0Jy4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhcmlhYmxlKFN0cmluZyBuYW1lLCBTdHJpbmcgc2NvcGVOYW1lKSB7Ci0gICAgICAgIEplbGx5Q29udGV4dCBzY29wZSA9IGdldFNjb3BlKHNjb3BlTmFtZSk7Ci0gICAgICAgIGlmICggc2NvcGUgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIHJldHVybiBzY29wZS5nZXRWYXJpYWJsZShuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQotCi0gICAgLyoqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBuYW1lZCB2YXJpYWJsZSAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhcmlhYmxlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKCBpc0V4cG9ydCgpICkgewotICAgICAgICAgICAgZ2V0UGFyZW50KCkuc2V0VmFyaWFibGUoIG5hbWUsIHZhbHVlICk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHZhcmlhYmxlcy5yZW1vdmUobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB2YXJpYWJsZXMucHV0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiB2YXJpYWJsZSBuYW1lIGluIHRoZSBnaXZlbiB2YXJpYWJsZSBzY29wZQotICAgICAqIEBwYXJhbSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZQotICAgICAqIEBwYXJhbSBzY29wZU5hbWUgaXMgdGhlIG9wdGlvbmFsIHNjb3BlIG5hbWUgc3VjaCBhcyAncGFyZW50Jy4gRm9yIHNlcnZsZXQgZW52aXJvbm1lbnRzCi0gICAgICogIHRoaXMgY291bGQgYmUgJ2FwcGxpY2F0aW9uJywgJ3Nlc3Npb24nIG9yICdyZXF1ZXN0Jy4KLSAgICAgKiBAcGFyYW0gdmFsdWUgaXMgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZShTdHJpbmcgbmFtZSwgU3RyaW5nIHNjb3BlTmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIEplbGx5Q29udGV4dCBzY29wZSA9IGdldFNjb3BlKHNjb3BlTmFtZSk7Ci0gICAgICAgIGlmICggc2NvcGUgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIHNjb3BlLnNldFZhcmlhYmxlKG5hbWUsIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBSZW1vdmVzIHRoZSBnaXZlbiB2YXJpYWJsZSAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVZhcmlhYmxlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHZhcmlhYmxlcy5yZW1vdmUobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gdmFyaWFibGUgaW4gdGhlIHNwZWNpZmllZCBzY29wZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZQotICAgICAqIEBwYXJhbSBzY29wZU5hbWUgaXMgdGhlIG9wdGlvbmFsIHNjb3BlIG5hbWUgc3VjaCBhcyAncGFyZW50Jy4gRm9yIHNlcnZsZXQgZW52aXJvbm1lbnRzCi0gICAgICogIHRoaXMgY291bGQgYmUgJ2FwcGxpY2F0aW9uJywgJ3Nlc3Npb24nIG9yICdyZXF1ZXN0Jy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVWYXJpYWJsZShTdHJpbmcgbmFtZSwgU3RyaW5nIHNjb3BlTmFtZSkgewotICAgICAgICBKZWxseUNvbnRleHQgc2NvcGUgPSBnZXRTY29wZShzY29wZU5hbWUpOwotICAgICAgICBpZiAoIHNjb3BlICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBzY29wZS5yZW1vdmVWYXJpYWJsZShuYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYW4gSXRlcmF0b3Igb3ZlciB0aGUgY3VycmVudCB2YXJpYWJsZSBuYW1lcyBpbiB0aGlzCi0gICAgICogY29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRWYXJpYWJsZU5hbWVzKCkgewotICAgICAgICByZXR1cm4gdmFyaWFibGVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgTWFwIG9mIHZhcmlhYmxlcyBpbiB0aGlzIHNjb3BlCi0gICAgICovCi0gICAgcHVibGljIE1hcCBnZXRWYXJpYWJsZXMoKSB7Ci0gICAgICAgIHJldHVybiB2YXJpYWJsZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgTWFwIG9mIHZhcmlhYmxlcyB0byB1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZXMoTWFwIHZhcmlhYmxlcykgewotICAgICAgICAvLyBJIGhhdmUgc2VlbiB0aGlzIGZhaWwgd2hlbiB0aGUgcGFzc2VkIE1hcCBjb250YWlucyBhIGtleSwgdmFsdWUKLSAgICAgICAgLy8gcGFpciB3aGVyZSB0aGUgdmFsdWUgaXMgbnVsbAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB2YXJpYWJsZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbGVtZW50ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRWYWx1ZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnZhcmlhYmxlcy5wdXQoZWxlbWVudC5nZXRLZXkoKSwgZWxlbWVudC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL3RoaXMudmFyaWFibGVzLnB1dEFsbCggdmFyaWFibGVzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBmYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgY2hpbGQgY29udGV4dCBvZiB0aGUKLSAgICAgKiBjdXJyZW50IGNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIEplbGx5Q29udGV4dCBuZXdKZWxseUNvbnRleHQoTWFwIG5ld1ZhcmlhYmxlcykgewotICAgICAgICAvLyBYWFhYOiBzaG91bGQgYWxsb3cgdGhpcyBuZXcgY29udGV4dCB0bwotICAgICAgICAvLyBYWFhYOiBpbmhlcml0IHBhcmVudCBjb250ZXh0cz8KLSAgICAgICAgLy8gWFhYWDogT3IgYXQgbGVhc3QgcHVibGlzaCB0aGUgcGFyZW50IHNjb3BlCi0gICAgICAgIC8vIFhYWFg6IGFzIGEgTWFwIGluIHRoaXMgbmV3IHZhcmlhYmxlIHNjb3BlPwotICAgICAgICBuZXdWYXJpYWJsZXMucHV0KCJwYXJlbnRTY29wZSIsIHZhcmlhYmxlcyk7Ci0gICAgICAgIEplbGx5Q29udGV4dCBhbnN3ZXIgPSBjcmVhdGVDaGlsZENvbnRleHQoKTsKLSAgICAgICAgYW5zd2VyLnNldFZhcmlhYmxlcyhuZXdWYXJpYWJsZXMpOwotICAgICAgICByZXR1cm4gYW5zd2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgZmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IGNoaWxkIGNvbnRleHQgb2YgdGhlCi0gICAgICogY3VycmVudCBjb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBKZWxseUNvbnRleHQgbmV3SmVsbHlDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gY3JlYXRlQ2hpbGRDb250ZXh0KCk7Ci0gICAgfQotICAgIAotCi0gICAgLyoqIEdldHMgdGhlIFNjcmlwdCBkYXRhIGl0ZW0gdGhhdCBtYXkgaGF2ZSBwcmV2aW91c2x5IGJlZW4gc3RvcmVkCi0gICAgICogYnkgdGhlIHNjcmlwdCwgaW4gdGhpcyBjb250ZXh0LCBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgotICAgICAqICAKLSAgICAgKiBAcmV0dXJuIHRoZSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGNvbnRleHQgYW5kIHRocmVhZAotICAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFRocmVhZFNjcmlwdERhdGEoU2NyaXB0IHNjcmlwdCkgewotICAgICAgICBpZiggc2NyaXB0ID09IG51bGwgKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFRhZyB0YWcgPSAoVGFnKSBnZXRUaHJlYWRTY3JpcHREYXRhTWFwKCkuZ2V0KHNjcmlwdCk7Ci0JCWlmKCB0YWcgPT0gbnVsbCAmJiBnZXRQYXJlbnQoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0VGhyZWFkU2NyaXB0RGF0YShzY3JpcHQpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHRhZzsKLQkJfQotICAgIH0KLQkKLQkvKiogR2V0cyBhIHBlci10aHJlYWQgKHRocmVhZCBsb2NhbCkgTWFwIG9mIGRhdGEgZm9yIHVzZSBieQotICAgICAqIFNjcmlwdHMuCi0gICAgICogQHJldHVybiB0aGUgdGhyZWFkIGxvY2FsIE1hcCBvZiBTY3JpcHQgZGF0YSAqLwotCXB1YmxpYyBNYXAgZ2V0VGhyZWFkU2NyaXB0RGF0YU1hcCgpIHsKLSAgICAgICAgTWFwIHJ2OwotICAgICAgICBNYXAgZGF0YSA9IChNYXApIHRocmVhZExvY2FsU2NyaXB0RGF0YS5nZXQoKTsKLSAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgcnYgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgdGhyZWFkTG9jYWxTY3JpcHREYXRhLnNldChydik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBydiA9IGRhdGE7Ci0gICAgICAgIH0KLQkJcmV0dXJuIHJ2OwotCX0KLSAgICAKLSAgICAvKiogU3RvcmVzIGFuIG9iamVjdCB0aGF0IGxhc3RzIGZvciB0aGUgbGlmZSBvZiB0aGlzIGNvbnRleHQKLSAgICAgKiBhbmQgaXMgbG9jYWwgdG8gdGhlIGN1cnJlbnQgdGhyZWFkLiBUaGlzIG1ldGhvZCBpcwotICAgICAqIG1haW5seSBpbnRlbmRlZCB0byBzdG9yZSBUYWcgaW5zdGFuY2VzLiBIb3dldmVyLCBhbnkKLSAgICAgKiBTY3JpcHQgdGhhdCB3YW50cyB0byBjYWNoZSBkYXRhIGNhbiB1c2UgdGhpcwotICAgICAqIG1ldGhvZC4KLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGhyZWFkU2NyaXB0RGF0YShTY3JpcHQgc2NyaXB0LCBPYmplY3QgZGF0YSkgewotICAgICAgICBnZXRUaHJlYWRTY3JpcHREYXRhTWFwKCkucHV0KHNjcmlwdCxkYXRhKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqIENsZWFycyB2YXJpYWJsZXMgc2V0IGJ5IFRhZ3MgKGJhc2ljYWxseSwgdmFyaWFibGVzIHNldCBpbiBhIEplbGx5IHNjcmlwdCkKLSAgICAgKiBhbmQgZGF0YSBzdG9yZWQgYnkge0BsaW5rIFNjcmlwdH0gaW5zdGFuY2VzLgotICAgICAqIEBzZWUgI2NsZWFyVmFyaWFibGVzKCkKLSAgICAgKiBAc2VlICNjbGVhclRocmVhZFNjcmlwdERhdGEoKQotICAgICAqIEBzZWUgI2NsZWFyU2NyaXB0RGF0YSgpCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBnZXRUaHJlYWRTY3JpcHREYXRhTWFwKCkuY2xlYXIoKTsKLSAgICAgICAgdmFyaWFibGVzLmNsZWFyKCk7Ci0gICAgfQotICAgIAotICAgIC8qKiBDbGVhcnMgdmFyaWFibGVzIHNldCBieSBUYWdzICh2YXJpYWJsZXMgc2V0IHdoaWxlIHJ1bm5pbmcgYSBKZWxseSBzY3JpcHQpCi0gICAgICogQHNlZSAjY2xlYXIoKQotICAgICAqIEBzZWUgI2NsZWFyVGhyZWFkU2NyaXB0RGF0YSgpCi0gICAgICogQHNlZSAjY2xlYXJTY3JpcHREYXRhKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhclZhcmlhYmxlcygpIHsKLSAgICAgICAgdmFyaWFibGVzLmNsZWFyKCk7Ci0gICAgfQotICAgIAotICAgIC8qKiBDbGVhcnMgZGF0YSBjYWNoZWQgYnkge0BsaW5rIFNjcmlwdH0gaW5zdGFuY2VzLCAKLSAgICAgKiBmb3IgdGhpcyBjb250ZXh0LCA8c3Ryb25nPmZvciB0aGUgY3VycmVudCB0aHJlYWQ8L3N0cm9uZz4uCi0gICAgICogVGhlIGRhdGEgY2xlYXJlZCBjb3VsZCBiZSBjYWNoZWQgVGFnIGluc3RhbmNlcyBvciBvdGhlciBkYXRhCi0gICAgICogc2F2ZWQgYnkgU2NyaXB0IGNsYXNzZXMuCi0gICAgICogQHNlZSAjY2xlYXIoKQotICAgICAqIEBzZWUgI2NsZWFyVmFyaWFibGVzKCkKLSAgICAgKiBAc2VlICNjbGVhclNjcmlwdERhdGEoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyVGhyZWFkU2NyaXB0RGF0YSgpIHsKLSAgICAgICAgZ2V0VGhyZWFkU2NyaXB0RGF0YU1hcCgpLmNsZWFyKCk7Ci0gICAgfQotICAgIAotICAgIC8qKiBDbGVhcnMgZGF0YSBjYWNoZWQgYnkge0BsaW5rIFNjcmlwdH0gaW5zdGFuY2VzLCAKLSAgICAgKiBmb3IgdGhpcyBjb250ZXh0LCA8c3Ryb25nPmZvciBhbGwgdGhyZWFkczwvc3Ryb25nPi4gCi0gICAgICogVGhlIGRhdGEgY2xlYXJlZCBjb3VsZCBiZSBjYWNoZWQgVGFnIGluc3RhbmNlcyBvciBvdGhlciBkYXRhCi0gICAgICogc2F2ZWQgYnkgU2NyaXB0IGNsYXNzZXMuCi0gICAgICogQHNlZSAjY2xlYXIoKQotICAgICAqIEBzZWUgI2NsZWFyVGhyZWFkU2NyaXB0RGF0YSgpCi0gICAgICogQHNlZSAjY2xlYXJWYXJpYWJsZXMoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyU2NyaXB0RGF0YSgpIHsKLSAgICAgICAgdGhyZWFkTG9jYWxTY3JpcHREYXRhID0gbmV3IFRocmVhZExvY2FsKCk7Ci0gICAgfQotICAgIAotICAgIC8qKiBSZWdpc3RlcnMgdGhlIGdpdmVuIHRhZyBsaWJyYXJ5IGFnYWluc3QgdGhlIGdpdmVuIG5hbWVzcGFjZSBVUkkuCi0gICAgICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB0aGUgcGFyc2VyIGlzIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJUYWdMaWJyYXJ5KFN0cmluZyBuYW1lc3BhY2VVUkksIFRhZ0xpYnJhcnkgdGFnbGliKSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWdpc3RlcmluZyB0YWcgbGlicmFyeSB0bzogIiArIG5hbWVzcGFjZVVSSSArICIgdGFnbGliOiAiICsgdGFnbGliKTsKLSAgICAgICAgfQotICAgICAgICB0YWdsaWJzLnB1dChuYW1lc3BhY2VVUkksIHRhZ2xpYik7Ci0KLSAgICAgICAgaWYgKGlzRXhwb3J0TGlicmFyaWVzKCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhcmVudC5yZWdpc3RlclRhZ0xpYnJhcnkoIG5hbWVzcGFjZVVSSSwgdGFnbGliICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogUmVnaXN0ZXJzIHRoZSBnaXZlbiB0YWcgbGlicmFyeSBjbGFzcyBuYW1lIGFnYWluc3QgdGhlIGdpdmVuIG5hbWVzcGFjZSBVUkkuCi0gICAgICogVGhlIGNsYXNzIHdpbGwgYmUgbG9hZGVkIHZpYSB0aGUgZ2l2ZW4gQ2xhc3NMb2FkZXIKLSAgICAgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBwYXJzZXIgaXMgdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlclRhZ0xpYnJhcnkoCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkksCi0gICAgICAgIFN0cmluZyBjbGFzc05hbWUpIHsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVnaXN0ZXJpbmcgdGFnIGxpYnJhcnkgdG86ICIgKyBuYW1lc3BhY2VVUkkgKyAiIHRhZ2xpYjogIiArIGNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGFnbGlicy5wdXQobmFtZXNwYWNlVVJJLCBjbGFzc05hbWUpOwotCi0gICAgICAgIGlmIChpc0V4cG9ydExpYnJhcmllcygpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwYXJlbnQucmVnaXN0ZXJUYWdMaWJyYXJ5KCBuYW1lc3BhY2VVUkksIGNsYXNzTmFtZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNUYWdMaWJyYXJ5UmVnaXN0ZXJlZChTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0gICAgICAgIGJvb2xlYW4gYW5zd2VyID0gdGFnbGlicy5jb250YWluc0tleSggbmFtZXNwYWNlVVJJICk7Ci0gICAgICAgIGlmIChhbnN3ZXIpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBwYXJlbnQgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuaXNUYWdMaWJyYXJ5UmVnaXN0ZXJlZChuYW1lc3BhY2VVUkkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgVGFnTGlicmFyeSBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZSBVUkkgb3IgbnVsbCBpZiBvbmUgY291bGQgbm90IGJlIGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIFRhZ0xpYnJhcnkgZ2V0VGFnTGlicmFyeShTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0KLSAgICAgICAgLy8gdXNlIG15IG93biBtYXBwaW5nIGZpcnN0LCBzbyB0aGF0IG5hbWVzcGFjZVVSSXMgY2FuCi0gICAgICAgIC8vIGJlIHJlZGVmaW5lZCBpbnNpZGUgY2hpbGQgY29udGV4dHMuLi4KLQotICAgICAgICBPYmplY3QgYW5zd2VyID0gdGFnbGlicy5nZXQobmFtZXNwYWNlVVJJKTsKLQotICAgICAgICBpZiAoIGFuc3dlciA9PSBudWxsICYmIHBhcmVudCAhPSBudWxsICkgewotICAgICAgICAgICAgYW5zd2VyID0gcGFyZW50LmdldFRhZ0xpYnJhcnkoIG5hbWVzcGFjZVVSSSApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBhbnN3ZXIgaW5zdGFuY2VvZiBUYWdMaWJyYXJ5ICkgewotICAgICAgICAgICAgcmV0dXJuIChUYWdMaWJyYXJ5KSBhbnN3ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIGFuc3dlciBpbnN0YW5jZW9mIFN0cmluZyApIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSBhbnN3ZXI7Ci0gICAgICAgICAgICBDbGFzcyB0aGVDbGFzcyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoZUNsYXNzID0gZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNvdWxkIG5vdCBmaW5kIHRoZSBjbGFzczogIiArIGNsYXNzTmFtZSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIHRoZUNsYXNzICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IHRoZUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBUYWdMaWJyYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YWdsaWJzLnB1dChuYW1lc3BhY2VVUkksIG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFRhZ0xpYnJhcnkpIG9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHRhZyBsaWJyYXJ5IG9iamVjdCBtYXBwZWQgdG86ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lc3BhY2VVUkkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vdCBhIFRhZ0xpYnJhcnkuIE9iamVjdCA9ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvYmplY3QpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGluc3RhbnRpYXRlIGluc3RhbmNlIG9mIGNsYXNzOiAiICsgY2xhc3NOYW1lICsgIi4gUmVhc29uOiAiICsgZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF0dGVtcHRzIHRvIHBhcnNlIHRoZSBzY3JpcHQgZnJvbSB0aGUgZ2l2ZW4gdXJpIHVzaW5nIHRoZQotICAgICAqIHtAbGluayAjZ2V0UmVzb3VyY2V9IG1ldGhvZCB0aGVuIHJldHVybnMgdGhlIGNvbXBpbGVkIHNjcmlwdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NyaXB0IGNvbXBpbGVTY3JpcHQoU3RyaW5nIHVyaSkgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLSAgICAgICAgWE1MUGFyc2VyIHBhcnNlciA9IGdldFhNTFBhcnNlcigpOwotICAgICAgICBwYXJzZXIuc2V0Q29udGV4dCh0aGlzKTsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBnZXRSZXNvdXJjZUFzU3RyZWFtKHVyaSk7Ci0gICAgICAgIGlmIChpbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIEplbGx5IHNjcmlwdDogIiArIHVyaSk7Ci0gICAgICAgIH0KLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzY3JpcHQgPSBwYXJzZXIucGFyc2UoaW4pOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlFeGNlcHRpb24oSmVsbHlDb250ZXh0LkJBRF9QQVJTRSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlFeGNlcHRpb24oSmVsbHlDb250ZXh0LkJBRF9QQVJTRSwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2NyaXB0LmNvbXBpbGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdHRlbXB0cyB0byBwYXJzZSB0aGUgc2NyaXB0IGZyb20gdGhlIGdpdmVuIFVSTCB1c2luZyB0aGUKLSAgICAgKiB7QGxpbmsgI2dldFJlc291cmNlfSBtZXRob2QgdGhlbiByZXR1cm5zIHRoZSBjb21waWxlZCBzY3JpcHQuCi0gICAgICovCi0gICAgcHVibGljIFNjcmlwdCBjb21waWxlU2NyaXB0KFVSTCB1cmwpIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFBhcnNlciBwYXJzZXIgPSBnZXRYTUxQYXJzZXIoKTsKLSAgICAgICAgcGFyc2VyLnNldENvbnRleHQodGhpcyk7Ci0KLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzY3JpcHQgPSBwYXJzZXIucGFyc2UodXJsLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlFeGNlcHRpb24oSmVsbHlDb250ZXh0LkJBRF9QQVJTRSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlFeGNlcHRpb24oSmVsbHlDb250ZXh0LkJBRF9QQVJTRSwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2NyaXB0LmNvbXBpbGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdHRlbXB0cyB0byBwYXJzZSB0aGUgc2NyaXB0IGZyb20gdGhlIGdpdmVuIElucHV0U291cmNlIHVzaW5nIHRoZQotICAgICAqIHtAbGluayAjZ2V0UmVzb3VyY2V9IG1ldGhvZCB0aGVuIHJldHVybnMgdGhlIGNvbXBpbGVkIHNjcmlwdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NyaXB0IGNvbXBpbGVTY3JpcHQoSW5wdXRTb3VyY2Ugc291cmNlKSB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotICAgICAgICBYTUxQYXJzZXIgcGFyc2VyID0gZ2V0WE1MUGFyc2VyKCk7Ci0gICAgICAgIHBhcnNlci5zZXRDb250ZXh0KHRoaXMpOwotCi0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2NyaXB0ID0gcGFyc2VyLnBhcnNlKHNvdXJjZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseUV4Y2VwdGlvbihKZWxseUNvbnRleHQuQkFEX1BBUlNFLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseUV4Y2VwdGlvbihKZWxseUNvbnRleHQuQkFEX1BBUlNFLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzY3JpcHQuY29tcGlsZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYSB0aHJlYWQgcG9vbGVkIFhNTFBhcnNlciB0byBhdm9pZCB0aGUgc3RhcnR1cCBvdmVyaGVhZAotICAgICAqIG9mIHRoZSBYTUxQYXJzZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWE1MUGFyc2VyIGdldFhNTFBhcnNlcigpIHsKLSAgICAgICAgWE1MUGFyc2VyIHBhcnNlciA9IGNyZWF0ZVhNTFBhcnNlcigpOwotICAgICAgICByZXR1cm4gcGFyc2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGFsbG93IEplbGx5Q29udGV4dCBpbXBsZW1lbnRhdGlvbnMgdG8gb3ZlcmxvYWQgaG93IGFuIFhNTFBhcnNlcgotICAgICAqIGlzIGNyZWF0ZWQgLSBzdWNoIGFzIHRvIG92ZXJsb2FkIHdoYXQgdGhlIGRlZmF1bHQgRXhwcmVzc2lvbkZhY3Rvcnkgc2hvdWxkIGJlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBYTUxQYXJzZXIgY3JlYXRlWE1MUGFyc2VyKCkgewotICAgICAgICByZXR1cm4gbmV3IFhNTFBhcnNlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgc2NyaXB0IGZyb20gdGhlIGdpdmVuIEZpbGUgdGhlbiBjb21waWxlcyBpdCBhbmQgcnVucyBpdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBjaGlsZCBjb250ZXh0IHRoYXQgd2FzIHVzZWQgdG8gcnVuIHRoZSBzY3JpcHQKLSAgICAgKi8KLSAgICBwdWJsaWMgSmVsbHlDb250ZXh0IHJ1blNjcmlwdChGaWxlIGZpbGUsIFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gcnVuU2NyaXB0KGZpbGUudG9VUkwoKSwgb3V0cHV0LCBKZWxseUNvbnRleHQuREVGQVVMVF9FWFBPUlQsCi0gICAgICAgICAgICAgICAgSmVsbHlDb250ZXh0LkRFRkFVTFRfSU5IRVJJVCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlFeGNlcHRpb24oZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgc2NyaXB0IGZyb20gdGhlIGdpdmVuIFVSTCB0aGVuIGNvbXBpbGVzIGl0IGFuZCBydW5zIGl0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV3IGNoaWxkIGNvbnRleHQgdGhhdCB3YXMgdXNlZCB0byBydW4gdGhlIHNjcmlwdAotICAgICAqLwotICAgIHB1YmxpYyBKZWxseUNvbnRleHQgcnVuU2NyaXB0KFVSTCB1cmwsIFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBydW5TY3JpcHQodXJsLCBvdXRwdXQsIEplbGx5Q29udGV4dC5ERUZBVUxUX0VYUE9SVCwKLSAgICAgICAgICAgIEplbGx5Q29udGV4dC5ERUZBVUxUX0lOSEVSSVQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgc2NyaXB0IGZyb20gdGhlIGdpdmVuIElucHV0U291cmNlIHRoZW4gY29tcGlsZXMgaXQgYW5kIHJ1bnMgaXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgY2hpbGQgY29udGV4dCB0aGF0IHdhcyB1c2VkIHRvIHJ1biB0aGUgc2NyaXB0Ci0gICAgICovCi0gICAgcHVibGljIEplbGx5Q29udGV4dCBydW5TY3JpcHQoSW5wdXRTb3VyY2Ugc291cmNlLCBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcnVuU2NyaXB0KHNvdXJjZSwgb3V0cHV0LCBKZWxseUNvbnRleHQuREVGQVVMVF9FWFBPUlQsCi0gICAgICAgICAgICBKZWxseUNvbnRleHQuREVGQVVMVF9JTkhFUklUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIHNjcmlwdCBmcm9tIHRoZSBnaXZlbiB1cmkgdXNpbmcgdGhlCi0gICAgICogSmVsbHlDb250ZXh0LmdldFJlc291cmNlKCkgQVBJIHRoZW4gY29tcGlsZXMgaXQgYW5kIHJ1bnMgaXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgY2hpbGQgY29udGV4dCB0aGF0IHdhcyB1c2VkIHRvIHJ1biB0aGUgc2NyaXB0Ci0gICAgICovCi0gICAgcHVibGljIEplbGx5Q29udGV4dCBydW5TY3JpcHQoU3RyaW5nIHVyaSwgWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLSAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB1cmwgPSBnZXRSZXNvdXJjZSh1cmkpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5RXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodXJsID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseUV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgSmVsbHkgc2NyaXB0OiAiICsgdXJsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnVuU2NyaXB0KHVybCwgb3V0cHV0LCBKZWxseUNvbnRleHQuREVGQVVMVF9FWFBPUlQsCi0gICAgICAgICAgICBKZWxseUNvbnRleHQuREVGQVVMVF9JTkhFUklUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIHNjcmlwdCBmcm9tIHRoZSBnaXZlbiB1cmkgdXNpbmcgdGhlCi0gICAgICogSmVsbHlDb250ZXh0LmdldFJlc291cmNlKCkgQVBJIHRoZW4gY29tcGlsZXMgaXQgYW5kIHJ1bnMgaXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgY2hpbGQgY29udGV4dCB0aGF0IHdhcyB1c2VkIHRvIHJ1biB0aGUgc2NyaXB0Ci0gICAgICovCi0gICAgcHVibGljIEplbGx5Q29udGV4dCBydW5TY3JpcHQoU3RyaW5nIHVyaSwgWE1MT3V0cHV0IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHBvcnQsIGJvb2xlYW4gaW5oZXJpdCkgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLSAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB1cmwgPSBnZXRSZXNvdXJjZSh1cmkpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5RXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodXJsID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseUV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgSmVsbHkgc2NyaXB0OiAiICsgdXJsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBydW5TY3JpcHQodXJsLCBvdXRwdXQsIGV4cG9ydCwgaW5oZXJpdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBzY3JpcHQgZnJvbSB0aGUgZ2l2ZW4gZmlsZSB0aGVuIGNvbXBpbGVzIGl0IGFuZCBydW5zIGl0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV3IGNoaWxkIGNvbnRleHQgdGhhdCB3YXMgdXNlZCB0byBydW4gdGhlIHNjcmlwdAotICAgICAqLwotICAgIHB1YmxpYyBKZWxseUNvbnRleHQgcnVuU2NyaXB0KEZpbGUgZmlsZSwgWE1MT3V0cHV0IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHBvcnQsIGJvb2xlYW4gaW5oZXJpdCkgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBydW5TY3JpcHQoZmlsZS50b1VSTCgpLCBvdXRwdXQsIGV4cG9ydCwgaW5oZXJpdCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlFeGNlcHRpb24oZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgc2NyaXB0IGZyb20gdGhlIGdpdmVuIFVSTCB0aGVuIGNvbXBpbGVzIGl0IGFuZCBydW5zIGl0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV3IGNoaWxkIGNvbnRleHQgdGhhdCB3YXMgdXNlZCB0byBydW4gdGhlIHNjcmlwdAotICAgICAqLwotICAgIHB1YmxpYyBKZWxseUNvbnRleHQgcnVuU2NyaXB0KFVSTCB1cmwsIFhNTE91dHB1dCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwb3J0LCBib29sZWFuIGluaGVyaXQpIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBydW5TY3JpcHQobmV3IElucHV0U291cmNlKHVybC50b1N0cmluZygpKSwgb3V0cHV0LCBleHBvcnQsIGluaGVyaXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgc2NyaXB0IGZyb20gdGhlIGdpdmVuIElucHV0U291cmNlIHRoZW4gY29tcGlsZXMgaXQgYW5kIHJ1bnMgaXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgY2hpbGQgY29udGV4dCB0aGF0IHdhcyB1c2VkIHRvIHJ1biB0aGUgc2NyaXB0Ci0gICAgICovCi0gICAgcHVibGljIEplbGx5Q29udGV4dCBydW5TY3JpcHQoSW5wdXRTb3VyY2Ugc291cmNlLCBYTUxPdXRwdXQgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGV4cG9ydCwgYm9vbGVhbiBpbmhlcml0KSB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gY29tcGlsZVNjcmlwdChzb3VyY2UpOwotCi0gICAgICAgIFVSTCBuZXdKZWxseUNvbnRleHRVUkwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV3SmVsbHlDb250ZXh0VVJMID0gZ2V0SmVsbHlDb250ZXh0VVJMKHNvdXJjZSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlFeGNlcHRpb24oZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEplbGx5Q29udGV4dCBuZXdKZWxseUNvbnRleHQgPSBuZXdKZWxseUNvbnRleHQoKTsKLSAgICAgICAgbmV3SmVsbHlDb250ZXh0LnNldFJvb3RVUkwoIG5ld0plbGx5Q29udGV4dFVSTCApOwotICAgICAgICBuZXdKZWxseUNvbnRleHQuc2V0Q3VycmVudFVSTCggbmV3SmVsbHlDb250ZXh0VVJMICk7Ci0gICAgICAgIG5ld0plbGx5Q29udGV4dC5zZXRFeHBvcnQoIGV4cG9ydCApOwotICAgICAgICBuZXdKZWxseUNvbnRleHQuc2V0SW5oZXJpdCggaW5oZXJpdCApOwotCi0gICAgICAgIGlmICggaW5oZXJpdCApIHsKLSAgICAgICAgICAgIC8vIHVzZSB0aGUgc2FtZSB2YXJpYWJsZSBzY29wZXMKLSAgICAgICAgICAgIG5ld0plbGx5Q29udGV4dC52YXJpYWJsZXMgPSB0aGlzLnZhcmlhYmxlczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyggIkFib3V0IHRvIHJ1biBzY3JpcHQ6ICIgKyBzb3VyY2UuZ2V0U3lzdGVtSWQoKSApOwotICAgICAgICAgICAgbG9nLmRlYnVnKCAicm9vdCBjb250ZXh0IFVSTDogIiArIG5ld0plbGx5Q29udGV4dC5yb290VVJMICk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoICJjdXJyZW50IGNvbnRleHQgVVJMOiAiICsgbmV3SmVsbHlDb250ZXh0LmN1cnJlbnRVUkwgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNjcmlwdC5ydW4obmV3SmVsbHlDb250ZXh0LCBvdXRwdXQpOwotCi0gICAgICAgIHJldHVybiBuZXdKZWxseUNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIFVSTCBmb3IgdGhlIGdpdmVuIHJlc291cmNlIGZyb20gdGhlIHNwZWNpZmllZCBwYXRoLgotICAgICAqIElmIHRoZSB1cmkgc3RhcnRzIHdpdGggIi8iIHRoZW4gdGhlIHBhdGggaXMgdGFrZW4gYXMgcmVsYXRpdmUgdG8KLSAgICAgKiB0aGUgY3VycmVudCBjb250ZXh0IHJvb3QuCi0gICAgICogSWYgdGhlIHVyaSBpcyBhIHdlbGwgZm9ybWVkIFVSTCB0aGVuIGl0IGlzIHVzZWQuCi0gICAgICogSWYgdGhlIHVyaSBpcyBhIGZpbGUgdGhhdCBleGlzdHMgYW5kIGNhbiBiZSByZWFkIHRoZW4gaXQgaXMgdXNlZC4KLSAgICAgKiBPdGhlcndpc2UgdGhlIHVyaSBpcyBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBjb250ZXh0ICh0aGUKLSAgICAgKiBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBzY3JpcHQpLgotICAgICAqLwotICAgIHB1YmxpYyBVUkwgZ2V0UmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh1cmkuc3RhcnRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICAvLyBhcHBlbmQgdGhpcyB1cmkgdG8gdGhlIGNvbnRleHQgcm9vdAotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlbGF0aXZlVVJMKHJvb3RVUkwsIHVyaS5zdWJzdHJpbmcoMSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVSTCh1cmkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gbGV0cyB0cnkgZmluZCBhIHJlbGF0aXZlIHJlc291cmNlCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlbGF0aXZlVVJMKGN1cnJlbnRVUkwsIHVyaSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXR0ZW1wdHMgdG8gb3BlbiBhbiBJbnB1dFN0cmVhbSB0byB0aGUgZ2l2ZW4gcmVzb3VyY2UgYXQgdGhlIHNwZWNpZmllZCBwYXRoLgotICAgICAqIElmIHRoZSB1cmkgc3RhcnRzIHdpdGggIi8iIHRoZW4gdGhlIHBhdGggaXMgdGFrZW4gYXMgcmVsYXRpdmUgdG8KLSAgICAgKiB0aGUgY3VycmVudCBjb250ZXh0IHJvb3QuIElmIHRoZSB1cmkgaXMgYSB3ZWxsIGZvcm1lZCBVUkwgdGhlbiBpdAotICAgICAqIGlzIHVzZWQuIE90aGVyd2lzZSB0aGUgdXJpIGlzIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50Ci0gICAgICogY29udGV4dCAodGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IHNjcmlwdCkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG51bGwgaWYgdGhpcyByZXNvdXJjZSBjb3VsZCBub3QgYmUgbG9hZGVkLCBvdGhlcndpc2UgdGhlIHJlc291cmNlcwotICAgICAqICBpbnB1dCBzdHJlYW0gaXMgcmV0dXJuZWQuCi0gICAgICovCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIHVyaSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVVJMIHVybCA9IGdldFJlc291cmNlKHVyaSk7Ci0gICAgICAgICAgICByZXR1cm4gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgKLSAgICAgICAgICAgICAgICAgICAgIkNhdWdodCBleGNlcHRpb24gYXR0ZW1wdGluZyB0byBvcGVuOiAiICsgdXJpICsgIi4gRXhjZXB0aW9uOiAiICsgZSwKLSAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCByb290IGNvbnRleHQgVVJMIGZyb20gd2hpY2ggYWxsIGFic29sdXRlIHJlc291cmNlIFVSSXMKLSAgICAgKiAgd2lsbCBiZSByZWxhdGl2ZSB0by4gRm9yIGV4YW1wbGUgaW4gYSB3ZWIgYXBwbGljYXRpb24gdGhlIHJvb3QgVVJMIHdpbGwKLSAgICAgKiAgbWFwIHRvIHRoZSB3ZWIgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHRoZSBXRUItSU5GIGRpcmVjdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVVJMIGdldFJvb3RVUkwoKSB7Ci0gICAgICAgIHJldHVybiByb290VVJMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgcm9vdCBjb250ZXh0IFVSTCBmcm9tIHdoaWNoIGFsbCBhYnNvbHV0ZSByZXNvdXJjZSBVUklzCi0gICAgICogIHdpbGwgYmUgcmVsYXRpdmUgdG8uIEZvciBleGFtcGxlIGluIGEgd2ViIGFwcGxpY2F0aW9uIHRoZSByb290IFVSTCB3aWxsCi0gICAgICogIG1hcCB0byB0aGUgd2ViIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyB0aGUgV0VCLUlORiBkaXJlY3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um9vdFVSTChVUkwgcm9vdFVSTCkgewotICAgICAgICB0aGlzLnJvb3RVUkwgPSByb290VVJMOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCBVUkwgY29udGV4dCBvZiB0aGUgY3VycmVudCBzY3JpcHQgdGhhdCBpcyBleGVjdXRpbmcuCi0gICAgICogIFRoaXMgVVJMIGNvbnRleHQgaXMgdXNlZCB0byBkZWR1Y2UgcmVsYXRpdmUgc2NyaXB0cyB3aGVuIHJlbGF0aXZlIFVSSXMgYXJlCi0gICAgICogIHVzZWQgaW4gY2FsbHMgdG8ge0BsaW5rICNnZXRSZXNvdXJjZX0gdG8gcHJvY2VzcyByZWxhdGl2ZSBzY3JpcHRzLgotICAgICAqLwotICAgIHB1YmxpYyBVUkwgZ2V0Q3VycmVudFVSTCgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnRVUkw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBVUkwgY29udGV4dCBvZiB0aGUgY3VycmVudCBzY3JpcHQgdGhhdCBpcyBleGVjdXRpbmcuCi0gICAgICogIFRoaXMgVVJMIGNvbnRleHQgaXMgdXNlZCB0byBkZWR1Y2UgcmVsYXRpdmUgc2NyaXB0cyB3aGVuIHJlbGF0aXZlIFVSSXMgYXJlCi0gICAgICogIHVzZWQgaW4gY2FsbHMgdG8ge0BsaW5rICNnZXRSZXNvdXJjZX0gdG8gcHJvY2VzcyByZWxhdGl2ZSBzY3JpcHRzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRVUkwoVVJMIGN1cnJlbnRVUkwpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50VVJMID0gY3VycmVudFVSTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgd2UgZXhwb3J0IHRhZyBsaWJyYXJpZXMgdG8gb3VyIHBhcmVudHMgY29udGV4dAotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRXhwb3J0TGlicmFyaWVzKCkgewotICAgICAgICByZXR1cm4gZXhwb3J0TGlicmFyaWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB3ZSBleHBvcnQgdGFnIGxpYnJhcmllcyB0byBvdXIgcGFyZW50cyBjb250ZXh0Ci0gICAgICogQHBhcmFtIGV4cG9ydExpYnJhcmllcyBUaGUgZXhwb3J0TGlicmFyaWVzIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4cG9ydExpYnJhcmllcyhib29sZWFuIGV4cG9ydExpYnJhcmllcykgewotICAgICAgICB0aGlzLmV4cG9ydExpYnJhcmllcyA9IGV4cG9ydExpYnJhcmllczsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB3ZSBzaG91bGQgZXhwb3J0IHZhcmlhYmxlIGRlZmluaXRpb25zIHRvIG91ciBwYXJlbnQgY29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4cG9ydChib29sZWFuIGV4cG9ydCkgewotICAgICAgICB0aGlzLmV4cG9ydCA9IGV4cG9ydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgd2Ugc2hvdWxkIGV4cG9ydCB2YXJpYWJsZSBkZWZpbml0aW9ucyB0byBvdXIgcGFyZW50IGNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0V4cG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXhwb3J0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB3ZSBzaG91bGQgaW5oZXJpdCB2YXJpYWJsZXMgZnJvbSBvdXIgcGFyZW50IGNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmhlcml0KGJvb2xlYW4gaW5oZXJpdCkgewotICAgICAgICB0aGlzLmluaGVyaXQgPSBpbmhlcml0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gd2hldGhlciB3ZSBzaG91bGQgaW5oZXJpdCB2YXJpYWJsZXMgZnJvbSBvdXIgcGFyZW50IGNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luaGVyaXQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmluaGVyaXQ7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIGxvYWRlciB0byBiZSB1c2VkIGZvciBpbnN0YW50aWF0aW5nIGFwcGxpY2F0aW9uIG9iamVjdHMKLSAgICAgKiB3aGVuIHJlcXVpcmVkLiAgVGhpcyBpcyBkZXRlcm1pbmVkIGJhc2VkIHVwb24gdGhlIGZvbGxvd2luZyBydWxlczoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPlRoZSBjbGFzcyBsb2FkZXIgc2V0IGJ5IDxjb2RlPnNldENsYXNzTG9hZGVyKCk8L2NvZGU+LCBpZiBhbnk8L2xpPgotICAgICAqIDxsaT5UaGUgdGhyZWFkIGNvbnRleHQgY2xhc3MgbG9hZGVyLCBpZiBpdCBleGlzdHMgYW5kIHRoZQotICAgICAqICAgICA8Y29kZT51c2VDb250ZXh0Q2xhc3NMb2FkZXI8L2NvZGU+IHByb3BlcnR5IGlzIHNldCB0byB0cnVlPC9saT4KLSAgICAgKiA8bGk+VGhlIGNsYXNzIGxvYWRlciB1c2VkIHRvIGxvYWQgdGhlIFhNTFBhcnNlciBjbGFzcyBpdHNlbGYuCi0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7Ci0gICAgICAgIHJldHVybiBDbGFzc0xvYWRlclV0aWxzLmdldENsYXNzTG9hZGVyKGNsYXNzTG9hZGVyLCB1c2VDb250ZXh0Q2xhc3NMb2FkZXIsIGdldENsYXNzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY2xhc3MgbG9hZGVyIHRvIGJlIHVzZWQgZm9yIGluc3RhbnRpYXRpbmcgYXBwbGljYXRpb24gb2JqZWN0cwotICAgICAqIHdoZW4gcmVxdWlyZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIgVGhlIG5ldyBjbGFzcyBsb2FkZXIgdG8gdXNlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqICB0byByZXZlcnQgdG8gdGhlIHN0YW5kYXJkIHJ1bGVzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLSAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgYm9vbGVhbiBhcyB0byB3aGV0aGVyIHRoZSBjb250ZXh0IGNsYXNzbG9hZGVyIHNob3VsZCBiZSB1c2VkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldFVzZUNvbnRleHRDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgcmV0dXJuIHVzZUNvbnRleHRDbGFzc0xvYWRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0byB1c2UgdGhlIENvbnRleHQgQ2xhc3NMb2FkZXIgKHRoZSBvbmUgZm91bmQgYnkKLSAgICAgKiBjYWxsaW5nIDxjb2RlPlRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk8L2NvZGU+KQotICAgICAqIHRvIHJlc29sdmUvbG9hZCBjbGFzc2VzLiAgSWYgbm90Ci0gICAgICogdXNpbmcgQ29udGV4dCBDbGFzc0xvYWRlciwgdGhlbiB0aGUgY2xhc3MtbG9hZGluZyBkZWZhdWx0cyB0bwotICAgICAqIHVzaW5nIHRoZSBjYWxsaW5nLWNsYXNzJyBDbGFzc0xvYWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1c2UgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHVzZSBKZWxseUNvbnRleHQgQ2xhc3NMb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlQ29udGV4dENsYXNzTG9hZGVyKGJvb2xlYW4gdXNlKSB7Ci0gICAgICAgIHVzZUNvbnRleHRDbGFzc0xvYWRlciA9IHVzZTsKLSAgICB9Ci0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGEgbmV3IHJlbGF0aXZlIFVSTCBmcm9tIHRoZSBnaXZlbiByb290IGFuZCB3aXRoIHRoZSBhZGRpdGlvbiBvZiB0aGUKLSAgICAgKiBleHRyYSByZWxhdGl2ZSBVUkkKLSAgICAgKgotICAgICAqIEBwYXJhbSByb290VVJMIGlzIHRoZSByb290IGNvbnRleHQgZnJvbSB3aGljaCB0aGUgcmVsYXRpdmUgVVJJIHdpbGwgYmUgYXBwbGllZAotICAgICAqIEBwYXJhbSByZWxhdGl2ZVVSSSBpcyB0aGUgcmVsYXRpdmUgVVJJICh3aXRob3V0IGEgbGVhZGluZyAiLyIpCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWYgdGhlIFVSTCBpcyBpbnZhbGlkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBVUkwgY3JlYXRlUmVsYXRpdmVVUkwoVVJMIHJvb3RVUkwsIFN0cmluZyByZWxhdGl2ZVVSSSkKLSAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIFVSTCB1cmwgPSByb290VVJMOwotICAgICAgICBpZiAodXJsID09IG51bGwpIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSk7Ci0gICAgICAgICAgICB1cmwgPSBmaWxlLnRvVVJMKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHVybFRleHQgPSB1cmwudG9TdHJpbmcoKSArIHJlbGF0aXZlVVJJOwotICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJBdHRlbXB0aW5nIHRvIG9wZW4gdXJsOiAiICsgdXJsVGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBVUkwodXJsVGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RyaXBzIG9mZiB0aGUgbmFtZSBvZiBhIHNjcmlwdCB0byBjcmVhdGUgYSBuZXcgY29udGV4dCBVUkwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVVJMIGdldEplbGx5Q29udGV4dFVSTChVUkwgdXJsKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRleHQgPSB1cmwudG9TdHJpbmcoKTsKLSAgICAgICAgaW50IGlkeCA9IHRleHQubGFzdEluZGV4T2YoJy8nKTsKLSAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIGlkeCArIDEpOwotICAgICAgICByZXR1cm4gbmV3IFVSTCh0ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpcHMgb2ZmIHRoZSBuYW1lIG9mIGEgc2NyaXB0IHRvIGNyZWF0ZSBhIG5ldyBjb250ZXh0IFVSTAotICAgICAqLwotICAgIHByb3RlY3RlZCBVUkwgZ2V0SmVsbHlDb250ZXh0VVJMKElucHV0U291cmNlIHNvdXJjZSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gc291cmNlLmdldFN5c3RlbUlkKCk7Ci0gICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBpZHggPSB0ZXh0Lmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgaWR4ICsgMSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFVSTCh0ZXh0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBjaGlsZCBvZiB0aGlzIGNvbnRleHQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSmVsbHlDb250ZXh0IGNyZWF0ZUNoaWxkQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKZWxseUNvbnRleHQodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hhbmdlIHRoZSBwYXJlbnQgY29udGV4dCB0byB0aGUgb25lIHByb3ZpZGVkCi0gICAgICogQHBhcmFtIGNvbnRleHQgdGhlIG5ldyBwYXJlbnQgY29udGV4dAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFBhcmVudChKZWxseUNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIHBhcmVudCA9IGNvbnRleHQ7Ci0gICAgICAgIHRoaXMudmFyaWFibGVzLnB1dCgicGFyZW50U2NvcGUiLCBwYXJlbnQudmFyaWFibGVzKTsKLSAgICAgICAgLy8gbmVlZCB0byByZS1leHBvcnQgdGFnIGxpYnJhcmllcyB0byB0aGUgbmV3IHBhcmVudAotICAgICAgICBpZiAoaXNFeHBvcnRMaWJyYXJpZXMoKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBrZXlzID0gdGFnbGlicy5rZXlTZXQoKS5pdGVyYXRvcigpOyBrZXlzLmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IChTdHJpbmcpIGtleXMubmV4dCgpOwotICAgICAgICAgICAgICAgIE9iamVjdCB0YWdMaWJPckNsYXNzTmFtZSA9IHRhZ2xpYnMuZ2V0KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRhZ0xpYk9yQ2xhc3NOYW1lIGluc3RhbmNlb2YgVGFnTGlicmFyeSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmVudC5yZWdpc3RlclRhZ0xpYnJhcnkoIG5hbWVzcGFjZVVSSSwgKFRhZ0xpYnJhcnkpIHRhZ0xpYk9yQ2xhc3NOYW1lICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmVudC5yZWdpc3RlclRhZ0xpYnJhcnkoIG5hbWVzcGFjZVVSSSwgKFN0cmluZykgdGFnTGliT3JDbGFzc05hbWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L0plbGx5RXhjZXB0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvSmVsbHlFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5MjBmYS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvSmVsbHlFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5OwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi0vKiogCi0gKiA8cD48Y29kZT5KZWxseUV4Y2VwdGlvbjwvY29kZT4gaXMgdGhlIHJvb3Qgb2YgYWxsIEplbGx5IGV4Y2VwdGlvbnMuPC9wPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xNyAkCi0gKi8KLQotcHVibGljIGNsYXNzIEplbGx5RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIGltcGxlbWVudHMgTG9jYXRpb25Bd2FyZSB7Ci0gICAgCi0gICAgLyoqIHRoZSB1bmRlcmx5aW5nIGNhdXNlIG9mIHRoZSBleGNlcHRpb24gKi8KLSAgICBwcml2YXRlIFRocm93YWJsZSBjYXVzZTsKLQotICAgIC8qKiB0aGUgSmVsbHkgZmlsZSB3aGljaCBjYXVzZWQgdGhlIHByb2JsZW0gKi8KLSAgICBwcml2YXRlIFN0cmluZyBmaWxlTmFtZTsKLQotICAgIC8qKiB0aGUgdGFnIG5hbWUgd2hpY2ggY2F1c2VkIHRoZSBwcm9ibGVtICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZWxlbWVudE5hbWU7Ci0KLSAgICAvKiogdGhlIGxpbmUgbnVtYmVyIGluIHRoZSBzY3JpcHQgb2YgdGhlIGVycm9yICovCi0gICAgcHJpdmF0ZSBpbnQgbGluZU51bWJlciA9IC0xOwotICAgIAotICAgIC8qKiB0aGUgY29sdW1uIG51bWJlciBpbiB0aGUgc2NyaXB0IG9mIHRoZSBlcnJvciAqLwotICAgIHByaXZhdGUgaW50IGNvbHVtbk51bWJlciA9IC0xOwotICAgIAotICAgIHB1YmxpYyBKZWxseUV4Y2VwdGlvbigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmVsbHlFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEplbGx5RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgICAgIHRoaXMuY2F1c2UgPSBjYXVzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEplbGx5RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB0aGlzLmNhdXNlID0gY2F1c2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBKZWxseUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UsIFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGVsZW1lbnROYW1lLCBpbnQgY29sdW1uTnVtYmVyLCBpbnQgbGluZU51bWJlcikgewotICAgICAgICB0aGlzKGNhdXNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgY2F1c2UsIGZpbGVOYW1lLCBlbGVtZW50TmFtZSwgY29sdW1uTnVtYmVyLCBsaW5lTnVtYmVyKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEplbGx5RXhjZXB0aW9uKFN0cmluZyByZWFzb24sIFRocm93YWJsZSBjYXVzZSwgU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgZWxlbWVudE5hbWUsIGludCBjb2x1bW5OdW1iZXIsIGludCBsaW5lTnVtYmVyKSB7Ci0gICAgICAgIHN1cGVyKCAocmVhc29uPT1udWxsP2NhdXNlLmdldENsYXNzKCkuZ2V0TmFtZSgpOnJlYXNvbikgKTsKLSAgICAgICAgdGhpcy5jYXVzZSA9IGNhdXNlOwotICAgICAgICB0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7Ci0gICAgICAgIHRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKLSAgICAgICAgdGhpcy5jb2x1bW5OdW1iZXIgPSBjb2x1bW5OdW1iZXI7Ci0gICAgICAgIHRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBKZWxseUV4Y2VwdGlvbihTdHJpbmcgcmVhc29uLCBTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBlbGVtZW50TmFtZSwgaW50IGNvbHVtbk51bWJlciwgaW50IGxpbmVOdW1iZXIpIHsKLSAgICAgICAgc3VwZXIocmVhc29uKTsKLSAgICAgICAgdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOwotICAgICAgICB0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0gICAgICAgIHRoaXMuY29sdW1uTnVtYmVyID0gY29sdW1uTnVtYmVyOwotICAgICAgICB0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkgewotICAgICAgICByZXR1cm4gY2F1c2U7Ci0gICAgfQotCi0gICAgCi0gICAgLyoqIAotICAgICAqIEByZXR1cm4gdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSB0YWcgCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gbGluZU51bWJlcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFNldHMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSB0YWcgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGluZU51bWJlcihpbnQgbGluZU51bWJlcikgewotICAgICAgICB0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSB0YWcgCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiBjb2x1bW5OdW1iZXI7Ci0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgKiBTZXRzIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSB0YWcgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29sdW1uTnVtYmVyKGludCBjb2x1bW5OdW1iZXIpIHsKLSAgICAgICAgdGhpcy5jb2x1bW5OdW1iZXIgPSBjb2x1bW5OdW1iZXI7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIEByZXR1cm4gdGhlIEplbGx5IGZpbGUgd2hpY2ggY2F1c2VkIHRoZSBwcm9ibGVtIAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogU2V0cyB0aGUgSmVsbHkgZmlsZSB3aGljaCBjYXVzZWQgdGhlIHByb2JsZW0gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0gICAgICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKLSAgICB9Ci0gICAgCi0KLSAgICAvKiogCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudCBuYW1lIHdoaWNoIGNhdXNlZCB0aGUgcHJvYmxlbQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50TmFtZTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogU2V0cyB0aGUgZWxlbWVudCBuYW1lIHdoaWNoIGNhdXNlZCB0aGUgcHJvYmxlbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnROYW1lKFN0cmluZyBlbGVtZW50TmFtZSkgewotICAgICAgICB0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0gICAgfQotICAgIAotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGVOYW1lICsgIjoiICsgbGluZU51bWJlciArICI6IiArIGNvbHVtbk51bWJlciArICI6IDwiICsgZWxlbWVudE5hbWUgKyAiPiAiICsgZ2V0UmVhc29uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWFzb24oKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRNZXNzYWdlKCk7Ci0gICAgfQotCi0gICAgLy8gIyMjIyBvdmVybG9hZCB0aGUgcHJpbnRTdGFja1RyYWNlIG1ldGhvZHMuLi4KLSAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRXcml0ZXIgcykgeyAKLSAgICAgICAgc3luY2hyb25pemVkIChzKSB7Ci0gICAgICAgICAgICBzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7Ci0gICAgICAgICAgICBpZiAgKGNhdXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzLnByaW50bG4oIlJvb3QgY2F1c2UiKTsKLSAgICAgICAgICAgICAgICBjYXVzZS5wcmludFN0YWNrVHJhY2Uocyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFN0cmVhbSBzKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAocykgewotICAgICAgICAgICAgc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotICAgICAgICAgICAgaWYgIChjYXVzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcy5wcmludGxuKCJSb290IGNhdXNlIik7Ci0gICAgICAgICAgICAgICAgY2F1c2UucHJpbnRTdGFja1RyYWNlKHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCkgewotICAgICAgICBzdXBlci5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgaWYgKGNhdXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUm9vdCBjYXVzZSIpOwotICAgICAgICAgICAgY2F1c2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9KZWxseVRhZ0V4Y2VwdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L0plbGx5VGFnRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Y2MyMTUuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L0plbGx5VGFnRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5OwotCi0vKiogCi0gKiA8cD5BIDxjb2RlPkplbGx5VGFnRXhjZXB0aW9uPC9jb2RlPiBpcyBhbiBleGNlcHRpb24gZ2VuZXJhdGVkIGJ5IGEgVGFnCi0gKiBpbXBsZW1lbnRhdGlvbi48L3A+Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bW9yZ2FuZEBhcGFjaGUub3JnIj5Nb3JnYW4gRGVsYWdyYW5nZTwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotCi1wdWJsaWMgY2xhc3MgSmVsbHlUYWdFeGNlcHRpb24gZXh0ZW5kcyBKZWxseUV4Y2VwdGlvbiB7Ci0gICAgCi0gICAgcHVibGljIEplbGx5VGFnRXhjZXB0aW9uKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBKZWxseVRhZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmVsbHlUYWdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLGNhdXNlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEplbGx5VGFnRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBKZWxseVRhZ0V4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UsIFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGVsZW1lbnROYW1lLCBpbnQgY29sdW1uTnVtYmVyLCBpbnQgbGluZU51bWJlcikgewotICAgICAgICBzdXBlcihjYXVzZSwgZmlsZU5hbWUsIGVsZW1lbnROYW1lLCBjb2x1bW5OdW1iZXIsIGxpbmVOdW1iZXIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSmVsbHlUYWdFeGNlcHRpb24oU3RyaW5nIHJlYXNvbiwgVGhyb3dhYmxlIGNhdXNlLCBTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBlbGVtZW50TmFtZSwgaW50IGNvbHVtbk51bWJlciwgaW50IGxpbmVOdW1iZXIpIHsKLSAgICAgICAgc3VwZXIocmVhc29uLGNhdXNlLGZpbGVOYW1lLGVsZW1lbnROYW1lLGNvbHVtbk51bWJlcixsaW5lTnVtYmVyKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEplbGx5VGFnRXhjZXB0aW9uKFN0cmluZyByZWFzb24sIFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGVsZW1lbnROYW1lLCBpbnQgY29sdW1uTnVtYmVyLCBpbnQgbGluZU51bWJlcikgewotICAgICAgICBzdXBlcihyZWFzb24sZmlsZU5hbWUsZWxlbWVudE5hbWUsY29sdW1uTnVtYmVyLGxpbmVOdW1iZXIpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9Mb2NhdGlvbkF3YXJlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvTG9jYXRpb25Bd2FyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzhmYjMyLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9Mb2NhdGlvbkF3YXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5OwotCi0vKiogCi0gKiA8cD48Y29kZT5Mb2NhdGlvbkF3YXJlPC9jb2RlPiByZXByZXNlbnRzIGEgVGFnIG9yIEV4Y2VwdGlvbiB3aGljaCBpcyBsb2NhdGlvbiBhd2FyZS4KLSAqIFRoYXQgaXMgdG8gc2F5IGl0IGlzIGNhcGFibGUgb2YgcmVjb3JkaW5nIHdoZXJlIGluIGEgSmVsbHkgc2NyaXB0IGEgdGFnIG9yIGV4Y2VwdGlvbgotICogaXMgdXNlZCB3aGljaCBjYW4gYWlkIGRlYnVnZ2luZyBhbmQgdHJhY2luZy48L3A+Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjExICQKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIExvY2F0aW9uQXdhcmUgewotICAgIAotICAgIC8qKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgdGFnIAotICAgICAqLwotICAgIGludCBnZXRMaW5lTnVtYmVyKCk7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFNldHMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSB0YWcgCi0gICAgICovCi0gICAgdm9pZCBzZXRMaW5lTnVtYmVyKGludCBsaW5lTnVtYmVyKTsKLQotICAgIC8qKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSB0YWcgCi0gICAgICovCi0gICAgaW50IGdldENvbHVtbk51bWJlcigpOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBTZXRzIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSB0YWcgCi0gICAgICovCi0gICAgdm9pZCBzZXRDb2x1bW5OdW1iZXIoaW50IGNvbHVtbk51bWJlcik7Ci0KLSAgICAvKiogCi0gICAgICogQHJldHVybiB0aGUgSmVsbHkgZmlsZSB3aGljaCBjYXVzZWQgdGhlIHByb2JsZW0gCi0gICAgICovCi0gICAgU3RyaW5nIGdldEZpbGVOYW1lKCk7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFNldHMgdGhlIEplbGx5IGZpbGUgd2hpY2ggY2F1c2VkIHRoZSBwcm9ibGVtIAotICAgICAqLwotICAgIHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKTsKLSAgICAKLSAgICAvKiogCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudCBuYW1lIHdoaWNoIGNhdXNlZCB0aGUgcHJvYmxlbQotICAgICAqLwotICAgIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpOwotCi0gICAgLyoqIAotICAgICAqIFNldHMgdGhlIGVsZW1lbnQgbmFtZSB3aGljaCBjYXVzZWQgdGhlIHByb2JsZW0KLSAgICAgKi8KLSAgICB2b2lkIHNldEVsZW1lbnROYW1lKFN0cmluZyBlbGVtZW50TmFtZSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvTWFwVGFnU3VwcG9ydC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L01hcFRhZ1N1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkNTQ2OC4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvTWFwVGFnU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqIAotICogPHA+PGNvZGU+TWFwVGFnPC9jb2RlPiBpcyBhIER5bmFUYWcgaW1wbGVtZW50YXRpb24gd2hpY2ggdXNlcyBhIE1hcAotICogdG8gc3RvcmUgaXRzIGF0dHJpYnV0ZSB2YWx1ZXMgaW4uIERlcml2ZWQgdGFncyBjYW4gdGhlbiBwcm9jZXNzIHRoaXMKLSAqIE1hcCwgY2hhbmdlIHZhbHVlcywgYWRkIG9yIHJlbW92ZSBhdHRyaWJ1dGVzIG9yIHBlcmZvcm0gc29tZSBvdGhlciBmb3JtCi0gKiBvZiBwcm9jZXNzc2luZyBwcmV0dHkgZWFzaWx5LgotICogPC9wPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS44ICQKLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWFwVGFnU3VwcG9ydCBleHRlbmRzIER5bmFUYWdTdXBwb3J0IHsKLQotICAgIHByaXZhdGUgTWFwIG1hcDsKLQotICAgIC8qKiBTZXRzIGFuIGF0dHJpYnV0ZSB2YWx1ZSBvZiB0aGlzIHRhZyBiZWZvcmUgdGhlIHRhZyBpcyBpbnZva2VkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgZ2V0QXR0cmlidXRlcygpLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIEhlbHBlciBtZXRob2Qgd2hpY2ggYWxsb3dzIGRlcml2ZWQgdGFncyB0byBhY2Nlc3MgdGhlIGF0dHJpYnV0ZXMKLSAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YWcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgbWFwID0gY3JlYXRlQXR0cmlidXRlcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXA7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEEgRmFjdG9yeSBNZXRob2Qgd2hpY2ggYWxsb3dzIGRlcml2ZWQgdGFncyB0byBvdmVybG9hZCB0aGUgTWFwCi0gICAgICogaW1wbGVtZW50YXRpb24gdXNlZCBieSB0aGlzIHRhZwotICAgICAqLwotCi0gICAgcHJvdGVjdGVkIE1hcCBjcmVhdGVBdHRyaWJ1dGVzKCkgewotICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXAoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDM0ZjMxLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5OwotCi0vKiogCi0gKiA8cD48Y29kZT5KZWxseUV4Y2VwdGlvbjwvY29kZT4gaXMgdGhlIHJvb3Qgb2YgYWxsIEplbGx5IGV4Y2VwdGlvbnMuPC9wPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKLSAqLwotcHVibGljIGNsYXNzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24gZXh0ZW5kcyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtaXNzaW5nQXR0cmlidXRlOwotICAgIAotICAgIC8vICMjIyB3ZSBtYXkgd2lzaCB0byBpbXBsZW1lbnQgYSBsb2NhbGl6ZWQgbWVzc2FnIGZvciB0aGlzIGVycm9yCi0gICAgICAgIAotICAgIHB1YmxpYyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKFN0cmluZyBtaXNzaW5nQXR0cmlidXRlKSB7Ci0gICAgICAgIHN1cGVyKCAiWW91IG11c3QgZGVmaW5lIGFuIGF0dHJpYnV0ZSBjYWxsZWQgJyIgKyBtaXNzaW5nQXR0cmlidXRlICsgIicgZm9yIHRoaXMgdGFnLiIgKTsKLSAgICAgICAgdGhpcy5taXNzaW5nQXR0cmlidXRlID0gbWlzc2luZ0F0dHJpYnV0ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRNaXNzaW5nQXR0cmlidXRlKCkgewotICAgICAgICByZXR1cm4gbWlzc2luZ0F0dHJpYnV0ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvTmFtZXNwYWNlQXdhcmVUYWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9OYW1lc3BhY2VBd2FyZVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2NhMjQxLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9OYW1lc3BhY2VBd2FyZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogPHA+PGNvZGU+TmFtZXNwYWNlQXdhcmVUYWc8L2NvZGU+IHJlcHJlc2VudHMgYSBKZWxseSBjdXN0b20gdGFnIHdoaWNoCi0gKiBuZWVkcyB0byBiZSBhd2FyZSBvZiB0aGUgWE1MIE5hbWVzcGFjZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuCi0gKiBXaGVuIHRoZSB0YWcgaXMgdXNlZCBpdCB3aWxsIGJlIGdpdmVuIHRoZSBuYW1lc3BhY2UgY29udGV4dCB3aGljaCBpcyBhCi0gKiBNYXAga2V5ZWQgb24gdGhlIG5hbWVzcGFjZSBwcmVmaXhlcyBhbmQgdGhlIHZhbHVlcyBhcmUgdGhlIG5hbWVzcGFjZSBVUklzCi0gKiBpbiBzY29wZSBpbiB0aGUgdGFncyBlbGVtZW50LgotICogPC9wPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS42ICQKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVzcGFjZUF3YXJlVGFnIGV4dGVuZHMgVGFnIHsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWVzcGFjZSBjb250ZXh0IGluIHNjb3BlIHdoZW4gdGhpcyB0YWcgaXMgdXNlZAotICAgICAqCi0gICAgICogQHBhcmFtIHByZWZpeFRvVXJpTWFwIGlzIGEgTWFwIHdoZXJlIHRoZSBrZXlzIGFyZSB0aGUgbmFtZXNwYWNlCi0gICAgICogcHJlZml4ZXMgYW5kIHRoZSB2YWx1ZXMgYXJlIHRoZSBuYW1lc3BhY2UgVVJJcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZUNvbnRleHQoTWFwIHByZWZpeFRvVXJpTWFwKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9TY3JpcHQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9TY3JpcHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDViNzE3ZC4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvU2NyaXB0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5OwotCi0vKioKLSAqIDxwPjxjb2RlPlNjcmlwdDwvY29kZT4gcmVwcmVzZW50cyBhIEplbGx5IHNjcmlwdC4KLSAqIEEgU2NyaXB0IDxiPm11c3Q8L2I+IGJlIHRocmVhZCBzYWZlIHNvIGNhcmUgc2hvdWxkIGJlIHRha2VuIG9uIHRoZQotICogaW1wbGVtZW50YXRpb25zIG9mIFNjcmlwdHMuIEhvd2V2ZXIgVGFncyBhcmUgb25seSB1c2VkIGluIGEgc2luZ2xlIHRocmVhZAotICogKGVhY2ggdGhyZWFkIHdpbGwgaGF2ZSBjcmVhdGUgaXRzIG93biBUYWdzIGZvciB0aGUgU2NyaXB0IGl0IGlzIHJ1bm5pbmcpCi0gKiBzbyBtdWx0aSB0aHJlYWRpbmcgaXMgbm90IGEgY29uY2VybiBmb3IgVGFnIGRldmVsb3BlcnMuPC9wPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMiAkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NyaXB0IHsKLQotICAgIC8qKiBDYWxsZWQgYnkgdGhlIHBhcnNlciB0byBhbGxvdyBhIG1vcmUgZWZmaWNpZW50Ci0gICAgICogcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjcmlwdCB0byBiZSB1c2VkLgotICAgICAqLwotICAgIHB1YmxpYyBTY3JpcHQgY29tcGlsZSgpIHRocm93cyBKZWxseUV4Y2VwdGlvbjsKLQotICAgIC8qKiBFdmFsdWF0ZXMgdGhlIGJvZHkgb2YgYSB0YWcgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oSmVsbHlDb250ZXh0IGNvbnRleHQsIFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L1RhZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L1RhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzliYjE4Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9UYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHk7Ci0KLS8qKgotICogPHA+PGNvZGU+VGFnPC9jb2RlPiByZXByZXNlbnRzIGEgSmVsbHkgY3VzdG9tIHRhZy4KLSAqIEEgVGFnIGlzIG9ubHkgZXZlciB1c2VkIGJ5IGEgc2luZ2xlIHRocmVhZCBzbyB0aGF0IFRhZyBkZXZlbG9wZXJzIGRvIG5vdAotICogbmVlZCB0byBjb25jZXJuIHRoZW1zZWx2ZXMgd2l0aCBtdXRsaS10aHJlYWRpbmcgaXNzdWVzIHdoZW4gd3JpdGluZyBhIFRhZy4KLSAqIEEgVGFnIGlzIGNyZWF0ZWQgcGVyIGN1c3RvbSB0YWcgaW4gYSBzY3JpcHQsIHBlciBpbnZvY2F0aW9uLgotICogU28gdGhlcmUgaXMgbm8gbmVlZCB0byB3b3JyeSBhYm91dCBwb29saW5nIGVycm9ycyBsaWtlIHRob3NlIGNhdXNlZAotICogaW4gSlNQIDEueC4oPC9wPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xNyAkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFnIHsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCBvZiB0aGlzIHRhZwotICAgICAqLwotICAgIHB1YmxpYyBUYWcgZ2V0UGFyZW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwYXJlbnQgb2YgdGhpcyB0YWcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoVGFnIHBhcmVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBib2R5IG9mIHRoZSB0YWcKLSAgICAgKi8KLSAgICBwdWJsaWMgU2NyaXB0IGdldEJvZHkoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGJvZHkgb2YgdGhlIHRhZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJvZHkoU2NyaXB0IGJvZHkpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgdGFnIHdpbGwgYmUgcnVuCi0gICAgICovCi0gICAgcHVibGljIEplbGx5Q29udGV4dCBnZXRDb250ZXh0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0YWcgd2lsbCBiZSBydW4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KEplbGx5Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBFdmFsdWF0ZXMgdGhpcyB0YWcgYWZ0ZXIgYWxsIHRoZSB0YWdzIHByb3BlcnRpZXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEEgaGVscGVyIG1ldGhvZCB0byBpbnZva2UgdGhpcyB0YWdzIGJvZHkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnZva2VCb2R5KFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L1RhZ0xpYnJhcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9UYWdMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYjQwM2QuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L1RhZ0xpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkNvbnZlcnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkNvbnZlcnRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkNvbXBvc2l0ZUV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uQ29uc3RhbnRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuVGFnRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5UYWdTY3JpcHQ7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0vKiogPHA+PGNvZGU+VGFnbGliPC9jb2RlPiByZXByZXNlbnRzIHRoZSBtZXRhZGF0YSBmb3IgYSBKZWxseSBjdXN0b20gdGFnIGxpYnJhcnkuPC9wPgotICAqCi0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yNSAkCi0gICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUYWdMaWJyYXJ5IHsKLQotICAgIHByaXZhdGUgTWFwIHRhZ3MgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgc3RhdGljIHsKLQotICAgICAgICAvLyByZWdpc3RlciBzdGFuZGFyZCBjb252ZXJ0ZXJzCi0KLSAgICAgICAgQ29udmVydFV0aWxzLnJlZ2lzdGVyKAotICAgICAgICAgICAgbmV3IENvbnZlcnRlcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNvbnZlcnQoQ2xhc3MgdHlwZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggdmFsdWUgaW5zdGFuY2VvZiBGaWxlICkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChGaWxlKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggdmFsdWUgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gdmFsdWUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZSggdGV4dCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBGaWxlLmNsYXNzCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgcHVibGljIFRhZ0xpYnJhcnkoKSB7Ci0gICAgfQotCi0gICAgLyoqIENyZWF0ZXMgYSBuZXcgc2NyaXB0IHRvIGV4ZWN1dGUgdGhlIGdpdmVuIHRhZyBuYW1lIGFuZCBhdHRyaWJ1dGVzICovCi0gICAgcHVibGljIFRhZ1NjcmlwdCBjcmVhdGVUYWdTY3JpcHQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKLSAgICAgICAgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLQotICAgICAgICBPYmplY3QgdmFsdWUgPSB0YWdzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ2xhc3MpIHsKLSAgICAgICAgICAgIENsYXNzIHR5cGUgPSAoQ2xhc3MpIHZhbHVlOwotICAgICAgICAgICAgcmV0dXJuIFRhZ1NjcmlwdC5uZXdJbnN0YW5jZSh0eXBlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFRhZ0ZhY3RvcnkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVGFnU2NyaXB0KCAoVGFnRmFjdG9yeSkgdmFsdWUgKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgIH0KLQotICAgIC8qKiBDcmVhdGVzIGEgbmV3IFRhZyBmb3IgdGhlIGdpdmVuIHRhZyBuYW1lIGFuZCBhdHRyaWJ1dGVzICovCi0gICAgcHVibGljIFRhZyBjcmVhdGVUYWcoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKLSAgICAgICAgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLQotICAgICAgICBPYmplY3QgdmFsdWUgPSB0YWdzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ2xhc3MpIHsKLSAgICAgICAgICAgIENsYXNzIHR5cGUgPSAoQ2xhc3MpIHZhbHVlOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFRhZykgdHlwZS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5RXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlFeGNlcHRpb24oZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFRhZ0ZhY3RvcnkpIHsKLSAgICAgICAgICAgIFRhZ0ZhY3RvcnkgZmFjdG9yeSA9IChUYWdGYWN0b3J5KSB2YWx1ZTsKLSAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZVRhZyhuYW1lLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiogQWxsb3dzIHRhZ2xpYnMgdG8gdXNlIHRoZWlyIG93biBleHByZXNzaW9uIGV2YWx1YXRpb24gbWVjaGFuaXNtICovCi0gICAgcHVibGljIEV4cHJlc3Npb24gY3JlYXRlRXhwcmVzc2lvbigKLSAgICAgICAgRXhwcmVzc2lvbkZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgVGFnU2NyaXB0IHRhZ1NjcmlwdCwKLSAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsCi0gICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkKLSAgICAgICAgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLQotICAgICAgICBFeHByZXNzaW9uRmFjdG9yeSBteUZhY3RvcnkgPSBnZXRFeHByZXNzaW9uRmFjdG9yeSgpOwotICAgICAgICBpZiAobXlGYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIG15RmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG15RmFjdG9yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29tcG9zaXRlRXhwcmVzc2lvbi5wYXJzZShhdHRyaWJ1dGVWYWx1ZSwgbXlGYWN0b3J5KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdpbGwgdXNlIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBpbnN0ZWFkCi0gICAgICAgIHJldHVybiBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKGF0dHJpYnV0ZVZhbHVlKTsKLSAgICB9Ci0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIHRhZyBpbXBsZW1lbnRhdGlvbiBDbGFzcyBmb3IgYSBnaXZlbiB0YWcgbmFtZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyVGFnKFN0cmluZyBuYW1lLCBDbGFzcyB0eXBlKSB7Ci0gICAgICAgIHRhZ3MucHV0KG5hbWUsIHR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIHRhZyBmYWN0b3J5IGZvciBhIGdpdmVuIHRhZyBuYW1lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJUYWdGYWN0b3J5KFN0cmluZyBuYW1lLCBUYWdGYWN0b3J5IHRhZ0ZhY3RvcnkpIHsKLSAgICAgICAgdGFncy5wdXQobmFtZSwgdGFnRmFjdG9yeSk7Ci0gICAgfQotCi0gICAgLyoqIEFsbG93cyBkZXJpdmVkIHRhZyBsaWJyYXJpZXMgdG8gdXNlIHRoZWlyIG93biBmYWN0b3J5ICovCi0gICAgcHJvdGVjdGVkIEV4cHJlc3Npb25GYWN0b3J5IGdldEV4cHJlc3Npb25GYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWFwIGdldFRhZ0NsYXNzZXMoKSB7Ci0gICAgICAgIHJldHVybiB0YWdzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L1RhZ1N1cHBvcnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9UYWdTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MDUzNDYuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L1RhZ1N1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseTsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnV0aWwuVGFnVXRpbHM7Ci0KLS8qKiA8cD48Y29kZT5UYWdTdXBwb3J0PC9jb2RlPiBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIHdoaWNoIGlzIHVzZWZ1bCB0bwotICAqIGluaGVyaXQgZnJvbSBpZiBkZXZlbG9waW5nIHlvdXIgb3duIHRhZy48L3A+Ci0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjM1ICQKLSAgKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRhZ1N1cHBvcnQgaW1wbGVtZW50cyBUYWcgewotCi0gICAgLyoqIHRoZSBwYXJlbnQgb2YgdGhpcyB0YWcgKi8KLSAgICBwcm90ZWN0ZWQgVGFnIHBhcmVudDsKLQotICAgIC8qKiB0aGUgYm9keSBvZiB0aGUgdGFnICovCi0gICAgcHJvdGVjdGVkIFNjcmlwdCBib2R5OwotICAgIC8qKiBUaGUgY3VycmVudCBjb250ZXh0ICovCi0KLSAgICBwcm90ZWN0ZWQgQm9vbGVhbiBzaG91bGRUcmltOwotICAgIHByb3RlY3RlZCBib29sZWFuIGhhc1RyaW1tZWQ7Ci0KLSAgICBwcm90ZWN0ZWQgSmVsbHlDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICAvKiogd2hldGhlciB4bWwgdGV4dCBzaG91bGQgYmUgZXNjYXBlZCAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBlc2NhcGVUZXh0ID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFNlYXJjaGVzIHVwIHRoZSBwYXJlbnQgaGllcmFyY2h5IGZyb20gdGhlIGdpdmVuIHRhZwotICAgICAqIGZvciBhIFRhZyBvZiB0aGUgZ2l2ZW4gdHlwZQotICAgICAqCi0gICAgICogQHBhcmFtIGZyb20gdGhlIHRhZyB0byBzdGFydCBzZWFyY2hpbmcgZnJvbQotICAgICAqIEBwYXJhbSB0YWdDbGFzcyB0aGUgdHlwZSBvZiB0aGUgdGFnIHRvIGZpbmQKLSAgICAgKiBAcmV0dXJuIHRoZSB0YWcgb2YgdGhlIGdpdmVuIHR5cGUgb3IgbnVsbCBpZiBpdCBjb3VsZCBub3QgYmUgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRhZyBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoVGFnIGZyb20sIENsYXNzIHRhZ0NsYXNzKSB7Ci0gICAgICAgIC8vIHdlIGNvdWxkIGltcGxlbWVudCB0aGlzIGFzCi0gICAgICAgIC8vICByZXR1cm4gZmluZEFuY2VzdG9yV2l0aENsYXNzKGZyb20sQ29sbGVjdGlvbnMuc2luZ2xldG9uKHRhZ0NsYXNzKSk7Ci0gICAgICAgIC8vIGJ1dCB0aGlzIGlzIHNvIHNpbXBsZSBsZXQncyBzYXZlIHRoZSBvYmplY3QgY3JlYXRpb24gZm9yIG5vdwotICAgICAgICB3aGlsZSAoZnJvbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodGFnQ2xhc3MuaXNJbnN0YW5jZShmcm9tKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmcm9tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJvbSA9IGZyb20uZ2V0UGFyZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoZXMgdXAgdGhlIHBhcmVudCBoaWVyYXJjaHkgZnJvbSB0aGUgZ2l2ZW4gdGFnCi0gICAgICogZm9yIGEgVGFnIG1hdGNoaW5nIG9uZSBvciBtb3JlIG9mIGdpdmVuIHR5cGVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGZyb20gdGhlIHRhZyB0byBzdGFydCBzZWFyY2hpbmcgZnJvbQotICAgICAqIEBwYXJhbSB0YWdDbGFzc2VzIGEgQ29sbGVjdGlvbiBvZiBDbGFzcyB0eXBlcyB0aGF0IG1pZ2h0IG1hdGNoCi0gICAgICogQHJldHVybiB0aGUgdGFnIG9mIHRoZSBnaXZlbiB0eXBlIG9yIG51bGwgaWYgaXQgY291bGQgbm90IGJlIGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUYWcgZmluZEFuY2VzdG9yV2l0aENsYXNzKFRhZyBmcm9tLCBDb2xsZWN0aW9uIHRhZ0NsYXNzZXMpIHsKLSAgICAgICAgd2hpbGUgKGZyb20gIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yKEl0ZXJhdG9yIGl0ZXIgPSB0YWdDbGFzc2VzLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3Mga2xhc3MgPSAoQ2xhc3MpKGl0ZXIubmV4dCgpKTsKLSAgICAgICAgICAgICAgICBpZiAoa2xhc3MuaXNJbnN0YW5jZShmcm9tKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcm9tID0gZnJvbS5nZXRQYXJlbnQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2hlcyB1cCB0aGUgcGFyZW50IGhpZXJhcmNoeSBmcm9tIHRoZSBnaXZlbiB0YWcKLSAgICAgKiBmb3IgYSBUYWcgbWF0Y2hpbmcgb25lIG9yIG1vcmUgb2YgZ2l2ZW4gdHlwZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZnJvbSB0aGUgdGFnIHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tCi0gICAgICogQHBhcmFtIHRhZ0NsYXNzZXMgYW4gYXJyYXkgb2YgdHlwZXMgdGhhdCBtaWdodCBtYXRjaAotICAgICAqIEByZXR1cm4gdGhlIHRhZyBvZiB0aGUgZ2l2ZW4gdHlwZSBvciBudWxsIGlmIGl0IGNvdWxkIG5vdCBiZSBmb3VuZAotICAgICAqIEBzZWUgI2ZpbmRBbmNlc3RvcldpdGhDbGFzcyhUYWcsQ29sbGVjdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRhZyBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoVGFnIGZyb20sIENsYXNzW10gdGFnQ2xhc3NlcykgewotICAgICAgICByZXR1cm4gZmluZEFuY2VzdG9yV2l0aENsYXNzKGZyb20sQXJyYXlzLmFzTGlzdCh0YWdDbGFzc2VzKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFRhZ1N1cHBvcnQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFRhZ1N1cHBvcnQoYm9vbGVhbiBzaG91bGRUcmltKSB7Ci0gICAgICAgIHNldFRyaW0oIHNob3VsZFRyaW0gKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgd2hpdGVzcGFjZSBpbnNpZGUgdGhpcyB0YWcgc2hvdWxkIGJlIHRyaW1tZWQgb3Igbm90LgotICAgICAqIERlZmF1bHRzIHRvIHRydWUgc28gd2hpdGVzcGFjZSBpcyB0cmltbWVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VHJpbShib29sZWFuIHNob3VsZFRyaW0pIHsKLSAgICAgICAgaWYgKCBzaG91bGRUcmltICkgewotICAgICAgICAgICAgdGhpcy5zaG91bGRUcmltID0gQm9vbGVhbi5UUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGhpcy5zaG91bGRUcmltID0gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVHJpbSgpIHsKLSAgICAgICAgaWYgKCB0aGlzLnNob3VsZFRyaW0gPT0gbnVsbCApIHsKLSAgICAgICAgICAgIFRhZyBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIGlmICggcGFyZW50ID09IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIHBhcmVudCBpbnN0YW5jZW9mIFRhZ1N1cHBvcnQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRhZ1N1cHBvcnQgcGFyZW50U3VwcG9ydCA9IChUYWdTdXBwb3J0KSBwYXJlbnQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG91bGRUcmltID0gKCBwYXJlbnRTdXBwb3J0LmlzVHJpbSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG91bGRUcmltID0gQm9vbGVhbi5UUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzLnNob3VsZFRyaW0uYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gdGhlIHBhcmVudCBvZiB0aGlzIHRhZyAqLwotICAgIHB1YmxpYyBUYWcgZ2V0UGFyZW50KCkgewotICAgICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSBwYXJlbnQgb2YgdGhpcyB0YWcgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoVGFnIHBhcmVudCkgewotICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiB0aGUgYm9keSBvZiB0aGUgdGFnICovCi0gICAgcHVibGljIFNjcmlwdCBnZXRCb2R5KCkgewotICAgICAgICBpZiAoISBoYXNUcmltbWVkKSB7Ci0gICAgICAgICAgICBoYXNUcmltbWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChpc1RyaW0oKSkgewotICAgICAgICAgICAgICAgIHRyaW1Cb2R5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJvZHk7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIGJvZHkgb2YgdGhlIHRhZyAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJvZHkoU2NyaXB0IGJvZHkpIHsKLSAgICAgICAgdGhpcy5ib2R5ID0gYm9keTsKLSAgICAgICAgdGhpcy5oYXNUcmltbWVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRhZyB3aWxsIGJlIHJ1biAqLwotICAgIHB1YmxpYyBKZWxseUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRhZyB3aWxsIGJlIHJ1biAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHQoSmVsbHlDb250ZXh0IGNvbnRleHQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlcyB0aGUgYm9keSBvZiB0aGlzIHRhZyB1c2luZyB0aGUgZ2l2ZW4gb3V0cHV0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW52b2tlQm9keShYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBnZXRCb2R5KCkucnVuKGNvbnRleHQsIG91dHB1dCk7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFNlYXJjaGVzIHVwIHRoZSBwYXJlbnQgaGllcmFyY2h5IGZvciBhIFRhZyBvZiB0aGUgZ2l2ZW4gdHlwZS4KLSAgICAgKiBAcmV0dXJuIHRoZSB0YWcgb2YgdGhlIGdpdmVuIHR5cGUgb3IgbnVsbCBpZiBpdCBjb3VsZCBub3QgYmUgZm91bmQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVGFnIGZpbmRBbmNlc3RvcldpdGhDbGFzcyhDbGFzcyBwYXJlbnRDbGFzcykgewotICAgICAgICByZXR1cm4gZmluZEFuY2VzdG9yV2l0aENsYXNzKGdldFBhcmVudCgpLCBwYXJlbnRDbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoZXMgdXAgdGhlIHBhcmVudCBoaWVyYXJjaHkgZm9yIGEgVGFnIG9mIG9uZSBvZiB0aGUgZ2l2ZW4gdHlwZXMuCi0gICAgICogQHJldHVybiB0aGUgdGFnIG9mIHRoZSBnaXZlbiB0eXBlIG9yIG51bGwgaWYgaXQgY291bGQgbm90IGJlIGZvdW5kCi0gICAgICogQHNlZSAjZmluZEFuY2VzdG9yV2l0aENsYXNzKENvbGxlY3Rpb24pCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRhZyBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoQ2xhc3NbXSBwYXJlbnRDbGFzc2VzKSB7Ci0gICAgICAgIHJldHVybiBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoZ2V0UGFyZW50KCkscGFyZW50Q2xhc3Nlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoZXMgdXAgdGhlIHBhcmVudCBoaWVyYXJjaHkgZm9yIGEgVGFnIG9mIG9uZSBvZiB0aGUgZ2l2ZW4gdHlwZXMuCi0gICAgICogQHJldHVybiB0aGUgdGFnIG9mIHRoZSBnaXZlbiB0eXBlIG9yIG51bGwgaWYgaXQgY291bGQgbm90IGJlIGZvdW5kCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRhZyBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoQ29sbGVjdGlvbiBwYXJlbnRDbGFzc2VzKSB7Ci0gICAgICAgIHJldHVybiBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoZ2V0UGFyZW50KCkscGFyZW50Q2xhc3Nlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIGJvZHkgb2YgdGhlIHRhZyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGEgU3RyaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdGV4dCBldmFsdWF0aW9uIG9mIHRoZSBib2R5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCb2R5VGV4dCgpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRCb2R5VGV4dChlc2NhcGVUZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGUgYm9keSBvZiB0aGUgdGFnIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYSBTdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2hvdWxkRXNjYXBlIFNpZ25hbCBpZiB0aGUgdGV4dCBzaG91bGQgYmUgZXNjYXBlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHRleHQgZXZhbHVhdGlvbiBvZiB0aGUgYm9keQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Qm9keVRleHQoYm9vbGVhbiBzaG91bGRFc2NhcGUpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIGludm9rZUJvZHkoWE1MT3V0cHV0LmNyZWF0ZVhNTE91dHB1dCh3cml0ZXIsIHNob3VsZEVzY2FwZSkpOwotICAgICAgICByZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBGaW5kIGFsbCB0ZXh0IG5vZGVzIGluc2lkZSB0aGUgdG9wIGxldmVsIG9mIHRoaXMgYm9keSBhbmQKLSAgICAgKiBpZiB0aGV5IGFyZSBqdXN0IHdoaXRlc3BhY2UgdGhlbiByZW1vdmUgdGhlbQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHRyaW1Cb2R5KCkgewotICAgICAgICBUYWdVdGlscy50cmltU2NyaXB0KGJvZHkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYm9keSBvZiB0aGlzIHRhZyB3aWxsIGJlIGVzY2FwZWQgb3Igbm90LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRXNjYXBlVGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGVzY2FwZVRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIHRoZSBib2R5IG9mIHRoZSB0YWcgc2hvdWxkIGJlIGVzY2FwZWQgYXMgdGV4dCAoc28gdGhhdCAmbHQ7IGFuZCAmZ3Q7IGFyZQotICAgICAqIGVzY2FwZWQgYXMgJmFtcDtsdDsgYW5kICZhbXA7Z3Q7KSwgd2hpY2ggaXMgdGhlIGRlZmF1bHQgb3IgbGVhdmUgdGhlIHRleHQgYXMgWE1MLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVzY2FwZVRleHQoYm9vbGVhbiBlc2NhcGVUZXh0KSB7Ci0gICAgICAgIHRoaXMuZXNjYXBlVGV4dCA9IGVzY2FwZVRleHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L1hNTE91dHB1dC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L1hNTE91dHB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGU5ZmYyLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9YTUxPdXRwdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuZG9tNGouaW8uWE1MV3JpdGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKiA8cD48Y29kZT5YTUxPdXRwdXQ8L2NvZGU+IGlzIHVzZWQgdG8gb3V0cHV0IFhNTCBldmVudHMKLSAgKiBpbiBhIFNBWC1saWtlIG1hbm5lci4gVGhpcyBhbHNvIGFsbG93cyBwaXBlbGluaW5nIHRvIGJlIGRvbmUKLSAgKiBzdWNoIGFzIGluIHRoZSA8YSBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcvY29jb29uLyI+Q29jb29uPC9hPiBwcm9qZWN0LjwvcD4KLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMjEgJAotICAqLwotCi1wdWJsaWMgY2xhc3MgWE1MT3V0cHV0IGltcGxlbWVudHMgQ29udGVudEhhbmRsZXIsIExleGljYWxIYW5kbGVyIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gTEVYSUNBTF9IQU5ETEVSX05BTUVTID0KLSAgICAgICAgewotICAgICAgICAgICAgImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2xleGljYWwtaGFuZGxlciIsCi0gICAgICAgICAgICAiaHR0cDovL3htbC5vcmcvc2F4L2hhbmRsZXJzL0xleGljYWxIYW5kbGVyIiB9OwotCi0gICAgLyoqIGVtcHR5IGF0dHJpYnV0ZXMgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdHRyaWJ1dGVzIEVNUFRZX0FUVFJJQlVURVMgPSBuZXcgQXR0cmlidXRlc0ltcGwoKTsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhYTUxPdXRwdXQuY2xhc3MpOwotCi0gICAgLyoqIHRoZSBkZWZhdWx0IGZvciBlc2NhcGluZyBvZiB0ZXh0ICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX0VTQ0FQRV9URVhUID0gZmFsc2U7Ci0KLSAgICAvKiogVGhlIFNBWCBDb250ZW50SGFuZGxlciB0aGF0IG91dHB1dCBnb2VzIHRvICovCi0gICAgcHJpdmF0ZSBDb250ZW50SGFuZGxlciBjb250ZW50SGFuZGxlcjsKLQotICAgIC8qKiBUaGUgU0FYIExleGljYWxIYW5kbGVyIHRoYXQgb3V0cHV0IGdvZXMgdG8gKi8KLSAgICBwcml2YXRlIExleGljYWxIYW5kbGVyIGxleGljYWxIYW5kbGVyOwotCi0KLSAgICBwdWJsaWMgWE1MT3V0cHV0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBYTUxPdXRwdXQoQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIpIHsKLSAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlciA9IGNvbnRlbnRIYW5kbGVyOwotICAgICAgICAvLyBvZnRlbiBjbGFzc2VzIHdpbGwgaW1wbGVtZW50IExleGljYWxIYW5kbGVyIGFzIHdlbGwKLSAgICAgICAgaWYgKGNvbnRlbnRIYW5kbGVyIGluc3RhbmNlb2YgTGV4aWNhbEhhbmRsZXIpIHsKLSAgICAgICAgICAgIHRoaXMubGV4aWNhbEhhbmRsZXIgPSAoTGV4aWNhbEhhbmRsZXIpIGNvbnRlbnRIYW5kbGVyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFhNTE91dHB1dCgKLSAgICAgICAgQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIsCi0gICAgICAgIExleGljYWxIYW5kbGVyIGxleGljYWxIYW5kbGVyKSB7Ci0gICAgICAgIHRoaXMuY29udGVudEhhbmRsZXIgPSBjb250ZW50SGFuZGxlcjsKLSAgICAgICAgdGhpcy5sZXhpY2FsSGFuZGxlciA9IGxleGljYWxIYW5kbGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpCi0gICAgICAgICAgICArICJbY29udGVudEhhbmRsZXI9IgotICAgICAgICAgICAgKyBjb250ZW50SGFuZGxlcgotICAgICAgICAgICAgKyAiO2xleGljYWxIYW5kbGVyPSIKLSAgICAgICAgICAgICsgbGV4aWNhbEhhbmRsZXIKLSAgICAgICAgICAgICsgIl0iOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIGEgdXNlZnVsIGhvb2sgdGhhdCBpbXBsZW1lbnRhdGlvbnMgY2FuIHVzZSB0byBjbG9zZSB0aGUKLSAgICAgKiB1bmRlcmx5aW5nIE91dHB1dFN0cmVhbSBvciBXcml0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiggY29udGVudEhhbmRsZXIgaW5zdGFuY2VvZiBYTUxXcml0ZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKFhNTFdyaXRlciljb250ZW50SGFuZGxlcikuZmx1c2goKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFN0YXRpYyBoZWxwZXIgbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBYTUxPdXRwdXQgZnJvbSBhbiBleGlzdGluZyBTQVggWE1MUmVhZGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYTUxPdXRwdXQgY3JlYXRlWE1MT3V0cHV0KFhNTFJlYWRlciB4bWxSZWFkZXIpIHsKLSAgICAgICAgWE1MT3V0cHV0IG91dHB1dCA9IG5ldyBYTUxPdXRwdXQoeG1sUmVhZGVyLmdldENvbnRlbnRIYW5kbGVyKCkpOwotCi0gICAgICAgIC8vIGlzbid0IGl0IGxvdmVseSB3aGF0IHdlJ3ZlIGdvdCB0byBkbyB0byBmaW5kIHRoZSBMZXhpY2FsSGFuZGxlci4uLiA7LSkKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMRVhJQ0FMX0hBTkRMRVJfTkFNRVMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0geG1sUmVhZGVyLmdldFByb3BlcnR5KExFWElDQUxfSEFORExFUl9OQU1FU1tpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGV4aWNhbEhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNldExleGljYWxIYW5kbGVyKChMZXhpY2FsSGFuZGxlcikgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUgYW55IHVuc3VwcG9ydGVkLW9wZXJhdGlvbiBleGNlcHRpb25zCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSBsb2cuZGVidWcoImVycm9yIHNldHRpbmcgbGV4aWNhbCBoYW5kbGVyIHByb3BlcnRpZXMiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3V0cHV0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB0ZXh0IGJhc2VkIFhNTE91dHB1dCB3aGljaCBjb252ZXJ0cyBhbGwgWE1MIGV2ZW50cyBpbnRvCi0gICAgICogdGV4dCBhbmQgd3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIFdyaXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFhNTE91dHB1dCBjcmVhdGVYTUxPdXRwdXQoV3JpdGVyIHdyaXRlcikgewotICAgICAgICByZXR1cm4gY3JlYXRlWE1MT3V0cHV0KHdyaXRlciwgREVGQVVMVF9FU0NBUEVfVEVYVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHRleHQgYmFzZWQgWE1MT3V0cHV0IHdoaWNoIGNvbnZlcnRzIGFsbCBYTUwgZXZlbnRzIGludG8KLSAgICAgKiB0ZXh0IGFuZCB3cml0ZXMgdG8gdGhlIHVuZGVybHlpbmcgV3JpdGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHdyaXRlciBpcyB0aGUgd3JpdGVyIHRvIG91dHB1dCB0bwotICAgICAqIEBwYXJhbSBlc2NhcGVUZXh0IGlzIHdoZXRoZXIgb3Igbm90IHRleHQgb3V0cHV0IHdpbGwgYmUgZXNjYXBlZC4gVGhpcyBtdXN0IGJlIHRydWUKLSAgICAgKiBpZiB0aGUgdW5kZXJseWluZyBvdXRwdXQgaXMgWE1MIG9yIGNvdWxkIGJlIGZhbHNlIGlmIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBpcyB0ZXh0dWFsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgWE1MT3V0cHV0IGNyZWF0ZVhNTE91dHB1dChXcml0ZXIgd3JpdGVyLCBib29sZWFuIGVzY2FwZVRleHQpCi0gICAgewotICAgICAgICBYTUxXcml0ZXIgeG1sV3JpdGVyID0gbmV3IFhNTFdyaXRlcih3cml0ZXIpOwotICAgICAgICB4bWxXcml0ZXIuc2V0RXNjYXBlVGV4dChlc2NhcGVUZXh0KTsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVhNTE91dHB1dCh4bWxXcml0ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB0ZXh0IGJhc2VkIFhNTE91dHB1dCB3aGljaCBjb252ZXJ0cyBhbGwgWE1MIGV2ZW50cyBpbnRvCi0gICAgICogdGV4dCBhbmQgd3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIE91dHB1dFN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFhNTE91dHB1dCBjcmVhdGVYTUxPdXRwdXQoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3JlYXRlWE1MT3V0cHV0KG91dCwgREVGQVVMVF9FU0NBUEVfVEVYVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHRleHQgYmFzZWQgWE1MT3V0cHV0IHdoaWNoIGNvbnZlcnRzIGFsbCBYTUwgZXZlbnRzIGludG8KLSAgICAgKiB0ZXh0IGFuZCB3cml0ZXMgdG8gdGhlIHVuZGVybHlpbmcgT3V0cHV0U3RyZWFtLgotICAgICAqCi0gICAgICogQHBhcmFtIG91dCBpcyB0aGUgb3V0cHV0IHN0cmVhbSB0byB3cml0ZQotICAgICAqIEBwYXJhbSBlc2NhcGVUZXh0IGlzIHdoZXRoZXIgb3Igbm90IHRleHQgb3V0cHV0IHdpbGwgYmUgZXNjYXBlZC4gVGhpcyBtdXN0IGJlIHRydWUKLSAgICAgKiBpZiB0aGUgdW5kZXJseWluZyBvdXRwdXQgaXMgWE1MIG9yIGNvdWxkIGJlIGZhbHNlIGlmIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBpcyB0ZXh0dWFsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgWE1MT3V0cHV0IGNyZWF0ZVhNTE91dHB1dChPdXRwdXRTdHJlYW0gb3V0LCBib29sZWFuIGVzY2FwZVRleHQpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MV3JpdGVyIHhtbFdyaXRlciA9IG5ldyBYTUxXcml0ZXIob3V0KTsKLSAgICAgICAgeG1sV3JpdGVyLnNldEVzY2FwZVRleHQoZXNjYXBlVGV4dCk7Ci0gICAgICAgIHJldHVybiBjcmVhdGVYTUxPdXRwdXQoeG1sV3JpdGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm5zIGFuIFhNTE91dHB1dCBvYmplY3QgdGhhdCB3aWxsIGRpc2NhcmQgYWxsCi0gICAgICogdGFnLWdlbmVyYXRlZCBYTUwgZXZlbnRzLiAgVXNlZnVsIHdoZW4gdGFnIG91dHB1dCBpcyBub3QgZXhwZWN0ZWQKLSAgICAgKiBvciBub3Qgc2lnbmlmaWNhbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbm8tb3AgWE1MT3V0cHV0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYTUxPdXRwdXQgY3JlYXRlRHVtbXlYTUxPdXRwdXQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgWE1MT3V0cHV0KG5ldyBEZWZhdWx0SGFuZGxlcigpKTsKLSAgICB9Ci0KLSAgICAvLyBFeHRyYSBoZWxwZXIgbWV0aG9kcyBwcm92aWRlZCBmb3IgdGFnIGF1dGhvcnMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIE91dHB1dHMgdGhlIGdpdmVuIFN0cmluZyBhcyBhIHBpZWNlIG9mIHZhbGlkIHRleHQgaW4gdGhlCi0gICAgICogWE1MIGV2ZW50IHN0cmVhbS4KLSAgICAgKiBBbnkgc3BlY2lhbCBYTUwgY2hhcmFjdGVycyBzaG91bGQgYmUgcHJvcGVybHkgZXNjYXBlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgdGV4dCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoYXJbXSBjaCA9IHRleHQudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgY2hhcmFjdGVycyhjaCwgMCwgY2gubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdXRwdXRzIHRoZSBnaXZlbiBTdHJpbmcgYXMgYSBwaWVjZSBvZiBDREFUQSBpbiB0aGUKLSAgICAgKiBYTUwgZXZlbnQgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlQ0RBVEEoU3RyaW5nIHRleHQpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBzdGFydENEQVRBKCk7Ci0gICAgICAgIGNoYXJbXSBjaCA9IHRleHQudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgY2hhcmFjdGVycyhjaCwgMCwgY2gubGVuZ3RoKTsKLSAgICAgICAgZW5kQ0RBVEEoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdXRwdXRzIGEgY29tbWVudCB0byB0aGUgWE1MIHN0cmVhbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlQ29tbWVudChTdHJpbmcgdGV4dCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoYXJbXSBjaCA9IHRleHQudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgY29tbWVudChjaCwgMCwgY2gubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIGZvciBvdXRwdXR0aW5nIGEgc3RhcnQgZWxlbWVudCBldmVudCBmb3IgYW4gZWxlbWVudCBpbiBubyBuYW1lc3BhY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN0YXJ0RWxlbWVudCgiIiwgbG9jYWxOYW1lLCBsb2NhbE5hbWUsIEVNUFRZX0FUVFJJQlVURVMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgZm9yIG91dHB1dHRpbmcgYSBzdGFydCBlbGVtZW50IGV2ZW50IGZvciBhbiBlbGVtZW50IGluIG5vIG5hbWVzcGFjZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbG9jYWxOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBzdGFydEVsZW1lbnQoIiIsIGxvY2FsTmFtZSwgbG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIGZvciBvdXRwdXR0aW5nIGFuIGVuZCBlbGVtZW50IGV2ZW50IGZvciBhbiBlbGVtZW50IGluIG5vIG5hbWVzcGFjZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGVuZEVsZW1lbnQoIiIsIGxvY2FsTmFtZSwgbG9jYWxOYW1lKTsKLSAgICB9Ci0KLQotICAgIC8vIENvbnRlbnRIYW5kbGVyIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogUmVjZWl2ZSBhbiBvYmplY3QgZm9yIGxvY2F0aW5nIHRoZSBvcmlnaW4gb2YgU0FYIGRvY3VtZW50IGV2ZW50cy4KLSAgICAgKgotICAgICAqIDxwPlNBWCBwYXJzZXJzIGFyZSBzdHJvbmdseSBlbmNvdXJhZ2VkICh0aG91Z2ggbm90IGFic29sdXRlbHkKLSAgICAgKiByZXF1aXJlZCkgdG8gc3VwcGx5IGEgbG9jYXRvcjogaWYgaXQgZG9lcyBzbywgaXQgbXVzdCBzdXBwbHkKLSAgICAgKiB0aGUgbG9jYXRvciB0byB0aGUgYXBwbGljYXRpb24gYnkgaW52b2tpbmcgdGhpcyBtZXRob2QgYmVmb3JlCi0gICAgICogaW52b2tpbmcgYW55IG9mIHRoZSBvdGhlciBtZXRob2RzIGluIHRoZSBDb250ZW50SGFuZGxlcgotICAgICAqIGludGVyZmFjZS48L3A+Ci0gICAgICoKLSAgICAgKiA8cD5UaGUgbG9jYXRvciBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIGRldGVybWluZSB0aGUgZW5kCi0gICAgICogcG9zaXRpb24gb2YgYW55IGRvY3VtZW50LXJlbGF0ZWQgZXZlbnQsIGV2ZW4gaWYgdGhlIHBhcnNlciBpcwotICAgICAqIG5vdCByZXBvcnRpbmcgYW4gZXJyb3IuICBUeXBpY2FsbHksIHRoZSBhcHBsaWNhdGlvbiB3aWxsCi0gICAgICogdXNlIHRoaXMgaW5mb3JtYXRpb24gZm9yIHJlcG9ydGluZyBpdHMgb3duIGVycm9ycyAoc3VjaCBhcwotICAgICAqIGNoYXJhY3RlciBjb250ZW50IHRoYXQgZG9lcyBub3QgbWF0Y2ggYW4gYXBwbGljYXRpb24ncwotICAgICAqIGJ1c2luZXNzIHJ1bGVzKS4gIFRoZSBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSB0aGUgbG9jYXRvcgotICAgICAqIGlzIHByb2JhYmx5IG5vdCBzdWZmaWNpZW50IGZvciB1c2Ugd2l0aCBhIHNlYXJjaCBlbmdpbmUuPC9wPgotICAgICAqCi0gICAgICogPHA+Tm90ZSB0aGF0IHRoZSBsb2NhdG9yIHdpbGwgcmV0dXJuIGNvcnJlY3QgaW5mb3JtYXRpb24gb25seQotICAgICAqIGR1cmluZyB0aGUgaW52b2NhdGlvbiBvZiB0aGUgZXZlbnRzIGluIHRoaXMgaW50ZXJmYWNlLiAgVGhlCi0gICAgICogYXBwbGljYXRpb24gc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBhdCBhbnkgb3RoZXIgdGltZS48L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbG9jYXRvciBBbiBvYmplY3QgdGhhdCBjYW4gcmV0dXJuIHRoZSBsb2NhdGlvbiBvZgotICAgICAqICAgICAgICAgICAgICAgIGFueSBTQVggZG9jdW1lbnQgZXZlbnQuCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5Mb2NhdG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKExvY2F0b3IgbG9jYXRvcikgewotICAgICAgICBjb250ZW50SGFuZGxlci5zZXREb2N1bWVudExvY2F0b3IobG9jYXRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgdGhlIGJlZ2lubmluZyBvZiBhIGRvY3VtZW50LgotICAgICAqCi0gICAgICogPHA+VGhlIFNBWCBwYXJzZXIgd2lsbCBpbnZva2UgdGhpcyBtZXRob2Qgb25seSBvbmNlLCBiZWZvcmUgYW55Ci0gICAgICogb3RoZXIgZXZlbnQgY2FsbGJhY2tzIChleGNlcHQgZm9yIHtAbGluayAjc2V0RG9jdW1lbnRMb2NhdG9yCi0gICAgICogc2V0RG9jdW1lbnRMb2NhdG9yfSkuPC9wPgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gQW55IFNBWCBleGNlcHRpb24sIHBvc3NpYmx5Ci0gICAgICogICAgICAgICAgICB3cmFwcGluZyBhbm90aGVyIGV4Y2VwdGlvbi4KLSAgICAgKiBAc2VlICNlbmREb2N1bWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgY29udGVudEhhbmRsZXIuc3RhcnREb2N1bWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHRoZSBlbmQgb2YgYSBkb2N1bWVudC4KLSAgICAgKgotICAgICAqIDxwPlRoZSBTQVggcGFyc2VyIHdpbGwgaW52b2tlIHRoaXMgbWV0aG9kIG9ubHkgb25jZSwgYW5kIGl0IHdpbGwKLSAgICAgKiBiZSB0aGUgbGFzdCBtZXRob2QgaW52b2tlZCBkdXJpbmcgdGhlIHBhcnNlLiAgVGhlIHBhcnNlciBzaGFsbAotICAgICAqIG5vdCBpbnZva2UgdGhpcyBtZXRob2QgdW50aWwgaXQgaGFzIGVpdGhlciBhYmFuZG9uZWQgcGFyc2luZwotICAgICAqIChiZWNhdXNlIG9mIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IpIG9yIHJlYWNoZWQgdGhlIGVuZCBvZgotICAgICAqIGlucHV0LjwvcD4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIEFueSBTQVggZXhjZXB0aW9uLCBwb3NzaWJseQotICAgICAqICAgICAgICAgICAgd3JhcHBpbmcgYW5vdGhlciBleGNlcHRpb24uCi0gICAgICogQHNlZSAjc3RhcnREb2N1bWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNvbnRlbnRIYW5kbGVyLmVuZERvY3VtZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmVnaW4gdGhlIHNjb3BlIG9mIGEgcHJlZml4LVVSSSBOYW1lc3BhY2UgbWFwcGluZy4KLSAgICAgKgotICAgICAqIDxwPlRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgZXZlbnQgaXMgbm90IG5lY2Vzc2FyeSBmb3IKLSAgICAgKiBub3JtYWwgTmFtZXNwYWNlIHByb2Nlc3Npbmc6IHRoZSBTQVggWE1MIHJlYWRlciB3aWxsCi0gICAgICogYXV0b21hdGljYWxseSByZXBsYWNlIHByZWZpeGVzIGZvciBlbGVtZW50IGFuZCBhdHRyaWJ1dGUKLSAgICAgKiBuYW1lcyB3aGVuIHRoZSA8Y29kZT5odHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlczwvY29kZT4KLSAgICAgKiBmZWF0dXJlIGlzIDx2YXI+dHJ1ZTwvdmFyPiAodGhlIGRlZmF1bHQpLjwvcD4KLSAgICAgKgotICAgICAqIDxwPlRoZXJlIGFyZSBjYXNlcywgaG93ZXZlciwgd2hlbiBhcHBsaWNhdGlvbnMgbmVlZCB0bwotICAgICAqIHVzZSBwcmVmaXhlcyBpbiBjaGFyYWN0ZXIgZGF0YSBvciBpbiBhdHRyaWJ1dGUgdmFsdWVzLAotICAgICAqIHdoZXJlIHRoZXkgY2Fubm90IHNhZmVseSBiZSBleHBhbmRlZCBhdXRvbWF0aWNhbGx5OyB0aGUKLSAgICAgKiBzdGFydC9lbmRQcmVmaXhNYXBwaW5nIGV2ZW50IHN1cHBsaWVzIHRoZSBpbmZvcm1hdGlvbgotICAgICAqIHRvIHRoZSBhcHBsaWNhdGlvbiB0byBleHBhbmQgcHJlZml4ZXMgaW4gdGhvc2UgY29udGV4dHMKLSAgICAgKiBpdHNlbGYsIGlmIG5lY2Vzc2FyeS48L3A+Ci0gICAgICoKLSAgICAgKiA8cD5Ob3RlIHRoYXQgc3RhcnQvZW5kUHJlZml4TWFwcGluZyBldmVudHMgYXJlIG5vdAotICAgICAqIGd1YXJhbnRlZWQgdG8gYmUgcHJvcGVybHkgbmVzdGVkIHJlbGF0aXZlIHRvIGVhY2ggb3RoZXI6Ci0gICAgICogYWxsIHN0YXJ0UHJlZml4TWFwcGluZyBldmVudHMgd2lsbCBvY2N1ciBpbW1lZGlhdGVseSBiZWZvcmUgdGhlCi0gICAgICogY29ycmVzcG9uZGluZyB7QGxpbmsgI3N0YXJ0RWxlbWVudCBzdGFydEVsZW1lbnR9IGV2ZW50LAotICAgICAqIGFuZCBhbGwge0BsaW5rICNlbmRQcmVmaXhNYXBwaW5nIGVuZFByZWZpeE1hcHBpbmd9Ci0gICAgICogZXZlbnRzIHdpbGwgb2NjdXIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgKiB7QGxpbmsgI2VuZEVsZW1lbnQgZW5kRWxlbWVudH0gZXZlbnQsCi0gICAgICogYnV0IHRoZWlyIG9yZGVyIGlzIG5vdCBvdGhlcndpc2UKLSAgICAgKiBndWFyYW50ZWVkLjwvcD4KLSAgICAgKgotICAgICAqIDxwPlRoZXJlIHNob3VsZCBuZXZlciBiZSBzdGFydC9lbmRQcmVmaXhNYXBwaW5nIGV2ZW50cyBmb3IgdGhlCi0gICAgICogInhtbCIgcHJlZml4LCBzaW5jZSBpdCBpcyBwcmVkZWNsYXJlZCBhbmQgaW1tdXRhYmxlLjwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmVmaXggVGhlIE5hbWVzcGFjZSBwcmVmaXggYmVpbmcgZGVjbGFyZWQuCi0gICAgICogIEFuIGVtcHR5IHN0cmluZyBpcyB1c2VkIGZvciB0aGUgZGVmYXVsdCBlbGVtZW50IG5hbWVzcGFjZSwKLSAgICAgKiAgd2hpY2ggaGFzIG5vIHByZWZpeC4KLSAgICAgKiBAcGFyYW0gdXJpIFRoZSBOYW1lc3BhY2UgVVJJIHRoZSBwcmVmaXggaXMgbWFwcGVkIHRvLgotICAgICAqIEBleGNlcHRpb24gb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIFRoZSBjbGllbnQgbWF5IHRocm93Ci0gICAgICogICAgICAgICAgICBhbiBleGNlcHRpb24gZHVyaW5nIHByb2Nlc3NpbmcuCi0gICAgICogQHNlZSAjZW5kUHJlZml4TWFwcGluZwotICAgICAqIEBzZWUgI3N0YXJ0RWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZyhTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgY29udGVudEhhbmRsZXIuc3RhcnRQcmVmaXhNYXBwaW5nKHByZWZpeCwgdXJpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmQgdGhlIHNjb3BlIG9mIGEgcHJlZml4LVVSSSBtYXBwaW5nLgotICAgICAqCi0gICAgICogPHA+U2VlIHtAbGluayAjc3RhcnRQcmVmaXhNYXBwaW5nIHN0YXJ0UHJlZml4TWFwcGluZ30gZm9yCi0gICAgICogZGV0YWlscy4gIFRoZXNlIGV2ZW50cyB3aWxsIGFsd2F5cyBvY2N1ciBpbW1lZGlhdGVseSBhZnRlciB0aGUKLSAgICAgKiBjb3JyZXNwb25kaW5nIHtAbGluayAjZW5kRWxlbWVudCBlbmRFbGVtZW50fSBldmVudCwgYnV0IHRoZSBvcmRlciBvZgotICAgICAqIHtAbGluayAjZW5kUHJlZml4TWFwcGluZyBlbmRQcmVmaXhNYXBwaW5nfSBldmVudHMgaXMgbm90IG90aGVyd2lzZQotICAgICAqIGd1YXJhbnRlZWQuPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4IHRoYXQgd2FzIGJlaW5nIG1hcHBlZC4KLSAgICAgKiAgVGhpcyBpcyB0aGUgZW1wdHkgc3RyaW5nIHdoZW4gYSBkZWZhdWx0IG1hcHBpbmcgc2NvcGUgZW5kcy4KLSAgICAgKiBAZXhjZXB0aW9uIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBUaGUgY2xpZW50IG1heSB0aHJvdwotICAgICAqICAgICAgICAgICAgYW4gZXhjZXB0aW9uIGR1cmluZyBwcm9jZXNzaW5nLgotICAgICAqIEBzZWUgI3N0YXJ0UHJlZml4TWFwcGluZwotICAgICAqIEBzZWUgI2VuZEVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmRQcmVmaXhNYXBwaW5nKFN0cmluZyBwcmVmaXgpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBjb250ZW50SGFuZGxlci5lbmRQcmVmaXhNYXBwaW5nKHByZWZpeCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgdGhlIGJlZ2lubmluZyBvZiBhbiBlbGVtZW50LgotICAgICAqCi0gICAgICogPHA+VGhlIFBhcnNlciB3aWxsIGludm9rZSB0aGlzIG1ldGhvZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5Ci0gICAgICogZWxlbWVudCBpbiB0aGUgWE1MIGRvY3VtZW50OyB0aGVyZSB3aWxsIGJlIGEgY29ycmVzcG9uZGluZwotICAgICAqIHtAbGluayAjZW5kRWxlbWVudCBlbmRFbGVtZW50fSBldmVudCBmb3IgZXZlcnkgc3RhcnRFbGVtZW50IGV2ZW50Ci0gICAgICogKGV2ZW4gd2hlbiB0aGUgZWxlbWVudCBpcyBlbXB0eSkuIEFsbCBvZiB0aGUgZWxlbWVudCdzIGNvbnRlbnQgd2lsbCBiZQotICAgICAqIHJlcG9ydGVkLCBpbiBvcmRlciwgYmVmb3JlIHRoZSBjb3JyZXNwb25kaW5nIGVuZEVsZW1lbnQKLSAgICAgKiBldmVudC48L3A+Ci0gICAgICoKLSAgICAgKiA8cD5UaGlzIGV2ZW50IGFsbG93cyB1cCB0byB0aHJlZSBuYW1lIGNvbXBvbmVudHMgZm9yIGVhY2gKLSAgICAgKiBlbGVtZW50OjwvcD4KLSAgICAgKgotICAgICAqIDxvbD4KLSAgICAgKiA8bGk+dGhlIE5hbWVzcGFjZSBVUkk7PC9saT4KLSAgICAgKiA8bGk+dGhlIGxvY2FsIG5hbWU7IGFuZDwvbGk+Ci0gICAgICogPGxpPnRoZSBxdWFsaWZpZWQgKHByZWZpeGVkKSBuYW1lLjwvbGk+Ci0gICAgICogPC9vbD4KLSAgICAgKgotICAgICAqIDxwPkFueSBvciBhbGwgb2YgdGhlc2UgbWF5IGJlIHByb3ZpZGVkLCBkZXBlbmRpbmcgb24gdGhlCi0gICAgICogdmFsdWVzIG9mIHRoZSA8dmFyPmh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzPC92YXI+Ci0gICAgICogYW5kIHRoZSA8dmFyPmh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXM8L3Zhcj4KLSAgICAgKiBwcm9wZXJ0aWVzOjwvcD4KLSAgICAgKgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+dGhlIE5hbWVzcGFjZSBVUkkgYW5kIGxvY2FsIG5hbWUgYXJlIHJlcXVpcmVkIHdoZW4KLSAgICAgKiB0aGUgbmFtZXNwYWNlcyBwcm9wZXJ0eSBpcyA8dmFyPnRydWU8L3Zhcj4gKHRoZSBkZWZhdWx0KSwgYW5kIGFyZQotICAgICAqIG9wdGlvbmFsIHdoZW4gdGhlIG5hbWVzcGFjZXMgcHJvcGVydHkgaXMgPHZhcj5mYWxzZTwvdmFyPiAoaWYgb25lIGlzCi0gICAgICogc3BlY2lmaWVkLCBib3RoIG11c3QgYmUpOzwvbGk+Ci0gICAgICogPGxpPnRoZSBxdWFsaWZpZWQgbmFtZSBpcyByZXF1aXJlZCB3aGVuIHRoZSBuYW1lc3BhY2UtcHJlZml4ZXMgcHJvcGVydHkKLSAgICAgKiBpcyA8dmFyPnRydWU8L3Zhcj4sIGFuZCBpcyBvcHRpb25hbCB3aGVuIHRoZSBuYW1lc3BhY2UtcHJlZml4ZXMgcHJvcGVydHkKLSAgICAgKiBpcyA8dmFyPmZhbHNlPC92YXI+ICh0aGUgZGVmYXVsdCkuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPHA+Tm90ZSB0aGF0IHRoZSBhdHRyaWJ1dGUgbGlzdCBwcm92aWRlZCB3aWxsIGNvbnRhaW4gb25seQotICAgICAqIGF0dHJpYnV0ZXMgd2l0aCBleHBsaWNpdCB2YWx1ZXMgKHNwZWNpZmllZCBvciBkZWZhdWx0ZWQpOgotICAgICAqICNJTVBMSUVEIGF0dHJpYnV0ZXMgd2lsbCBiZSBvbWl0dGVkLiAgVGhlIGF0dHJpYnV0ZSBsaXN0Ci0gICAgICogd2lsbCBjb250YWluIGF0dHJpYnV0ZXMgdXNlZCBmb3IgTmFtZXNwYWNlIGRlY2xhcmF0aW9ucwotICAgICAqICh4bWxucyogYXR0cmlidXRlcykgb25seSBpZiB0aGUKLSAgICAgKiA8Y29kZT5odHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlLXByZWZpeGVzPC9jb2RlPgotICAgICAqIHByb3BlcnR5IGlzIHRydWUgKGl0IGlzIGZhbHNlIGJ5IGRlZmF1bHQsIGFuZCBzdXBwb3J0IGZvciBhCi0gICAgICogdHJ1ZSB2YWx1ZSBpcyBvcHRpb25hbCkuPC9wPgotICAgICAqCi0gICAgICogPHA+TGlrZSB7QGxpbmsgI2NoYXJhY3RlcnMgY2hhcmFjdGVycygpfSwgYXR0cmlidXRlIHZhbHVlcyBtYXkgaGF2ZQotICAgICAqIGNoYXJhY3RlcnMgdGhhdCBuZWVkIG1vcmUgdGhhbiBvbmUgPGNvZGU+Y2hhcjwvY29kZT4gdmFsdWUuICA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJpIFRoZSBOYW1lc3BhY2UgVVJJLCBvciB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZQotICAgICAqICAgICAgICBlbGVtZW50IGhhcyBubyBOYW1lc3BhY2UgVVJJIG9yIGlmIE5hbWVzcGFjZQotICAgICAqICAgICAgICBwcm9jZXNzaW5nIGlzIG5vdCBiZWluZyBwZXJmb3JtZWQuCi0gICAgICogQHBhcmFtIGxvY2FsTmFtZSBUaGUgbG9jYWwgbmFtZSAod2l0aG91dCBwcmVmaXgpLCBvciB0aGUKLSAgICAgKiAgICAgICAgZW1wdHkgc3RyaW5nIGlmIE5hbWVzcGFjZSBwcm9jZXNzaW5nIGlzIG5vdCBiZWluZwotICAgICAqICAgICAgICBwZXJmb3JtZWQuCi0gICAgICogQHBhcmFtIHFOYW1lIFRoZSBxdWFsaWZpZWQgbmFtZSAod2l0aCBwcmVmaXgpLCBvciB0aGUKLSAgICAgKiAgICAgICAgZW1wdHkgc3RyaW5nIGlmIHF1YWxpZmllZCBuYW1lcyBhcmUgbm90IGF2YWlsYWJsZS4KLSAgICAgKiBAcGFyYW0gYXR0cyBUaGUgYXR0cmlidXRlcyBhdHRhY2hlZCB0byB0aGUgZWxlbWVudC4gIElmCi0gICAgICogICAgICAgIHRoZXJlIGFyZSBubyBhdHRyaWJ1dGVzLCBpdCBzaGFsbCBiZSBhbiBlbXB0eQotICAgICAqICAgICAgICBBdHRyaWJ1dGVzIG9iamVjdC4KLSAgICAgKiBAZXhjZXB0aW9uIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBBbnkgU0FYIGV4Y2VwdGlvbiwgcG9zc2libHkKLSAgICAgKiAgICAgICAgICAgIHdyYXBwaW5nIGFub3RoZXIgZXhjZXB0aW9uLgotICAgICAqIEBzZWUgI2VuZEVsZW1lbnQKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoCi0gICAgICAgIFN0cmluZyB1cmksCi0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUsCi0gICAgICAgIFN0cmluZyBxTmFtZSwKLSAgICAgICAgQXR0cmlidXRlcyBhdHRzKQotICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgY29udGVudEhhbmRsZXIuc3RhcnRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBxTmFtZSwgYXR0cyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgdGhlIGVuZCBvZiBhbiBlbGVtZW50LgotICAgICAqCi0gICAgICogPHA+VGhlIFNBWCBwYXJzZXIgd2lsbCBpbnZva2UgdGhpcyBtZXRob2QgYXQgdGhlIGVuZCBvZiBldmVyeQotICAgICAqIGVsZW1lbnQgaW4gdGhlIFhNTCBkb2N1bWVudDsgdGhlcmUgd2lsbCBiZSBhIGNvcnJlc3BvbmRpbmcKLSAgICAgKiB7QGxpbmsgI3N0YXJ0RWxlbWVudCBzdGFydEVsZW1lbnR9IGV2ZW50IGZvciBldmVyeSBlbmRFbGVtZW50Ci0gICAgICogZXZlbnQgKGV2ZW4gd2hlbiB0aGUgZWxlbWVudCBpcyBlbXB0eSkuPC9wPgotICAgICAqCi0gICAgICogPHA+Rm9yIGluZm9ybWF0aW9uIG9uIHRoZSBuYW1lcywgc2VlIHN0YXJ0RWxlbWVudC48L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJpIFRoZSBOYW1lc3BhY2UgVVJJLCBvciB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZQotICAgICAqICAgICAgICBlbGVtZW50IGhhcyBubyBOYW1lc3BhY2UgVVJJIG9yIGlmIE5hbWVzcGFjZQotICAgICAqICAgICAgICBwcm9jZXNzaW5nIGlzIG5vdCBiZWluZyBwZXJmb3JtZWQuCi0gICAgICogQHBhcmFtIGxvY2FsTmFtZSBUaGUgbG9jYWwgbmFtZSAod2l0aG91dCBwcmVmaXgpLCBvciB0aGUKLSAgICAgKiAgICAgICAgZW1wdHkgc3RyaW5nIGlmIE5hbWVzcGFjZSBwcm9jZXNzaW5nIGlzIG5vdCBiZWluZwotICAgICAqICAgICAgICBwZXJmb3JtZWQuCi0gICAgICogQHBhcmFtIHFOYW1lIFRoZSBxdWFsaWZpZWQgWE1MIDEuMCBuYW1lICh3aXRoIHByZWZpeCksIG9yIHRoZQotICAgICAqICAgICAgICBlbXB0eSBzdHJpbmcgaWYgcXVhbGlmaWVkIG5hbWVzIGFyZSBub3QgYXZhaWxhYmxlLgotICAgICAqIEBleGNlcHRpb24gb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIEFueSBTQVggZXhjZXB0aW9uLCBwb3NzaWJseQotICAgICAqICAgICAgICAgICAgd3JhcHBpbmcgYW5vdGhlciBleGNlcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpCi0gICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBjb250ZW50SGFuZGxlci5lbmRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBxTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgY2hhcmFjdGVyIGRhdGEuCi0gICAgICoKLSAgICAgKiA8cD5UaGUgUGFyc2VyIHdpbGwgY2FsbCB0aGlzIG1ldGhvZCB0byByZXBvcnQgZWFjaCBjaHVuayBvZgotICAgICAqIGNoYXJhY3RlciBkYXRhLiAgU0FYIHBhcnNlcnMgbWF5IHJldHVybiBhbGwgY29udGlndW91cyBjaGFyYWN0ZXIKLSAgICAgKiBkYXRhIGluIGEgc2luZ2xlIGNodW5rLCBvciB0aGV5IG1heSBzcGxpdCBpdCBpbnRvIHNldmVyYWwKLSAgICAgKiBjaHVua3M7IGhvd2V2ZXIsIGFsbCBvZiB0aGUgY2hhcmFjdGVycyBpbiBhbnkgc2luZ2xlIGV2ZW50Ci0gICAgICogbXVzdCBjb21lIGZyb20gdGhlIHNhbWUgZXh0ZXJuYWwgZW50aXR5IHNvIHRoYXQgdGhlIExvY2F0b3IKLSAgICAgKiBwcm92aWRlcyB1c2VmdWwgaW5mb3JtYXRpb24uPC9wPgotICAgICAqCi0gICAgICogPHA+VGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IGF0dGVtcHQgdG8gcmVhZCBmcm9tIHRoZSBhcnJheQotICAgICAqIG91dHNpZGUgb2YgdGhlIHNwZWNpZmllZCByYW5nZS48L3A+Ci0gICAgICoKLSAgICAgKiA8cD5JbmRpdmlkdWFsIGNoYXJhY3RlcnMgbWF5IGNvbnNpc3Qgb2YgbW9yZSB0aGFuIG9uZSBKYXZhCi0gICAgICogPGNvZGU+Y2hhcjwvY29kZT4gdmFsdWUuICBUaGVyZSBhcmUgdHdvIGltcG9ydGFudCBjYXNlcyB3aGVyZSB0aGlzCi0gICAgICogaGFwcGVucywgYmVjYXVzZSBjaGFyYWN0ZXJzIGNhbid0IGJlIHJlcHJlc2VudGVkIGluIGp1c3Qgc2l4dGVlbiBiaXRzLgotICAgICAqIEluIG9uZSBjYXNlLCBjaGFyYWN0ZXJzIGFyZSByZXByZXNlbnRlZCBpbiBhIDxlbT5TdXJyb2dhdGUgUGFpcjwvZW0+LAotICAgICAqIHVzaW5nIHR3byBzcGVjaWFsIFVuaWNvZGUgdmFsdWVzLiBTdWNoIGNoYXJhY3RlcnMgYXJlIGluIHRoZSBzby1jYWxsZWQKLSAgICAgKiAiQXN0cmFsIFBsYW5lcyIsIHdpdGggYSBjb2RlIHBvaW50IGFib3ZlIFUrRkZGRi4gIEEgc2Vjb25kIGNhc2UgaW52b2x2ZXMKLSAgICAgKiBjb21wb3NpdGUgY2hhcmFjdGVycywgc3VjaCBhcyBhIGJhc2UgY2hhcmFjdGVyIGNvbWJpbmluZyB3aXRoIG9uZSBvcgotICAgICAqIG1vcmUgYWNjZW50IGNoYXJhY3RlcnMuIDwvcD4KLSAgICAgKgotICAgICAqIDxwPiBZb3VyIGNvZGUgc2hvdWxkIG5vdCBhc3N1bWUgdGhhdCBhbGdvcml0aG1zIHVzaW5nCi0gICAgICogPGNvZGU+Y2hhcjwvY29kZT4tYXQtYS10aW1lIGlkaW9tcyB3aWxsIGJlIHdvcmtpbmcgaW4gY2hhcmFjdGVyCi0gICAgICogdW5pdHM7IGluIHNvbWUgY2FzZXMgdGhleSB3aWxsIHNwbGl0IGNoYXJhY3RlcnMuICBUaGlzIGlzIHJlbGV2YW50Ci0gICAgICogd2hlcmV2ZXIgWE1MIHBlcm1pdHMgYXJiaXRyYXJ5IGNoYXJhY3RlcnMsIHN1Y2ggYXMgYXR0cmlidXRlIHZhbHVlcywKLSAgICAgKiBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGRhdGEsIGFuZCBjb21tZW50cyBhcyB3ZWxsIGFzIGluIGRhdGEgcmVwb3J0ZWQKLSAgICAgKiBmcm9tIHRoaXMgbWV0aG9kLiAgSXQncyBhbHNvIGdlbmVyYWxseSByZWxldmFudCB3aGVuZXZlciBKYXZhIGNvZGUKLSAgICAgKiBtYW5pcHVsYXRlcyBpbnRlcm5hdGlvbmFsaXplZCB0ZXh0OyB0aGUgaXNzdWUgaXNuJ3QgdW5pcXVlIHRvIFhNTC48L3A+Ci0gICAgICoKLSAgICAgKiA8cD5Ob3RlIHRoYXQgc29tZSBwYXJzZXJzIHdpbGwgcmVwb3J0IHdoaXRlc3BhY2UgaW4gZWxlbWVudAotICAgICAqIGNvbnRlbnQgdXNpbmcgdGhlIHtAbGluayAjaWdub3JhYmxlV2hpdGVzcGFjZSBpZ25vcmFibGVXaGl0ZXNwYWNlfQotICAgICAqIG1ldGhvZCByYXRoZXIgdGhhbiB0aGlzIG9uZSAodmFsaWRhdGluZyBwYXJzZXJzIDxlbT5tdXN0PC9lbT4KLSAgICAgKiBkbyBzbykuPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGNoIFRoZSBjaGFyYWN0ZXJzIGZyb20gdGhlIFhNTCBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uIGluIHRoZSBhcnJheS4KLSAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZWFkIGZyb20gdGhlIGFycmF5LgotICAgICAqIEBleGNlcHRpb24gb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIEFueSBTQVggZXhjZXB0aW9uLCBwb3NzaWJseQotICAgICAqICAgICAgICAgICAgd3JhcHBpbmcgYW5vdGhlciBleGNlcHRpb24uCi0gICAgICogQHNlZSAjaWdub3JhYmxlV2hpdGVzcGFjZQotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguTG9jYXRvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBjb250ZW50SGFuZGxlci5jaGFyYWN0ZXJzKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBpZ25vcmFibGUgd2hpdGVzcGFjZSBpbiBlbGVtZW50IGNvbnRlbnQuCi0gICAgICoKLSAgICAgKiA8cD5WYWxpZGF0aW5nIFBhcnNlcnMgbXVzdCB1c2UgdGhpcyBtZXRob2QgdG8gcmVwb3J0IGVhY2ggY2h1bmsKLSAgICAgKiBvZiB3aGl0ZXNwYWNlIGluIGVsZW1lbnQgY29udGVudCAoc2VlIHRoZSBXM0MgWE1MIDEuMCByZWNvbW1lbmRhdGlvbiwKLSAgICAgKiBzZWN0aW9uIDIuMTApOiBub24tdmFsaWRhdGluZyBwYXJzZXJzIG1heSBhbHNvIHVzZSB0aGlzIG1ldGhvZAotICAgICAqIGlmIHRoZXkgYXJlIGNhcGFibGUgb2YgcGFyc2luZyBhbmQgdXNpbmcgY29udGVudCBtb2RlbHMuPC9wPgotICAgICAqCi0gICAgICogPHA+U0FYIHBhcnNlcnMgbWF5IHJldHVybiBhbGwgY29udGlndW91cyB3aGl0ZXNwYWNlIGluIGEgc2luZ2xlCi0gICAgICogY2h1bmssIG9yIHRoZXkgbWF5IHNwbGl0IGl0IGludG8gc2V2ZXJhbCBjaHVua3M7IGhvd2V2ZXIsIGFsbCBvZgotICAgICAqIHRoZSBjaGFyYWN0ZXJzIGluIGFueSBzaW5nbGUgZXZlbnQgbXVzdCBjb21lIGZyb20gdGhlIHNhbWUKLSAgICAgKiBleHRlcm5hbCBlbnRpdHksIHNvIHRoYXQgdGhlIExvY2F0b3IgcHJvdmlkZXMgdXNlZnVsCi0gICAgICogaW5mb3JtYXRpb24uPC9wPgotICAgICAqCi0gICAgICogPHA+VGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IGF0dGVtcHQgdG8gcmVhZCBmcm9tIHRoZSBhcnJheQotICAgICAqIG91dHNpZGUgb2YgdGhlIHNwZWNpZmllZCByYW5nZS48L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY2ggVGhlIGNoYXJhY3RlcnMgZnJvbSB0aGUgWE1MIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgcG9zaXRpb24gaW4gdGhlIGFycmF5LgotICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQgZnJvbSB0aGUgYXJyYXkuCi0gICAgICogQGV4Y2VwdGlvbiBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gQW55IFNBWCBleGNlcHRpb24sIHBvc3NpYmx5Ci0gICAgICogICAgICAgICAgICB3cmFwcGluZyBhbm90aGVyIGV4Y2VwdGlvbi4KLSAgICAgKiBAc2VlICNjaGFyYWN0ZXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZShjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCkKLSAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNvbnRlbnRIYW5kbGVyLmlnbm9yYWJsZVdoaXRlc3BhY2UoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4KLSAgICAgKgotICAgICAqIDxwPlRoZSBQYXJzZXIgd2lsbCBpbnZva2UgdGhpcyBtZXRob2Qgb25jZSBmb3IgZWFjaCBwcm9jZXNzaW5nCi0gICAgICogaW5zdHJ1Y3Rpb24gZm91bmQ6IG5vdGUgdGhhdCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBtYXkgb2NjdXIKLSAgICAgKiBiZWZvcmUgb3IgYWZ0ZXIgdGhlIG1haW4gZG9jdW1lbnQgZWxlbWVudC48L3A+Ci0gICAgICoKLSAgICAgKiA8cD5BIFNBWCBwYXJzZXIgbXVzdCBuZXZlciByZXBvcnQgYW4gWE1MIGRlY2xhcmF0aW9uIChYTUwgMS4wLAotICAgICAqIHNlY3Rpb24gMi44KSBvciBhIHRleHQgZGVjbGFyYXRpb24gKFhNTCAxLjAsIHNlY3Rpb24gNC4zLjEpCi0gICAgICogdXNpbmcgdGhpcyBtZXRob2QuPC9wPgotICAgICAqCi0gICAgICogPHA+TGlrZSB7QGxpbmsgI2NoYXJhY3RlcnMgY2hhcmFjdGVycygpfSwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbgotICAgICAqIGRhdGEgbWF5IGhhdmUgY2hhcmFjdGVycyB0aGF0IG5lZWQgbW9yZSB0aGFuIG9uZSA8Y29kZT5jaGFyPC9jb2RlPgotICAgICAqIHZhbHVlLiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldC4KLSAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBkYXRhLCBvciBudWxsIGlmCi0gICAgICogICAgICAgIG5vbmUgd2FzIHN1cHBsaWVkLiAgVGhlIGRhdGEgZG9lcyBub3QgaW5jbHVkZSBhbnkKLSAgICAgKiAgICAgICAgd2hpdGVzcGFjZSBzZXBhcmF0aW5nIGl0IGZyb20gdGhlIHRhcmdldC4KLSAgICAgKiBAZXhjZXB0aW9uIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBBbnkgU0FYIGV4Y2VwdGlvbiwgcG9zc2libHkKLSAgICAgKiAgICAgICAgICAgIHdyYXBwaW5nIGFub3RoZXIgZXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkKLSAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNvbnRlbnRIYW5kbGVyLnByb2Nlc3NpbmdJbnN0cnVjdGlvbih0YXJnZXQsIGRhdGEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGEgc2tpcHBlZCBlbnRpdHkuCi0gICAgICogVGhpcyBpcyBub3QgY2FsbGVkIGZvciBlbnRpdHkgcmVmZXJlbmNlcyB3aXRoaW4gbWFya3VwIGNvbnN0cnVjdHMKLSAgICAgKiBzdWNoIGFzIGVsZW1lbnQgc3RhcnQgdGFncyBvciBtYXJrdXAgZGVjbGFyYXRpb25zLiAgKFRoZSBYTUwKLSAgICAgKiByZWNvbW1lbmRhdGlvbiByZXF1aXJlcyByZXBvcnRpbmcgc2tpcHBlZCBleHRlcm5hbCBlbnRpdGllcy4KLSAgICAgKiBTQVggYWxzbyByZXBvcnRzIGludGVybmFsIGVudGl0eSBleHBhbnNpb24vbm9uLWV4cGFuc2lvbiwgZXhjZXB0Ci0gICAgICogd2l0aGluIG1hcmt1cCBjb25zdHJ1Y3RzLikKLSAgICAgKgotICAgICAqIDxwPlRoZSBQYXJzZXIgd2lsbCBpbnZva2UgdGhpcyBtZXRob2QgZWFjaCB0aW1lIHRoZSBlbnRpdHkgaXMKLSAgICAgKiBza2lwcGVkLiAgTm9uLXZhbGlkYXRpbmcgcHJvY2Vzc29ycyBtYXkgc2tpcCBlbnRpdGllcyBpZiB0aGV5Ci0gICAgICogaGF2ZSBub3Qgc2VlbiB0aGUgZGVjbGFyYXRpb25zIChiZWNhdXNlLCBmb3IgZXhhbXBsZSwgdGhlCi0gICAgICogZW50aXR5IHdhcyBkZWNsYXJlZCBpbiBhbiBleHRlcm5hbCBEVEQgc3Vic2V0KS4gIEFsbCBwcm9jZXNzb3JzCi0gICAgICogbWF5IHNraXAgZXh0ZXJuYWwgZW50aXRpZXMsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWVzIG9mIHRoZQotICAgICAqIDxjb2RlPmh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9leHRlcm5hbC1nZW5lcmFsLWVudGl0aWVzPC9jb2RlPgotICAgICAqIGFuZCB0aGUKLSAgICAgKiA8Y29kZT5odHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvZXh0ZXJuYWwtcGFyYW1ldGVyLWVudGl0aWVzPC9jb2RlPgotICAgICAqIHByb3BlcnRpZXMuPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHNraXBwZWQgZW50aXR5LiAgSWYgaXQgaXMgYQotICAgICAqICAgICAgICBwYXJhbWV0ZXIgZW50aXR5LCB0aGUgbmFtZSB3aWxsIGJlZ2luIHdpdGggJyUnLCBhbmQgaWYKLSAgICAgKiAgICAgICAgaXQgaXMgdGhlIGV4dGVybmFsIERURCBzdWJzZXQsIGl0IHdpbGwgYmUgdGhlIHN0cmluZwotICAgICAqICAgICAgICAiW2R0ZF0iLgotICAgICAqIEBleGNlcHRpb24gb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIEFueSBTQVggZXhjZXB0aW9uLCBwb3NzaWJseQotICAgICAqICAgICAgICAgICAgd3JhcHBpbmcgYW5vdGhlciBleGNlcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2tpcHBlZEVudGl0eShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNvbnRlbnRIYW5kbGVyLnNraXBwZWRFbnRpdHkobmFtZSk7Ci0gICAgfQotCi0KLSAgICAvLyBMZXhpY2FsIEhhbmRsZXIgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBSZXBvcnQgdGhlIHN0YXJ0IG9mIERURCBkZWNsYXJhdGlvbnMsIGlmIGFueS4KLSAgICAgKgotICAgICAqIDxwPlRoaXMgbWV0aG9kIGlzIGludGVuZGVkIHRvIHJlcG9ydCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgICAqIERPQ1RZUEUgZGVjbGFyYXRpb247IGlmIHRoZSBkb2N1bWVudCBoYXMgbm8gRE9DVFlQRSBkZWNsYXJhdGlvbiwKLSAgICAgKiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBiZSBpbnZva2VkLjwvcD4KLSAgICAgKgotICAgICAqIDxwPkFsbCBkZWNsYXJhdGlvbnMgcmVwb3J0ZWQgdGhyb3VnaAotICAgICAqIHtAbGluayBvcmcueG1sLnNheC5EVERIYW5kbGVyIERUREhhbmRsZXJ9IG9yCi0gICAgICoge0BsaW5rIG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlciBEZWNsSGFuZGxlcn0gZXZlbnRzIG11c3QgYXBwZWFyCi0gICAgICogYmV0d2VlbiB0aGUgc3RhcnREVEQgYW5kIHtAbGluayAjZW5kRFREIGVuZERURH0gZXZlbnRzLgotICAgICAqIERlY2xhcmF0aW9ucyBhcmUgYXNzdW1lZCB0byBiZWxvbmcgdG8gdGhlIGludGVybmFsIERURCBzdWJzZXQKLSAgICAgKiB1bmxlc3MgdGhleSBhcHBlYXIgYmV0d2VlbiB7QGxpbmsgI3N0YXJ0RW50aXR5IHN0YXJ0RW50aXR5fQotICAgICAqIGFuZCB7QGxpbmsgI2VuZEVudGl0eSBlbmRFbnRpdHl9IGV2ZW50cy4gIENvbW1lbnRzIGFuZAotICAgICAqIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIERURCBzaG91bGQgYWxzbyBiZSByZXBvcnRlZAotICAgICAqIGJldHdlZW4gdGhlIHN0YXJ0RFREIGFuZCBlbmREVEQgZXZlbnRzLCBpbiB0aGVpciBvcmlnaW5hbAotICAgICAqIG9yZGVyIG9mIChsb2dpY2FsKSBvY2N1cnJlbmNlOyB0aGV5IGFyZSBub3QgcmVxdWlyZWQgdG8KLSAgICAgKiBhcHBlYXIgaW4gdGhlaXIgY29ycmVjdCBsb2NhdGlvbnMgcmVsYXRpdmUgdG8gRFRESGFuZGxlcgotICAgICAqIG9yIERlY2xIYW5kbGVyIGV2ZW50cywgaG93ZXZlci48L3A+Ci0gICAgICoKLSAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIHN0YXJ0L2VuZERURCBldmVudHMgd2lsbCBhcHBlYXIgd2l0aGluCi0gICAgICogdGhlIHN0YXJ0L2VuZERvY3VtZW50IGV2ZW50cyBmcm9tIENvbnRlbnRIYW5kbGVyIGFuZAotICAgICAqIGJlZm9yZSB0aGUgZmlyc3QKLSAgICAgKiB7QGxpbmsgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnRFbGVtZW50IHN0YXJ0RWxlbWVudH0KLSAgICAgKiBldmVudC48L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgZG9jdW1lbnQgdHlwZSBuYW1lLgotICAgICAqIEBwYXJhbSBwdWJsaWNJZCBUaGUgZGVjbGFyZWQgcHVibGljIGlkZW50aWZpZXIgZm9yIHRoZQotICAgICAqICAgICAgICBleHRlcm5hbCBEVEQgc3Vic2V0LCBvciBudWxsIGlmIG5vbmUgd2FzIGRlY2xhcmVkLgotICAgICAqIEBwYXJhbSBzeXN0ZW1JZCBUaGUgZGVjbGFyZWQgc3lzdGVtIGlkZW50aWZpZXIgZm9yIHRoZQotICAgICAqICAgICAgICBleHRlcm5hbCBEVEQgc3Vic2V0LCBvciBudWxsIGlmIG5vbmUgd2FzIGRlY2xhcmVkLgotICAgICAqICAgICAgICAoTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlc29sdmVkIGFnYWluc3QgdGhlIGRvY3VtZW50Ci0gICAgICogICAgICAgIGJhc2UgVVJJLikKLSAgICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbiBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuCi0gICAgICogICAgICAgICAgICBleGNlcHRpb24uCi0gICAgICogQHNlZSAjZW5kRFRECi0gICAgICogQHNlZSAjc3RhcnRFbnRpdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydERURChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBpZiAobGV4aWNhbEhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbGV4aWNhbEhhbmRsZXIuc3RhcnREVEQobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcG9ydCB0aGUgZW5kIG9mIERURCBkZWNsYXJhdGlvbnMuCi0gICAgICoKLSAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCB0byByZXBvcnQgdGhlIGVuZCBvZiB0aGUKLSAgICAgKiBET0NUWVBFIGRlY2xhcmF0aW9uOyBpZiB0aGUgZG9jdW1lbnQgaGFzIG5vIERPQ1RZUEUgZGVjbGFyYXRpb24sCi0gICAgICogdGhpcyBtZXRob2Qgd2lsbCBub3QgYmUgaW52b2tlZC48L3A+Ci0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbiBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KLSAgICAgKiBAc2VlICNzdGFydERURAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZERURCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBpZiAobGV4aWNhbEhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbGV4aWNhbEhhbmRsZXIuZW5kRFREKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBvcnQgdGhlIGJlZ2lubmluZyBvZiBzb21lIGludGVybmFsIGFuZCBleHRlcm5hbCBYTUwgZW50aXRpZXMuCi0gICAgICoKLSAgICAgKiA8cD5UaGUgcmVwb3J0aW5nIG9mIHBhcmFtZXRlciBlbnRpdGllcyAoaW5jbHVkaW5nCi0gICAgICogdGhlIGV4dGVybmFsIERURCBzdWJzZXQpIGlzIG9wdGlvbmFsLCBhbmQgU0FYMiBkcml2ZXJzIHRoYXQKLSAgICAgKiByZXBvcnQgTGV4aWNhbEhhbmRsZXIgZXZlbnRzIG1heSBub3QgaW1wbGVtZW50IGl0OyB5b3UgY2FuIHVzZSB0aGUKLSAgICAgKiA8Y29kZQotICAgICAqID5odHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbGV4aWNhbC1oYW5kbGVyL3BhcmFtZXRlci1lbnRpdGllczwvY29kZT4KLSAgICAgKiBmZWF0dXJlIHRvIHF1ZXJ5IG9yIGNvbnRyb2wgdGhlIHJlcG9ydGluZyBvZiBwYXJhbWV0ZXIgZW50aXRpZXMuPC9wPgotICAgICAqCi0gICAgICogPHA+R2VuZXJhbCBlbnRpdGllcyBhcmUgcmVwb3J0ZWQgd2l0aCB0aGVpciByZWd1bGFyIG5hbWVzLAotICAgICAqIHBhcmFtZXRlciBlbnRpdGllcyBoYXZlICclJyBwcmVwZW5kZWQgdG8gdGhlaXIgbmFtZXMsIGFuZAotICAgICAqIHRoZSBleHRlcm5hbCBEVEQgc3Vic2V0IGhhcyB0aGUgcHNldWRvLWVudGl0eSBuYW1lICJbZHRkXSIuPC9wPgotICAgICAqCi0gICAgICogPHA+V2hlbiBhIFNBWDIgZHJpdmVyIGlzIHByb3ZpZGluZyB0aGVzZSBldmVudHMsIGFsbCBvdGhlcgotICAgICAqIGV2ZW50cyBtdXN0IGJlIHByb3Blcmx5IG5lc3RlZCB3aXRoaW4gc3RhcnQvZW5kIGVudGl0eQotICAgICAqIGV2ZW50cy4gIFRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnQgdGhhdCBldmVudHMgZnJvbQotICAgICAqIHtAbGluayBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIgRGVjbEhhbmRsZXJ9IG9yCi0gICAgICoge0BsaW5rIG9yZy54bWwuc2F4LkRUREhhbmRsZXIgRFRESGFuZGxlcn0gYmUgcHJvcGVybHkgb3JkZXJlZC48L3A+Ci0gICAgICoKLSAgICAgKiA8cD5Ob3RlIHRoYXQgc2tpcHBlZCBlbnRpdGllcyB3aWxsIGJlIHJlcG9ydGVkIHRocm91Z2ggdGhlCi0gICAgICoge0BsaW5rIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3NraXBwZWRFbnRpdHkgc2tpcHBlZEVudGl0eX0KLSAgICAgKiBldmVudCwgd2hpY2ggaXMgcGFydCBvZiB0aGUgQ29udGVudEhhbmRsZXIgaW50ZXJmYWNlLjwvcD4KLSAgICAgKgotICAgICAqIDxwPkJlY2F1c2Ugb2YgdGhlIHN0cmVhbWluZyBldmVudCBtb2RlbCB0aGF0IFNBWCB1c2VzLCBzb21lCi0gICAgICogZW50aXR5IGJvdW5kYXJpZXMgY2Fubm90IGJlIHJlcG9ydGVkIHVuZGVyIGFueQotICAgICAqIGNpcmN1bXN0YW5jZXM6PC9wPgotICAgICAqCi0gICAgICogPHVsPgotICAgICAqIDxsaT5nZW5lcmFsIGVudGl0aWVzIHdpdGhpbiBhdHRyaWJ1dGUgdmFsdWVzPC9saT4KLSAgICAgKiA8bGk+cGFyYW1ldGVyIGVudGl0aWVzIHdpdGhpbiBkZWNsYXJhdGlvbnM8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8cD5UaGVzZSB3aWxsIGJlIHNpbGVudGx5IGV4cGFuZGVkLCB3aXRoIG5vIGluZGljYXRpb24gb2Ygd2hlcmUKLSAgICAgKiB0aGUgb3JpZ2luYWwgZW50aXR5IGJvdW5kYXJpZXMgd2VyZS48L3A+Ci0gICAgICoKLSAgICAgKiA8cD5Ob3RlIGFsc28gdGhhdCB0aGUgYm91bmRhcmllcyBvZiBjaGFyYWN0ZXIgcmVmZXJlbmNlcyAod2hpY2gKLSAgICAgKiBhcmUgbm90IHJlYWxseSBlbnRpdGllcyBhbnl3YXkpIGFyZSBub3QgcmVwb3J0ZWQuPC9wPgotICAgICAqCi0gICAgICogPHA+QWxsIHN0YXJ0L2VuZEVudGl0eSBldmVudHMgbXVzdCBiZSBwcm9wZXJseSBuZXN0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZW50aXR5LiAgSWYgaXQgaXMgYSBwYXJhbWV0ZXIKLSAgICAgKiAgICAgICAgZW50aXR5LCB0aGUgbmFtZSB3aWxsIGJlZ2luIHdpdGggJyUnLCBhbmQgaWYgaXQgaXMgdGhlCi0gICAgICogICAgICAgIGV4dGVybmFsIERURCBzdWJzZXQsIGl0IHdpbGwgYmUgIltkdGRdIi4KLSAgICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbiBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KLSAgICAgKiBAc2VlICNlbmRFbnRpdHkKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlciNpbnRlcm5hbEVudGl0eURlY2wKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlciNleHRlcm5hbEVudGl0eURlY2wKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVudGl0eShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsZXhpY2FsSGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsZXhpY2FsSGFuZGxlci5zdGFydEVudGl0eShuYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcG9ydCB0aGUgZW5kIG9mIGFuIGVudGl0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBlbmRpbmcuCi0gICAgICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24gVGhlIGFwcGxpY2F0aW9uIG1heSByYWlzZSBhbiBleGNlcHRpb24uCi0gICAgICogQHNlZSAjc3RhcnRFbnRpdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBpZiAobGV4aWNhbEhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbGV4aWNhbEhhbmRsZXIuZW5kRW50aXR5KG5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwb3J0IHRoZSBzdGFydCBvZiBhIENEQVRBIHNlY3Rpb24uCi0gICAgICoKLSAgICAgKiA8cD5UaGUgY29udGVudHMgb2YgdGhlIENEQVRBIHNlY3Rpb24gd2lsbCBiZSByZXBvcnRlZCB0aHJvdWdoCi0gICAgICogdGhlIHJlZ3VsYXIge0BsaW5rIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2NoYXJhY3RlcnMKLSAgICAgKiBjaGFyYWN0ZXJzfSBldmVudDsgdGhpcyBldmVudCBpcyBpbnRlbmRlZCBvbmx5IHRvIHJlcG9ydAotICAgICAqIHRoZSBib3VuZGFyeS48L3A+Ci0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbiBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KLSAgICAgKiBAc2VlICNlbmRDREFUQQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q0RBVEEoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGxleGljYWxIYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxleGljYWxIYW5kbGVyLnN0YXJ0Q0RBVEEoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcG9ydCB0aGUgZW5kIG9mIGEgQ0RBVEEgc2VjdGlvbi4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgotICAgICAqIEBzZWUgI3N0YXJ0Q0RBVEEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBpZiAobGV4aWNhbEhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbGV4aWNhbEhhbmRsZXIuZW5kQ0RBVEEoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcG9ydCBhbiBYTUwgY29tbWVudCBhbnl3aGVyZSBpbiB0aGUgZG9jdW1lbnQuCi0gICAgICoKLSAgICAgKiA8cD5UaGlzIGNhbGxiYWNrIHdpbGwgYmUgdXNlZCBmb3IgY29tbWVudHMgaW5zaWRlIG9yIG91dHNpZGUgdGhlCi0gICAgICogZG9jdW1lbnQgZWxlbWVudCwgaW5jbHVkaW5nIGNvbW1lbnRzIGluIHRoZSBleHRlcm5hbCBEVEQKLSAgICAgKiBzdWJzZXQgKGlmIHJlYWQpLiAgQ29tbWVudHMgaW4gdGhlIERURCBtdXN0IGJlIHByb3Blcmx5Ci0gICAgICogbmVzdGVkIGluc2lkZSBzdGFydC9lbmREVEQgYW5kIHN0YXJ0L2VuZEVudGl0eSBldmVudHMgKGlmCi0gICAgICogdXNlZCkuPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGNoIEFuIGFycmF5IGhvbGRpbmcgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIGNvbW1lbnQuCi0gICAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydGluZyBwb3NpdGlvbiBpbiB0aGUgYXJyYXkuCi0gICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gdXNlIGZyb20gdGhlIGFycmF5LgotICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbW1lbnQoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBpZiAobGV4aWNhbEhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbGV4aWNhbEhhbmRsZXIuY29tbWVudChjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqIFBhc3MgZGF0YSB0aHJvdWdoIHRoZSBwaXBsaW5lLgotICAgICAgKiBCeSBkZWZhdWx0LCB0aGlzIGNhbGwgaXMgaWdub3JlZC4KLSAgICAgICogU3ViY2xhc3NlcyBhcmUgaW52aXRlZCB0byB1c2UgdGhpcyBhcyBhIHdheSBmb3IgY2hpbGRyZW4gdGFncyB0bwotICAgICAgKiBwYXNzIGRhdGEgdG8gdGhlaXIgcGFyZW50LgotICAgICAgKiAKLSAgICAgICogQHBhcmFtIG9iamVjdCB0aGUgZGF0YSB0byBwYXNzCi0gICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvYmplY3REYXRhKE9iamVjdCBvYmplY3QpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBpZihjb250ZW50SGFuZGxlciBpbnN0YW5jZW9mIFhNTE91dHB1dCkKLSAgICAgICAgICAgICgoWE1MT3V0cHV0KSBjb250ZW50SGFuZGxlcikub2JqZWN0RGF0YShvYmplY3QpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmKG9iamVjdCE9bnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBvdXRwdXQ9b2JqZWN0LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgd3JpdGUob3V0cHV0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgY291bGQgaGF2ZSBhICJjb25maWd1cmFibGUgbnVsbC10b1N0cmluZyIuLi4KLSAgICAgICAgICAgICAgICB3cml0ZSgibnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIFNBWCBDb250ZW50SGFuZGxlciB0byB1c2UgdG8gcGlwZSBTQVggZXZlbnRzIGludG8KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udGVudEhhbmRsZXIgZ2V0Q29udGVudEhhbmRsZXIoKSB7Ci0gICAgICAgIHJldHVybiBjb250ZW50SGFuZGxlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBTQVggQ29udGVudEhhbmRsZXIgdG8gcGlwZSBTQVggZXZlbnRzIGludG8KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50SGFuZGxlciBpcyB0aGUgbmV3IENvbnRlbnRIYW5kbGVyIHRvIHVzZS4KLSAgICAgKiAgICAgIFRoaXMgdmFsdWUgY2Fubm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudEhhbmRsZXIoQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRIYW5kbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29udGVudEhhbmRsZXIgY2Fubm90IGJlIG51bGwhIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlciA9IGNvbnRlbnRIYW5kbGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIFNBWCBMZXhpY2FsSGFuZGxlciB0byB1c2UgdG8gcGlwZSBTQVggZXZlbnRzIGludG8KLSAgICAgKi8KLSAgICBwdWJsaWMgTGV4aWNhbEhhbmRsZXIgZ2V0TGV4aWNhbEhhbmRsZXIoKSB7Ci0gICAgICAgIHJldHVybiBsZXhpY2FsSGFuZGxlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBTQVggTGV4aWNhbEhhbmRsZXIgdG8gcGlwZSBTQVggZXZlbnRzIGludG8KLSAgICAgKgotICAgICAqIEBwYXJhbSBsZXhpY2FsSGFuZGxlciBpcyB0aGUgbmV3IExleGljYWxIYW5kbGVyIHRvIHVzZS4KLSAgICAgKiAgICAgIFRoaXMgdmFsdWUgY2FuIGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGV4aWNhbEhhbmRsZXIoTGV4aWNhbEhhbmRsZXIgbGV4aWNhbEhhbmRsZXIpIHsKLSAgICAgICAgdGhpcy5sZXhpY2FsSGFuZGxlciA9IGxleGljYWxIYW5kbGVyOwotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgWE1MT3V0cHV0IGZyb20gYW4gWE1MV3JpdGVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBYTUxPdXRwdXQgY3JlYXRlWE1MT3V0cHV0KGZpbmFsIFhNTFdyaXRlciB4bWxXcml0ZXIpIHsKLSAgICAgICAgWE1MT3V0cHV0IGFuc3dlciA9IG5ldyBYTUxPdXRwdXQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGFuc3dlci5zZXRDb250ZW50SGFuZGxlcih4bWxXcml0ZXIpOwotICAgICAgICBhbnN3ZXIuc2V0TGV4aWNhbEhhbmRsZXIoeG1sV3JpdGVyKTsKLSAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9leHByZXNzaW9uL0NvbXBvc2l0ZUV4cHJlc3Npb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9leHByZXNzaW9uL0NvbXBvc2l0ZUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg2YTg5MC4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZXhwcmVzc2lvbi9Db21wb3NpdGVFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuU2luZ2xldG9uSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUV4Y2VwdGlvbjsKLQotLyoqCi0gKiA8cD48Y29kZT5Db21wb3NpdGVFeHByZXNzaW9uPC9jb2RlPiBpcyBhIENvbXBvc2l0ZSBleHByZXNzaW9uIG1hZGUgdXAgb2Ygc2V2ZXJhbAotICogRXhwcmVzc2lvbiBvYmplY3RzIHdoaWNoIGFyZSBjb25jYXRlbmF0ZWQgaW50byBhIHNpbmdsZSBTdHJpbmcuPC9wPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZUV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uU3VwcG9ydCB7Ci0KLSAgICAvKiogVGhlIGV4cHJlc3Npb25zICovCi0gICAgcHJpdmF0ZSBMaXN0IGV4cHJlc3Npb25zOwotCi0gICAgcHVibGljIENvbXBvc2l0ZUV4cHJlc3Npb24oKSB7Ci0gICAgICAgIHRoaXMuZXhwcmVzc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbXBvc2l0ZUV4cHJlc3Npb24oTGlzdCBleHByZXNzaW9ucykgewotICAgICAgICB0aGlzLmV4cHJlc3Npb25zID0gZXhwcmVzc2lvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiW2V4cHJlc3Npb25zPSIgKyBleHByZXNzaW9ucyArIl0iOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gU3RyaW5nIHRvIGJlIGVpdGhlciBhIENvbnN0YW50RXhwcmVzc3Npb24sIGFuIEV4cHJlc3Npb24gZGVub3RlZCBhcwotICAgICAqICIke2Zvb30iIG9yIHNvbWUgU3RyaW5nIHdpdGggZW1iZWRkZWQgZXhwcmVzc3Npb25zIHN1Y2ggYXMgImFiYyR7c29tZXRoaW5nfWRlZiR7ZWxzZX14eXoiCi0gICAgICogd2hpY2ggcmVzdWx0cyBpbiBhIENvbXBvc2l0ZUV4cHJlc3Npb24gYmVpbmcgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGV4dCBpcyB0aGUgU3RyaW5nIHRvIHBhcnNlIGludG8gZXhwcmVzc2lvbnMKLSAgICAgKiBAcGFyYW0gZmFjdG9yeSBpcyB0aGUgRmFjdG9yeSBvZiBFeHByZXNzaW9uIG9iamVjdHMgdXNlZCB0byBjcmVhdGUgZXhwcmVzc3Npb25zIGZvciB0aGUgY29udGVudHMKLSAgICAgKiAgb2YgdGhlIFN0cmluZyAiZm9vIiBpbnNpZGUgZXhwcmVzc2lvbnMgc3VjaCBhcyAiJHtmb299IgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgRXhwcmVzc3Npb24gZm9yIHRoZSBnaXZlbiBTdHJpbmcuCi0gICAgICogQHRocm93cyBKZWxseUV4Y2VwdGlvbiBpZiB0aGUgdGV4dCBpcyBpbnZhbGlkIChzdWNoIGFzIG1pc3NpbmcgJ30nIGNoYXJhY3RlcikuCi0gICAgICogQHRocm93cyBKZWxseUV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgc29tZSBwcm9ibGVtIGNyZWF0aW5nIHRoZSB1bmRlcmx5aW5nIEV4cHJlc3Npb24gb2JqZWN0Ci0gICAgICogIGZyb20gdGhlIEV4cHJlc3Npb25GYWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFeHByZXNzaW9uIHBhcnNlKFN0cmluZyB0ZXh0LCBFeHByZXNzaW9uRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotCi0gICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOwotCi0gICAgICAgIGludCBzdGFydEluZGV4ID0gdGV4dC5pbmRleE9mKCAiJHsiICk7Ci0KLSAgICAgICAgaWYgKCBzdGFydEluZGV4IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25zdGFudEV4cHJlc3Npb24odGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZW5kSW5kZXggPSB0ZXh0LmluZGV4T2YoICJ9Iiwgc3RhcnRJbmRleCsyICk7Ci0KLSAgICAgICAgaWYgKCBlbmRJbmRleCA8IDAgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlFeGNlcHRpb24oICJNaXNzaW5nICd9JyBjaGFyYWN0ZXIgYXQgdGhlIGVuZCBvZiBleHByZXNzaW9uOiAiICsgdGV4dCApOwotICAgICAgICB9Ci0gICAgICAgIGlmICggc3RhcnRJbmRleCA9PSAwICYmIGVuZEluZGV4ID09IGxlbiAtIDEgKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKHRleHQuc3Vic3RyaW5nKDIsIGVuZEluZGV4KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDb21wb3NpdGVFeHByZXNzaW9uIGFuc3dlciA9IG5ldyBDb21wb3NpdGVFeHByZXNzaW9uKCk7Ci0KLSAgICAgICAgaW50IGN1ciA9IDA7Ci0gICAgICAgIGNoYXIgYyA9IDA7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGNoYXJzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBTdHJpbmdCdWZmZXIgZXhwciAgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgIE1BSU46Ci0gICAgICAgIHdoaWxlICggY3VyIDwgbGVuICkgewotICAgICAgICAgICAgYyA9IHRleHQuY2hhckF0KCBjdXIgKTsKLQotICAgICAgICAgICAgc3dpdGNoICggYyApIHsKLSAgICAgICAgICAgICAgICBjYXNlKCckJyk6Ci0gICAgICAgICAgICAgICAgICAgIGlmICggY3VyKzE8bGVuICkgewotICAgICAgICAgICAgICAgICAgICAgICAgKytjdXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjID0gdGV4dC5jaGFyQXQoIGN1ciApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBjICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UoJyQnKToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnMuYXBwZW5kKCBjICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UoJ3snKToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjaGFycy5sZW5ndGgoKSA+IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnN3ZXIuYWRkVGV4dEV4cHJlc3Npb24oIGNoYXJzLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzLmRlbGV0ZSgwLCBjaGFycy5sZW5ndGgoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cisxPGxlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytjdXI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjdXI8bGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHRleHQuY2hhckF0KGN1cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICggYyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSgnIicpOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuYXBwZW5kKCBjICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytjdXI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBET1VCTEVfUVVPVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShjdXI8bGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHRleHQuY2hhckF0KGN1cik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBjICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlKCdcXCcpOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytjdXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmFwcGVuZChjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlKCciJyk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2N1cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuYXBwZW5kKGMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgRE9VQkxFX1FVT1RFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytjdXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmFwcGVuZChjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIHN3aXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyB3aGlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UoJ1wnJyk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmFwcGVuZCggYyApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytjdXI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSU5HTEVfUVVPVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShjdXI8bGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHRleHQuY2hhckF0KGN1cik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBjICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlKCdcXCcpOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytjdXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmFwcGVuZChjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlKCdcJycpOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytjdXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmFwcGVuZChjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIFNJTkdMRV9RVU9URTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrY3VyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5hcHBlbmQoYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBzd2l0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gd2hpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlKCd9Jyk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnN3ZXIuYWRkRXhwcmVzc2lvbihmYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oZXhwci50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZSgwLCBleHByLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrY3VyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgTUFJTjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuYXBwZW5kKCBjICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2N1cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnMuYXBwZW5kKGMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnMuYXBwZW5kKGMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGNoYXJzLmFwcGVuZCggYyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKytjdXI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGNoYXJzLmxlbmd0aCgpID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFuc3dlci5hZGRUZXh0RXhwcmVzc2lvbiggY2hhcnMudG9TdHJpbmcoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBFeHByZXNzaW9uIG9iamVjdHMgdGhhdCBtYWtlIHVwIHRoaXMKLSAgICAgKiBjb21wb3NpdGUgZXhwcmVzc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGdldEV4cHJlc3Npb25zKCkgewotICAgICAgICByZXR1cm4gZXhwcmVzc2lvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgRXhwcmVzc2lvbiBvYmplY3RzIHRoYXQgbWFrZSB1cCB0aGlzCi0gICAgICogY29tcG9zaXRlIGV4cHJlc3Npb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9ucyhMaXN0IGV4cHJlc3Npb25zKSB7Ci0gICAgICAgIHRoaXMuZXhwcmVzc2lvbnMgPSBleHByZXNzaW9uczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbmV3IGV4cHJlc3Npb24gdG8gdGhlIGVuZCBvZiB0aGUgZXhwcmVzc2lvbiBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLSAgICAgICAgZXhwcmVzc2lvbnMuYWRkKGV4cHJlc3Npb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgaGVscGVyIG1ldGhvZCB0byBhZGQgYSBuZXcgY29uc3RhbnQgdGV4dCBleHByZXNzaW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVGV4dEV4cHJlc3Npb24oU3RyaW5nIHRleHQpIHsKLSAgICAgICAgYWRkRXhwcmVzc2lvbihuZXcgQ29uc3RhbnRFeHByZXNzaW9uKHRleHQpKTsKLSAgICB9Ci0KLSAgICAvLyBFeHByZXNzaW9uIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFeHByZXNzaW9uVGV4dCgpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZXhwcmVzc2lvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gKEV4cHJlc3Npb24pIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCggZXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uVGV4dCgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLQotCi0gICAgLy8gaW5oZXJpdCBqYXZhZG9jIGZyb20gaW50ZXJmYWNlCi0gICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShKZWxseUNvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gZXZhbHVhdGVBc1N0cmluZyhjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvLyBpbmhlcml0IGphdmFkb2MgZnJvbSBpbnRlcmZhY2UKLSAgICBwdWJsaWMgU3RyaW5nIGV2YWx1YXRlQXNTdHJpbmcoSmVsbHlDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZXhwcmVzc2lvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gKEV4cHJlc3Npb24pIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZXhwcmVzc2lvbi5ldmFsdWF0ZUFzU3RyaW5nKGNvbnRleHQpOwotICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPSBudWxsICkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIHZhbHVlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCi0gICAgfQotCi0gICAgLy8gaW5oZXJpdCBqYXZhZG9jIGZyb20gaW50ZXJmYWNlCi0gICAgcHVibGljIEl0ZXJhdG9yIGV2YWx1YXRlQXNJdGVyYXRvcihKZWxseUNvbnRleHQgY29udGV4dCkgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBldmFsdWF0ZUFzU3RyaW5nKGNvbnRleHQpOwotICAgICAgICBpZiAoIHZhbHVlID09IG51bGwgKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGV0b25JdGVyYXRvciggdmFsdWUgKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9leHByZXNzaW9uL0NvbnN0YW50RXhwcmVzc2lvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2V4cHJlc3Npb24vQ29uc3RhbnRFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYzNkYjQuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2V4cHJlc3Npb24vQ29uc3RhbnRFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5Q29udGV4dDsKLQotLyoqIDxwPjxjb2RlPkNvbnN0YW50RXhwcmVzc2lvbjwvY29kZT4gcmVwcmVzZW50cyBhIGNvbnN0YW50IGV4cHJlc3Npb24uPC9wPgotICAqCi0gICogPHA+IEluIG90aGVyIHdvcmRzLCB7QGxpbmsgI2V2YWx1YXRlfSByZXR1cm5zIGEgdmFsdWUgaW5kZXBlbmRlbnQgb2YgdGhlIGNvbnRleHQuIDwvcD4KLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOSAkCi0gICovCi1wdWJsaWMgY2xhc3MgQ29uc3RhbnRFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvblN1cHBvcnQgewotCi0gICAgLyoqIFRoZSB2YWx1ZSBvZiB0aGlzIGV4cHJlc3Npb24gKi8KLSAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKLQotICAgIC8qKiBCYXNlIGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIENvbnN0YW50RXhwcmVzc2lvbigpIHsKLSAgICB9Ci0KLSAgICAvKiogQ29udmVuaWVuY2UgY29uc3RydWN0b3Igc2V0cyA8Y29kZT52YWx1ZTwvY29kZT4gcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIENvbnN0YW50RXhwcmVzc2lvbihPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIlt2YWx1ZT0iICsgdmFsdWUgKyJdIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb25UZXh0KCkgewotICAgICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICJudWxsIiA6IHZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICAqIEV2YWx1YXRlIGV4cHJlc3Npb24gYWdhaW5zdCBnaXZlbiBjb250ZXh0LgotICAgICAgKgotICAgICAgKiBAcGFyYW0gY29udGV4dCBldmFsdWF0ZSBleHByZXNzaW9uIGFnYWluc3QgdGhpcyBjb250ZXh0Ci0gICAgICAqIEByZXR1cm4gY3VycmVudCB2YWx1ZSBvZiA8Y29kZT52YWx1ZTwvY29kZT4gcHJvcGVydHkKLSAgICAgICovCi0gICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShKZWxseUNvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqIEdldHMgdGhlIGNvbnN0YW50IHZhbHVlIG9mIHRoaXMgZXhwcmVzc2lvbiAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyB0aGUgY29uc3RhbnQgdmFsdWUgb2YgdGhpcyBleHByZXNzaW9uICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZXhwcmVzc2lvbi9FeHByZXNzaW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZXhwcmVzc2lvbi9FeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMDk5MmMuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2V4cHJlc3Npb24vRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2V4cHJlc3Npb24vRXhwcmVzc2lvbkZhY3RvcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9leHByZXNzaW9uL0V4cHJlc3Npb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NWRiMDYuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2V4cHJlc3Npb24vRXhwcmVzc2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUV4Y2VwdGlvbjsKLQotLyoqIDxwPjxjb2RlPkV4cHJlc3Npb25GYWN0b3J5PC9jb2RlPiBpcyBhIGZhY3Rvcnkgb2YgRXhwcmVzc2lvbiBvYmplY3RzLjwvcD4KLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOSAkCi0gICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4cHJlc3Npb25GYWN0b3J5IHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZXhwcmVzc2lvbiBmb3IgdGhlIGdpdmVuIHRleHQKLSAgICAgKi8KLQotICAgIHB1YmxpYyBFeHByZXNzaW9uIGNyZWF0ZUV4cHJlc3Npb24oU3RyaW5nIHRleHQpIHRocm93cyBKZWxseUV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2V4cHJlc3Npb24vRXhwcmVzc2lvblN1cHBvcnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9leHByZXNzaW9uL0V4cHJlc3Npb25TdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjgxMmUuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2V4cHJlc3Npb24vRXhwcmVzc2lvblN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLkVudW1lcmF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5TaW5nbGV0b25JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7Ci0KLS8qKiA8cD48Y29kZT5FeHByZXNzaW9uU3VwcG9ydDwvY29kZT4KLSAgKiBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBFeHByZXNzaW9uIGltcGxlbWVudGF0aW9ucwotICAqIHdoaWNoIHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHNvbWUgb2YgdGhlCi0gICogdHlwZXNhZmUgZXZhbHVhdGlvbiBtZXRob2RzLjwvcD4KLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTUgJAotICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb25TdXBwb3J0IGltcGxlbWVudHMgRXhwcmVzc2lvbiB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEl0ZXJhdG9yIEVNUFRZX0lURVJBVE9SID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCi0gICAgLy8gaW5oZXJpdCBqYXZhZG9jIGZyb20gaW50ZXJmYWNlCi0gICAgcHVibGljIFN0cmluZyBldmFsdWF0ZUFzU3RyaW5nKEplbGx5Q29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGV2YWx1YXRlUmVjdXJzZShjb250ZXh0KTsKLSAgICAgICAgLy8gc29tZXRpbWVzIHdoZW4gSmVsbHkgaXMgdXNlZCBpbnNpZGUgTWF2ZW4gdGhlIHZhbHVlCi0gICAgICAgIC8vIG9mIGFuIGV4cHJlc3Npb24gY2FuIGFjdHVhbGx5IGJlIGFuIGV4cHJlc3Npb24uCi0gICAgICAgIC8vIGUuZy4gJHtmb28uYmFyfSBjYW4gbG9va3VwICJmb28uYmFyIiBpbiBhIE1hdmVuIGNvbnRleHQKLSAgICAgICAgLy8gd2hpY2ggY291bGQgYWN0dWFsbHkgYmUgYW4gZXhwcmVzc2lvbgotCi0gICAgICAgIGlmICggdmFsdWUgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgLy8gaW5oZXJpdCBqYXZhZG9jIGZyb20gaW50ZXJmYWNlCi0gICAgcHVibGljIE9iamVjdCBldmFsdWF0ZVJlY3Vyc2UoSmVsbHlDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gZXZhbHVhdGUoY29udGV4dCk7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEV4cHJlc3Npb24pIHsKLSAgICAgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IChFeHByZXNzaW9uKSB2YWx1ZTsKLSAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uLmV2YWx1YXRlUmVjdXJzZShjb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLy8gaW5oZXJpdCBqYXZhZG9jIGZyb20gaW50ZXJmYWNlCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGVBc0Jvb2xlYW4oSmVsbHlDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gZXZhbHVhdGVSZWN1cnNlKGNvbnRleHQpOwotICAgICAgICBpZiAoIHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbiApIHsKLSAgICAgICAgICAgIEJvb2xlYW4gYiA9IChCb29sZWFuKSB2YWx1ZTsKLSAgICAgICAgICAgIHJldHVybiBiLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyApIHsKLSAgICAgICAgICAgIC8vIHJldHVybiBCb29sZWFuLmdldEJvb2xlYW4oIChTdHJpbmcpIHZhbHVlICk7Ci0gICAgICAgICAgICBTdHJpbmcgc3RyID0gKFN0cmluZykgdmFsdWU7Ci0KLSAgICAgICAgICAgIHJldHVybiAoIHN0ci5lcXVhbHNJZ25vcmVDYXNlKCAib24iICkKLSAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgc3RyLmVxdWFsc0lnbm9yZUNhc2UoICJ5ZXMiICkKLSAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgc3RyLmVxdWFscyggIjEiICkKLSAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgc3RyLmVxdWFsc0lnbm9yZUNhc2UoICJ0cnVlIiApICk7Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gaW5oZXJpdCBqYXZhZG9jIGZyb20gaW50ZXJmYWNlCi0gICAgcHVibGljIEl0ZXJhdG9yIGV2YWx1YXRlQXNJdGVyYXRvcihKZWxseUNvbnRleHQgY29udGV4dCkgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBldmFsdWF0ZVJlY3Vyc2UoY29udGV4dCk7Ci0gICAgICAgIGlmICggdmFsdWUgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHJldHVybiBFTVBUWV9JVEVSQVRPUjsKLSAgICAgICAgfSBlbHNlIGlmICggdmFsdWUgaW5zdGFuY2VvZiBJdGVyYXRvciApIHsKLSAgICAgICAgICAgIHJldHVybiAoSXRlcmF0b3IpIHZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIExpc3QgKSB7Ci0gICAgICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgdmFsdWU7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC5pdGVyYXRvcigpOwotICAgICAgICB9IGVsc2UgaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIE1hcCApIHsKLSAgICAgICAgICAgIE1hcCBtYXAgPSAoTWFwKSB2YWx1ZTsKLSAgICAgICAgICAgIHJldHVybiBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB9IGVsc2UgaWYgKCB2YWx1ZS5nZXRDbGFzcygpLmlzQXJyYXkoKSApIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlJdGVyYXRvciggdmFsdWUgKTsKLSAgICAgICAgfSBlbHNlIGlmICggdmFsdWUgaW5zdGFuY2VvZiBFbnVtZXJhdGlvbiApIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRW51bWVyYXRpb25JdGVyYXRvcigoRW51bWVyYXRpb24gKSB2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIHZhbHVlIGluc3RhbmNlb2YgQ29sbGVjdGlvbiApIHsKLSAgICAgICAgICBDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgdmFsdWU7Ci0gICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsKLSAgICAgICAgfSBlbHNlIGlmICggdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgKSB7Ci0gICAgICAgICAgIFN0cmluZ1tdIGFycmF5ID0gU3RyaW5nVXRpbHMuc3BsaXQoKFN0cmluZykgdmFsdWUsICIsIiApOwotICAgICAgICAgICBhcnJheSA9IFN0cmluZ1V0aWxzLnN0cmlwQWxsKCBhcnJheSApOwotICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5SXRlcmF0b3IoIGFycmF5ICk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBYWFg6IHNob3VsZCB3ZSByZXR1cm4gc2luZ2xlIGl0ZXJhdG9yPwotICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGV0b25JdGVyYXRvciggdmFsdWUgKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9leHByZXNzaW9uL2pleGwvSmV4bEV4cHJlc3Npb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9leHByZXNzaW9uL2pleGwvSmV4bEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU0NjUxYi4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZXhwcmVzc2lvbi9qZXhsL0pleGxFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLmpleGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkV4cHJlc3Npb25TdXBwb3J0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmpleGwuRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamV4bC5KZXhsQ29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvamV4bC5odG1sIj5KZXhsPC9hPgotICogZXhwcmVzc2lvbiB3aGljaCBmdWxseSBzdXBwb3J0cyB0aGUgRXhwcmVzc2lvbiBMYW5ndWFnZSBpbiBKU1RMIGFuZCBKU1AKLSAqIGFsb25nIHdpdGggc29tZSBleHRyYSBmZWF0dXJlcyBsaWtlIG9iamVjdCBtZXRob2QgaW52b2NhdGlvbi4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTggJAotICovCi0KLXB1YmxpYyBjbGFzcyBKZXhsRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb25TdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKZXhsRXhwcmVzc2lvbi5jbGFzcyk7Ci0KLSAgICAvKiogVGhlIEpleGwgZXhwcmVzc2lvbiBvYmplY3QgKi8KLSAgICBwcml2YXRlIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKLQotICAgIHB1YmxpYyBKZXhsRXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLSAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICJbIiArIGV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbigpICsgIl0iOwotICAgIH0KLQotICAgIC8vIEV4cHJlc3Npb24gaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIFN0cmluZyBnZXRFeHByZXNzaW9uVGV4dCgpIHsKLSAgICAgICAgcmV0dXJuICIkeyIgKyBleHByZXNzaW9uLmdldEV4cHJlc3Npb24oKSArICJ9IjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKEplbGx5Q29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKZXhsQ29udGV4dCBqZXhsQ29udGV4dCA9IG5ldyBKZWxseUpleGxDb250ZXh0KCBjb250ZXh0ICk7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV2YWx1YXRpbmcgRUw6ICIgKyBleHByZXNzaW9uLmdldEV4cHJlc3Npb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBleHByZXNzaW9uLmV2YWx1YXRlKGpleGxDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJ2YWx1ZSBvZiBleHByZXNzaW9uOiAiICsgdmFsdWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cud2FybigiQ2F1Z2h0IGV4Y2VwdGlvbiBldmFsdWF0aW5nOiAiICsgZXhwcmVzc2lvbiArICIuIFJlYXNvbjogIiArIGUsIGUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWNsYXNzIEplbGx5SmV4bENvbnRleHQgaW1wbGVtZW50cyBKZXhsQ29udGV4dCB7Ci0KLSAgICBwcml2YXRlIE1hcCB2YXJzOwotCi0gICAgSmVsbHlKZXhsQ29udGV4dChKZWxseUNvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzLnZhcnMgPSBuZXcgSmVsbHlNYXAoIGNvbnRleHQgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXJzKE1hcCB2YXJzKSB7Ci0gICAgICAgIHRoaXMudmFycy5jbGVhcigpOwotICAgICAgICB0aGlzLnZhcnMucHV0QWxsKCB2YXJzICk7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcCBnZXRWYXJzKCkgewotICAgICAgICByZXR1cm4gdGhpcy52YXJzOwotICAgIH0KLX0KLQotCi1jbGFzcyBKZWxseU1hcCBpbXBsZW1lbnRzIE1hcCB7Ci0KLSAgICBwcml2YXRlIEplbGx5Q29udGV4dCBjb250ZXh0OwotCi0gICAgSmVsbHlNYXAoSmVsbHlDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldFZhcmlhYmxlKCAoU3RyaW5nKSBrZXkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgLy8gbm90IGltcGxlbWVudGVkCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewotICAgICAgICByZXR1cm4gKCBnZXQoIGtleSApICE9IG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBlbnRyeVNldCgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQga2V5U2V0KCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcCB0KSB7Ci0gICAgICAgIC8vIG5vdCBpbXBsZW1lbnRlZAotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb24gdmFsdWVzKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZXhwcmVzc2lvbi9qZXhsL0pleGxFeHByZXNzaW9uRmFjdG9yeS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2V4cHJlc3Npb24vamV4bC9KZXhsRXhwcmVzc2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0ZjUwMS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZXhwcmVzc2lvbi9qZXhsL0pleGxFeHByZXNzaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5qZXhsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5FeHByZXNzaW9uU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5FeHByZXNzaW9uRmFjdG9yeTsKLQotLy9pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmpleGwucmVzb2x2ZXIuRmxhdFJlc29sdmVyOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBmYWN0b3J5IG9mIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9qZXhsLmh0bWwiPkpleGw8L2E+Ci0gKiBleHByZXNzaW9uIHdoaWNoIGZ1bGx5IHN1cHBvcnRzIHRoZSBFeHByZXNzaW9uIExhbmd1YWdlIGluIEpTVEwgYW5kIEpTUC4KLSAqIEluIGFkZGl0aW9uIHRoaXMgRXhwcmVzc2lvbkZhY3RvcnkgY2FuIGFsc28gc3VwcG9ydCBBbnQgc3R5bGUgdmFyaWFibGUKLSAqIG5hbWVzLCB3aGVyZSAnLicgaXMgdXNlZCBpbnNpZGUgdmFyaWFibGUgbmFtZXMuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjE5ICQKLSAqLwotCi1wdWJsaWMgY2xhc3MgSmV4bEV4cHJlc3Npb25GYWN0b3J5IGltcGxlbWVudHMgRXhwcmVzc2lvbkZhY3RvcnkgewotCi0gICAgLyoqIHdoZXRoZXIgd2Ugc2hvdWxkIGFsbG93IEFudC1zdHlsZSBleHByZXNzc2lvbnMsIHVzaW5nIGRvdHMgYXMgcGFydCBvZiB2YXJpYWJsZSBuYW1lICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHN1cHBvcnRBbnRWYXJpYWJsZXMgPSB0cnVlOwotCi0gICAgLy8gRXhwcmVzc2lvbkZhY3RvcnkgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIEV4cHJlc3Npb24gY3JlYXRlRXhwcmVzc2lvbihTdHJpbmcgdGV4dCkgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLS8qCi0KLSAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmpleGwuRXhwcmVzc2lvbiBleHByID0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5qZXhsLkV4cHJlc3Npb25GYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24odGV4dCk7Ci0KLSAgICAgICAgaWYgKCBpc1N1cHBvcnRBbnRWYXJpYWJsZXMoKSApIHsKLSAgICAgICAgICAgIGV4cHIuYWRkUG9zdFJlc29sdmVyKG5ldyBGbGF0UmVzb2x2ZXIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IEpleGxFeHByZXNzaW9uKCBleHByICk7Ci0qLwotCi0gICAgICAgIEV4cHJlc3Npb24gamV4bEV4cHJlc3Npb24gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gdGhpcyBtZXRob2QgcmVhbGx5IGRvZXMgdGhyb3cgRXhjZXB0aW9uCi0gICAgICAgICAgICBqZXhsRXhwcmVzc2lvbiA9IG5ldyBKZXhsRXhwcmVzc2lvbigKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5qZXhsLkV4cHJlc3Npb25GYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24odGV4dCkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlFeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgZXhwcmVzc2lvbjogIiArIHRleHQsIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBpc1N1cHBvcnRBbnRWYXJpYWJsZXMoKSAmJiBpc1ZhbGlkQW50VmFyaWFibGVOYW1lKHRleHQpICkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uU3VwcG9ydExvY2FsKGpleGxFeHByZXNzaW9uLHRleHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBqZXhsRXhwcmVzc2lvbjsKLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgd2Ugc2hvdWxkIGFsbG93IEFudC1zdHlsZSBleHByZXNzc2lvbnMsIHVzaW5nIGRvdHMgYXMKLSAgICAgKiBwYXJ0IG9mIHZhcmlhYmxlIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRBbnRWYXJpYWJsZXMoKSB7Ci0gICAgICAgIHJldHVybiBzdXBwb3J0QW50VmFyaWFibGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB3ZSBzaG91bGQgYWxsb3cgQW50LXN0eWxlIGV4cHJlc3NzaW9ucywgdXNpbmcgZG90cyBhcwotICAgICAqIHBhcnQgb2YgdmFyaWFibGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN1cHBvcnRBbnRWYXJpYWJsZXMoYm9vbGVhbiBzdXBwb3J0QW50VmFyaWFibGVzKSB7Ci0gICAgICAgIHRoaXMuc3VwcG9ydEFudFZhcmlhYmxlcyA9IHN1cHBvcnRBbnRWYXJpYWJsZXM7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSB2YWxpZCBBbnQgdmFyaWFibGUgbmFtZSwKLSAgICAgKiB0eXBpY2FsbHkgdGhhdHMgYWxwaGFudW1lcmljIHRleHQgd2l0aCAnLicgZXRjLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRBbnRWYXJpYWJsZU5hbWUoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgY2hhcltdIGNoYXJzID0gdGV4dC50b0NoYXJBcnJheSgpOwotICAgICAgICBmb3IgKGludCBpID0gMCwgc2l6ZSA9IGNoYXJzLmxlbmd0aDsgaSA8IHNpemU7IGkrKyApIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSBjaGFyc1tpXTsKLSAgICAgICAgICAgIC8vIGNvdWxkIG1heWJlIGJlIGEgYml0IG1vcmUgcmVzdHJpY3RpdmUuLi4KLSAgICAgICAgICAgIGlmICggQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkgfHwgY2ggPT0gJ1snIHx8IGNoID09ICddJyB8fCBjaCA9PSAnKCcgfHwgY2ggPT0gJyknKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgRXhwcmVzc2lvblN1cHBvcnRMb2NhbCBleHRlbmRzIEV4cHJlc3Npb25TdXBwb3J0IHsKLQotICAgICAgICBwcm90ZWN0ZWQgRXhwcmVzc2lvbiBqZXhsRXhwcmVzc2lvbiA9IG51bGw7Ci0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgdGV4dCA9IG51bGw7Ci0KLSAgICAgICAgcHVibGljIEV4cHJlc3Npb25TdXBwb3J0TG9jYWwoRXhwcmVzc2lvbiBqZXhsRXhwcmVzc2lvbiwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgICAgIHRoaXMuamV4bEV4cHJlc3Npb24gPSBqZXhsRXhwcmVzc2lvbjsKLSAgICAgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKEplbGx5Q29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBPYmplY3QgYW5zd2VyID0gamV4bEV4cHJlc3Npb24uZXZhbHVhdGUoY29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmICggYW5zd2VyID09IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgYW5zd2VyID0gY29udGV4dC5nZXRWYXJpYWJsZSh0ZXh0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwcmVzc2lvblRleHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiR7IiArIHRleHQgKyAifSI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiW2V4cHJlc3Npb246IiArIHRleHQgKyAiXSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9leHByZXNzaW9uL2pleGwvcGFja2FnZS5odG1sIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2V4cHJlc3Npb24vamV4bC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZDZkZjUuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2V4cHJlc3Npb24vamV4bC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci0KLSAgPHA+RXhwcmVzc2lvbnMgdXNlZCB0byB0dXJuIHRoZSB0YWcgYXR0cmlidXRlIHZhbHVlcyBpbnRvIGNvbXBpbGVkCi0gIGV4cHJlc3Npb24gb2JqZWN0cyBmb3IgbGFuZ3VhZ2VzIHN1Y2ggYXMgSmV4bCwgWFBhdGgsIFZlbG9jaXR5LCBiZWFuc2hlbGwsIFJoaW5vIAotICBldGMuCi0gIDwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2V4cHJlc3Npb24vcGFja2FnZS5odG1sIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2V4cHJlc3Npb24vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjVjZDczLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9leHByZXNzaW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08L2hlYWQ+Ci08Ym9keT4KLQotICA8cD5JbXBsZW1lbnRhdGlvbnMgb2YgdGhlIEV4cHJlc3Npb24gY2xhc3NlcyB1c2luZyBjb21tb25zLWpleGwuCi0gIDwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2V4cHJlc3Npb24veHBhdGgvWFBhdGhFeHByZXNzaW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZXhwcmVzc2lvbi94cGF0aC9YUGF0aEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYyYWRiYy4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZXhwcmVzc2lvbi94cGF0aC9YUGF0aEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLnhwYXRoOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5FeHByZXNzaW9uU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5UYWdTY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmpheGVuLlNpbXBsZU5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmpheGVuLlZhcmlhYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuamF4ZW4uWFBhdGg7Ci1pbXBvcnQgb3JnLmpheGVuLkpheGVuRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5qYXhlbi5kb200ai5Eb200alhQYXRoOwotCi0vKiogQW4gZXhwcmVzc2lvbiB3aGljaCByZXR1cm5zIGFuIFhQYXRoIG9iamVjdC4KLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNCAkCi0gICovCi1wdWJsaWMgY2xhc3MgWFBhdGhFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvblN1cHBvcnQgaW1wbGVtZW50cyBWYXJpYWJsZUNvbnRleHQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coWFBhdGhFeHByZXNzaW9uLmNsYXNzKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHRleHQ7Ci0gICAgcHJpdmF0ZSBFeHByZXNzaW9uIHhwYXRoRXhwcjsKLSAgICBwcml2YXRlIEplbGx5Q29udGV4dCBjb250ZXh0OwotICAgIHByaXZhdGUgTWFwIHVyaXM7Ci0KLSAgICBwdWJsaWMgWFBhdGhFeHByZXNzaW9uKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBYUGF0aEV4cHJlc3Npb24oU3RyaW5nIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uIHhwYXRoRXhwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhZ1NjcmlwdCB0YWdTY3JpcHQpIHsKLSAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKLSAgICAgICAgdGhpcy54cGF0aEV4cHIgPSB4cGF0aEV4cHI7Ci0KLSAgICAgICAgTWFwIG5hbWVzcGFjZUNvbnRleHQgPSB0YWdTY3JpcHQuZ2V0TmFtZXNwYWNlQ29udGV4dCgpOwotCi0gICAgICAgIHRoaXMudXJpcyA9IGNyZWF0ZVVyaU1hcChuYW1lc3BhY2VDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0RXhwcmVzc2lvblRleHQoKTsKLSAgICB9Ci0KLSAgICAvLyBFeHByZXNzaW9uIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwcmVzc2lvblRleHQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShKZWxseUNvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBYUGF0aCB4cGF0aCA9IG5ldyBEb200alhQYXRoKCB0aGlzLnhwYXRoRXhwci5ldmFsdWF0ZUFzU3RyaW5nKCBjb250ZXh0ICkgKTsKLQotICAgICAgICAgICAgeHBhdGguc2V0VmFyaWFibGVDb250ZXh0KHRoaXMpOwotCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoICJTZXR0aW5nIHRoZSBuYW1lc3BhY2UgY29udGV4dCB0byBiZTogIiArIHVyaXMgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgeHBhdGguc2V0TmFtZXNwYWNlQ29udGV4dCggbmV3IFNpbXBsZU5hbWVzcGFjZUNvbnRleHQoIHRoaXMudXJpcyApICk7Ci0KLSAgICAgICAgICAgIHJldHVybiB4cGF0aDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSmF4ZW5FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nLmVycm9yKCAiRXJyb3IgY29uc3RydWN0aW5nIHhwYXRoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLy8gVmFyaWFibGVDb250ZXh0IGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFyaWFibGVWYWx1ZSgKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSwKLSAgICAgICAgU3RyaW5nIHByZWZpeCwKLSAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSkgewotCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGNvbnRleHQuZ2V0VmFyaWFibGUobG9jYWxOYW1lKTsKLQotICAgICAgICAvL2xvZy5kZWJ1ZyggIkxvb2tpbmcgdXAgWFBhdGggdmFyaWFibGUgb2YgbmFtZTogIiArIGxvY2FsTmFtZSArICIgdmFsdWUgaXM6ICIgKyB2YWx1ZSApOwotCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBzeW5jaHJvbml6ZWQgTWFwIG9mIG5vbi1udWxsIGFuZCBub24tYmxhbmsKLSAgICAgKiBuYW1lc3BhY2UgcHJlZml4ZXMgdG8gbmFtZXNwYWNlIFVSSXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFwIGNyZWF0ZVVyaU1hcChNYXAgbmFtZXNwYWNlQ29udGV4dCkgewotICAgICAgICAvLyBub3cgbGV0cyBjbG9uZSB0aGUgTWFwIGJ1dCBpZ25vcmluZyBkZWZhdWx0IG9yIG51bGwgcHJlZml4ZXMKLSAgICAgICAgTWFwIHVyaXMgPSBuZXcgSGFzaHRhYmxlKG5hbWVzcGFjZUNvbnRleHQuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbmFtZXNwYWNlQ29udGV4dC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgdXJpcy5wdXQocHJlZml4LCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXJpczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9BdHRyaWJ1dGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL0F0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2FhODc0Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL0F0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkV4cHJlc3Npb247Ci0KLS8qKgotICogUmVwcmVzZW50cyB0aGUgYXR0cmlidXRlIGRlZmluaXRpb24gdXNlZCBieSBkeW5hbWljIHRhZ3MsIHN1Y2ggYXMgd2hldGhlciB0aGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkCi0gKiBvciBhbnkgZGVmYXVsdCB2YWx1ZXMgZXRjLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS43ICQKLSAqLwotcHVibGljIGNsYXNzIEF0dHJpYnV0ZSB7Ci0KLSAgICAvKiogdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKiogdGhlIGRlZmF1bHQgdmFsdWUgZXhwcmVzc2lvbiAqLwotICAgIHByaXZhdGUgRXhwcmVzc2lvbiBkZWZhdWx0VmFsdWU7Ci0KLSAgICAvKiogd2hldGhlciB0aGlzIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCAqLwotICAgIHByaXZhdGUgYm9vbGVhbiByZXF1aXJlZDsKLQotICAgIHB1YmxpYyBBdHRyaWJ1dGUoKSB7Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgYXR0cmlidXRlIGlzIHJlcXVpcmVkLgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKSB7Ci0gICAgICAgIHJldHVybiByZXF1aXJlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdGhpcyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCi0gICAgICogQHBhcmFtIHJlcXVpcmVkIGlzIHRydWUgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgYSBtYW5kYXRvcnkgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoYm9vbGVhbiByZXF1aXJlZCkgewotICAgICAgICB0aGlzLnJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZS4KLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZS4KLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdFZhbHVlLgotICAgICAqIEByZXR1cm4gRXhwcmVzc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldERlZmF1bHRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0VmFsdWUuCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdFZhbHVlIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZShFeHByZXNzaW9uIGRlZmF1bHRWYWx1ZSkgewotICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL0JlYW5Tb3VyY2UuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL0JlYW5Tb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI3NmM3Ni4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9CZWFuU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgdGFnIHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCBhIEphdmFCZWFuLCBzdWNoIGFzIGEge0BsaW5rIER5bmFtaWNCZWFuVGFnfQotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS42ICQKLSAqLwotcHVibGljIGludGVyZmFjZSBCZWFuU291cmNlIHsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGJlYW4gdG8gd2hpY2ggdGhpcyB0YWcgaXMgYXNzb2NpYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmVhbigpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL0JyZWFrRXhjZXB0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9CcmVha0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjQ1ZWZjLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL0JyZWFrRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci0KLS8qKgotICogPHA+PGNvZGU+QnJlYWtFeGNlcHRpb248L2NvZGU+IGlzIHVzZWQgdG8gdGVybWluYXRlIGxvb3BzIHN1Y2ggYXMKLSAqICZsdDtmb3JFYWNoJmd0OyBhbmQgJmx0O3doaWxlJmd0OyB0YWdzLjwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOSAkCi0gKi8KLQotcHVibGljIGNsYXNzIEJyZWFrRXhjZXB0aW9uIGV4dGVuZHMgSmVsbHlUYWdFeGNlcHRpb24gewotCi0gICAgcHVibGljIEJyZWFrRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigiQnJlYWsgZXhjZXB0aW9uLCB0ZXJtaW5hdGluZyB0aGUgcGFyZW50IGxvb3AiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9Db2xsZWN0aW9uVGFnLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9Db2xsZWN0aW9uVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOTc2OGMuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2ltcGwvQ29sbGVjdGlvblRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIHRhZyB3aGljaCBpcyBjYXBhYmxlIG9mIGNvbnN1bWluZyBvYmplY3RzLCBzdWNoIGFzIGEgJmx0O3VzZUxpc3QmZ3Q7IHRhZwotICogc3VjaCB0aGF0IG5lc3RlZCBvYmplY3RzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHBhcmVudCB0YWcuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjYgJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbGxlY3Rpb25UYWcgewotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhZGRzIGFuIGl0ZW0gdG8gdGhlIHRhZ3MgY29sbGVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEl0ZW0oT2JqZWN0IHZhbHVlKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9Db21wb3NpdGVUZXh0U2NyaXB0QmxvY2suamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL0NvbXBvc2l0ZVRleHRTY3JpcHRCbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDllN2E4Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL0NvbXBvc2l0ZVRleHRTY3JpcHRCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlNjcmlwdDsKLQotCi0vKioKLSAqIDxwPjxjb2RlPkNvbXBvc2l0ZVRleHRTY3JpcHRCbG9jazwvY29kZT4gcmVwcmVzZW50cyBhIHRleHQgYm9keSBvZiBhCi0gKiBhIHRhZyB3aGljaCBjb250YWlucyBleHByZXNzaW9ucywgc28gdGhhdCB3aGl0ZXNwYWNlIHRyaW1taW5nCi0gKiBjYW4gYmUgaGFuZGxlZCBkaWZmZXJlbnRseS48L3A+Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjcgJAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlVGV4dFNjcmlwdEJsb2NrIGV4dGVuZHMgU2NyaXB0QmxvY2sgewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBDb21wb3NpdGVUZXh0U2NyaXB0QmxvY2soKSB7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFRyaW0gdGhlIGJvZHkgb2YgdGhlIHNjcmlwdC4KLSAgICAgKiBJbiB0aGlzIGNhc2UsIHRyaW0gdGhlIHdoaXRlc3BhY2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IGVsZW1lbnQKLSAgICAgKiBhbmQgZnJvbSB0aGUgZW5kIG9mIHRoZSBsYXN0IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdHJpbVdoaXRlc3BhY2UoKSB7Ci0gICAgICAgIExpc3QgbGlzdCA9IGdldFNjcmlwdExpc3QoKTsKLSAgICAgICAgaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLSAgICAgICAgaWYgKCBzaXplID4gMCApIHsKLSAgICAgICAgICAgIFNjcmlwdCBzY3JpcHQgPSAoU2NyaXB0KSBsaXN0LmdldCgwKTsKLSAgICAgICAgICAgIGlmICggc2NyaXB0IGluc3RhbmNlb2YgVGV4dFNjcmlwdCApIHsKLSAgICAgICAgICAgICAgICBUZXh0U2NyaXB0IHRleHRTY3JpcHQgPSAoVGV4dFNjcmlwdCkgc2NyaXB0OwotICAgICAgICAgICAgICAgIHRleHRTY3JpcHQudHJpbVN0YXJ0V2hpdGVzcGFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCBzaXplID4gMSApIHsKLSAgICAgICAgICAgICAgICBzY3JpcHQgPSAoU2NyaXB0KSBsaXN0LmdldChzaXplIC0gMSk7Ci0gICAgICAgICAgICAgICAgaWYgKCBzY3JpcHQgaW5zdGFuY2VvZiBUZXh0U2NyaXB0ICkgewotICAgICAgICAgICAgICAgICAgICBUZXh0U2NyaXB0IHRleHRTY3JpcHQgPSAoVGV4dFNjcmlwdCkgc2NyaXB0OwotICAgICAgICAgICAgICAgICAgICB0ZXh0U2NyaXB0LnRyaW1FbmRXaGl0ZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL0RlZmF1bHRUYWdGYWN0b3J5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9EZWZhdWx0VGFnRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmM5ZTg1Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL0RlZmF1bHRUYWdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWc7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0vKioKLSAqIDxwPjxjb2RlPkRlZmF1bHRUYWdGYWN0b3J5PC9jb2RlPiBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgVGFnRmFjdG9yeQotICogd2hpY2ggY3JlYXRlcyBuZXcgaW5zdGFuY2VzIG9mIGEgZ2l2ZW4gY2xhc3MuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjE2ICQKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRUYWdGYWN0b3J5IGltcGxlbWVudHMgVGFnRmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIENsYXNzIHRhZ0NsYXNzOwotCi0gICAgcHVibGljIERlZmF1bHRUYWdGYWN0b3J5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBEZWZhdWx0VGFnRmFjdG9yeShDbGFzcyB0YWdDbGFzcykgewotICAgICAgICB0aGlzLnRhZ0NsYXNzID0gdGFnQ2xhc3M7Ci0gICAgfQotCi0gICAgLy8gVGFnRmFjdG9yeSBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgVGFnIGNyZWF0ZVRhZyhTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgIHJldHVybiAoVGFnKSB0YWdDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseUV4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseUV4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0YWdDbGFzcy4KLSAgICAgKiBAcmV0dXJuIENsYXNzCi0gICAgICovCi0gICAgcHVibGljIENsYXNzIGdldFRhZ0NsYXNzKCkgewotICAgICAgICByZXR1cm4gdGFnQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGFnQ2xhc3MuCi0gICAgICogQHBhcmFtIHRhZ0NsYXNzIFRoZSB0YWdDbGFzcyB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYWdDbGFzcyhDbGFzcyB0YWdDbGFzcykgewotICAgICAgICB0aGlzLnRhZ0NsYXNzID0gdGFnQ2xhc3M7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9EZWZhdWx0VGFnTGlicmFyeVJlc29sdmVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9EZWZhdWx0VGFnTGlicmFyeVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MTJkNmEuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2ltcGwvRGVmYXVsdFRhZ0xpYnJhcnlSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZGlzY292ZXJ5LlJlc291cmNlQ2xhc3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRpc2NvdmVyeS5SZXNvdXJjZUNsYXNzSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRpc2NvdmVyeS5yZXNvdXJjZS5DbGFzc0xvYWRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRpc2NvdmVyeS5yZXNvdXJjZS5jbGFzc2VzLkRpc2NvdmVyQ2xhc3NlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnTGlicmFyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudXRpbC5DbGFzc0xvYWRlclV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0KLS8qKgotICogPHA+PGNvZGU+RGVmYXVsdFRhZ0xpYnJhcnlSZXNvbHZlcjwvY29kZT4gaXMgYSBkZWZhdWx0IGltcGxlbWVuYXRpb24KLSAqIHdoaWNoIGF0dGVtcHRzIHRvIGludGVycHJldCB0aGUgVVJJIGFzIGEgU3RyaW5nIGNhbGxlZCAnamVsbHk6Y2xhc3NOYW1lJwotICogYW5kIGNsYXNzIGxvYWQgdGhlIGdpdmVuIEphdmEgY2xhc3MuIE90aGVyd2lzZSBNRVRBLUlORi9zZXJ2aWNlcy9qZWxseS91cmkKLSAqIGlzIHNlYXJjaGVkIGZvciBvbiB0aGUgdGhyZWFkIGNvbnRleHQncyBjbGFzcyBwYXRoIGFuZCwgaWYgZm91bmQsIHRoYXQKLSAqIGNsYXNzIHdpbGwgYmUgbG9hZGVkLjwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTIgJAotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFRhZ0xpYnJhcnlSZXNvbHZlciBpbXBsZW1lbnRzIFRhZ0xpYnJhcnlSZXNvbHZlciB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGVmYXVsdFRhZ0xpYnJhcnlSZXNvbHZlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIERpc2NvdmVyQ2xhc3NlcyBkaXNjb3Zlcnk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2xhc3MgbG9hZGVyIHRvIHVzZSBmb3IgaW5zdGFudGlhdGluZyBhcHBsaWNhdGlvbiBvYmplY3RzLgotICAgICAqIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlciwgb3IgdGhlIGNsYXNzIGxvYWRlcgotICAgICAqIHVzZWQgdG8gbG9hZCB0aGlzIGNsYXNzIGl0c2VsZiwgaXMgdXNlZCwgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZQotICAgICAqIDxjb2RlPnVzZUNvbnRleHRDbGFzc0xvYWRlcjwvY29kZT4gdmFyaWFibGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLQotICAgIC8qKgotICAgICAqIERvIHdlIHdhbnQgdG8gdXNlIHRoZSBDb250ZXh0IENsYXNzTG9hZGVyIHdoZW4gbG9hZGluZyBjbGFzc2VzCi0gICAgICogZm9yIGluc3RhbnRpYXRpbmcgbmV3IG9iamVjdHM/ICBEZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlQ29udGV4dENsYXNzTG9hZGVyID0gZmFsc2U7Ci0KLQotICAgIHB1YmxpYyBEZWZhdWx0VGFnTGlicmFyeVJlc29sdmVyKCkgewotICAgIH0KLQotCi0gICAgLy8gVGFnTGlicmFyeVJlc29sdmVyIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQXR0ZW1wdHMgdG8gcmVzb2x2ZSB0aGUgZ2l2ZW4gVVJJIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhIFRhZ0xpYnJhcnkKLSAgICAgKiBvdGhlcndpc2UgbnVsbCBpcyByZXR1cm5lZCB0byBpbmRpY2F0ZSBubyB0YWcgbGlicmFyeSBjb3VsZCBiZSBmb3VuZAotICAgICAqIHNvIHRoYXQgdGhlIG5hbWVzcGFjZSBVUkkgc2hvdWxkIGJlIHRyZWF0ZWQgYXMganVzdCB2YW5pbGxhIFhNTC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGFnTGlicmFyeSByZXNvbHZlVGFnTGlicmFyeShTdHJpbmcgdXJpKSB7Ci0gICAgICAgIERpc2NvdmVyQ2xhc3NlcyBkaXNjb3ZlcnkgPSBnZXREaXNjb3ZlckNsYXNzZXMoKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSB1cmk7Ci0gICAgICAgIGlmICggdXJpLnN0YXJ0c1dpdGgoICJqZWxseToiICkgKSB7Ci0gICAgICAgICAgICBuYW1lID0gImplbGx5LiIgKyB1cmkuc3Vic3RyaW5nKDYpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9nLmluZm8oICJMb29raW5nIHVwIHNlcnZpY2UgbmFtZTogIiArIG5hbWUgKTsKLQotLyoKLSAgICAgICAgQ2xhc3NMb2FkZXJzIGxvYWRlcnMgPSBDbGFzc0xvYWRlcnMuZ2V0QXBwTG9hZGVycyhUYWdMaWJyYXJ5LmNsYXNzLCBnZXRDbGFzcygpLCBmYWxzZSk7Ci0KLSAgICAgICAgRGlzY292ZXJDbGFzcyBkaXNjb3ZlciA9IG5ldyBEaXNjb3ZlckNsYXNzKGxvYWRlcnMpOwotICAgICAgICBDbGFzcyBpbXBsQ2xhc3MgPSBkaXNjb3Zlci5maW5kKFRlc3RJbnRlcmZhY2UyLmNsYXNzKTsKLQotCi0KLSAgICAgICAgVGFnTGlicmFyeSBhbnN3ZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYW5zd2VyID0gKFRhZ0xpYnJhcnkpIERpc2NvdmVyU2luZ2xldG9uLmZpbmQoVGFnTGlicmFyeS5jbGFzcywgbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoICJDb3VsZCBub3QgbG9hZCBzZXJ2aWNlOiAiICsgbmFtZSApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbnN3ZXI7Ci0qLwotICAgICAgICBSZXNvdXJjZUNsYXNzSXRlcmF0b3IgaXRlciA9IGRpc2NvdmVyeS5maW5kUmVzb3VyY2VDbGFzc2VzKG5hbWUpOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFJlc291cmNlQ2xhc3MgcmVzb3VyY2UgPSBpdGVyLm5leHRSZXNvdXJjZUNsYXNzKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENsYXNzIHR5cGVDbGFzcyA9IHJlc291cmNlLmxvYWRDbGFzcygpOwotICAgICAgICAgICAgICAgIGlmICggdHlwZUNsYXNzICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdJbnN0YW5jZSh1cmksIHR5cGVDbGFzcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKCAiQ291bGQgbm90IGxvYWQgc2VydmljZTogIiArIHJlc291cmNlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbG9nLmluZm8oICJDb3VsZCBub3QgZmluZCBhbnkgc2VydmljZXMgZm9yIG5hbWU6ICIgKyBuYW1lICk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY2xhc3MgbG9hZGVyIHRvIGJlIHVzZWQgZm9yIGluc3RhbnRpYXRpbmcgYXBwbGljYXRpb24gb2JqZWN0cwotICAgICAqIHdoZW4gcmVxdWlyZWQuICBUaGlzIGlzIGRldGVybWluZWQgYmFzZWQgdXBvbiB0aGUgZm9sbG93aW5nIHJ1bGVzOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+VGhlIGNsYXNzIGxvYWRlciBzZXQgYnkgPGNvZGU+c2V0Q2xhc3NMb2FkZXIoKTwvY29kZT4sIGlmIGFueTwvbGk+Ci0gICAgICogPGxpPlRoZSB0aHJlYWQgY29udGV4dCBjbGFzcyBsb2FkZXIsIGlmIGl0IGV4aXN0cyBhbmQgdGhlCi0gICAgICogICAgIDxjb2RlPnVzZUNvbnRleHRDbGFzc0xvYWRlcjwvY29kZT4gcHJvcGVydHkgaXMgc2V0IHRvIHRydWU8L2xpPgotICAgICAqIDxsaT5UaGUgY2xhc3MgbG9hZGVyIHVzZWQgdG8gbG9hZCB0aGUgWE1MUGFyc2VyIGNsYXNzIGl0c2VsZi4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgcmV0dXJuIENsYXNzTG9hZGVyVXRpbHMuZ2V0Q2xhc3NMb2FkZXIoY2xhc3NMb2FkZXIsIHVzZUNvbnRleHRDbGFzc0xvYWRlciwgZ2V0Q2xhc3MoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjbGFzcyBsb2FkZXIgdG8gYmUgdXNlZCBmb3IgaW5zdGFudGlhdGluZyBhcHBsaWNhdGlvbiBvYmplY3RzCi0gICAgICogd2hlbiByZXF1aXJlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGFzc0xvYWRlciBUaGUgbmV3IGNsYXNzIGxvYWRlciB0byB1c2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogIHRvIHJldmVydCB0byB0aGUgc3RhbmRhcmQgcnVsZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotICAgICAgICB0aGlzLmNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBib29sZWFuIGFzIHRvIHdoZXRoZXIgdGhlIGNvbnRleHQgY2xhc3Nsb2FkZXIgc2hvdWxkIGJlIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0VXNlQ29udGV4dENsYXNzTG9hZGVyKCkgewotICAgICAgICByZXR1cm4gdXNlQ29udGV4dENsYXNzTG9hZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZSB3aGV0aGVyIHRvIHVzZSB0aGUgQ29udGV4dCBDbGFzc0xvYWRlciAodGhlIG9uZSBmb3VuZCBieQotICAgICAqIGNhbGxpbmcgPGNvZGU+VGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTwvY29kZT4pCi0gICAgICogdG8gcmVzb2x2ZS9sb2FkIGNsYXNzZXMuICBJZiBub3QKLSAgICAgKiB1c2luZyBDb250ZXh0IENsYXNzTG9hZGVyLCB0aGVuIHRoZSBjbGFzcy1sb2FkaW5nIGRlZmF1bHRzIHRvCi0gICAgICogdXNpbmcgdGhlIGNhbGxpbmctY2xhc3MnIENsYXNzTG9hZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGJvb2xlYW4gZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHVzZSBKZWxseUNvbnRleHQgQ2xhc3NMb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlQ29udGV4dENsYXNzTG9hZGVyKGJvb2xlYW4gdXNlKSB7Ci0gICAgICAgIHVzZUNvbnRleHRDbGFzc0xvYWRlciA9IHVzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBEaXNjb3ZlckNsYXNzZXMgaW5zdGFuY2UgdG8gdXNlIHRvIGxvY2F0ZSBzZXJ2aWNlcy4KLSAgICAgKiAgVGhpcyBvYmplY3QgaXMgbGF6aWx5IGNyZWF0ZWQgaWYgaXQgaGFzIG5vdCBiZWVuIGNvbmZpZ3VyZWQuCi0gICAgICovCi0gICAgcHVibGljIERpc2NvdmVyQ2xhc3NlcyBnZXREaXNjb3ZlckNsYXNzZXMoKSB7Ci0gICAgICAgIGlmICggZGlzY292ZXJ5ID09IG51bGwgKSB7Ci0gICAgICAgICAgICBDbGFzc0xvYWRlcnMgbG9hZGVycyA9IENsYXNzTG9hZGVycy5nZXRBcHBMb2FkZXJzKFRhZ0xpYnJhcnkuY2xhc3MsIGdldENsYXNzKCksIGZhbHNlKTsKLSAgICAgICAgICAgIGRpc2NvdmVyeSA9IG5ldyBEaXNjb3ZlckNsYXNzZXMobG9hZGVycyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRpc2NvdmVyeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmdWxseSBjb25maWd1cmVkIERpc2NvdmVyQ2xhc3NlcyBpbnN0YW5jZSB0byBiZSB1c2VkIHRvCi0gICAgICogbG9va3VwIHNlcnZpY2VzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGlzY292ZXJDbGFzc2VzKERpc2NvdmVyQ2xhc3NlcyBkaXNjb3ZlcnkpIHsKLSAgICAgICAgdGhpcy5kaXNjb3ZlcnkgPSBkaXNjb3Zlcnk7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIHRoZSBnaXZlbiBjbGFzcyBuYW1lLiBPdGhlcndpc2UgYW4gZXhjZXB0aW9uIGlzIGxvZ2dlZAotICAgICAqIGFuZCBudWxsIGlzIHJldHVybmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRhZ0xpYnJhcnkgbG9hZENsYXNzKFN0cmluZyB1cmksIFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIHRoZUNsYXNzID0gZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGlmICggdGhlQ2xhc3MgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2UodXJpLCB0aGVDbGFzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJDb3VsZCBub3QgZmluZCB0aGUgY2xhc3M6ICIgKyBjbGFzc05hbWUgKyAiIHdoZW4gdHJ5aW5nIHRvIHJlc29sdmUgVVJJOiAiICsgdXJpLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIFRhZ0xpYnJhcnkgY2xhc3Mgb3IKLSAgICAgKiByZXR1cm4gbnVsbCBpZiBpdCBjb3VsZCBub3QgYmUgaW5zdGFudGlhdGVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBUYWdMaWJyYXJ5IG5ld0luc3RhbmNlKFN0cmluZyB1cmksIENsYXNzIHRoZUNsYXNzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gdGhlQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBUYWdMaWJyYXJ5KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChUYWdMaWJyYXJ5KSBvYmplY3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICJUaGUgdGFnIGxpYnJhcnkgb2JqZWN0IG1hcHBlZCB0bzogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyB1cmkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgYSBUYWdMaWJyYXJ5LiBPYmplY3QgPSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG9iamVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoCi0gICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBpbnN0YW5jZSBvZiBjbGFzczogIiArIHRoZUNsYXNzLmdldE5hbWUoKSArICIuIFJlYXNvbjogIiArIGUsCi0gICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2ltcGwvRHluYW1pY0JlYW5UYWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL0R5bmFtaWNCZWFuVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMjI1NDEuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2ltcGwvRHluYW1pY0JlYW5UYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuQ29udmVydGluZ1dyYXBEeW5hQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQmVhbk1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuRHluYUJlYW5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIHRhZyBpcyBib3VuZCBvbnRvIGEgSmF2YSBCZWFuIGNsYXNzLiBXaGVuIHRoZSB0YWcgaXMgaW52b2tlZCBhIGJlYW4gd2lsbCBiZSBjcmVhdGVkCi0gKiB1c2luZyB0aGUgdGFncyBhdHRyaWJ1dGVzLgotICogVGhlIGJlYW4gbWF5IGFsc28gaGF2ZSBhbiBpbnZva2UgbWV0aG9kIGNhbGxlZCBpbnZva2UoKSwgcnVuKCksIGV4ZWN1dGUoKSBvciBzb21lIHN1Y2ggbWV0aG9kCi0gKiB3aGljaCB3aWxsIGJlIGludm9rZWQgYWZ0ZXIgdGhlIGJlYW4gaGFzIGJlZW4gY29uZmlndXJlZC48L3A+Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AemVucGxleC5jb20iPkphc29uIHZhbiBaeWw8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBEeW5hbWljQmVhblRhZyBleHRlbmRzIER5bmFCZWFuVGFnU3VwcG9ydCBpbXBsZW1lbnRzIEJlYW5Tb3VyY2UgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKER5bmFtaWNCZWFuVGFnLmNsYXNzKTsKLQotICAgIC8qKiBFbXB0eSBhcmd1bWVudHMgZm9yIE1ldGhvZC5pbnZva2UoKSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIGVtcHR5QXJncyA9IHt9OwotCi0gICAgLyoqIHRoZSBiZWFuIGNsYXNzICovCi0gICAgcHJpdmF0ZSBDbGFzcyBiZWFuQ2xhc3M7Ci0KLSAgICAvKiogdGhlIGN1cnJlbnQgYmVhbiBpbnN0YW5jZSAqLwotICAgIHByaXZhdGUgT2JqZWN0IGJlYW47Ci0KLSAgICAvKiogdGhlIG1ldGhvZCB0byBpbnZva2Ugb24gdGhlIGJlYW4gKi8KLSAgICBwcml2YXRlIE1ldGhvZCBtZXRob2Q7Ci0KLSAgICAvKioKLSAgICAgKiB0aGUgdGFnIGF0dHJpYnV0ZSBuYW1lIHRoYXQgaXMgdXNlZCB0byBkZWNsYXJlIHRoZSBuYW1lCi0gICAgICogb2YgdGhlIHZhcmlhYmxlIHRvIGV4cG9ydCBhZnRlciBydW5uaW5nIHRoaXMgdGFnCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyaWFibGVOYW1lQXR0cmlidXRlOwotCi0gICAgLyoqIHRoZSBjdXJyZW50IHZhcmlhYmxlIG5hbWUgdGhhdCB0aGUgYmVhbiBzaG91bGQgYmUgZXhwb3J0ZWQgYXMgKi8KLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0KLSAgICAvKiogdGhlIHNldCBvZiBhdHRyaWJ1dGUgbmFtZXMgd2UndmUgYWxyZWFkeSBzZXQgKi8KLSAgICBwcml2YXRlIFNldCBzZXRBdHRyaWJ1dGVzU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQotICAgIC8qKiB0aGUgYXR0cmlidXRlIGRlZmluaXRpb25zICovCi0gICAgcHJpdmF0ZSBNYXAgYXR0cmlidXRlczsKLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHBhcmFtIGJlYW5DbGFzcyBDbGFzcyBvZiB0aGUgYmVhbiB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgc2V0dGVyIGV2ZW50cwotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzCi0gICAgICogQHBhcmFtIHZhcmlhYmxlTmFtZUF0dHJpYnV0ZQotICAgICAqIEBwYXJhbSBtZXRob2QgbWV0aG9kIG9mIHRoZSBCZWFuIHRvIGludm9rZSBhZnRlciB0aGUgYXR0cmlidXRlcyBoYXZlIGJlZW4gc2V0LiAgQ2FuIGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIER5bmFtaWNCZWFuVGFnKENsYXNzIGJlYW5DbGFzcywgTWFwIGF0dHJpYnV0ZXMsIFN0cmluZyB2YXJpYWJsZU5hbWVBdHRyaWJ1dGUsIE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgdGhpcy5iZWFuQ2xhc3MgPSBiZWFuQ2xhc3M7Ci0gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kOwotICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwotICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZUF0dHJpYnV0ZSA9IHZhcmlhYmxlTmFtZUF0dHJpYnV0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVTZXRBdHRyaWJ1dGVzKCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGR5bmFiZWFuIGJlZm9yZSB0aGUgYXR0cmlidXRlcyBhcmUgc2V0Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBiZWFuID0gYmVhbkNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBzZXREeW5hQmVhbiggbmV3IENvbnZlcnRpbmdXcmFwRHluYUJlYW4oIGJlYW4gKSApOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiQ291bGQgbm90IGluc3RhbnRpYXRlIGR5bmFiZWFuIixlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBkeW5hYmVhbiIsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRBdHRyaWJ1dGVzU2V0LmNsZWFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gaXNWYXJpYWJsZU5hbWUgPSBmYWxzZTsKLSAgICAgICAgaWYgKHZhcmlhYmxlTmFtZUF0dHJpYnV0ZSAhPSBudWxsICkgewotICAgICAgICAgICAgaWYgKCB2YXJpYWJsZU5hbWVBdHRyaWJ1dGUuZXF1YWxzKCBuYW1lICkgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlzVmFyaWFibGVOYW1lID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoISBpc1ZhcmlhYmxlTmFtZSkgewotCi0gICAgICAgICAgICAvLyAjIyMjIHN0cmljdGx5IHNwZWFraW5nIHdlIGNvdWxkCi0gICAgICAgICAgICAvLyBrbm93IHdoYXQgYXR0cmlidXRlcyBhcmUgc3BlY2lmaWVkIGF0IGNvbXBpbGUgdGltZQotICAgICAgICAgICAgLy8gc28gdGhpcyBkeW5hbWljIHNldCBpcyB1bm5lY2Vzc2FyeQotICAgICAgICAgICAgc2V0QXR0cmlidXRlc1NldC5hZGQobmFtZSk7Ci0KLSAgICAgICAgICAgIC8vIHdlIGNvdWxkIG1heWJlIGltcGxlbWVudCBhdHRyaWJ1dGUgc3BlY2lmaWMgdmFsaWRhdGlvbiBoZXJlCi0KLSAgICAgICAgICAgIHN1cGVyLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBsZXRzIGZpbmQgYW55IGF0dHJpYnV0ZXMgdGhhdCBhcmUgbm90IHNldCBhbmQKLSAgICAgICAgZm9yICggSXRlcmF0b3IgaXRlciA9IGF0dHJpYnV0ZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChBdHRyaWJ1dGUpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKCAhIHNldEF0dHJpYnV0ZXNTZXQuY29udGFpbnMoIG5hbWUgKSApIHsKLSAgICAgICAgICAgICAgICBpZiAoIGF0dHJpYnV0ZS5pc1JlcXVpcmVkKCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKG5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBsZXRzIGdldCB0aGUgZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gYXR0cmlidXRlLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmICggZXhwcmVzc2lvbiAhPSBudWxsICkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGV4cHJlc3Npb24uZXZhbHVhdGUoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gb25seSBzZXQgbm9uLW51bGwgdmFsdWVzPwotICAgICAgICAgICAgICAgIGlmICggdmFsdWUgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXIuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGUgZHluYW1pYyBiZWFuIGlzIGl0c2VsZiBhIHRhZywgbGV0IGl0IGV4ZWN1dGUgaXRzZWxmCi0gICAgICAgIGlmIChiZWFuIGluc3RhbmNlb2YgVGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICBUYWcgdGFnID0gKFRhZykgYmVhbjsKLSAgICAgICAgICAgIHRhZy5zZXRCb2R5KGdldEJvZHkoKSk7Ci0gICAgICAgICAgICB0YWcuc2V0Q29udGV4dChnZXRDb250ZXh0KCkpOwotICAgICAgICAgICAgdGFnLnNldFBhcmVudChnZXRQYXJlbnQoKSk7Ci0gICAgICAgICAgICAoKFRhZykgYmVhbikuZG9UYWcob3V0cHV0KTsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotCi0gICAgICAgIC8vIGV4cG9ydCB0aGUgYmVhbiBpZiByZXF1aXJlZAotICAgICAgICBpZiAoIHZhciAhPSBudWxsICkgewotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIGJlYW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm93LCBJIG1heSBpbnZva2UgdGhlICdleGVjdXRlJyBtZXRob2QgaWYgSSBoYXZlIG9uZQotICAgICAgICBpZiAoIG1ldGhvZCAhPSBudWxsICkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlKCBiZWFuLCBlbXB0eUFyZ3MgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBtZXRob2RJbnZvY2F0aW9uRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBtZXRob2RJbnZvY2F0aW9uRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gbWV0aG9kSW52b2NhdGlvbkVycm9yKGJlYW4sIG1ldGhvZCwgZSk7Ci0KLSAgICAgICAgICAgICAgICBUaHJvd2FibGUgaW5uZXIgPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGlubmVyKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwb3J0IHRoZSBzdGF0ZSBvZiB0aGUgYmVhbiB3aGVuIG1ldGhvZCBpbnZvY2F0aW9uIGZhaWxzCi0gICAgICogc28gdGhhdCB0aGUgdXNlciBjYW4gZGV0ZXJtaW5lIGFueSBwcm9ibGVtcyB0aGF0IG1pZ2h0Ci0gICAgICogYmUgb2NjdXJpbmcgd2hpbGUgdXNpbmcgZHluYW1pYyBqZWxseSBiZWFucy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiZWFuIEJlYW4gb24gd2hpY2ggPGNvZGU+bWV0aG9kPC9jb2RlIHdhcyBpbnZva2VkCi0gICAgICogQHBhcmFtIG1ldGhvZCBNZXRob2QgdGhhdCB3YXMgaW52b2tlZAotICAgICAqIEBwYXJhbSBlIEV4Y2VwdGlvbiB0aHJvdyB3aGVuIDxjb2RlPm1ldGhvZDwvY29kZT4gd2FzIGludm9rZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbWV0aG9kSW52b2NhdGlvbkV4Y2VwdGlvbihPYmplY3QgYmVhbiwgTWV0aG9kIG1ldGhvZCwgRXhjZXB0aW9uIGUpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGxvZy5lcnJvcigiQ291bGQgbm90IGludm9rZSAiICsgbWV0aG9kLCBlKTsKLSAgICAgICAgQmVhbk1hcCBiZWFuTWFwID0gbmV3IEJlYW5NYXAoYmVhbik7Ci0KLSAgICAgICAgbG9nLmVycm9yKCJCZWFuIHByb3BlcnRpZXM6Iik7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGJlYW5NYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGJlYW5NYXAuZ2V0KHByb3BlcnR5KTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihwcm9wZXJ0eSArICIgLT4gIiArIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZy5lcnJvcihiZWFuTWFwKTsKLSAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBiZWFuIHRoYXQgaGFzIGp1c3QgYmVlbiBjcmVhdGVkCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKCkgewotICAgICAgICByZXR1cm4gYmVhbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9EeW5hbWljRHluYUJlYW5UYWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL0R5bmFtaWNEeW5hQmVhblRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjZlZjdjLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL0R5bmFtaWNEeW5hQmVhblRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5EeW5hQ2xhc3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkR5bmFCZWFuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5FeHByZXNzaW9uOwotCi0vKioKLSAqIFRoaXMgdGFnIGlzIGJvdW5kIG9udG8gYSB7QGxpbmsgRHluYUNsYXNzfSBpbnN0YW5jZS4KLSAqIFdoZW4gdGhlIHRhZyBpcyBpbnZva2VkIGEge0BsaW5rIER5bmFCZWFuIHdpbGwgYmUgY3JlYXRlZCB1c2luZyB0aGUgdGFncyBhdHRyaWJ1dGVzLgotICogU28gdGhpcyBjbGFzcyBpcyBsaWtlIGEge0BsaW5rIER5bmFCZWFufSBpbXBsZW1lbmF0aW9uIG9mIHtAbGluayBEeW5hbWljQmVhblRhZ30KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBEeW5hbWljRHluYUJlYW5UYWcgZXh0ZW5kcyBEeW5hQmVhblRhZ1N1cHBvcnQgaW1wbGVtZW50cyBCZWFuU291cmNlIHsKLQotICAgIC8qKiB0aGUgYmVhbiBjbGFzcyAqLwotICAgIHByaXZhdGUgRHluYUNsYXNzIGJlYW5DbGFzczsKLQotICAgIC8qKgotICAgICAqIHRoZSB0YWcgYXR0cmlidXRlIG5hbWUgdGhhdCBpcyB1c2VkIHRvIGRlY2xhcmUgdGhlIG5hbWUKLSAgICAgKiBvZiB0aGUgdmFyaWFibGUgdG8gZXhwb3J0IGFmdGVyIHJ1bm5pbmcgdGhpcyB0YWcKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB2YXJpYWJsZU5hbWVBdHRyaWJ1dGU7Ci0KLSAgICAvKiogdGhlIGN1cnJlbnQgdmFyaWFibGUgbmFtZSB0aGF0IHRoZSBiZWFuIHNob3VsZCBiZSBleHBvcnRlZCBhcyAqLwotICAgIHByaXZhdGUgU3RyaW5nIHZhcjsKLQotICAgIC8qKiB0aGUgc2V0IG9mIGF0dHJpYnV0ZSBuYW1lcyB3ZSd2ZSBhbHJlYWR5IHNldCAqLwotICAgIHByaXZhdGUgU2V0IHNldEF0dHJpYnV0ZXNTZXQgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgLyoqIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMgKi8KLSAgICBwcml2YXRlIE1hcCBhdHRyaWJ1dGVzOwotCi0gICAgcHVibGljIER5bmFtaWNEeW5hQmVhblRhZyhEeW5hQ2xhc3MgYmVhbkNsYXNzLCBNYXAgYXR0cmlidXRlcywgU3RyaW5nIHZhcmlhYmxlTmFtZUF0dHJpYnV0ZSkgewotICAgICAgICB0aGlzLmJlYW5DbGFzcyA9IGJlYW5DbGFzczsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLSAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVBdHRyaWJ1dGUgPSB2YXJpYWJsZU5hbWVBdHRyaWJ1dGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlU2V0QXR0cmlidXRlcygpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBkeW5hYmVhbiBiZWZvcmUgdGhlIGF0dHJpYnV0ZXMgYXJlIHNldAotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0RHluYUJlYW4oIGJlYW5DbGFzcy5uZXdJbnN0YW5jZSgpICk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgZHluYWJlYW4iLGUpOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiQ291bGQgbm90IGluc3RhbnRpYXRlIGR5bmFiZWFuIixlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldEF0dHJpYnV0ZXNTZXQuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBpc1ZhcmlhYmxlTmFtZSA9IGZhbHNlOwotICAgICAgICBpZiAodmFyaWFibGVOYW1lQXR0cmlidXRlICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBpZiAoIHZhcmlhYmxlTmFtZUF0dHJpYnV0ZS5lcXVhbHMoIG5hbWUgKSApIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB2YXIgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyID0gdmFsdWUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaXNWYXJpYWJsZU5hbWUgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghIGlzVmFyaWFibGVOYW1lKSB7Ci0KLSAgICAgICAgICAgIC8vICMjIyMgc3RyaWN0bHkgc3BlYWtpbmcgd2UgY291bGQKLSAgICAgICAgICAgIC8vIGtub3cgd2hhdCBhdHRyaWJ1dGVzIGFyZSBzcGVjaWZpZWQgYXQgY29tcGlsZSB0aW1lCi0gICAgICAgICAgICAvLyBzbyB0aGlzIGR5bmFtaWMgc2V0IGlzIHVubmVjZXNzYXJ5Ci0gICAgICAgICAgICBzZXRBdHRyaWJ1dGVzU2V0LmFkZChuYW1lKTsKLQotICAgICAgICAgICAgLy8gd2UgY291bGQgbWF5YmUgaW1wbGVtZW50IGF0dHJpYnV0ZSBzcGVjaWZpYyB2YWxpZGF0aW9uIGhlcmUKLQotICAgICAgICAgICAgc3VwZXIuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotCi0gICAgICAgIC8vIGxldHMgZmluZCBhbnkgYXR0cmlidXRlcyB0aGF0IGFyZSBub3Qgc2V0IGFuZAotICAgICAgICBmb3IgKCBJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlID0gKEF0dHJpYnV0ZSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAoICEgc2V0QXR0cmlidXRlc1NldC5jb250YWlucyggbmFtZSApICkgewotICAgICAgICAgICAgICAgIGlmICggYXR0cmlidXRlLmlzUmVxdWlyZWQoKSApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24obmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGxldHMgZ2V0IHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBhdHRyaWJ1dGUuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCBleHByZXNzaW9uICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZXhwcmVzc2lvbi5ldmFsdWF0ZShjb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBvbmx5IHNldCBub24tbnVsbCB2YWx1ZXM/Ci0gICAgICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPSBudWxsICkgewotICAgICAgICAgICAgICAgICAgICBzdXBlci5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLQotICAgICAgICAvLyBleHBvcnQgdGhlIGJlYW4gaWYgcmVxdWlyZWQKLSAgICAgICAgaWYgKCB2YXIgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUodmFyLCBnZXREeW5hQmVhbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBiZWFuIHRoYXQgaGFzIGp1c3QgYmVlbiBjcmVhdGVkCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKCkgewotICAgICAgICByZXR1cm4gZ2V0RHluYUJlYW4oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9EeW5hbWljVGFnLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9EeW5hbWljVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0Yjg4NDYuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2ltcGwvRHluYW1pY1RhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5EeW5hVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuU2NyaXB0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogPHA+PGNvZGU+RHluYW1pY1RhZzwvY29kZT4gaXMgYSB0YWcgdGhhdCBpcyBjcmVhdGVkIGZyb20KLSAqIGluc2lkZSBhIEplbGx5IHNjcmlwdCBhcyBhIEplbGx5IHRlbXBsYXRlIGFuZCB3aWxsIGludm9rZSBhCi0gKiBnaXZlbiBzY3JpcHQsIHBhc3NpbmcgaW4gaXRzIGluc3RhbnRpYXRpb24gYXR0cmlidXRlcwotICogYXMgdmFyaWFibGVzIGFuZCB3aWxsIGFsbG93IHRoZSB0ZW1wbGF0ZSB0byBpbnZva2UgaXRzIGluc3RhbmNlIGJvZHkuPC9wPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBEeW5hbWljVGFnIGV4dGVuZHMgRHluYVRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKER5bmFtaWNUYWcuY2xhc3MpOwotCi0gICAgLyoqIFRoZSB0ZW1wbGF0ZSBzY3JpcHQgKi8KLSAgICBwcml2YXRlIFNjcmlwdCB0ZW1wbGF0ZTsKLQotICAgIC8qKiBUaGUgaW5zdGFuY2UgYXR0cmlidXRlcyAqLwotICAgIHByaXZhdGUgTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHVibGljIER5bmFtaWNUYWcoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIER5bmFtaWNUYWcoU2NyaXB0IHRlbXBsYXRlKSB7Ci0gICAgICAgIHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTsKLSAgICB9Ci0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyBkeW5hbWljIHRhZyB3aXRoIGF0dHJpYnV0ZXM6ICIgKyBhdHRyaWJ1dGVzKTsKLSAgICAgICAgfQotICAgICAgICBhdHRyaWJ1dGVzLnB1dCgib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmJvZHkiLCBnZXRCb2R5KCkpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBuZXcgY29udGV4dCBiYXNlZCBvbiBjdXJyZW50IGF0dHJpYnV0ZXMKLSAgICAgICAgSmVsbHlDb250ZXh0IG5ld0plbGx5Q29udGV4dCA9IGNvbnRleHQubmV3SmVsbHlDb250ZXh0KGF0dHJpYnV0ZXMpOwotICAgICAgICBNYXAgYXR0ck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIGZvciAoIEl0ZXJhdG9yIGtleUl0ZXIgPSB0aGlzLmF0dHJpYnV0ZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAga2V5SXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5SXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIGtleS5lbmRzV2l0aCggIkF0dHIiICkgKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gdGhpcy5hdHRyaWJ1dGVzLmdldCgga2V5ICk7Ci0gICAgICAgICAgICAgICAgYXR0ck1hcC5wdXQoIGtleSwgdmFsdWUgKTsKLSAgICAgICAgICAgICAgICBhdHRyTWFwLnB1dCgga2V5LnN1YnN0cmluZyggMCwga2V5Lmxlbmd0aCgpLTQgKSwgdmFsdWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBuZXdKZWxseUNvbnRleHQuc2V0VmFyaWFibGUoICJhdHRycyIsIGF0dHJNYXAgKTsKLSAgICAgICAgZ2V0VGVtcGxhdGUoKS5ydW4obmV3SmVsbHlDb250ZXh0LCBvdXRwdXQpOwotICAgIH0KLQotICAgIC8vIER5bmFUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgYXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICBhdHRyaWJ1dGVzLnB1dChuYW1lICsgIkF0dHIiLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKiBUaGUgdGVtcGxhdGUgdG8gYmUgZXhlY3V0ZWQgYnkgdGhpcyB0YWcgd2hpY2ggbWF5IHdlbGwKLSAgICAgKiBpbnZva2UgdGhpcyBpbnN0YW5jZXMgYm9keSBmcm9tIGluc2lkZSB0aGUgdGVtcGxhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU2NyaXB0IGdldFRlbXBsYXRlKCkgewotICAgICAgICByZXR1cm4gdGVtcGxhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGVtcGxhdGUoU2NyaXB0IHRlbXBsYXRlKSB7Ci0gICAgICAgIHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9EeW5hbWljVGFnTGlicmFyeS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2ltcGwvRHluYW1pY1RhZ0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODViOTNkZS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9EeW5hbWljVGFnTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5TY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnTGlicmFyeTsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0vKioKLSAqIDxwPjxjb2RlPkR5bmFtaWNUYWdMaWJyYXJ5PC9jb2RlPiByZXByZXNlbnRzIGEgVGFnTGlicmFyeSB3aGljaAotICogZ2V0cyBjcmVhdGVkIGJ5IHJ1bm5pbmcgYSBKZWxseSBzY3JpcHQuPC9wPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS42ICQKLSAqLwotcHVibGljIGNsYXNzIER5bmFtaWNUYWdMaWJyYXJ5IGV4dGVuZHMgVGFnTGlicmFyeSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB1cmk7Ci0gICAgcHJpdmF0ZSBNYXAgdGVtcGxhdGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIFRhZ0xpYnJhcnkgcGFyZW50OwotCi0gICAgcHVibGljIER5bmFtaWNUYWdMaWJyYXJ5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBEeW5hbWljVGFnTGlicmFyeShTdHJpbmcgdXJpKSB7Ci0gICAgICAgIHRoaXMudXJpID0gdXJpOwotICAgIH0KLQotICAgIC8qKiBDcmVhdGVzIGEgbmV3IHNjcmlwdCB0byBleGVjdXRlIHRoZSBnaXZlbiB0YWcgbmFtZSBhbmQgYXR0cmlidXRlcyAqLwotICAgIHB1YmxpYyBUYWdTY3JpcHQgY3JlYXRlVGFnU2NyaXB0KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCi0gICAgICAgIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBUYWdTY3JpcHQoCi0gICAgICAgICAgICBuZXcgVGFnRmFjdG9yeSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgVGFnIGNyZWF0ZVRhZyhTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRHluYW1pY1RhZ0xpYnJhcnkudGhpcy5jcmVhdGVUYWcobmFtZSwgYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgIH0KLQotICAgIC8qKiBDcmVhdGVzIGEgbmV3IFRhZyBmb3IgdGhlIGdpdmVuIHRhZyBuYW1lIGlmIGl0IGV4aXN0cyAqLwotICAgIHB1YmxpYyBUYWcgY3JlYXRlVGFnKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCi0gICAgICAgIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gdGVtcGxhdGVzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIFNjcmlwdCApIHsKLSAgICAgICAgICAgIFNjcmlwdCB0ZW1wbGF0ZSA9IChTY3JpcHQpIHZhbHVlOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljVGFnKHRlbXBsYXRlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggdmFsdWUgaW5zdGFuY2VvZiBUYWdGYWN0b3J5ICkgewotICAgICAgICAgICAgVGFnRmFjdG9yeSBmYWN0b3J5ID0gKFRhZ0ZhY3RvcnkpIHZhbHVlOwotICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlVGFnKG5hbWUsIGF0dHJpYnV0ZXMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBwYXJlbnQgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIC8vIGRlbGVnYXRlIHRvIHRoZSBwYXJlbnQKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuY3JlYXRlVGFnKG5hbWUsIGF0dHJpYnV0ZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB0YWcgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdGVtcGxhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckR5bmFtaWNUYWcoU3RyaW5nIG5hbWUsIFNjcmlwdCB0ZW1wbGF0ZSkgewotICAgICAgICB0ZW1wbGF0ZXMucHV0KG5hbWUsIHRlbXBsYXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEplbGx5IEJlYW4gVGFnIHdpdGggdGhlIGdpdmVuIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckJlYW5UYWcoU3RyaW5nIG5hbWUsIFRhZ0ZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICB0ZW1wbGF0ZXMucHV0KG5hbWUsIGZhY3RvcnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNjcmlwdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHRhZyBuYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdGFnIG5hbWUKLSAgICAgKiBAcmV0dXJuIFRoZSBzY3JpcHQgYXNzb2NpYXRlZCB3aXRoIDxjb2RlPm5hbWU8L2NvZGU+LCBvcgotICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHRhZyBkb2Vzbid0IGV4aXN0IG9yIGlzbid0IGEgc2NyaXB0Ci0gICAgICovCi0gICAgcHVibGljIFNjcmlwdCBnZXREeW5hbWljVGFnKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIE9iamVjdCByZXN1bHQgPSB0ZW1wbGF0ZXMuZ2V0KG5hbWUpOwotICAgICAgICByZXR1cm4gKHJlc3VsdCBpbnN0YW5jZW9mIFNjcmlwdCkgPyAoU2NyaXB0KSByZXN1bHQgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRhZyBsaWJyYXJ5IGluc3RhbmNlIHdoaWNoIGNvbnRhaW5zIHRoZSBuYW1lZCB0YWcuCi0gICAgICogPHAvPgotICAgICAqIElmIHRoZSB0YWcgaXMgbm90IHJlZ2lzdGVyZWQgd2l0aGluIHRoaXMgbGlicmFyeSwgdGhlIHNldCBvZgotICAgICAqIHBhcmVudCBsaWJyYXJpZXMgd2lsbCBiZSBzZWFyY2hlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSB0YWcgbmFtZQotICAgICAqIEByZXR1cm4gVGhlIHRhZyBsaWJyYXJ5IGNvbnRhaW5pbmcgdGhlIG5hbWVkIHRhZywgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiAgICAgICAgIGlmIHRoZSB0YWcgaXMgbm90IHJlZ2lzdGVyZWQuCi0gICAgICovCi0gICAgcHVibGljIER5bmFtaWNUYWdMaWJyYXJ5IGZpbmQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgRHluYW1pY1RhZ0xpYnJhcnkgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKHRlbXBsYXRlcy5nZXQobmFtZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gdGhpczsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBEeW5hbWljVGFnTGlicmFyeSkgewotICAgICAgICAgICAgcmVzdWx0ID0gKChEeW5hbWljVGFnTGlicmFyeSkgcGFyZW50KS5maW5kKG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJpKCkgewotICAgICAgICByZXR1cm4gdXJpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVyaShTdHJpbmcgdXJpKSB7Ci0gICAgICAgIHRoaXMudXJpID0gdXJpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGFyZW50IGxpYnJhcnkgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHJlc29sdmUgdW5rbm93biB0YWdzLgotICAgICAqIEByZXR1cm4gVGFnTGlicmFyeQotICAgICAqLwotICAgIHB1YmxpYyBUYWdMaWJyYXJ5IGdldFBhcmVudCgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwYXJlbnQgdG8gaW5oZXJpdCB0YWdzIGZyb20gdGhhdCBhcmUgbm90IGRlZmluZWQgaW4gdGhpcyBsaWJyYXJ5LgotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoVGFnTGlicmFyeSBwYXJlbnQpIHsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9FbWJlZGRlZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2ltcGwvRW1iZWRkZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIxMjQwOC4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9FbWJlZGRlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5TY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ0xpYnJhcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkucGFyc2VyLlhNTFBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86dmluYXljQGFwYWNoZS5vcmciPlZpbmF5IENoYW5kcmFuPC9hPgotICoKLSAqIDxwPjxjb2RlPkVtYmVkZGVkPC9jb2RlPiBwcm92aWRlcyBlYXN5IG1lYW5zIHRvIGVtYmVkIEplbGx5RW5naW5lIDxici8+Ci0gKiBhbmQgdXNlIEplbGx5IHNjcmlwdHMgd2l0aGluIGFuIGFwcGxpY2F0aW9uPC9wPgotICogQSB0eXBpY2FsIHVzYWdlOjxici8+Ci0gKiAgPGNvZGU+PGJyLz4KLSAqICAgICBFbWJlZGRlZCBlbWJlZGRlZCA9IG5ldyBFbWJlZGRlZCgpOzxici8+Ci0gKiAgICAgZW1iZWRkZWQuc2V0T3V0cHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSk7PGJyLz4KLSAqICAgICBlbWJlZGRlZC5zZXRWYXJpYWJsZSgic29tZS12YXIiLCJzb21lLW9iamVjdCIpOzxici8+Ci0gKiAgICAgLi4uLi48YnIvPgotICogICAgIGVtYmVkZGVkLnNldFNjcmlwdChzY3JpcHRBc1N0cmluZyk7PGJyLz4KLSAqICAgICAvL29yIG9uZSBjYW4gZG8uPGJyLz4KLSAqICAgICAvL2VtYmVkZGVkLnNldFNjcmlwdChzY3JpcHRBc0lucHV0U3RyZWFtKTs8YnIvPgotICogICAgIDxici8+Ci0gKiAgICAgYm9vbGVhbiBiU3RhdHVzPWVtYmVkZGVkLmV4ZWN1dGUoKTs8YnIvPgotICogICAgIGlmKCFiU3RhdHVzKSAvL2lmIGVycm9yPGJyLz4KLSAqICAgICB7PGJyLz4KLSAqICAgICAgICAgU3RyaW5nIGVycm9yTXNnPWVtYmVkZGVkLmdldEVycm9yTXNnKCk7PGJyLz4KLSAqICAgICB9PGJyLz4KLSAqICA8L2NvZGU+ICA8YnIvPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnZpbmF5Y0BhcGFjaGUub3JnIj5WaW5heSBDaGFuZHJhbjwvYT4KLSAqLwotcHVibGljIGNsYXNzIEVtYmVkZGVkIHsKLSAgICAvKiogSmVsbHkgRW5naW5lICovCi0gICAgSmVsbHkgbV9qZWxseUVuZ2luZSA9IG5ldyBKZWxseSgpOwotICAgIC8qKiBKZWxseUNvbnRleHQqLwotICAgIHByaXZhdGUgSmVsbHlDb250ZXh0IG1fY29udGV4dCA9IG5ldyBKZWxseUNvbnRleHQoKTsKLSAgICAvKiogQ29tcGlsZWQgU2NyaXB0IE9iamVjdCovCi0gICAgcHJpdmF0ZSBTY3JpcHQgbV9zY3JpcHQ7Ci0gICAgLyoqIElucHV0IHNjcmlwdCBhcyBzdHJlYW0qLwotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gbV9pbnB1dFN0cmVhbTsKLSAgICAvKiogT3V0cHV0IFN0cmVhbSAqLwotICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIG1fb3V0cHV0U3RyZWFtOwotICAgIC8qKiBPdXRwdXQoZGVmYXVsdCBTeXN0ZW0ub3V0KSAqLwotICAgIHByaXZhdGUgWE1MT3V0cHV0IG1fb3V0cHV0ID0KLSAgICAgICAgWE1MT3V0cHV0LmNyZWF0ZVhNTE91dHB1dChuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5vdXQpKTsKLSAgICAvKiogRXhjZXB0aW9uIHRocm93biBkdXJpbmcgY29tcGlsYXRpb24gb2Ygc2NyaXB0Ki8KLSAgICBFeGNlcHRpb24gbV9zY3JpcHRDb21waWxhdGlvbkV4Y2VwdGlvbjsKLSAgICAvKiogYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNjcmlwdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY29tcGlsZWQgb3IgTk9UICovCi0gICAgYm9vbGVhbiBtX3NjcmlwdENvbXBpbGVkID0gZmFsc2U7Ci0gICAgLyoqIEVycm9yTXNnKi8KLSAgICBwcml2YXRlIFN0cmluZyBtX2Vycm9yTXNnOwotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhFbWJlZGRlZC5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IENvbnN0cnVjdG9yCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgRW1iZWRkZWQoKSB7Ci0gICAgICAgIC8vbV9jb250ZXh0LnNldENsYXNzTG9hZGVyKG5ldyBUYWdMaWJyYXJ5Q2xhc3NMb2FkZXIobV9jb250ZXh0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHNldENvbnRleHQuCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KEplbGx5Q29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIG1fY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldENvbnRleHQuCi0gICAgICogQHJldHVybiBKZWxseUNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgSmVsbHlDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBtX2NvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGEgbmV3IHZhcmlhYmxlIHdpdGhpbiB0aGUgY29udGV4dCBmb3IgdGhlIHNjcmlwdCB0byB1c2UuCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIG1fY29udGV4dC5zZXRWYXJpYWJsZShuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpbnB1dCBzY3JpcHQKLSAgICAgKiBAcGFyYW0gc2NyaXB0QXNTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTY3JpcHQoU3RyaW5nIHNjcmlwdEFzU3RyaW5nKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSByZXNvbHZlVVJMKHNjcmlwdEFzU3RyaW5nKTsKLSAgICAgICAgICAgIG1faW5wdXRTdHJlYW0gPSB1cmwub3BlblN0cmVhbSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9FbmNhcHN1bGF0ZSB0aGUgc3RyaW5nIHdpdGhpbgotICAgICAgICAgICAgbV9pbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzY3JpcHRBc1N0cmluZy5nZXRCeXRlcygpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9FcnJvciByZWFkaW5nIGZyb20gdGhlIFVSTAotICAgICAgICAgICAgbV9pbnB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBjb21waWxlU2NyaXB0QW5kS2VlcCgpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgVVJMIGZvciB0aGUgcmVsYXRpdmUgZmlsZSBuYW1lIG9yIGFic29sdXRlIFVSTAotICAgICAqLwotICAgIHByaXZhdGUgVVJMIHJlc29sdmVVUkwoU3RyaW5nIG5hbWUpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShuYW1lKTsKLSAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmaWxlLnRvVVJMKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBVUkwobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBAcGFyYW0gc2NyaXB0QXNJbnB1dFN0cmVhbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNjcmlwdChJbnB1dFN0cmVhbSBzY3JpcHRBc0lucHV0U3RyZWFtKSB7Ci0gICAgICAgIG1faW5wdXRTdHJlYW0gPSBzY3JpcHRBc0lucHV0U3RyZWFtOwotICAgICAgICBjb21waWxlU2NyaXB0QW5kS2VlcCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBpbGUgdGhlIHNjcmlwdAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb21waWxlU2NyaXB0QW5kS2VlcCgpIHsKLSAgICAgICAgWE1MUGFyc2VyIHBhcnNlciA9IG5ldyBYTUxQYXJzZXIoKTsKLSAgICAgICAgcGFyc2VyLnNldENvbnRleHQobV9jb250ZXh0KTsKLSAgICAgICAgbV9zY3JpcHRDb21waWxlZCA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbV9zY3JpcHQgPSBwYXJzZXIucGFyc2UobV9pbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICBtX3NjcmlwdCA9IG1fc2NyaXB0LmNvbXBpbGUoKTsKLSAgICAgICAgICAgIG1fc2NyaXB0Q29tcGlsZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBtX3NjcmlwdENvbXBpbGF0aW9uRXhjZXB0aW9uID0gZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIG1fc2NyaXB0Q29tcGlsYXRpb25FeGNlcHRpb24gPSBlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbV9zY3JpcHRDb21waWxhdGlvbkV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2Qgc2V0T3V0cHV0U3RyZWFtLgotICAgICAqIEBwYXJhbSBvdXRwdXRTdHJlYW0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgewotICAgICAgICBtX291dHB1dFN0cmVhbSA9IG91dHB1dFN0cmVhbTsKLSAgICAgICAgbV9vdXRwdXQgPQotICAgICAgICAgICAgWE1MT3V0cHV0LmNyZWF0ZVhNTE91dHB1dChuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG1fb3V0cHV0U3RyZWFtKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIHRoZSBnaXZlbiB0YWcgbGlicmFyeSBjbGFzcyBuYW1lIGFnYWluc3QgdGhlIGdpdmVuIG5hbWVzcGFjZSBVUkkuCi0gICAgICogVGhlIGNsYXNzIHdpbGwgYmUgbG9hZGVkIHZpYSB0aGUgZ2l2ZW4gQ2xhc3NMb2FkZXIKLSAgICAgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBwYXJzZXIgaXMgdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlclRhZ0xpYnJhcnkoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICBpZiAobV9jb250ZXh0ICE9IG51bGwpCi0gICAgICAgICAgICBtX2NvbnRleHQucmVnaXN0ZXJUYWdMaWJyYXJ5KG5hbWVzcGFjZVVSSSwgY2xhc3NOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIHRhZyBsaWJyYXJ5IGFnYWluc3QgdGhlIGdpdmVuIG5hbWVzcGFjZSBVUkkuCi0gICAgICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB0aGUgcGFyc2VyIGlzIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJUYWdMaWJyYXJ5KFN0cmluZyBuYW1lc3BhY2VVUkksIFRhZ0xpYnJhcnkgdGFnbGliKSB7Ci0gICAgICAgIGlmIChtX2NvbnRleHQgIT0gbnVsbCkKLSAgICAgICAgICAgIG1fY29udGV4dC5yZWdpc3RlclRhZ0xpYnJhcnkobmFtZXNwYWNlVVJJLCB0YWdsaWIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVycm9yTXNnLgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1zZygpIHsKLSAgICAgICAgcmV0dXJuIG1fZXJyb3JNc2c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZXJyb3JNc2cuCi0gICAgICogQHBhcmFtIGVycm9yTXNnIFRoZSBlcnJvck1zZyB0byBzZXQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0RXJyb3JNc2coU3RyaW5nIGVycm9yTXNnKSB7Ci0gICAgICAgIG1fZXJyb3JNc2cgPSBlcnJvck1zZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlIHRoZSBqZWxseSBzY3JpcHQgYW5kIGNhcHR1cmUgdGhlIGVycm9ycyAoaWZhbnkpd2l0aGluLgotICAgICAqCi0gICAgICogQHRocm93cyBKZWxseUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoKSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3RhcnRpbmcgRXhlY3V0aW9uIik7Ci0gICAgICAgIC8vSWYgc2NyaXB0IGhhcyBub3QgYmVlbiBjb21waWxlZCB0aGVuIHJldHVybiB0aGUgZXJyb3JNc2cgdGhhdCBvY2N1cmVkIGR1cmluZyBjb21waWxhdGlvbgotICAgICAgICBpZiAoIW1fc2NyaXB0Q29tcGlsZWQpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IobV9zY3JpcHRDb21waWxhdGlvbkV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgc2V0RXJyb3JNc2cobV9zY3JpcHRDb21waWxhdGlvbkV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX2lucHV0U3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIltFcnJvcl0gSW5wdXQgc2NyaXB0LXJlc291cmNlIE5PVCBhY2Nlc3NpYmxlIik7Ci0gICAgICAgICAgICBzZXRFcnJvck1zZygiW0Vycm9yXSBJbnB1dCBzY3JpcHQtcmVzb3VyY2UgTk9UIGFjY2Vzc2libGUiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbV9zY3JpcHQucnVuKG1fY29udGV4dCwgbV9vdXRwdXQpOwotICAgICAgICAgICAgbV9vdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIG1fb3V0cHV0LmZsdXNoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRXJyb3JFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHNldEVycm9yTXNnKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBsb2cuZGVidWcoIkRvbmUgRXhlY3V0aW5nIik7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2ltcGwvRXhwcmVzc2lvblNjcmlwdC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2ltcGwvRXhwcmVzc2lvblNjcmlwdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDk3YTNmLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL0V4cHJlc3Npb25TY3JpcHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuU2NyaXB0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbjsKLQotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiA8cD48Y29kZT5FeHByZXNzaW9uU2NyaXB0PC9jb2RlPiBvdXRwdXRzIHRoZSB2YWx1ZSBvZiBhbiBleHByZXNzaW9uIGFzIHRleHQuPC9wPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIEV4cHJlc3Npb25TY3JpcHQgaW1wbGVtZW50cyBTY3JpcHQgewotCi0gICAgLyoqIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlZCBhcyBhIFN0cmluZyBhbmQgb3V0cHV0IGJ5IHRoaXMgc2NyaXB0ICovCi0gICAgcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHJlc3Npb247Ci0KLSAgICBwdWJsaWMgRXhwcmVzc2lvblNjcmlwdCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhwcmVzc2lvblNjcmlwdChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLSAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICJbZXhwcmVzc2lvbj0iICsgZXhwcmVzc2lvbiArICJdIjsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZWQgYXMgYSBTdHJpbmcgYW5kIG91dHB1dCBieSB0aGlzIHNjcmlwdCAqLwotICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7Ci0gICAgICAgIHJldHVybiBleHByZXNzaW9uOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlZCBhcyBhIFN0cmluZyBhbmQgb3V0cHV0IGJ5IHRoaXMgc2NyaXB0ICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLSAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLSAgICB9Ci0KLSAgICAvLyBTY3JpcHQgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIFNjcmlwdCBjb21waWxlKCkgewotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKiogRXZhbHVhdGVzIHRoZSBib2R5IG9mIGEgdGFnICovCi0gICAgcHVibGljIHZvaWQgcnVuKEplbGx5Q29udGV4dCBjb250ZXh0LCBYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBPYmplY3QgcmVzdWx0ID0gZXhwcmVzc2lvbi5ldmFsdWF0ZShjb250ZXh0KTsKLSAgICAgICAgaWYgKCByZXN1bHQgIT0gbnVsbCApIHsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgb3V0cHV0Lm9iamVjdERhdGEocmVzdWx0KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJDb3VsZCBub3Qgd3JpdGUgdG8gWE1MT3V0cHV0IixlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2ltcGwvU2NyaXB0QmxvY2suamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL1NjcmlwdEJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYjNjMDUuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2ltcGwvU2NyaXB0QmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlNjcmlwdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKiogPHA+PGNvZGU+U2NyaXB0QmxvY2s8L2NvZGU+IGEgYmxvY2sgb2Ygc2NyaXB0cy48L3A+Ci0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjE2ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBTY3JpcHRCbG9jayBpbXBsZW1lbnRzIFNjcmlwdCB7Ci0KLSAgICAvKiogVGhlIGxpc3Qgb2Ygc2NyaXB0cyAqLwotICAgIHByaXZhdGUgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBTY3JpcHRCbG9jaygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiW3NjcmlwdHM9IiArIGxpc3QgKyAiXSI7Ci0gICAgfQotCi0gICAgLyoqIEFkZCBhIG5ldyBzY3JpcHQgdG8gdGhlIGVuZCBvZiB0aGlzIGJsb2NrICovCi0gICAgcHVibGljIHZvaWQgYWRkU2NyaXB0KFNjcmlwdCBzY3JpcHQpIHsKLSAgICAgICAgbGlzdC5hZGQoc2NyaXB0KTsKLSAgICB9Ci0KLSAgICAvKiogUmVtb3ZlcyBhIHNjcmlwdCBmcm9tIHRoaXMgYmxvY2sgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVTY3JpcHQoU2NyaXB0IHNjcmlwdCkgewotICAgICAgICBsaXN0LnJlbW92ZShzY3JpcHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNoaWxkIHNjcmlwdHMgdGhhdCBtYWtlIHVwIHRoaXMgYmxvY2suIFRoaXMgbGlzdCBpcyBsaXZlCi0gICAgICogc28gdGhhdCBpdCBjYW4gYmUgbW9kaWZpZWQgaWYgcmVxdXJpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRTY3JpcHRMaXN0KCkgewotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICAvLyBTY3JpcHQgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIFNjcmlwdCBjb21waWxlKCkgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLSAgICAgICAgaWYgKHNpemUgPT0gMSkgewotICAgICAgICAgICAgU2NyaXB0IHNjcmlwdCA9IChTY3JpcHQpIGxpc3QuZ2V0KDApOwotICAgICAgICAgICAgcmV0dXJuIHNjcmlwdC5jb21waWxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gbm93IGNvbXBpbGUgY2hpbGRyZW4KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIFNjcmlwdCBzY3JpcHQgPSAoU2NyaXB0KSBsaXN0LmdldChpKTsKLSAgICAgICAgICAgIGxpc3Quc2V0KGksIHNjcmlwdC5jb21waWxlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKiBFdmFsdWF0ZXMgdGhlIGJvZHkgb2YgYSB0YWcgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oSmVsbHlDb250ZXh0IGNvbnRleHQsIFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0vKgotICAgICAgICBmb3IgKGludCBpID0gMCwgc2l6ZSA9IHNjcmlwdHMubGVuZ3RoOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBTY3JpcHQgc2NyaXB0ID0gc2NyaXB0c1tpXTsKLSAgICAgICAgICAgIHNjcmlwdC5ydW4oY29udGV4dCwgb3V0cHV0KTsKLSAgICAgICAgfQotKi8KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICBTY3JpcHQgc2NyaXB0ID0gKFNjcmlwdCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBzY3JpcHQucnVuKGNvbnRleHQsIG91dHB1dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJpbSB0aGUgYm9keSBvZiB0aGUgc2NyaXB0LgotICAgICAqIEluIHRoaXMgY2FzZSwgdHJpbSBhbGwgZWxlbWVudHMsIHJlbW92aW5nIGFueSB0aGF0IGFyZSBlbXB0eSB0ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRyaW1XaGl0ZXNwYWNlKCkgewotICAgICAgICBMaXN0IGxpc3QgPSBnZXRTY3JpcHRMaXN0KCk7Ci0gICAgICAgIGZvciAoIGludCBpID0gbGlzdC5zaXplKCkgLSAxOyBpID49IDA7IGktLSApIHsKLSAgICAgICAgICAgIFNjcmlwdCBzY3JpcHQgPSAoU2NyaXB0KSBsaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmICggc2NyaXB0IGluc3RhbmNlb2YgVGV4dFNjcmlwdCApIHsKLSAgICAgICAgICAgICAgICBUZXh0U2NyaXB0IHRleHRTY3JpcHQgPSAoVGV4dFNjcmlwdCkgc2NyaXB0OwotICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gdGV4dFNjcmlwdC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQudHJpbSgpOwotICAgICAgICAgICAgICAgIGlmICggdGV4dC5sZW5ndGgoKSA9PSAwICkgewotICAgICAgICAgICAgICAgICAgICBsaXN0LnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRleHRTY3JpcHQuc2V0VGV4dCh0ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9TdGF0aWNUYWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL1N0YXRpY1RhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzk1ZjE5Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL1N0YXRpY1RhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuRHluYVRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5BdHRyaWJ1dGVzSW1wbDsKLQotLyoqCi0gKiA8cD48Y29kZT5TdGF0aWNUYWc8L2NvZGU+IHJlcHJlc2VudHMgYSBzdGF0aWMgWE1MIGVsZW1lbnQKLSAqIHdoaWNoIGVjaG9zIGl0c2VsZiB0byBYTUxPdXRwdXQgd2hlbiBpdCBpcyBpbnZva2VkLjwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTkgJAotICovCi0KLXB1YmxpYyBjbGFzcyBTdGF0aWNUYWcgZXh0ZW5kcyBEeW5hVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogVGhlIG5hbWVzcGFjZSBVUkkgKi8KLSAgICBwcml2YXRlIFN0cmluZyB1cmk7Ci0KLSAgICAvKiogVGhlIHF1YWxpZmllZCBuYW1lICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcW5hbWU7Ci0KLSAgICAvKiogVGhlIGxvY2FsIG5hbWUgKi8KLSAgICBwcml2YXRlIFN0cmluZyBsb2NhbE5hbWU7Ci0KLSAgICAvKiogVGhlIFhNTCBBdHRyaWJ1dGVzICovCi0gICAgcHJpdmF0ZSBBdHRyaWJ1dGVzSW1wbCBhdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7Ci0KLSAgICBwdWJsaWMgU3RhdGljVGFnKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTdGF0aWNUYWcoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFuYW1lKSB7Ci0gICAgICAgIHRoaXMudXJpID0gdXJpOwotICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLSAgICAgICAgdGhpcy5xbmFtZSA9IHFuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIltxbmFtZT0iICsgcW5hbWUgKyAiO2F0dHJpYnV0ZXM9IiArIGF0dHJpYnV0ZXMgKyAiXSI7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXRwdXQuc3RhcnRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBxbmFtZSwgYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0gICAgICAgICAgICBvdXRwdXQuZW5kRWxlbWVudCh1cmksIGxvY2FsTmFtZSwgcW5hbWUpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gRHluYVRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gIyMjIHdlJ2xsIGFzc3VtZSB0aGF0IGFsbCBhdHRyaWJ1dGVzIGFyZSBpbiBubyBuYW1lc3BhY2UhCi0gICAgICAgIC8vICMjIyB0aGlzIGlzIHNldmVyZWx5IGxpbWl0aW5nIQotICAgICAgICAvLyAjIyMgLSBUYWcgYXR0cmlidXRlcyBzaG91bGQgYWxsb3cgZm9yIG5hbWVzcGFjZSBhd2FyZQotICAgICAgICBpbnQgaW5kZXggPSBhdHRyaWJ1dGVzLmdldEluZGV4KCIiLCBuYW1lKTsKLSAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMucmVtb3ZlQXR0cmlidXRlKGluZGV4KTsKLSAgICAgICAgfQotICAgICAgICAvLyB0cmVhdCBudWxsIHZhbHVlcyBhcyBubyBhdHRyaWJ1dGUKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKCIiLCBuYW1lLCBuYW1lLCAiQ0RBVEEiLCB2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVyaSgpIHsKLSAgICAgICAgcmV0dXJuIHVyaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcmkoU3RyaW5nIHVyaSkgewotICAgICAgICB0aGlzLnVyaSA9IHVyaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFFOYW1lKCkgewotICAgICAgICByZXR1cm4gcW5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UU5hbWUoU3RyaW5nIHFuYW1lKSB7Ci0gICAgICAgIHRoaXMucW5hbWUgPSBxbmFtZTsKLSAgICAgICAgaW50IGlkeCA9IHFuYW1lLmluZGV4T2YoJzonKTsKLSAgICAgICAgaWYgKGlkeCA+PSAwKSB7Ci0gICAgICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IHFuYW1lLnN1YnN0cmluZyhpZHggKyAxKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMubG9jYWxOYW1lID0gcW5hbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbE5hbWUoU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLSAgICAgICAgLy8gRklYTUUgVGhpcyBqdXN0IGRvZXNuJ3Qgc2VlbSByaWdodCBvciB3b3JrLi4uCi0gICAgICAgIGlmIChxbmFtZSA9PSBudWxsIHx8ICFxbmFtZS5lbmRzV2l0aChsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICBsb2NhbE5hbWUgPSBxbmFtZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL1N0YXRpY1RhZ1NjcmlwdC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2ltcGwvU3RhdGljVGFnU2NyaXB0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MGM1YzQuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2ltcGwvU3RhdGljVGFnU2NyaXB0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5EeW5hVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdMaWJyYXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogPHA+PGNvZGU+U3RhdGljVGFnU2NyaXB0PC9jb2RlPiBpcyBhIHNjcmlwdCB0aGF0IGV2YWx1YXRlcyBhIFN0YXRpY1RhZywgYSBwaWVjZSBvZiBzdGF0aWMgWE1MCi0gKiB0aG91Z2ggaXRzIGF0dHJpYnV0ZXMgb3IgZWxlbWVudCBjb250ZW50IG1heSBjb250YWluIGR5bmFtaWMgZXhwcmVzc2lvbnMuCi0gKiBUaGUgZmlyc3QgdGltZSB0aGlzIHRhZyBldmFsdWF0ZXMsIGl0IG1heSBoYXZlIGJlY29tZSBhIGR5bmFtaWMgdGFnLCBzbyBpdCB3aWxsIGNoZWNrIHRoYXQKLSAqIGEgbmV3IGR5bmFtaWMgdGFnIGhhcyBub3QgYmVlbiBnZW5lcmF0ZWQuPC9wPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS44ICQKLSAqLwotcHVibGljIGNsYXNzIFN0YXRpY1RhZ1NjcmlwdCBleHRlbmRzIFRhZ1NjcmlwdCB7Ci0KLSAgICBwdWJsaWMgU3RhdGljVGFnU2NyaXB0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTdGF0aWNUYWdTY3JpcHQoVGFnRmFjdG9yeSB0YWdGYWN0b3J5KSB7Ci0gICAgICAgIHN1cGVyKHRhZ0ZhY3RvcnkpOwotICAgIH0KLQotCi0gICAgLy8gU2NyaXB0IGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIHJ1bihKZWxseUNvbnRleHQgY29udGV4dCwgWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0YXJ0TmFtZXNwYWNlUHJlZml4ZXMob3V0cHV0KTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiY291bGQgbm90IHN0YXJ0IG5hbWVzcGFjZSBwcmVmaXhlcyIsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBUYWcgdGFnID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRhZyA9IGdldFRhZyhjb250ZXh0KTsKLQotICAgICAgICAgICAgLy8gbGV0cyBzZWUgaWYgd2UgaGF2ZSBhIGR5bmFtaWMgdGFnCi0gICAgICAgICAgICBpZiAodGFnIGluc3RhbmNlb2YgU3RhdGljVGFnKSB7Ci0gICAgICAgICAgICAgICAgdGFnID0gZmluZER5bmFtaWNUYWcoY29udGV4dCwgKFN0YXRpY1RhZykgdGFnKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0VGFnKHRhZyxjb250ZXh0KTsKLSAgICAgICAgfSBjYXRjaCAoSmVsbHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgVVJMIHJvb3RVUkwgPSBjb250ZXh0LmdldFJvb3RVUkwoKTsKLSAgICAgICAgVVJMIGN1cnJlbnRVUkwgPSBjb250ZXh0LmdldEN1cnJlbnRVUkwoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICggdGFnID09IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGFnLnNldENvbnRleHQoY29udGV4dCk7Ci0gICAgICAgICAgICBzZXRDb250ZXh0VVJMcyhjb250ZXh0KTsKLQotICAgICAgICAgICAgRHluYVRhZyBkeW5hVGFnID0gKER5bmFUYWcpIHRhZzsKLQotICAgICAgICAgICAgLy8gIyMjIHByb2JhYmx5IGNvbXBpbGluZyB0aGlzIHRvIDIgYXJyYXlzIG1pZ2h0IGJlIHF1aWNrZXIgYW5kIHNtYWxsZXIKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGF0dHJpYnV0ZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IChFeHByZXNzaW9uKSBlbnRyeS5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGlmICggRXhwcmVzc2lvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKCBkeW5hVGFnLmdldEF0dHJpYnV0ZVR5cGUobmFtZSkgKSApIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBleHByZXNzaW9uOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZXhwcmVzc2lvbi5ldmFsdWF0ZShjb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkeW5hVGFnLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRhZy5kb1RhZyhvdXRwdXQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChKZWxseVRhZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY29udGV4dC5zZXRDdXJyZW50VVJMKGN1cnJlbnRVUkwpOwotICAgICAgICAgICAgY29udGV4dC5zZXRSb290VVJMKHJvb3RVUkwpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGVuZE5hbWVzcGFjZVByZWZpeGVzKG91dHB1dCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oImNvdWxkIG5vdCBlbmQgbmFtZXNwYWNlIHByZWZpeGVzIixlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF0dGVtcHRzIHRvIGZpbmQgYSBkeW5hbWljYWxseSBjcmVhdGVkIHRhZyB0aGF0IGhhcyBiZWVuIGNyZWF0ZWQgc2luY2UgdGhpcwotICAgICAqIHNjcmlwdCB3YXMgY29tcGlsZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVGFnIGZpbmREeW5hbWljVGFnKEplbGx5Q29udGV4dCBjb250ZXh0LCBTdGF0aWNUYWcgdGFnKSB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotICAgICAgICAvLyBsZXRzIHNlZSBpZiB0aGVyZSdzIGEgdGFnIGxpYnJhcnkgZm9yIHRoaXMgVVJJLi4uCi0gICAgICAgIFRhZ0xpYnJhcnkgdGFnbGliID0gY29udGV4dC5nZXRUYWdMaWJyYXJ5KCB0YWcuZ2V0VXJpKCkgKTsKLSAgICAgICAgaWYgKCB0YWdsaWIgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIFRhZyBuZXdUYWcgPSB0YWdsaWIuY3JlYXRlVGFnKCB0YWcuZ2V0TG9jYWxOYW1lKCksIGdldFNheEF0dHJpYnV0ZXMoKSApOwotICAgICAgICAgICAgaWYgKCBuZXdUYWcgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICBuZXdUYWcuc2V0UGFyZW50KCB0YWcuZ2V0UGFyZW50KCkgKTsKLSAgICAgICAgICAgICAgICBuZXdUYWcuc2V0Qm9keSggdGFnLmdldEJvZHkoKSApOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXdUYWc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRhZzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9UYWdGYWN0b3J5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9UYWdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYjQ2MzUuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2ltcGwvVGFnRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotLyoqCi0gKiA8cD48Y29kZT5UYWdGYWN0b3J5PC9jb2RlPiByZXByZXNlbnRzIGEgRmFjdG9yeSBvZiB7QGxpbmsgVGFnfSBpbnN0YW5jZXMuPC9wPgotICoKLSAqIDxiPk5vdGU8L2I+IHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgcmUtZW50cmFudCBhbmQgdXNlZAotICogY29uY3VycmVudGx5IGJ5IG11bHRpcGxlIHRocmVhZHMuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjE2ICQKLSAqLwotcHVibGljIGludGVyZmFjZSBUYWdGYWN0b3J5IHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBUYWcgZm9yIHRoZSBnaXZlbiBsb2NhbCBuYW1lIGFuZCB0aGUgU0FYIGF0dHJpYnV0ZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgVGFnIGNyZWF0ZVRhZyhTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgSmVsbHlFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9UYWdMaWJyYXJ5UmVzb2x2ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL1RhZ0xpYnJhcnlSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGI3YmU3Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL1RhZ0xpYnJhcnlSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdMaWJyYXJ5OwotCi0KLS8qKgotICogPHA+PGNvZGU+VGFnTGlicmFyeVJlc29sdmVyPC9jb2RlPiByZXByZXNlbnRzIGFuIG9iamVjdCBjYXBhYmxlIG9mCi0gKiByZXNvbHZpbmcgYSBVUkkgdG8gYSBUYWdMaWJyYXJ5IGluc3RhbmNlLjwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTIgJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhZ0xpYnJhcnlSZXNvbHZlciB7Ci0KLSAgICAvKioKLSAgICAgKiBBdHRlbXB0cyB0byByZXNvbHZlIHRoZSBnaXZlbiBVUkkgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGEgVGFnTGlicmFyeQotICAgICAqIG90aGVyd2lzZSBudWxsIGlzIHJldHVybmVkIHRvIGluZGljYXRlIG5vIHRhZyBsaWJyYXJ5IGNvdWxkIGJlIGZvdW5kCi0gICAgICogc28gdGhhdCB0aGUgbmFtZXNwYWNlIFVSSSBzaG91bGQgYmUgdHJlYXRlZCBhcyBqdXN0IHZhbmlsbGEgWE1MLgotICAgICAqLwotICAgIHB1YmxpYyBUYWdMaWJyYXJ5IHJlc29sdmVUYWdMaWJyYXJ5KFN0cmluZyB1cmkpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL1RhZ1NjcmlwdC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2ltcGwvVGFnU2NyaXB0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MTYzZDYuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2ltcGwvVGFnU2NyaXB0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkNvbnZlcnRpbmdXcmFwRHluYUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5Db252ZXJ0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5EeW5hQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkR5bmFQcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5Db21waWxhYmxlVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuRHluYVRhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTG9jYXRpb25Bd2FyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTmFtZXNwYWNlQXdhcmVUYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlNjcmlwdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiA8cD48Y29kZT5UYWdTY3JpcHQ8L2NvZGU+IGlzIGEgU2NyaXB0IHRoYXQgZXZhbHVhdGVzIGEgY3VzdG9tIHRhZy48L3A+Ci0gKgotICogPGI+Tm90ZTwvYj4gdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSByZS1lbnRyYW50IGFuZCB1c2VkCi0gKiBjb25jdXJyZW50bHkgYnkgbXVsdGlwbGUgdGhyZWFkcy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNTAgJAotICovCi1wdWJsaWMgY2xhc3MgVGFnU2NyaXB0IGltcGxlbWVudHMgU2NyaXB0IHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUYWdTY3JpcHQuY2xhc3MpOwotCi0KLSAgICAvKiogVGhlIGF0dHJpYnV0ZSBleHByZXNzaW9ucyB0aGF0IGFyZSBjcmVhdGVkICovCi0gICAgcHJvdGVjdGVkIE1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgLyoqIHRoZSBvcHRpb25hbCBuYW1lc3BhY2VzIE1hcCBvZiBwcmVmaXggLT4gVVJJIG9mIHRoaXMgc2luZ2xlIFRhZyAqLwotICAgIHByaXZhdGUgTWFwIHRhZ05hbWVzcGFjZXNNYXA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgb3B0aW9uYWwgbmFtZXNwYWNlIGNvbnRleHQgbWFwcGluZyBhbGwgcHJlZml4ZXMgLT4gVVJJcyBpbiBzY29wZQotICAgICAqIGF0IHRoZSBwb2ludCB0aGlzIHRhZyBpcyB1c2VkLgotICAgICAqIFRoaXMgTWFwIGlzIG9ubHkgY3JlYXRlZCBsYXppbHkgaWYgaXQgaXMgcmVxdWlyZWQgYnkgdGhlIE5hbWVzcGFjZUF3YXJlVGFnLgotICAgICAqLwotICAgIHByaXZhdGUgTWFwIG5hbWVzcGFjZUNvbnRleHQ7Ci0KLSAgICAvKiogdGhlIEplbGx5IGZpbGUgd2hpY2ggY2F1c2VkIHRoZSBwcm9ibGVtICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWU7Ci0KLSAgICAvKiogdGhlIHF1YWxpZmllZCBlbGVtZW50IG5hbWUgd2hpY2ggY2F1c2VkIHRoZSBwcm9ibGVtICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZWxlbWVudE5hbWU7Ci0KLSAgICAvKiogdGhlIGxvY2FsIChub24tbmFtZXNwYWNlZCkgdGFnIG5hbWUgKi8KLSAgICBwcml2YXRlIFN0cmluZyBsb2NhbE5hbWU7Ci0KLSAgICAvKiogdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSB0YWcgKi8KLSAgICBwcml2YXRlIGludCBsaW5lTnVtYmVyID0gLTE7Ci0KLSAgICAvKiogdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIHRhZyAqLwotICAgIHByaXZhdGUgaW50IGNvbHVtbk51bWJlciA9IC0xOwotCi0gICAgLyoqIHRoZSBmYWN0b3J5IG9mIFRhZyBpbnN0YW5jZXMgKi8KLSAgICBwcml2YXRlIFRhZ0ZhY3RvcnkgdGFnRmFjdG9yeTsKLQotICAgIC8qKiB0aGUgYm9keSBzY3JpcHQgdXNlZCBmb3IgdGhpcyB0YWcgKi8KLSAgICBwcml2YXRlIFNjcmlwdCB0YWdCb2R5OwotCi0gICAgLyoqIHRoZSBwYXJlbnQgVGFnU2NyaXB0ICovCi0gICAgcHJpdmF0ZSBUYWdTY3JpcHQgcGFyZW50OwotCi0gICAgLyoqIHRoZSBTQVggYXR0cmlidXRlcyAqLwotICAgIHByaXZhdGUgQXR0cmlidXRlcyBzYXhBdHRyaWJ1dGVzOwotICAgIAotICAgIC8qKiB0aGUgdXJsIG9mIHRoZSBzY3JpcHQgd2hlbiBwYXJzZWQgKi8KLSAgICBwcml2YXRlIFVSTCBzY3JpcHRVUkwgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhIG5ldyBUYWdTY3JpcHQgYmFzZWQgb24gd2hldGhlcgotICAgICAqIHRoZSBnaXZlbiBUYWcgY2xhc3MgaXMgYSBiZWFuIHRhZyBvciBEeW5hVGFnCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUYWdTY3JpcHQgbmV3SW5zdGFuY2UoQ2xhc3MgdGFnQ2xhc3MpIHsKLSAgICAgICAgVGFnRmFjdG9yeSBmYWN0b3J5ID0gbmV3IERlZmF1bHRUYWdGYWN0b3J5KHRhZ0NsYXNzKTsKLSAgICAgICAgcmV0dXJuIG5ldyBUYWdTY3JpcHQoZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIFRhZ1NjcmlwdCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGFnU2NyaXB0KFRhZ0ZhY3RvcnkgdGFnRmFjdG9yeSkgewotICAgICAgICB0aGlzLnRhZ0ZhY3RvcnkgPSB0YWdGYWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIlt0YWc9IiArIGVsZW1lbnROYW1lICsgIjthdD0iICsgbGluZU51bWJlciArICI6IiArIGNvbHVtbk51bWJlciArICJdIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21waWxlcyB0aGUgdGFncyBib2R5Ci0gICAgICovCi0gICAgcHVibGljIFNjcmlwdCBjb21waWxlKCkgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRhZ0JvZHkgIT0gbnVsbCkgewotICAgICAgICAgICAgdGFnQm9keSA9IHRhZ0JvZHkuY29tcGlsZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG9wdGlvbmFsIG5hbWVzcGFjZXMgcHJlZml4IC0+IFVSSSBtYXAgb2YKLSAgICAgKiB0aGUgbmFtZXNwYWNlcyBhdHRhY2hlZCB0byB0aGlzIFRhZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhZ05hbWVzcGFjZXNNYXAoTWFwIHRhZ05hbWVzcGFjZXNNYXApIHsKLSAgICAgICAgLy8gbGV0cyBjaGVjayB0aGF0IHRoaXMgaXMgYSB0aHJlYWQtc2FmZSBtYXAKLSAgICAgICAgaWYgKCAhICh0YWdOYW1lc3BhY2VzTWFwIGluc3RhbmNlb2YgSGFzaHRhYmxlKSApIHsKLSAgICAgICAgICAgIHRhZ05hbWVzcGFjZXNNYXAgPSBuZXcgSGFzaHRhYmxlKCB0YWdOYW1lc3BhY2VzTWFwICk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy50YWdOYW1lc3BhY2VzTWFwID0gdGFnTmFtZXNwYWNlc01hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmVzIHRoaXMgVGFnU2NyaXB0IGZyb20gdGhlIFNBWCBMb2NhdG9yLCBzZXR0aW5nIHRoZSBjb2x1bW4KLSAgICAgKiBhbmQgbGluZSBudW1iZXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYXRvcihMb2NhdG9yIGxvY2F0b3IpIHsKLSAgICAgICAgc2V0TGluZU51bWJlciggbG9jYXRvci5nZXRMaW5lTnVtYmVyKCkgKTsKLSAgICAgICAgc2V0Q29sdW1uTnVtYmVyKCBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpICk7Ci0gICAgfQotCi0KLSAgICAvKiogQWRkIGFuIGluaXRpYWxpemF0aW9uIGF0dHJpYnV0ZSBmb3IgdGhlIHRhZy4KLSAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgc2V0VGFnKCkgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKFN0cmluZyBuYW1lLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImFkZGluZyBhdHRyaWJ1dGUgbmFtZTogIiArIG5hbWUgKyAiIGV4cHJlc3Npb246ICIgKyBleHByZXNzaW9uKTsKLSAgICAgICAgfQotICAgICAgICBhdHRyaWJ1dGVzLnB1dChuYW1lLCBleHByZXNzaW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpcHMgb2ZmIHRoZSBuYW1lIG9mIGEgc2NyaXB0IHRvIGNyZWF0ZSBhIG5ldyBjb250ZXh0IFVSTAotICAgICAqIEZJWE1FOiBDb3BpZWQgZnJvbSBKZWxseUNvbnRleHQKLSAgICAgKi8KLSAgICBwcml2YXRlIFVSTCBnZXRKZWxseUNvbnRleHRVUkwoVVJMIHVybCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gdXJsLnRvU3RyaW5nKCk7Ci0gICAgICAgIGludCBpZHggPSB0ZXh0Lmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBpZHggKyAxKTsKLSAgICAgICAgcmV0dXJuIG5ldyBVUkwodGV4dCk7Ci0gICAgfQotCi0gICAgLy8gU2NyaXB0IGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqIEV2YWx1YXRlcyB0aGUgYm9keSBvZiBhIHRhZyAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bihKZWxseUNvbnRleHQgY29udGV4dCwgWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgVVJMIHJvb3RVUkwgPSBjb250ZXh0LmdldFJvb3RVUkwoKTsKLSAgICAgICAgVVJMIGN1cnJlbnRVUkwgPSBjb250ZXh0LmdldEN1cnJlbnRVUkwoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFRhZyB0YWcgPSBnZXRUYWcoY29udGV4dCk7Ci0gICAgICAgICAgICBpZiAoIHRhZyA9PSBudWxsICkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRhZy5zZXRDb250ZXh0KGNvbnRleHQpOwotICAgICAgICAgICAgc2V0Q29udGV4dFVSTHMoY29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmICggdGFnIGluc3RhbmNlb2YgRHluYVRhZyApIHsKLSAgICAgICAgICAgICAgICBEeW5hVGFnIGR5bmFUYWcgPSAoRHluYVRhZykgdGFnOwotCi0gICAgICAgICAgICAgICAgLy8gIyMjIHByb2JhYmx5IGNvbXBpbGluZyB0aGlzIHRvIDIgYXJyYXlzIG1pZ2h0IGJlIHF1aWNrZXIgYW5kIHNtYWxsZXIKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSAoRXhwcmVzc2lvbikgZW50cnkuZ2V0VmFsdWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBDbGFzcyB0eXBlID0gZHluYVRhZy5nZXRBdHRyaWJ1dGVUeXBlKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsICYmIHR5cGUuaXNBc3NpZ25hYmxlRnJvbShFeHByZXNzaW9uLmNsYXNzKSAmJiAhdHlwZS5pc0Fzc2lnbmFibGVGcm9tKE9iamVjdC5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZXhwcmVzc2lvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZXhwcmVzc2lvbi5ldmFsdWF0ZVJlY3Vyc2UoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZHluYVRhZy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHRyZWF0IHRoZSB0YWcgYXMgYSBiZWFuCi0gICAgICAgICAgICAgICAgRHluYUJlYW4gZHluYUJlYW4gPSBuZXcgQ29udmVydGluZ1dyYXBEeW5hQmVhbiggdGFnICk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gKEV4cHJlc3Npb24pIGVudHJ5LmdldFZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgRHluYVByb3BlcnR5IHByb3BlcnR5ID0gZHluYUJlYW4uZ2V0RHluYUNsYXNzKCkuZ2V0RHluYVByb3BlcnR5KG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5RXhjZXB0aW9uKCJUaGlzIHRhZyBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoZSAnIiArIG5hbWUgKyAiJyBhdHRyaWJ1dGUiICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IHByb3BlcnR5LmdldFR5cGUoKTsKLQotICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0Fzc2lnbmFibGVGcm9tKEV4cHJlc3Npb24uY2xhc3MpICYmICF0eXBlLmlzQXNzaWduYWJsZUZyb20oT2JqZWN0LmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBleHByZXNzaW9uOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBleHByZXNzaW9uLmV2YWx1YXRlUmVjdXJzZShjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkeW5hQmVhbi5zZXQobmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGFnLmRvVGFnKG91dHB1dCk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXQuZmx1c2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSmVsbHlUYWdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChKZWxseUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEVycm9yIGUpIHsKLSAgICAgICAgICAgLyoKLSAgICAgICAgICAgICogTm90IHN1cmUgaWYgd2Ugc2hvdWxkIGJlIGNvbnZlcnRpbmcgZXJyb3JzIHRvIGV4Y2VwdGlvbnMsCi0gICAgICAgICAgICAqIGJ1dCBub3QgdHJpdmlhbCB0byByZW1vdmUgYmVjYXVzZSBKVW5pdCB0YWdzIHRocm93Ci0gICAgICAgICAgICAqIEVycm9ycyBpbiB0aGUgbm9ybWFsIGNvdXJzZSBvZiBvcGVyYXRpb24uICBIbW0uLi4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFJvb3RVUkwocm9vdFVSTCk7Ci0gICAgICAgICAgICBjb250ZXh0LnNldEN1cnJlbnRVUkwoY3VycmVudFVSTCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY29udGV4dCdzIHJvb3QgYW5kIGN1cnJlbnQgVVJMIGlmIG5vdCBwcmVzZW50Ci0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiBAdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0Q29udGV4dFVSTHMoSmVsbHlDb250ZXh0IGNvbnRleHQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICgoY29udGV4dC5nZXRDdXJyZW50VVJMKCkgPT0gbnVsbCB8fCBjb250ZXh0LmdldFJvb3RVUkwoKSA9PSBudWxsKSAmJiBzY3JpcHRVUkwgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0Um9vdFVSTCgpID09IG51bGwpIGNvbnRleHQuc2V0Um9vdFVSTChzY3JpcHRVUkwpOwotICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0Q3VycmVudFVSTCgpID09IG51bGwpIGNvbnRleHQuc2V0Q3VycmVudFVSTChzY3JpcHRVUkwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgdGFnIHRvIGJlIGV2YWx1YXRlZCwgY3JlYXRpbmcgaXQgbGF6aWx5IGlmIHJlcXVpcmVkLgotICAgICAqLwotICAgIHB1YmxpYyBUYWcgZ2V0VGFnKEplbGx5Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotICAgICAgICBUYWcgdGFnID0gKFRhZykgY29udGV4dC5nZXRUaHJlYWRTY3JpcHREYXRhKHRoaXMpOwotICAgICAgICBpZiAoIHRhZyA9PSBudWxsICkgewotICAgICAgICAgICAgdGFnID0gY3JlYXRlVGFnKCk7Ci0gICAgICAgICAgICBpZiAoIHRhZyAhPSBudWxsICkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0VGhyZWFkU2NyaXB0RGF0YSh0aGlzLHRhZyk7Ci0gICAgICAgICAgICAgICAgY29uZmlndXJlVGFnKHRhZyxjb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGFnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEZhY3Rvcnkgb2YgVGFnIGluc3RhbmNlcy4KLSAgICAgKiBAcmV0dXJuIHRoZSBmYWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIFRhZ0ZhY3RvcnkgZ2V0VGFnRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIHRhZ0ZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgRmFjdG9yeSBvZiBUYWcgaW5zdGFuY2VzLgotICAgICAqIEBwYXJhbSB0YWdGYWN0b3J5IFRoZSBmYWN0b3J5IHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhZ0ZhY3RvcnkoVGFnRmFjdG9yeSB0YWdGYWN0b3J5KSB7Ci0gICAgICAgIHRoaXMudGFnRmFjdG9yeSA9IHRhZ0ZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGFyZW50LgotICAgICAqIEByZXR1cm4gVGFnU2NyaXB0Ci0gICAgICovCi0gICAgcHVibGljIFRhZ1NjcmlwdCBnZXRQYXJlbnQoKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGFnQm9keS4KLSAgICAgKiBAcmV0dXJuIFNjcmlwdAotICAgICAqLwotICAgIHB1YmxpYyBTY3JpcHQgZ2V0VGFnQm9keSgpIHsKLSAgICAgICAgcmV0dXJuIHRhZ0JvZHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcGFyZW50LgotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoVGFnU2NyaXB0IHBhcmVudCkgewotICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0YWdCb2R5LgotICAgICAqIEBwYXJhbSB0YWdCb2R5IFRoZSB0YWdCb2R5IHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhZ0JvZHkoU2NyaXB0IHRhZ0JvZHkpIHsKLSAgICAgICAgdGhpcy50YWdCb2R5ID0gdGFnQm9keTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBKZWxseSBmaWxlIHdoaWNoIGNhdXNlZCB0aGUgcHJvYmxlbQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBKZWxseSBmaWxlIHdoaWNoIGNhdXNlZCB0aGUgcHJvYmxlbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgewotICAgICAgICB0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnNjcmlwdFVSTCA9IGdldEplbGx5Q29udGV4dFVSTChuZXcgVVJMKGZpbGVOYW1lKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImVycm9yIHNldHRpbmcgc2NyaXB0IHVybCIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IG5hbWUgd2hpY2ggY2F1c2VkIHRoZSBwcm9ibGVtCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGVsZW1lbnQgbmFtZSB3aGljaCBjYXVzZWQgdGhlIHByb2JsZW0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50TmFtZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgdGFnCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gbGluZU51bWJlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgdGFnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGluZU51bWJlcihpbnQgbGluZU51bWJlcikgewotICAgICAgICB0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIHRhZwotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gY29sdW1uTnVtYmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIHRhZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbk51bWJlcihpbnQgY29sdW1uTnVtYmVyKSB7Ci0gICAgICAgIHRoaXMuY29sdW1uTnVtYmVyID0gY29sdW1uTnVtYmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFNBWCBhdHRyaWJ1dGVzIG9mIHRoaXMgdGFnCi0gICAgICogQHJldHVybiBBdHRyaWJ1dGVzCi0gICAgICovCi0gICAgcHVibGljIEF0dHJpYnV0ZXMgZ2V0U2F4QXR0cmlidXRlcygpIHsKLSAgICAgICAgcmV0dXJuIHNheEF0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgU0FYIGF0dHJpYnV0ZXMgb2YgdGhpcyB0YWcKLSAgICAgKiBAcGFyYW0gc2F4QXR0cmlidXRlcyBUaGUgc2F4QXR0cmlidXRlcyB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTYXhBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMgc2F4QXR0cmlidXRlcykgewotICAgICAgICB0aGlzLnNheEF0dHJpYnV0ZXMgPSBzYXhBdHRyaWJ1dGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxvY2FsLCBub24gbmFtZXNwYWNlZCBYTUwgbmFtZSBvZiB0aGlzIHRhZwotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBsb2NhbE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbG9jYWwsIG5vbiBuYW1lc3BhY2VkIG5hbWUgb2YgdGhpcyB0YWcuCi0gICAgICogQHBhcmFtIGxvY2FsTmFtZSBUaGUgbG9jYWxOYW1lIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvY2FsTmFtZShTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIGNvbnRleHQgb2YgdGhpcyB0YWcuIFRoaXMgaXMgYWxsIHRoZSBwcmVmaXhlcwotICAgICAqIGluIHNjb3BlIGluIHRoZSBkb2N1bWVudCB3aGVyZSB0aGlzIHRhZyBpcyB1c2VkIHdoaWNoIGFyZSBtYXBwZWQgdG8KLSAgICAgKiB0aGVpciBuYW1lc3BhY2UgVVJJcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBNYXAgd2l0aCB0aGUga2V5cyBhcmUgbmFtZXNwYWNlIHByZWZpeGVzIGFuZCB0aGUgdmFsdWVzIGFyZQotICAgICAqIG5hbWVzcGFjZSBVUklzLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTWFwIGdldE5hbWVzcGFjZUNvbnRleHQoKSB7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbnRleHQgPSBnZXRQYXJlbnQoKS5nZXROYW1lc3BhY2VDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRhZ05hbWVzcGFjZXNNYXAgIT0gbnVsbCAmJiAhdGFnTmFtZXNwYWNlc01hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGNoaWxkIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgSGFzaHRhYmxlIG5ld0NvbnRleHQgPSBuZXcgSGFzaHRhYmxlKG5hbWVzcGFjZUNvbnRleHQuc2l6ZSgpKzEpOwotICAgICAgICAgICAgICAgICAgICBuZXdDb250ZXh0LnB1dEFsbChuYW1lc3BhY2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgbmV3Q29udGV4dC5wdXRBbGwodGFnTmFtZXNwYWNlc01hcCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbnRleHQgPSBuZXdDb250ZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbnRleHQgPSB0YWdOYW1lc3BhY2VzTWFwOwotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29udGV4dCA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZUNvbnRleHQ7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFRhZyBpbnN0YW5jZS4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyB0byBkZWxlZ2F0ZSB0byB0aGUgVGFnRmFjdG9yeQotICAgICAqLwotICAgIHByb3RlY3RlZCBUYWcgY3JlYXRlVGFnKCkgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCB0YWdGYWN0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0YWdGYWN0b3J5LmNyZWF0ZVRhZyhsb2NhbE5hbWUsIGdldFNheEF0dHJpYnV0ZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0JCi0gICAgLyoqCi0gICAgICogQ29tcGlsZXMgYSBuZXdseSBjcmVhdGVkIHRhZyBpZiByZXF1aXJlZCwgc2V0cyBpdHMgcGFyZW50IGFuZCBib2R5LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVRhZyhUYWcgdGFnLCBKZWxseUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRhZyBpbnN0YW5jZW9mIENvbXBpbGFibGVUYWcpIHsKLSAgICAgICAgICAgICgoQ29tcGlsYWJsZVRhZykgdGFnKS5jb21waWxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgVGFnIHBhcmVudFRhZyA9IG51bGw7Ci0gICAgICAgIGlmICggcGFyZW50ICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBwYXJlbnRUYWcgPSBwYXJlbnQuZ2V0VGFnKGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIHRhZy5zZXRQYXJlbnQoIHBhcmVudFRhZyApOwotICAgICAgICB0YWcuc2V0Qm9keSggdGFnQm9keSApOwotCi0gICAgICAgIGlmICh0YWcgaW5zdGFuY2VvZiBOYW1lc3BhY2VBd2FyZVRhZykgewotICAgICAgICAgICAgTmFtZXNwYWNlQXdhcmVUYWcgbmFUYWcgPSAoTmFtZXNwYWNlQXdhcmVUYWcpIHRhZzsKLSAgICAgICAgICAgIG5hVGFnLnNldE5hbWVzcGFjZUNvbnRleHQoZ2V0TmFtZXNwYWNlQ29udGV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGFnIGluc3RhbmNlb2YgTG9jYXRpb25Bd2FyZSkgewotICAgICAgICAgICAgYXBwbHlMb2NhdGlvbigoTG9jYXRpb25Bd2FyZSkgdGFnKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQWxsb3dzIHRoZSBzY3JpcHQgdG8gc2V0IHRoZSB0YWcgaW5zdGFuY2UgdG8gYmUgdXNlZCwgc3VjaCBhcyBpbiBhIFN0YXRpY1RhZ1NjcmlwdAotICAgICAqIHdoZW4gYSBTdGF0aWNUYWcgaXMgc3dpdGNoZWQgd2l0aCBhIER5bmFtaWNUYWcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRUYWcoVGFnIHRhZywgSmVsbHlDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgY29udGV4dC5zZXRUaHJlYWRTY3JpcHREYXRhKHRoaXMsdGFnKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdXRwdXQgdGhlIG5ldyBuYW1lc3BhY2UgcHJlZml4ZXMgdXNlZCBmb3IgdGhpcyBlbGVtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc3RhcnROYW1lc3BhY2VQcmVmaXhlcyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCB0YWdOYW1lc3BhY2VzTWFwICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBmb3IgKCBJdGVyYXRvciBpdGVyID0gdGFnTmFtZXNwYWNlc01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0LnN0YXJ0UHJlZml4TWFwcGluZyhwcmVmaXgsIHVyaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmQgdGhlIG5ldyBuYW1lc3BhY2UgcHJlZml4ZXMgbWFwcGVkIGZvciB0aGUgY3VycmVudCBlbGVtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZW5kTmFtZXNwYWNlUHJlZml4ZXMoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICggdGFnTmFtZXNwYWNlc01hcCAhPSBudWxsICkgewotICAgICAgICAgICAgZm9yICggSXRlcmF0b3IgaXRlciA9IHRhZ05hbWVzcGFjZXNNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBvdXRwdXQuZW5kUHJlZml4TWFwcGluZyhwcmVmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSByZXF1aXJlZCB0eXBlLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGlzIHRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQuIFRoaXMgd2lsbCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSByZXF1aXJlZFR5cGUgdGhlIHR5cGUgdGhhdCB0aGUgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0bwotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgY29udmVydFR5cGUoT2JqZWN0IHZhbHVlLCBDbGFzcyByZXF1aXJlZFR5cGUpCi0gICAgICAgIHRocm93cyBKZWxseUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChyZXF1aXJlZFR5cGUuaXNJbnN0YW5jZSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIHJldHVybiBDb252ZXJ0VXRpbHMuY29udmVydCgoU3RyaW5nKSB2YWx1ZSwgcmVxdWlyZWRUeXBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBKZWxseSBleGNlcHRpb24sIGFkb3JuaW5nIGl0IHdpdGggbG9jYXRpb24gaW5mb3JtYXRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSmVsbHlFeGNlcHRpb24gY3JlYXRlSmVsbHlFeGNlcHRpb24oU3RyaW5nIHJlYXNvbikgewotICAgICAgICByZXR1cm4gbmV3IEplbGx5RXhjZXB0aW9uKAotICAgICAgICAgICAgcmVhc29uLCBmaWxlTmFtZSwgZWxlbWVudE5hbWUsIGNvbHVtbk51bWJlciwgbGluZU51bWJlcgotICAgICAgICApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgSmVsbHkgZXhjZXB0aW9uLCBhZG9ybmluZyBpdCB3aXRoIGxvY2F0aW9uIGluZm9ybWF0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEplbGx5RXhjZXB0aW9uIGNyZWF0ZUplbGx5RXhjZXB0aW9uKFN0cmluZyByZWFzb24sIEV4Y2VwdGlvbiBjYXVzZSkgewotICAgICAgICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBKZWxseUV4Y2VwdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIChKZWxseUV4Y2VwdGlvbikgY2F1c2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEplbGx5RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIHJlYXNvbiwKLSAgICAgICAgICAgICAgICAoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIGNhdXNlKS5nZXRUYXJnZXRFeGNlcHRpb24oKSwKLSAgICAgICAgICAgICAgICBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSwKLSAgICAgICAgICAgICAgICBjb2x1bW5OdW1iZXIsCi0gICAgICAgICAgICAgICAgbGluZU51bWJlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBKZWxseUV4Y2VwdGlvbigKLSAgICAgICAgICAgIHJlYXNvbiwgY2F1c2UsIGZpbGVOYW1lLCBlbGVtZW50TmFtZSwgY29sdW1uTnVtYmVyLCBsaW5lTnVtYmVyCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBoZWxwZXIgbWV0aG9kIHRvIGhhbmRsZSB0aGlzIEplbGx5IGV4Y2VwdGlvbi4KLSAgICAgKiBUaGlzIG1ldGhvZCBhZG9ybnMgdGhlIEplbGx5RXhjZXB0aW9uIHdpdGggbG9jYXRpb24gaW5mb3JtYXRpb24KLSAgICAgKiBzdWNoIGFzIGFkZGluZyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBldGMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXhjZXB0aW9uKEplbGx5VGFnRXhjZXB0aW9uIGUpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKCAiQ2F1Z2h0IGV4Y2VwdGlvbjogIiArIGUsIGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFwcGx5TG9jYXRpb24oZSk7Ci0KLSAgICAgICAgdGhyb3cgZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGhlbHBlciBtZXRob2QgdG8gaGFuZGxlIHRoaXMgSmVsbHkgZXhjZXB0aW9uLgotICAgICAqIFRoaXMgbWV0aG9kIGFkb3JucyB0aGUgSmVsbHlFeGNlcHRpb24gd2l0aCBsb2NhdGlvbiBpbmZvcm1hdGlvbgotICAgICAqIHN1Y2ggYXMgYWRkaW5nIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGV0Yy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFeGNlcHRpb24oSmVsbHlFeGNlcHRpb24gZSkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UoICJDYXVnaHQgZXhjZXB0aW9uOiAiICsgZSwgZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgYXBwbHlMb2NhdGlvbihlKTsKLQotICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlMb2NhdGlvbihMb2NhdGlvbkF3YXJlIGxvY2F0aW9uQXdhcmUpIHsKLSAgICAgICAgaWYgKGxvY2F0aW9uQXdhcmUuZ2V0TGluZU51bWJlcigpID09IC0xKSB7Ci0gICAgICAgICAgICBsb2NhdGlvbkF3YXJlLnNldENvbHVtbk51bWJlcihjb2x1bW5OdW1iZXIpOwotICAgICAgICAgICAgbG9jYXRpb25Bd2FyZS5zZXRMaW5lTnVtYmVyKGxpbmVOdW1iZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICggbG9jYXRpb25Bd2FyZS5nZXRGaWxlTmFtZSgpID09IG51bGwgKSB7Ci0gICAgICAgICAgICBsb2NhdGlvbkF3YXJlLnNldEZpbGVOYW1lKCBmaWxlTmFtZSApOwotICAgICAgICB9Ci0gICAgICAgIGlmICggbG9jYXRpb25Bd2FyZS5nZXRFbGVtZW50TmFtZSgpID09IG51bGwgKSB7Ci0gICAgICAgICAgICBsb2NhdGlvbkF3YXJlLnNldEVsZW1lbnROYW1lKCBlbGVtZW50TmFtZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBoZWxwZXIgbWV0aG9kIHRvIGhhbmRsZSB0aGlzIG5vbi1KZWxseSBleGNlcHRpb24uCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXRocm93IHRoZSBleGNlcHRpb24sIHdyYXBwZWQgaW4gYSBKZWxseUV4Y2VwdGlvbgotICAgICAqIHdoaWxlIGFkZGluZyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBldGMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZSggIkNhdWdodCBleGNlcHRpb246ICIgKyBlLCBlICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIExvY2F0aW9uQXdhcmUpIHsKLSAgICAgICAgICAgIGFwcGx5TG9jYXRpb24oKExvY2F0aW9uQXdhcmUpIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBlIGluc3RhbmNlb2YgSmVsbHlFeGNlcHRpb24gKSB7Ci0gICAgICAgICAgICBlLmZpbGxJblN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKWUpLmdldFRhcmdldEV4Y2VwdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlciApOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUsIGZpbGVOYW1lLCBlbGVtZW50TmFtZSwgY29sdW1uTnVtYmVyLCBsaW5lTnVtYmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGhlbHBlciBtZXRob2QgdG8gaGFuZGxlIHRoaXMgbm9uLUplbGx5IGV4Y2VwdGlvbi4KLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldGhyb3cgdGhlIGV4Y2VwdGlvbiwgd3JhcHBlZCBpbiBhIEplbGx5RXhjZXB0aW9uCi0gICAgICogd2hpbGUgYWRkaW5nIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGV0Yy4KLSAgICAgKgotICAgICAqIElzIHRoaXMgbWV0aG9kIHdpc2U/Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXhjZXB0aW9uKEVycm9yIGUpIHRocm93cyBFcnJvciwgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZSggIkNhdWdodCBleGNlcHRpb246ICIgKyBlLCBlICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIExvY2F0aW9uQXdhcmUpIHsKLSAgICAgICAgICAgIGFwcGx5TG9jYXRpb24oKExvY2F0aW9uQXdhcmUpIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUsIGZpbGVOYW1lLCBlbGVtZW50TmFtZSwgY29sdW1uTnVtYmVyLCBsaW5lTnVtYmVyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9UZXh0U2NyaXB0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9UZXh0U2NyaXB0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMzA3ZDMuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2ltcGwvVGV4dFNjcmlwdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuU2NyaXB0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKiA8cD48Y29kZT5UZXh0U2NyaXB0PC9jb2RlPiBvdXRwdXRzIHNvbWUgc3RhdGljIHRleHQuPC9wPgotICAqCi0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xNyAkCi0gICovCi1wdWJsaWMgY2xhc3MgVGV4dFNjcmlwdCBpbXBsZW1lbnRzIFNjcmlwdCB7Ci0KLSAgICAvKiogdGhlIHRleHQgb3V0cHV0IGJ5IHRoaXMgc2NyaXB0ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQotICAgIHB1YmxpYyBUZXh0U2NyaXB0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBUZXh0U2NyaXB0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiW3RleHQ9IiArIHRleHQgKyAiXSI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJpbXMgd2hpdGVzcGFjZSBmcm9tIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSB0ZXh0IGluIHRoaXMgc2NyaXB0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdHJpbVdoaXRlc3BhY2UoKSB7Ci0gICAgICAgIHRoaXMudGV4dCA9IHRleHQudHJpbSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyaW1zIHdoaXRlc3BhY2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0cmltU3RhcnRXaGl0ZXNwYWNlKCkgewotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICBmb3IgKCBpbnQgbGVuZ3RoID0gdGV4dC5sZW5ndGgoKTsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gdGV4dC5jaGFyQXQoaW5kZXgpOwotICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICggaW5kZXggPiAwICkgewotICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGV4dC5zdWJzdHJpbmcoaW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJpbXMgd2hpdGVzcGFjZSBmcm9tIHRoZSBlbmQgb2YgdGhlIHRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0cmltRW5kV2hpdGVzcGFjZSgpIHsKLSAgICAgICAgaW50IGluZGV4ID0gdGV4dC5sZW5ndGgoKTsKLSAgICAgICAgd2hpbGUgKC0taW5kZXggPj0gMCkgewotICAgICAgICAgICAgY2hhciBjaCA9IHRleHQuY2hhckF0KGluZGV4KTsKLSAgICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbmRleCsrOwotICAgICAgICBpZiAoIGluZGV4IDwgdGV4dC5sZW5ndGgoKSApIHsKLSAgICAgICAgICAgIHRoaXMudGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsaW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gdGhlIHRleHQgb3V0cHV0IGJ5IHRoaXMgc2NyaXB0ICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyB0aGUgdGV4dCBvdXRwdXQgYnkgdGhpcyBzY3JpcHQgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7Ci0gICAgfQotCi0gICAgLy8gU2NyaXB0IGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBTY3JpcHQgY29tcGlsZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqIEV2YWx1YXRlcyB0aGUgYm9keSBvZiBhIHRhZyAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bihKZWxseUNvbnRleHQgY29udGV4dCwgWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCB0ZXh0ICE9IG51bGwgKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICBvdXRwdXQud3JpdGUodGV4dCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiY291bGQgbm90IHdyaXRlIHRvIFhNTE91dHB1dCIsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9wYWNrYWdlLmh0bWwgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YWZkMmIuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2ltcGwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTwvaGVhZD4KLTxib2R5PgotCi0gIDxwPkNvcmUgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBmb3IgSmVsbHkuCi0gIDwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2plbGx5LnByb3BlcnRpZXMgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvamVsbHkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlYmM0ZS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvamVsbHkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jIAotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIHJlZ2lzdGVyIHRoZSBkZWZhdWx0IHRhZyBsaWJyYXJpZXMgd2l0aCBhbiBhYmJyZXZpYXRlZCBuYW1lCi1jb3JlICAgICAgICA9IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmUuQ29yZVRhZ0xpYnJhcnkKLQotIyBvcHRpb25hbCB0YWdsaWJzCi1hbnQgICAgICAgICA9IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmFudC5BbnRUYWdMaWJyYXJ5Ci1hbnRsciAgICAgICA9IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmFudGxyLkFudGxyVGFnTGlicmFyeQotYmVhbiAgICAgICAgPSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5iZWFuLkJlYW5UYWdMaWJyYXJ5Ci1iZWFuc2hlbGwgICA9IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmJlYW5zaGVsbC5CZWFuU2hlbGxUYWdMaWJyYXJ5Ci1iZXR3aXh0ICAgICA9IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmJldHdpeHQuQmV0d2l4dFRhZ0xpYnJhcnkKLWJzZiAgICAgICAgID0gb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYnNmLkJTRlRhZ0xpYnJhcnkKLWRlZmluZSAgICAgID0gb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZGVmaW5lLkRlZmluZVRhZ0xpYnJhcnkKLWR5bmFiZWFuICAgID0gb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuZHluYWJlYW4uRHluYWJlYW5UYWdMaWJyYXJ5Ci1lbWFpbCAgICAgICA9IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmVtYWlsLkVtYWlsVGFnTGlicmFyeQotZm10ICAgICAgICAgPSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5mbXQuRm10VGFnTGlicmFyeQotaHRtbCAgICAgICAgPSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5odG1sLkhUTUxUYWdMaWJyYXJ5Ci1odHRwICAgICAgICA9IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmh0dHAuSHR0cFRhZ0xpYnJhcnkKLWludGVyYWN0aW9uID0gb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25UYWdMaWJyYXJ5Ci1qYXZhc2NyaXB0ICA9IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmJzZi5KYXZhU2NyaXB0VGFnTGlicmFyeQotamZhY2UgICAgICAgPSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qZmFjZS5KRmFjZVRhZ0xpYnJhcnkKLWpldHR5ICAgICAgID0gb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuamV0dHkuSmV0dHlUYWdMaWJyYXJ5Ci1qbXMgICAgICAgICA9IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmptcy5KTVNUYWdMaWJyYXJ5Ci1qbXggICAgICAgICA9IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmpteC5KTVhUYWdMaWJyYXJ5Ci1qcHl0aG9uICAgICA9IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmJzZi5KUHl0aG9uVGFnTGlicmFyeQotanl0aG9uICAgICAgPSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5ic2YuSnl0aG9uVGFnTGlicmFyeQotanNsICAgICAgICAgPSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qc2wuSlNMVGFnTGlicmFyeQotanVuaXQgICAgICAgPSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qdW5pdC5KVW5pdFRhZ0xpYnJhcnkKLWxvZyAgICAgICAgID0gb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MubG9nLkxvZ1RhZ0xpYnJhcnkKLW9qYiAgICAgICAgID0gb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3Mub2piLk9qYlRhZ0xpYnJhcnkKLXBudXRzICAgICAgID0gb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuYnNmLlBOdXRzVGFnTGlicmFyeQotcXVhcnR6ICAgICAgPSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5xdWFydHouUXVhcnR6VGFnTGlicmFyeQotcmVnZXhwICAgICAgPSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5yZWdleHAuUmVnZXhwVGFnTGlicmFyeQotc29hcCAgICAgICAgPSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zb2FwLlNvYXBUYWdMaWJyYXJ5Ci1zcWwgICAgICAgICA9IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnNxbC5TcWxUYWdMaWJyYXJ5Ci1zd2luZyAgICAgICA9IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnN3aW5nLlN3aW5nVGFnTGlicmFyeQotc3d0ICAgICAgICAgPSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5zd3QuU3d0VGFnTGlicmFyeQotdGhyZWFkcyAgICAgPSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy50aHJlYWRzLlRocmVhZHNUYWdMaWJyYXJ5Ci11dGlsICAgICAgICA9IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnV0aWwuVXRpbFRhZ0xpYnJhcnkKLXZhbGlkYXRlICAgID0gb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MudmFsaWRhdGUuVmFsaWRhdGVUYWdMaWJyYXJ5Ci12ZWxvY2l0eSAgICA9IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLnZlbG9jaXR5LlZlbG9jaXR5VGFnTGlicmFyeQoteG1sICAgICAgICAgPSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy54bWwuWE1MVGFnTGlicmFyeQoteG1sdW5pdCAgICAgPSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy54bWx1bml0LlhNTFVuaXRUYWdMaWJyYXJ5CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvcGFja2FnZS5odG1sIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE4YzFjNC4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTwvaGVhZD4KLTxib2R5PgotCi0gIDxwPlRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgbWFpbiBqZWxseSBBUEkgY2xhc3Nlcy4gRGV2ZWxvcGVycyB3cml0aW5nIHRhZ3Mgc2hvdWxkIHVzZSB0aGlzIHBhY2thZ2UuCi0gIDwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9wYXJzZXIvRGVmYXVsdE5hbWVzcGFjZUZpbHRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3BhcnNlci9EZWZhdWx0TmFtZXNwYWNlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NjY3ZTQuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3BhcnNlci9EZWZhdWx0TmFtZXNwYWNlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkucGFyc2VyOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MRmlsdGVySW1wbDsKLQotLyoqCi0gKiBYTUxGaWx0ZXIgdGhhdCBjYW4gcHJvdmlkZSBhIGRlZmF1bHQgbmFtZXNwYWNlIHdoZW4KLSAqIG9uZSBoYXMgbm90IGJlZW4gZGVjbGFyZWQgYnkgdGhlIFhNTCBkb2N1bWVudC4gIE5vdGU6Ci0gKiB0aGlzIGNsYXNzIGRvZXMgbm90IGFkZHJlc3MgdGhlIG5hbWVzcGFjZSBvZiBhdHRyaWJ1dGVzLgotICoKLSAqIEBhdXRob3IgTW9yZ2FuIERlbGFncmFuZ2UKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHROYW1lc3BhY2VGaWx0ZXIgZXh0ZW5kcyBYTUxGaWx0ZXJJbXBsIHsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgdXJpRGVmYXVsdCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBGaWx0ZXIgZm9yIHVuZGVmaW5lZCBhbiB1bmRlZmluZWQgbmFtZXNwYWNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVmYXVsdE5hbWVzcGFjZQotICAgICAqICAgICAgICAgICAgICAgdXJpIGZvciB0aGUgamVsbHkgbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHJlYWRlciBYTUxSZWFkZXIgdG8gZmlsdGVyCi0gICAgICovCi0gICAgcHVibGljIERlZmF1bHROYW1lc3BhY2VGaWx0ZXIoU3RyaW5nIGRlZmF1bHROYW1lc3BhY2UsIFhNTFJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgc3VwZXIocmVhZGVyKTsKLSAgICAgICAgdGhpcy51cmlEZWZhdWx0ID0gZGVmYXVsdE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGwgaW5jb21pbmcgZW1wdHkgVVJJcyB3aWxsIGJlIHJlbWFwcGVkIHRvIHRoZSBkZWZhdWx0LgotICAgICAqCi0gICAgICogQHBhcmFtIHByZWZpeCBpbmNvbWluZyBwcmVmaXgKLSAgICAgKiBAcGFyYW0gdXJpICAgIFVSSSB0byBjaGVjayBhbmQgcG90ZW50aWFsbHkgcmVwbGFjZQotICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRQcmVmaXhNYXBwaW5nKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHVyaSkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAodXJpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHN1cGVyLnN0YXJ0UHJlZml4TWFwcGluZyhwcmVmaXgsdGhpcy51cmlEZWZhdWx0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN1cGVyLnN0YXJ0UHJlZml4TWFwcGluZyhwcmVmaXgsdXJpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsbCBpbmNvbWluZyBlbXB0eSBVUklzIHdpbGwgYmUgcmVtYXBwZWQgdG8gdGhlIGRlZmF1bHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJpICAgICAgIFVSSSB0byBjaGVjayBhbmQgcG90ZW50aWFsbHkgcmVwbGFjZQotICAgICAqIEBwYXJhbSBsb2NhbE5hbWUKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKiBAcGFyYW0gYXR0cwotICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcgdXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGxvY2FsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBxTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRzKQotICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0gICAgICAgIGlmICh1cmkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KHRoaXMudXJpRGVmYXVsdCxsb2NhbE5hbWUscU5hbWUsYXR0cyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdXBlci5zdGFydEVsZW1lbnQodXJpLGxvY2FsTmFtZSxxTmFtZSxhdHRzKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWxsIGluY29taW5nIGVtcHR5IFVSSXMgd2lsbCBiZSByZW1hcHBlZCB0byB0aGUgZGVmYXVsdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKLSAgICAgKiAgICAgICAgICAgICAgICAgIFVSSSB0byBjaGVjayBhbmQgcG90ZW50aWFsbHkgcmVwbGFjZQotICAgICAqIEBwYXJhbSBsb2NhbE5hbWUKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKQotICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBpZiAobmFtZXNwYWNlVVJJLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHN1cGVyLmVuZEVsZW1lbnQodGhpcy51cmlEZWZhdWx0LGxvY2FsTmFtZSxxTmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdXBlci5lbmRFbGVtZW50KG5hbWVzcGFjZVVSSSxsb2NhbE5hbWUscU5hbWUpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9wYXJzZXIvWE1MUGFyc2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvcGFyc2VyL1hNTFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjI0NjdkLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9wYXJzZXIvWE1MUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5BcnJheVN0YWNrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlNjcmlwdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdMaWJyYXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLkNvbXBvc2l0ZVRleHRTY3JpcHRCbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5FeHByZXNzaW9uU2NyaXB0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLlN0YXRpY1RhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5TY3JpcHRCbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5TdGF0aWNUYWdTY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuVGFnRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5UYWdTY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuVGV4dFNjcmlwdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudXRpbC5DbGFzc0xvYWRlclV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkNvbXBvc2l0ZUV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uQ29uc3RhbnRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uamV4bC5KZXhsRXhwcmVzc2lvbkZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGw7Ci0KLS8qKiA8cD48Y29kZT5YTUxQYXJzZXI8L2NvZGU+IHBhcnNlcyB0aGUgWE1MIEplbGx5IGZvcm1hdC4KLSAqIFRoZSBTQVhQYXJzZXIgYW5kIFhNTFJlYWRlciBwb3J0aW9ucyBvZiB0aGlzIGNvZGUgY29tZSBmcm9tIERpZ2VzdGVyLjwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNTcgJAotICovCi1wdWJsaWMgY2xhc3MgWE1MUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCi0gICAgLyoqCi0gICAgICogU2hhcmUgdGhlIEplbGx5IHByb3BlcnRpZXMgYWNyb3NzIHBhcnNlcnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzIGplbGx5UHJvcGVydGllczsKLQotCi0gICAgLyoqIEplbGx5Q29udGV4dCB3aGljaCBpcyB1c2VkIHRvIGxvY2F0ZSB0YWcgbGlicmFyaWVzKi8KLSAgICBwcml2YXRlIEplbGx5Q29udGV4dCBjb250ZXh0ID0gbmV3IEplbGx5Q29udGV4dCgpOwotCi0gICAgLyoqIHRoZSBleHByZXNzaW9uIGZhY3RvcnkgdXNlZCB0byBldmFsdWF0ZSB0YWcgYXR0cmlidXRlcyAqLwotICAgIHByaXZhdGUgRXhwcmVzc2lvbkZhY3RvcnkgZXhwcmVzc2lvbkZhY3Rvcnk7Ci0KLSAgICAvKiogVGhlIGN1cnJlbnQgc2NyaXB0IGJsb2NrICovCi0gICAgcHJpdmF0ZSBTY3JpcHRCbG9jayBzY3JpcHQ7Ci0KLSAgICAvKiogVGhlIGN1cnJlbnQsIHBhcmVudCB0YWdTY3JpcHQgKi8KLSAgICBwcml2YXRlIFRhZ1NjcmlwdCB0YWdTY3JpcHQ7Ci0KLSAgICAvKiogVGhlIHN0YWNrIG9mIGJvZHkgc2NyaXB0cy4gKi8KLSAgICBwcml2YXRlIEFycmF5U3RhY2sgc2NyaXB0U3RhY2sgPSBuZXcgQXJyYXlTdGFjaygpOwotCi0gICAgLyoqIFRoZSBzdGFjayBvZiB0YWdTY3JpcHRzIC0gdXNlIEFycmF5TGlzdCBhcyBpdCBhbGxvd3MgbnVsbC4gKi8KLSAgICBwcml2YXRlIEFycmF5TGlzdCB0YWdTY3JpcHRTdGFjayA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8qKiBUaGUgY3VycmVudCB0ZXh0IGJ1ZmZlciB3aGVyZSBub24tY3VzdG9tIHRhZ3MgZ2V0IHdyaXR0ZW4gKi8KLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciB0ZXh0QnVmZmVyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNsYXNzIGxvYWRlciB0byB1c2UgZm9yIGluc3RhbnRpYXRpbmcgYXBwbGljYXRpb24gb2JqZWN0cy4KLSAgICAgKiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgY29udGV4dCBjbGFzcyBsb2FkZXIsIG9yIHRoZSBjbGFzcyBsb2FkZXIKLSAgICAgKiB1c2VkIHRvIGxvYWQgWE1MUGFyc2VyIGl0c2VsZiwgaXMgdXNlZCwgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZQotICAgICAqIDxjb2RlPnVzZUNvbnRleHRDbGFzc0xvYWRlcjwvY29kZT4gdmFyaWFibGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIERvIHdlIHdhbnQgdG8gdXNlIHRoZSBDb250ZXh0IENsYXNzTG9hZGVyIHdoZW4gbG9hZGluZyBjbGFzc2VzCi0gICAgICogZm9yIGluc3RhbnRpYXRpbmcgbmV3IG9iamVjdHM/ICBEZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VDb250ZXh0Q2xhc3NMb2FkZXIgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBhcHBsaWNhdGlvbi1zdXBwbGllZCBlcnJvciBoYW5kbGVyIHRoYXQgaXMgbm90aWZpZWQgd2hlbiBwYXJzaW5nCi0gICAgICogd2FybmluZ3MsIGVycm9ycywgb3IgZmF0YWwgZXJyb3JzIG9jY3VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBTQVhQYXJzZXJGYWN0b3J5IHRoYXQgaXMgY3JlYXRlZCB0aGUgZmlyc3QgdGltZSB3ZSBuZWVkIGl0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBTQVhQYXJzZXIgd2Ugd2lsbCB1c2UgdG8gcGFyc2UgdGhlIGlucHV0IHN0cmVhbS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU0FYUGFyc2VyIHBhcnNlciA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgWE1MUmVhZGVyIHVzZWQgdG8gcGFyc2UgZGlnZXN0ZXIgcnVsZXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhNTFJlYWRlciByZWFkZXIgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIExvY2F0b3IgYXNzb2NpYXRlZCB3aXRoIG91ciBwYXJzZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExvY2F0b3IgbG9jYXRvciA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcmVkIG5hbWVzcGFjZXMgd2UgYXJlIGN1cnJlbnRseSBwcm9jZXNzaW5nLiAgVGhlIGtleSBpcyB0aGUKLSAgICAgKiBuYW1lc3BhY2UgcHJlZml4IHRoYXQgd2FzIGRlY2xhcmVkIGluIHRoZSBkb2N1bWVudC4gIFRoZSB2YWx1ZSBpcyBhbgotICAgICAqIEFycmF5U3RhY2sgb2YgdGhlIG5hbWVzcGFjZSBVUklzIHRoaXMgcHJlZml4IGhhcyBiZWVuIG1hcHBlZCB0byAtLQotICAgICAqIHRoZSB0b3AgU3RhY2sgZWxlbWVudCBpcyB0aGUgbW9zdCBjdXJyZW50IG9uZS4gIChUaGlzIGFyY2hpdGVjdHVyZQotICAgICAqIGlzIHJlcXVpcmVkIGJlY2F1c2UgZG9jdW1lbnRzIGNhbiBkZWNsYXJlIG5lc3RlZCB1c2VzIG9mIHRoZSBzYW1lCi0gICAgICogcHJlZml4IGZvciBkaWZmZXJlbnQgTmFtZXNwYWNlIFVSSXMpLgotICAgICAqLwotICAgIHByb3RlY3RlZCBNYXAgbmFtZXNwYWNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvKiogVGhlIE1hcCBvZiB0aGUgbmFtZXNwYWNlIHByZWZpeCAtJmd0OyBVUklzIGRlZmluZWQgZm9yIHRoZSBjdXJyZW50IGVsZW1lbnQgKi8KLSAgICBwcml2YXRlIE1hcCBlbGVtZW50TmFtZXNwYWNlczsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlIGJlaW5nIHBhcnNlZCB0aGF0IGlzIHBhc3NlZCB0byB0aGUgVGFnU2NyaXB0IG9iamVjdHMKLSAgICAgKiBmb3IgZXJyb3IgcmVwb3J0aW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBEbyB3ZSB3YW50IHRvIHVzZSBhIHZhbGlkYXRpbmcgcGFyc2VyPwotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRpbmcgPSBmYWxzZTsKLQotICAgIC8qKiBGbGFnIHRvIGluZGljYXRlIGlmIHRoaXMgb2JqZWN0IGhhcyBiZWVuIGNvbmZpZ3VyZWQgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY29uZmlndXJlZDsKLQotICAgIC8qKgotICAgICAqIHdoZW4gbm90IG51bGwsIHNldCB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgZm9yCi0gICAgICogdW5wcmVmaXhlZCBlbGVtZW50cyB2aWEgdGhlIERlZmF1bHROYW1lc3BhY2VGaWx0ZXIKLSAgICAgKiBjbGFzcwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHROYW1lc3BhY2VVUkkgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhYTUxQYXJzZXIuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFhNTFBhcnNlciB3aXRoIGRlZmF1bHQgcHJvcGVydGllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MUGFyc2VyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBYTUxQYXJzZXIsIGFsbG93aW5nIGEgU0FYUGFyc2VyIHRvIGJlIHBhc3NlZCBpbi4gIFRoaXMKLSAgICAgKiBhbGxvd3MgWE1MUGFyc2VyIHRvIGJlIHVzZWQgaW4gZW52aXJvbm1lbnRzIHdoaWNoIGFyZSB1bmZyaWVuZGx5IHRvCi0gICAgICogSkFYUDEuMSAoc3VjaCBhcyBXZWJMb2dpYyA2LjApLiAgVGhhbmtzIGZvciB0aGUgcmVxdWVzdCB0byBjaGFuZ2UgZ28gdG8KLSAgICAgKiBKYW1lcyBIb3VzZSAoamFtZXNAaW50ZXJvYmplY3RpdmUuY29tKS4gIFRoaXMgbWF5IGhlbHAgaW4gcGxhY2VzIHdoZXJlCi0gICAgICogeW91IGFyZSBhYmxlIHRvIGxvYWQgSkFYUCAxLjEgY2xhc3NlcyB5b3Vyc2VsZi4KLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MUGFyc2VyKFNBWFBhcnNlciBwYXJzZXIpIHsKLSAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFhNTFBhcnNlciwgYWxsb3dpbmcgYW4gWE1MUmVhZGVyIHRvIGJlIHBhc3NlZCBpbi4gIFRoaXMKLSAgICAgKiBhbGxvd3MgWE1MUGFyc2VyIHRvIGJlIHVzZWQgaW4gZW52aXJvbm1lbnRzIHdoaWNoIGFyZSB1bmZyaWVuZGx5IHRvCi0gICAgICogSkFYUDEuMSAoc3VjaCBhcyBXZWJMb2dpYyA2LjApLiAgTm90ZSB0aGF0IGlmIHlvdSB1c2UgdGhpcyBvcHRpb24geW91Ci0gICAgICogaGF2ZSB0byBjb25maWd1cmUgbmFtZXNwYWNlIGFuZCB2YWxpZGF0aW9uIHN1cHBvcnQgeW91cnNlbGYsIGFzIHRoZXNlCi0gICAgICogcHJvcGVydGllcyBvbmx5IGFmZmVjdCB0aGUgU0FYUGFyc2VyIGFuZCBlbXRweSBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MUGFyc2VyKFhNTFJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgdGhpcy5yZWFkZXIgPSByZWFkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgdGhlIGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCBmaWxlIHVzaW5nIHRoaXMgWE1MUGFyc2VyLiAgUmV0dXJucwotICAgICAqIHRoZSByb290IGVsZW1lbnQgZnJvbSB0aGUgb2JqZWN0IHN0YWNrIChpZiBhbnkpLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUgRmlsZSBjb250YWluaW5nIHRoZSBYTUwgZGF0YSB0byBiZSBwYXJzZWQKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycwotICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIGlmIGEgcGFyc2luZyBleGNlcHRpb24gb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIFNjcmlwdCBwYXJzZShGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHBhcnNlKGZpbGUudG9VUkwoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgdGhlIGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCBmaWxlIHVzaW5nIHRoaXMgWE1MUGFyc2VyLiAgUmV0dXJucwotICAgICAqIHRoZSByb290IGVsZW1lbnQgZnJvbSB0aGUgb2JqZWN0IHN0YWNrIChpZiBhbnkpLgotICAgICAqCi0gICAgICogQHBhcmFtIHVybCBVUkwgY29udGFpbmluZyB0aGUgWE1MIGRhdGEgdG8gYmUgcGFyc2VkCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKLSAgICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbiBpZiBhIHBhcnNpbmcgZXhjZXB0aW9uIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBTY3JpcHQgcGFyc2UoVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotICAgICAgICBlbnN1cmVDb25maWd1cmVkKCk7Ci0gICAgICAgIHRoaXMuZmlsZU5hbWUgPSB1cmwudG9TdHJpbmcoKTsKLQotICAgICAgICBJbnB1dFNvdXJjZSBzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UodXJsLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIGdldFhNTFJlYWRlcigpLnBhcnNlKHNvdXJjZSk7Ci0gICAgICAgIHJldHVybiBzY3JpcHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgdGhlIGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCBpbnB1dCBzb3VyY2UgdXNpbmcgdGhpcyBYTUxQYXJzZXIuCi0gICAgICogUmV0dXJucyB0aGUgcm9vdCBlbGVtZW50IGZyb20gdGhlIG9iamVjdCBzdGFjayAoaWYgYW55KS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbnB1dCBJbnB1dCBzb3VyY2UgY29udGFpbmluZyB0aGUgWE1MIGRhdGEgdG8gYmUgcGFyc2VkCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKLSAgICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbiBpZiBhIHBhcnNpbmcgZXhjZXB0aW9uIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBTY3JpcHQgcGFyc2UoSW5wdXRTb3VyY2UgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgZW5zdXJlQ29uZmlndXJlZCgpOwotICAgICAgICB0aGlzLmZpbGVOYW1lID0gaW5wdXQuZ2V0U3lzdGVtSWQoKTsKLSAgICAgICAgZ2V0WE1MUmVhZGVyKCkucGFyc2UoaW5wdXQpOwotICAgICAgICByZXR1cm4gc2NyaXB0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtIHVzaW5nIHRoaXMgWE1MUGFyc2VyLgotICAgICAqIFJldHVybnMgdGhlIHJvb3QgZWxlbWVudCBmcm9tIHRoZSBvYmplY3Qgc3RhY2sgKGlmIGFueSkuCi0gICAgICogKE5vdGU6IGlmIHJlYWRpbmcgYSBGaWxlIG9yIFVSTCwgdXNlIG9uZSBvZiB0aGUgVVJMLWJhc2VkCi0gICAgICogcGFyc2UgbWV0aG9kcyBpbnN0ZWFkLiAgVGhpcyBtZXRob2Qgd2lsbCBub3QgYmUgYWJsZQotICAgICAqIHRvIHJlc29sdmUgYW55IHJlbGF0aXZlIHBhdGhzIGluc2lkZSBhIERURC4pCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5wdXQgIElucHV0IHN0cmVhbSBjb250YWluaW5nIHRoZSBYTUwgZGF0YSB0byBiZSBwYXJzZWQKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICAgIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKLSAgICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICAgIGlmIGEgcGFyc2luZyBleGNlcHRpb24gb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIFNjcmlwdCBwYXJzZShJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotICAgICAgICBlbnN1cmVDb25maWd1cmVkKCk7Ci0gICAgICAgIHRoaXMuZmlsZU5hbWUgPSBnZXRDdXJyZW50VVJJKCk7Ci0gICAgICAgIGdldFhNTFJlYWRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbnB1dCkpOwotICAgICAgICByZXR1cm4gc2NyaXB0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgcmVhZGVyIHVzaW5nIHRoaXMgWE1MUGFyc2VyLgotICAgICAqIFJldHVybnMgdGhlIHJvb3QgZWxlbWVudCBmcm9tIHRoZSBvYmplY3Qgc3RhY2sgKGlmIGFueSkuCi0gICAgICogKE5vdGU6IGlmIHJlYWRpbmcgYSBGaWxlIG9yIFVSTCwgdXNlIG9uZSBvZiB0aGUgVVJMLWJhc2VkCi0gICAgICogcGFyc2UgbWV0aG9kcyBpbnN0ZWFkLiAgVGhpcyBtZXRob2Qgd2lsbCBub3QgYmUgYWJsZQotICAgICAqIHRvIHJlc29sdmUgYW55IHJlbGF0aXZlIHBhdGhzIGluc2lkZSBhIERURC4pCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVhZGVyIFJlYWRlciBjb250YWluaW5nIHRoZSBYTUwgZGF0YSB0byBiZSBwYXJzZWQKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICAgIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKLSAgICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICAgIGlmIGEgcGFyc2luZyBleGNlcHRpb24gb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIFNjcmlwdCBwYXJzZShSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGVuc3VyZUNvbmZpZ3VyZWQoKTsKLSAgICAgICAgdGhpcy5maWxlTmFtZSA9IGdldEN1cnJlbnRVUkkoKTsKLSAgICAgICAgZ2V0WE1MUmVhZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKHJlYWRlcikpOwotICAgICAgICByZXR1cm4gc2NyaXB0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgVVJJIHVzaW5nIHRoaXMgWE1MUGFyc2VyLgotICAgICAqIFJldHVybnMgdGhlIHJvb3QgZWxlbWVudCBmcm9tIHRoZSBvYmplY3Qgc3RhY2sgKGlmIGFueSkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJpIFVSSSBjb250YWluaW5nIHRoZSBYTUwgZGF0YSB0byBiZSBwYXJzZWQKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycwotICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIGlmIGEgcGFyc2luZyBleGNlcHRpb24gb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIFNjcmlwdCBwYXJzZShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGVuc3VyZUNvbmZpZ3VyZWQoKTsKLSAgICAgICAgdGhpcy5maWxlTmFtZSA9IHVyaTsKLSAgICAgICAgZ2V0WE1MUmVhZGVyKCkucGFyc2UodXJpKTsKLSAgICAgICAgcmV0dXJuIHNjcmlwdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnRseSBtYXBwZWQgbmFtZXNwYWNlIFVSSSBmb3IgdGhlIHNwZWNpZmllZCBwcmVmaXgsCi0gICAgICogaWYgYW55OyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LiAgVGhlc2UgbWFwcGluZ3MgY29tZSBhbmQKLSAgICAgKiBnbyBkeW5hbWljYWxseSBhcyB0aGUgZG9jdW1lbnQgaXMgcGFyc2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIHByZWZpeCBQcmVmaXggdG8gbG9vayB1cAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZmluZE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIEFycmF5U3RhY2sgc3RhY2sgPSAoQXJyYXlTdGFjaykgbmFtZXNwYWNlcy5nZXQocHJlZml4KTsKLSAgICAgICAgaWYgKHN0YWNrID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiAoKFN0cmluZykgc3RhY2sucGVlaygpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRW1wdHlTdGFja0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBKZWxseUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChKZWxseUNvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgamVsbHkgbmFtZXNwYWNlIHRvIHVzZSBmb3IgdW5wcmVmaXhlZCBlbGVtZW50cy4KLSAgICAgKiBXaWxsIGJlIG92ZXJyaWRkZW4gYnkgYW4gZXhwbGljaXQgbmFtZXNwYWNlIGluIHRoZQotICAgICAqIFhNTCBkb2N1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2UgamVsbHkgbmFtZXNwYWNlIHRvIHVzZSAoZS5nLiAnamVsbHk6Y29yZScpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWVzcGFjZVVSSShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgIHRoaXMuZGVmYXVsdE5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIGxvYWRlciB0byBiZSB1c2VkIGZvciBpbnN0YW50aWF0aW5nIGFwcGxpY2F0aW9uIG9iamVjdHMKLSAgICAgKiB3aGVuIHJlcXVpcmVkLiAgVGhpcyBpcyBkZXRlcm1pbmVkIGJhc2VkIHVwb24gdGhlIGZvbGxvd2luZyBydWxlczoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPlRoZSBjbGFzcyBsb2FkZXIgc2V0IGJ5IDxjb2RlPnNldENsYXNzTG9hZGVyKCk8L2NvZGU+LCBpZiBhbnk8L2xpPgotICAgICAqIDxsaT5UaGUgdGhyZWFkIGNvbnRleHQgY2xhc3MgbG9hZGVyLCBpZiBpdCBleGlzdHMgYW5kIHRoZQotICAgICAqICAgICA8Y29kZT51c2VDb250ZXh0Q2xhc3NMb2FkZXI8L2NvZGU+IHByb3BlcnR5IGlzIHNldCB0byB0cnVlPC9saT4KLSAgICAgKiA8bGk+VGhlIGNsYXNzIGxvYWRlciB1c2VkIHRvIGxvYWQgdGhlIFhNTFBhcnNlciBjbGFzcyBpdHNlbGYuCi0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7Ci0gICAgICAgIHJldHVybiBDbGFzc0xvYWRlclV0aWxzLmdldENsYXNzTG9hZGVyKGNsYXNzTG9hZGVyLCB1c2VDb250ZXh0Q2xhc3NMb2FkZXIsIGdldENsYXNzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY2xhc3MgbG9hZGVyIHRvIGJlIHVzZWQgZm9yIGluc3RhbnRpYXRpbmcgYXBwbGljYXRpb24gb2JqZWN0cwotICAgICAqIHdoZW4gcmVxdWlyZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIgVGhlIG5ldyBjbGFzcyBsb2FkZXIgdG8gdXNlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqICB0byByZXZlcnQgdG8gdGhlIHN0YW5kYXJkIHJ1bGVzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLSAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgYm9vbGVhbiBhcyB0byB3aGV0aGVyIHRoZSBjb250ZXh0IGNsYXNzbG9hZGVyIHNob3VsZCBiZSB1c2VkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldFVzZUNvbnRleHRDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgcmV0dXJuIHVzZUNvbnRleHRDbGFzc0xvYWRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0byB1c2UgdGhlIENvbnRleHQgQ2xhc3NMb2FkZXIgKHRoZSBvbmUgZm91bmQgYnkKLSAgICAgKiBjYWxsaW5nIDxjb2RlPlRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk8L2NvZGU+KQotICAgICAqIHRvIHJlc29sdmUvbG9hZCBjbGFzc2VzLiAgSWYgbm90Ci0gICAgICogdXNpbmcgQ29udGV4dCBDbGFzc0xvYWRlciwgdGhlbiB0aGUgY2xhc3MtbG9hZGluZyBkZWZhdWx0cyB0bwotICAgICAqIHVzaW5nIHRoZSBjYWxsaW5nLWNsYXNzJyBDbGFzc0xvYWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1c2UgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHVzZSBKZWxseUNvbnRleHQgQ2xhc3NMb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlQ29udGV4dENsYXNzTG9hZGVyKGJvb2xlYW4gdXNlKSB7Ci0gICAgICAgIHVzZUNvbnRleHRDbGFzc0xvYWRlciA9IHVzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGVycm9yIGhhbmRsZXIgZm9yIHRoaXMgWE1MUGFyc2VyLgotICAgICAqLwotICAgIHB1YmxpYyBFcnJvckhhbmRsZXIgZ2V0RXJyb3JIYW5kbGVyKCkgewotICAgICAgICByZXR1cm4gKHRoaXMuZXJyb3JIYW5kbGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGVycm9yIGhhbmRsZXIgZm9yIHRoaXMgWE1MUGFyc2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIGVycm9ySGFuZGxlciBUaGUgbmV3IGVycm9yIGhhbmRsZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFcnJvckhhbmRsZXIoRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgewotICAgICAgICB0aGlzLmVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgTG9nZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlIG9mIHRoZSBYTUxQYXJzZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgTG9nIGdldExvZ2dlcigpIHsKLSAgICAgICAgcmV0dXJuIGxvZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGN1cnJlbnQgbG9nZ2VyIGZvciB0aGlzIFhNTFBhcnNlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2dnZXIoTG9nIGxvZykgewotICAgICAgICB0aGlzLmxvZyA9IGxvZzsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiB0aGUgZXhwcmVzc2lvbiBmYWN0b3J5IHVzZWQgdG8gZXZhbHVhdGUgdGFnIGF0dHJpYnV0ZXMgKi8KLSAgICBwdWJsaWMgRXhwcmVzc2lvbkZhY3RvcnkgZ2V0RXhwcmVzc2lvbkZhY3RvcnkoKSB7Ci0gICAgICAgIGlmIChleHByZXNzaW9uRmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBleHByZXNzaW9uRmFjdG9yeSA9IGNyZWF0ZUV4cHJlc3Npb25GYWN0b3J5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGV4cHJlc3Npb25GYWN0b3J5OwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSBleHByZXNzaW9uIGZhY3RvcnkgdXNlZCB0byBldmFsdWF0ZSB0YWcgYXR0cmlidXRlcyAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb25GYWN0b3J5KEV4cHJlc3Npb25GYWN0b3J5IGV4cHJlc3Npb25GYWN0b3J5KSB7Ci0gICAgICAgIHRoaXMuZXhwcmVzc2lvbkZhY3RvcnkgPSBleHByZXNzaW9uRmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIFNBWFBhcnNlciB3ZSB3aWxsIHVzZSB0byBwYXJzZSB0aGUgaW5wdXQgc3RyZWFtLiAgSWYgdGhlcmUKLSAgICAgKiBpcyBhIHByb2JsZW0gY3JlYXRpbmcgdGhlIHBhcnNlciwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBTQVhQYXJzZXIgZ2V0UGFyc2VyKCkgewotICAgICAgICAvLyBSZXR1cm4gdGhlIHBhcnNlciB3ZSBhbHJlYWR5IGNyZWF0ZWQgKGlmIGFueSkKLSAgICAgICAgaWYgKHBhcnNlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKHBhcnNlcik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgcGFyc2VyCi0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgZmFjdG9yeS5zZXRWYWxpZGF0aW5nKHZhbGlkYXRpbmcpOwotICAgICAgICAgICAgICAgIHBhcnNlciA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChwYXJzZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKCJYTUxQYXJzZXIuZ2V0UGFyc2VyOiAiLCBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnkgc2V0dGluZyB0aGUgcmVhZGVyIGluIHRoZSBjb25zdHJ1Y3RvciwgeW91IGNhbiBieXBhc3MgSkFYUCBhbmQKLSAgICAgKiBiZSBhYmxlIHRvIHVzZSBkaWdlc3RlciBpbiBXZWJsb2dpYyA2LjAuCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZ2V0WE1MUmVhZGVyKCkgaW5zdGVhZCwgd2hpY2ggY2FuIHRocm93IGEKLSAgICAgKiAgU0FYRXhjZXB0aW9uIGlmIHRoZSByZWFkZXIgY2Fubm90IGJlIGluc3RhbnRpYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBYTUxSZWFkZXIgZ2V0UmVhZGVyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIChnZXRYTUxSZWFkZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBnZXQgWE1MUmVhZGVyIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gKG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBYTUxSZWFkZXIgdG8gYmUgdXNlZCBmb3IgcGFyc2luZyB0aGUgaW5wdXQgZG9jdW1lbnQuCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbiBpZiBubyBYTUxSZWFkZXIgY2FuIGJlIGluc3RhbnRpYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgWE1MUmVhZGVyIGdldFhNTFJlYWRlcigpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBpZiAocmVhZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlYWRlciA9IGdldFBhcnNlcigpLmdldFhNTFJlYWRlcigpOwotICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdE5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IERlZmF1bHROYW1lc3BhY2VGaWx0ZXIodGhpcy5kZWZhdWx0TmFtZXNwYWNlVVJJLHJlYWRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9zZXQgdXAgdGhlIHBhcnNlCi0gICAgICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcih0aGlzKTsKLSAgICAgICAgcmVhZGVyLnNldERUREhhbmRsZXIodGhpcyk7Ci0gICAgICAgIC8vcmVhZGVyLnNldEVudGl0eVJlc29sdmVyKHRoaXMpOwotICAgICAgICByZWFkZXIuc2V0RXJyb3JIYW5kbGVyKHRoaXMpOwotCi0gICAgICAgIHJldHVybiByZWFkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB2YWxpZGF0aW5nIHBhcnNlciBmbGFnLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldFZhbGlkYXRpbmcoKSB7Ci0gICAgICAgIHJldHVybiAodGhpcy52YWxpZGF0aW5nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHZhbGlkYXRpbmcgcGFyc2VyIGZsYWcuICBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZQotICAgICAqIDxjb2RlPnBhcnNlKCk8L2NvZGU+IGlzIGNhbGxlZCB0aGUgZmlyc3QgdGltZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWxpZGF0aW5nIFRoZSBuZXcgdmFsaWRhdGluZyBwYXJzZXIgZmxhZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW5nKGJvb2xlYW4gdmFsaWRhdGluZykgewotICAgICAgICB0aGlzLnZhbGlkYXRpbmcgPSB2YWxpZGF0aW5nOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2NyaXB0IHRoYXQgaGFzIGp1c3QgYmVlbiBjcmVhdGVkIGlmIHRoaXMgY2xhc3MgaXMgdXNlZAotICAgICAqIGFzIGEgU0FYIENvbnRlbnRIYW5kbGVyIGFuZCBwYXNzZWQgaW50byBzb21lIFhNTCBwcm9jZXNzb3Igb3IgcGFyc2VyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgU2NyaXB0QmxvY2sgY3JlYXRlZCBpZiBTQVggZXZlbnRzIGFyZSBwaXBlZCBpbnRvIHRoaXMgY2xhc3MsCi0gICAgICogd2hpY2ggbXVzdCBpbmNsdWRlIGEgc3RhcnREb2N1bWVudCgpIGFuZCBlbmREb2N1bWVudCgpCi0gICAgICovCi0gICAgcHVibGljIFNjcmlwdEJsb2NrIGdldFNjcmlwdCgpIHsKLSAgICAgICAgcmV0dXJuIHNjcmlwdDsKLSAgICB9Ci0KLQotICAgIC8vIENvbnRlbnRIYW5kbGVyIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFByb2Nlc3Mgbm90aWZpY2F0aW9uIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50IGJlaW5nIHJlYWNoZWQuCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbiBpZiBhIHBhcnNpbmcgZXJyb3IgaXMgdG8gYmUgcmVwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNjcmlwdCA9IG5ldyBTY3JpcHRCbG9jaygpOwotICAgICAgICB0ZXh0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICB0YWdTY3JpcHQgPSBudWxsOwotICAgICAgICBzY3JpcHRTdGFjay5jbGVhcigpOwotICAgICAgICB0YWdTY3JpcHRTdGFjay5jbGVhcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3Mgbm90aWZpY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50IGJlaW5nIHJlYWNoZWQuCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbiBpZiBhIHBhcnNpbmcgZXJyb3IgaXMgdG8gYmUgcmVwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICB0ZXh0QnVmZmVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIG5vdGlmaWNhdGlvbiBvZiB0aGUgc3RhcnQgb2YgYW4gWE1MIGVsZW1lbnQgYmVpbmcgcmVhY2hlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgVGhlIE5hbWVzcGFjZSBVUkksIG9yIHRoZSBlbXB0eSBzdHJpbmcgaWYgdGhlCi0gICAgICogICBlbGVtZW50IGhhcyBubyBOYW1lc3BhY2UgVVJJIG9yIGlmIE5hbWVzcGFjZSBwcm9jZXNzaW5nIGlzIG5vdAotICAgICAqICAgYmVpbmcgcGVyZm9ybWVkLgotICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgVGhlIGxvY2FsIG5hbWUgKHdpdGhvdXQgcHJlZml4KSwgb3IgdGhlIGVtcHR5Ci0gICAgICogICBzdHJpbmcgaWYgTmFtZXNwYWNlIHByb2Nlc3NpbmcgaXMgbm90IGJlaW5nIHBlcmZvcm1lZC4KLSAgICAgKiBAcGFyYW0gcU5hbWUgVGhlIHF1YWxpZmllZCBuYW1lICh3aXRoIHByZWZpeCksIG9yIHRoZSBlbXB0eQotICAgICAqICAgc3RyaW5nIGlmIHF1YWxpZmllZCBuYW1lcyBhcmUgbm90IGF2YWlsYWJsZS5cCi0gICAgICogQHBhcmFtIGxpc3QgVGhlIGF0dHJpYnV0ZXMgYXR0YWNoZWQgdG8gdGhlIGVsZW1lbnQuIElmIHRoZXJlIGFyZQotICAgICAqICAgbm8gYXR0cmlidXRlcywgaXQgc2hhbGwgYmUgYW4gZW1wdHkgQXR0cmlidXRlcyBvYmplY3QuCi0gICAgICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24gaWYgYSBwYXJzaW5nIGVycm9yIGlzIHRvIGJlIHJlcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KAotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJLAotICAgICAgICBTdHJpbmcgbG9jYWxOYW1lLAotICAgICAgICBTdHJpbmcgcU5hbWUsCi0gICAgICAgIEF0dHJpYnV0ZXMgbGlzdCkKLSAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGFkZCBjaGVjayB0byBlbnN1cmUgbmFtZXNwYWNlIFVSSSBpcyAiIiBmb3Igbm8gbmFtZXNwYWNlCi0gICAgICAgICAgICBpZiAoIG5hbWVzcGFjZVVSSSA9PSBudWxsICkgewotICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9ICIiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgdGFnIHRoZW4gY3JlYXRlIGEgc2NyaXB0IHRvIHJ1biBpdAotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHBhc3MgdGhlIHRleHQgdG8gdGhlIGN1cnJlbnQgYm9keQotICAgICAgICAgICAgVGFnU2NyaXB0IG5ld1RhZ1NjcmlwdCA9IGNyZWF0ZVRhZyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgbGlzdCk7Ci0gICAgICAgICAgICBpZiAobmV3VGFnU2NyaXB0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBuZXdUYWdTY3JpcHQgPSBjcmVhdGVTdGF0aWNUYWcobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHFOYW1lLCBsaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRhZ1NjcmlwdCA9IG5ld1RhZ1NjcmlwdDsKLSAgICAgICAgICAgIHRhZ1NjcmlwdFN0YWNrLmFkZCh0YWdTY3JpcHQpOwotICAgICAgICAgICAgaWYgKHRhZ1NjcmlwdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBsaW5lIG51bWJlciBkZXRhaWxzCi0gICAgICAgICAgICAgICAgaWYgKCBsb2NhdG9yICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhZ1NjcmlwdC5zZXRMb2NhdG9yKGxvY2F0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBzZXRzIHRoZSBmaWxlIG5hbWUgZWxlbWVudCBuYW1lcwotICAgICAgICAgICAgICAgIHRhZ1NjcmlwdC5zZXRGaWxlTmFtZShmaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgdGFnU2NyaXB0LnNldEVsZW1lbnROYW1lKHFOYW1lKTsKLSAgICAgICAgICAgICAgICB0YWdTY3JpcHQuc2V0TG9jYWxOYW1lKGxvY2FsTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodGV4dEJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkVGV4dFNjcmlwdCh0ZXh0QnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB0ZXh0QnVmZmVyLnNldExlbmd0aCgwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2NyaXB0LmFkZFNjcmlwdCh0YWdTY3JpcHQpOwotICAgICAgICAgICAgICAgIC8vIHN0YXJ0IGEgbmV3IGJvZHkKLSAgICAgICAgICAgICAgICBzY3JpcHRTdGFjay5wdXNoKHNjcmlwdCk7Ci0gICAgICAgICAgICAgICAgc2NyaXB0ID0gbmV3IFNjcmlwdEJsb2NrKCk7Ci0gICAgICAgICAgICAgICAgdGFnU2NyaXB0LnNldFRhZ0JvZHkoc2NyaXB0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFhYWFg6IG1pZ2h0IHdhbm5hIGhhbmRsZSBlbXB0eSBlbGVtZW50cyBsYXRlci4uLgotICAgICAgICAgICAgICAgIHRleHRCdWZmZXIuYXBwZW5kKCI8Iik7Ci0gICAgICAgICAgICAgICAgdGV4dEJ1ZmZlci5hcHBlbmQocU5hbWUpOwotICAgICAgICAgICAgICAgIGludCBzaXplID0gbGlzdC5nZXRMZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICB0ZXh0QnVmZmVyLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB0ZXh0QnVmZmVyLmFwcGVuZChsaXN0LmdldFFOYW1lKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgdGV4dEJ1ZmZlci5hcHBlbmQoIj0iKTsKLSAgICAgICAgICAgICAgICAgICAgdGV4dEJ1ZmZlci5hcHBlbmQoIlwiIik7Ci0gICAgICAgICAgICAgICAgICAgIHRleHRCdWZmZXIuYXBwZW5kKGxpc3QuZ2V0VmFsdWUoaSkpOwotICAgICAgICAgICAgICAgICAgICB0ZXh0QnVmZmVyLmFwcGVuZCgiXCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGV4dEJ1ZmZlci5hcHBlbmQoIj4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoICJDYXVnaHQgZXhjZXB0aW9uOiAiICsgZSwgZSApOwotICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbiggIlJ1bnRpbWUgRXhjZXB0aW9uOiAiICsgZSwgZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyBub3RpZmljYXRpb24gb2YgY2hhcmFjdGVyIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgYm9keSBvZgotICAgICAqIGFuIFhNTCBlbGVtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1ZmZlciBUaGUgY2hhcmFjdGVycyBmcm9tIHRoZSBYTUwgZG9jdW1lbnQKLSAgICAgKiBAcGFyYW0gc3RhcnQgU3RhcnRpbmcgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlcgotICAgICAqIEBwYXJhbSBsZW5ndGggTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgYnVmZmVyCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbiBpZiBhIHBhcnNpbmcgZXJyb3IgaXMgdG8gYmUgcmVwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXIgYnVmZmVyW10sIGludCBzdGFydCwgaW50IGxlbmd0aCkKLSAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRleHRCdWZmZXIuYXBwZW5kKGJ1ZmZlciwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyBub3RpZmljYXRpb24gb2YgdGhlIGVuZCBvZiBhbiBYTUwgZWxlbWVudCBiZWluZyByZWFjaGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVVSSSBUaGUgTmFtZXNwYWNlIFVSSSwgb3IgdGhlIGVtcHR5IHN0cmluZyBpZiB0aGUKLSAgICAgKiAgIGVsZW1lbnQgaGFzIG5vIE5hbWVzcGFjZSBVUkkgb3IgaWYgTmFtZXNwYWNlIHByb2Nlc3NpbmcgaXMgbm90Ci0gICAgICogICBiZWluZyBwZXJmb3JtZWQuCi0gICAgICogQHBhcmFtIGxvY2FsTmFtZSBUaGUgbG9jYWwgbmFtZSAod2l0aG91dCBwcmVmaXgpLCBvciB0aGUgZW1wdHkKLSAgICAgKiAgIHN0cmluZyBpZiBOYW1lc3BhY2UgcHJvY2Vzc2luZyBpcyBub3QgYmVpbmcgcGVyZm9ybWVkLgotICAgICAqIEBwYXJhbSBxTmFtZSBUaGUgcXVhbGlmaWVkIFhNTCAxLjAgbmFtZSAod2l0aCBwcmVmaXgpLCBvciB0aGUKLSAgICAgKiAgIGVtcHR5IHN0cmluZyBpZiBxdWFsaWZpZWQgbmFtZXMgYXJlIG5vdCBhdmFpbGFibGUuCi0gICAgICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24gaWYgYSBwYXJzaW5nIGVycm9yIGlzIHRvIGJlIHJlcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpCi0gICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGFnU2NyaXB0ID0gKFRhZ1NjcmlwdCkgdGFnU2NyaXB0U3RhY2sucmVtb3ZlKHRhZ1NjcmlwdFN0YWNrLnNpemUoKSAtIDEpOwotICAgICAgICAgICAgaWYgKHRhZ1NjcmlwdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRleHRCdWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFRleHRTY3JpcHQodGV4dEJ1ZmZlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgdGV4dEJ1ZmZlci5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNjcmlwdCA9IChTY3JpcHRCbG9jaykgc2NyaXB0U3RhY2sucG9wKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0ZXh0QnVmZmVyLmFwcGVuZCgiPC8iKTsKLSAgICAgICAgICAgICAgICB0ZXh0QnVmZmVyLmFwcGVuZChxTmFtZSk7Ci0gICAgICAgICAgICAgICAgdGV4dEJ1ZmZlci5hcHBlbmQoIj4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm93IGxldHMgc2V0IHRoZSBwYXJlbnQgdGFnIHZhcmlhYmxlCi0gICAgICAgICAgICBpZiAoIHRhZ1NjcmlwdFN0YWNrLmlzRW1wdHkoKSApIHsKLSAgICAgICAgICAgICAgICB0YWdTY3JpcHQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGFnU2NyaXB0ID0gKFRhZ1NjcmlwdCkgdGFnU2NyaXB0U3RhY2suZ2V0KHRhZ1NjcmlwdFN0YWNrLnNpemUoKSAtIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCAiQ2F1Z2h0IGV4Y2VwdGlvbjogIiArIGUsIGUgKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oICJSdW50aW1lIEV4Y2VwdGlvbjogIiArIGUsIGUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3Mgbm90aWZpY2F0aW9uIHRoYXQgYSBuYW1lc3BhY2UgcHJlZml4IGlzIGNvbWluZyBpbiB0byBzY29wZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmVmaXggUHJlZml4IHRoYXQgaXMgYmVpbmcgZGVjbGFyZWQKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJIENvcnJlc3BvbmRpbmcgbmFtZXNwYWNlIFVSSSBiZWluZyBtYXBwZWQgdG8KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIGlmIGEgcGFyc2luZyBlcnJvciBpcyB0byBiZSByZXBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZyhTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlVVJJKQotICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gUmVnaXN0ZXIgdGhpcyBwcmVmaXggbWFwcGluZwotICAgICAgICBBcnJheVN0YWNrIHN0YWNrID0gKEFycmF5U3RhY2spIG5hbWVzcGFjZXMuZ2V0KHByZWZpeCk7Ci0gICAgICAgIGlmIChzdGFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzdGFjayA9IG5ldyBBcnJheVN0YWNrKCk7Ci0gICAgICAgICAgICBuYW1lc3BhY2VzLnB1dChwcmVmaXgsIHN0YWNrKTsKLSAgICAgICAgfQotICAgICAgICBzdGFjay5wdXNoKG5hbWVzcGFjZVVSSSk7Ci0KLSAgICAgICAgaWYgKCBlbGVtZW50TmFtZXNwYWNlcyA9PSBudWxsICkgewotICAgICAgICAgICAgZWxlbWVudE5hbWVzcGFjZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsZW1lbnROYW1lc3BhY2VzLnB1dChwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyBub3RpZmljYXRpb24gdGhhdCBhIG5hbWVzcGFjZSBwcmVmaXggaXMgZ29pbmcgb3V0IG9mIHNjb3BlLgotICAgICAqCi0gICAgICogQHBhcmFtIHByZWZpeCBQcmVmaXggdGhhdCBpcyBnb2luZyBvdXQgb2Ygc2NvcGUKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIGlmIGEgcGFyc2luZyBlcnJvciBpcyB0byBiZSByZXBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZFByZWZpeE1hcHBpbmcoU3RyaW5nIHByZWZpeCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIERlcmVnaXN0ZXIgdGhpcyBwcmVmaXggbWFwcGluZwotICAgICAgICBBcnJheVN0YWNrIHN0YWNrID0gKEFycmF5U3RhY2spIG5hbWVzcGFjZXMuZ2V0KHByZWZpeCk7Ci0gICAgICAgIGlmIChzdGFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0YWNrLnBvcCgpOwotICAgICAgICAgICAgaWYgKHN0YWNrLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VzLnJlbW92ZShwcmVmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFbXB0eVN0YWNrRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNyZWF0ZVNBWEV4Y2VwdGlvbigiZW5kUHJlZml4TWFwcGluZyBwb3BwZWQgdG9vIG1hbnkgdGltZXMiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3Mgbm90aWZpY2F0aW9uIG9mIGlnbm9yYWJsZSB3aGl0ZXNwYWNlIHJlY2VpdmVkIGZyb20gdGhlIGJvZHkgb2YKLSAgICAgKiBhbiBYTUwgZWxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidWZmZXIgVGhlIGNoYXJhY3RlcnMgZnJvbSB0aGUgWE1MIGRvY3VtZW50Ci0gICAgICogQHBhcmFtIHN0YXJ0IFN0YXJ0aW5nIG9mZnNldCBpbnRvIHRoZSBidWZmZXIKLSAgICAgKiBAcGFyYW0gbGVuIE51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGJ1ZmZlcgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24gaWYgYSBwYXJzaW5nIGVycm9yIGlzIHRvIGJlIHJlcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZShjaGFyIGJ1ZmZlcltdLCBpbnQgc3RhcnQsIGludCBsZW4pCi0gICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICA7IC8vIE5vIHByb2Nlc3NpbmcgcmVxdWlyZWQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIG5vdGlmaWNhdGlvbiBvZiBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGhhdCB3YXMgZW5jb3VudGVyZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldAotICAgICAqIEBwYXJhbSBkYXRhIFRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGRhdGEgKGlmIGFueSkKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIGlmIGEgcGFyc2luZyBlcnJvciBpcyB0byBiZSByZXBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkKLSAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIDsgLy8gTm8gcHJvY2Vzc2luZyBpcyByZXF1aXJlZAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZG9jdW1lbnQgbG9jYXRvciBhc3NvY2lhdGVkIHdpdGggb3VyIHBhcnNlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2NhdG9yIFRoZSBuZXcgbG9jYXRvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcihMb2NhdG9yIGxvY2F0b3IpIHsKLSAgICAgICAgdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIG5vdGlmaWNhdGlvbiBvZiBhIHNraXBwZWQgZW50aXR5LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgc2tpcHBlZCBlbnRpdHkKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIGlmIGEgcGFyc2luZyBlcnJvciBpcyB0byBiZSByZXBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNraXBwZWRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICA7IC8vIE5vIHByb2Nlc3NpbmcgcmVxdWlyZWQKLSAgICB9Ci0KLQotICAgIC8vIERUREhhbmRsZXIgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBhIG5vdGF0aW9uIGRlY2xhcmF0aW9uIGV2ZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG5vdGF0aW9uIG5hbWUKLSAgICAgKiBAcGFyYW0gcHVibGljSWQgVGhlIHB1YmxpYyBpZGVudGlmaWVyIChpZiBhbnkpCi0gICAgICogQHBhcmFtIHN5c3RlbUlkIFRoZSBzeXN0ZW0gaWRlbnRpZmllciAoaWYgYW55KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vdGF0aW9uRGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBhbiB1bnBhcnNlZCBlbnRpdHkgZGVjbGFyYXRpb24gZXZlbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdW5wYXJzZWQgZW50aXR5IG5hbWUKLSAgICAgKiBAcGFyYW0gcHVibGljSWQgVGhlIHB1YmxpYyBpZGVudGlmaWVyIChpZiBhbnkpCi0gICAgICogQHBhcmFtIHN5c3RlbUlkIFRoZSBzeXN0ZW0gaWRlbnRpZmllciAoaWYgYW55KQotICAgICAqIEBwYXJhbSBub3RhdGlvbiBUaGUgbmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBub3RhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVucGFyc2VkRW50aXR5RGVjbCgKLSAgICAgICAgU3RyaW5nIG5hbWUsCi0gICAgICAgIFN0cmluZyBwdWJsaWNJZCwKLSAgICAgICAgU3RyaW5nIHN5c3RlbUlkLAotICAgICAgICBTdHJpbmcgbm90YXRpb24pIHsKLSAgICB9Ci0KLQotICAgIC8vIEVycm9ySGFuZGxlciBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEZvcndhcmQgbm90aWZpY2F0aW9uIG9mIGEgcGFyc2luZyBlcnJvciB0byB0aGUgYXBwbGljYXRpb24gc3VwcGxpZWQKLSAgICAgKiBlcnJvciBoYW5kbGVyLCBpZiBhbnksIG90aGVyd2lzZSB0aHJvdyBhIFNBWEV4Y2VwdGlvbiB3aXRoIHRoZSBlcnJvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGVycm9yIGluZm9ybWF0aW9uCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbiBpZiBhIHBhcnNpbmcgZXhjZXB0aW9uIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvZy5lcnJvcigKLSAgICAgICAgICAgICJQYXJzZSBFcnJvciBhdCBsaW5lICIKLSAgICAgICAgICAgICAgICArIGV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCkKLSAgICAgICAgICAgICAgICArICIgY29sdW1uICIKLSAgICAgICAgICAgICAgICArIGV4Y2VwdGlvbi5nZXRDb2x1bW5OdW1iZXIoKQotICAgICAgICAgICAgICAgICsgIjogIgotICAgICAgICAgICAgICAgICsgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgIGV4Y2VwdGlvbik7Ci0gICAgICAgIGlmIChlcnJvckhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZXJyb3JIYW5kbGVyLmVycm9yKGV4Y2VwdGlvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBleGNlcHRpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3J3YXJkIG5vdGlmaWNhdGlvbiBvZiBhIGZhdGFsIHBhcnNpbmcgZXJyb3IgdG8gdGhlIGFwcGxpY2F0aW9uCi0gICAgICogc3VwcGxpZWQgZXJyb3IgaGFuZGxlciwgaWYgYW55LCBvdGhlcndpc2UgdGhyb3cgYSBTQVhFeGNlcHRpb24gd2l0aCB0aGUgZXJyb3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIFRoZSBmYXRhbCBlcnJvciBpbmZvcm1hdGlvbgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24gaWYgYSBwYXJzaW5nIGV4Y2VwdGlvbiBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvZy5lcnJvcigKLSAgICAgICAgICAgICJQYXJzZSBGYXRhbCBFcnJvciBhdCBsaW5lICIKLSAgICAgICAgICAgICAgICArIGV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCkKLSAgICAgICAgICAgICAgICArICIgY29sdW1uICIKLSAgICAgICAgICAgICAgICArIGV4Y2VwdGlvbi5nZXRDb2x1bW5OdW1iZXIoKQotICAgICAgICAgICAgICAgICsgIjogIgotICAgICAgICAgICAgICAgICsgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgIGV4Y2VwdGlvbik7Ci0gICAgICAgIGlmIChlcnJvckhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZXJyb3JIYW5kbGVyLmZhdGFsRXJyb3IoZXhjZXB0aW9uKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcndhcmQgbm90aWZpY2F0aW9uIG9mIGEgcGFyc2Ugd2FybmluZyB0byB0aGUgYXBwbGljYXRpb24gc3VwcGxpZWQKLSAgICAgKiBlcnJvciBoYW5kbGVyIChpZiBhbnkpLiAgVW5saWtlIFhNTFBhcnNlci5lcnJvcihTQVhQYXJzZUV4Y2VwdGlvbikgYW5kCi0gICAgICogWE1MUGFyc2VyLmZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24pLCB0aGlzIGltcGxlbWVudGF0aW9uIHdpbGwKLSAgICAgKiBOT1QgdGhyb3cgYSBTQVhFeGNlcHRpb24gYnkgZGVmYXVsdCBpZiBubyBlcnJvciBoYW5kbGVyIGlzIHN1cHBsaWVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4Y2VwdGlvbiBUaGUgd2FybmluZyBpbmZvcm1hdGlvbgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24gaWYgYSBwYXJzaW5nIGV4Y2VwdGlvbiBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvZy5lcnJvcigKLSAgICAgICAgICAgICJQYXJzZSBXYXJuaW5nIGF0IGxpbmUgIgotICAgICAgICAgICAgICAgICsgZXhjZXB0aW9uLmdldExpbmVOdW1iZXIoKQotICAgICAgICAgICAgICAgICsgIiBjb2x1bW4gIgotICAgICAgICAgICAgICAgICsgZXhjZXB0aW9uLmdldENvbHVtbk51bWJlcigpCi0gICAgICAgICAgICAgICAgKyAiOiAiCi0gICAgICAgICAgICAgICAgKyBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgZXhjZXB0aW9uKTsKLSAgICAgICAgaWYgKGVycm9ySGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlcnJvckhhbmRsZXIud2FybmluZyhleGNlcHRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIElmIHRoaXMgb2JqZWN0IGhhcyBub3QgYmVlbiBjb25maWd1cmVkIHRoZW4gcmVnaXN0ZXIgdGhlIGRlZmF1bHQKLSAgICAgKiBuYW1lc3BhY2VzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUNvbmZpZ3VyZWQoKSB7Ci0gICAgICAgIGlmICghY29uZmlndXJlZCkgewotICAgICAgICAgICAgY29uZmlndXJlKCk7Ci0gICAgICAgICAgICBjb25maWd1cmVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmx5IG9uY2UgYmVmb3JlIHBhcnNpbmcgb2NjdXJzCi0gICAgICogd2hpY2ggYWxsb3dzIHRhZyBsaWJyYXJpZXMgdG8gYmUgcmVnaXN0ZXJlZCBhbmQgc28gZm9ydGgKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7Ci0gICAgICAgIC8vIGxvYWQgdGhlIHByb3BlcnRpZXMgZmlsZSBvZiBsaWJyYXJpZXMgYXZhaWxhYmxlCi0gICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IGdldEplbGx5UHJvcGVydGllcygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgU3RyaW5nIGxpYnJhcnlVUkkgPSAiamVsbHk6IiArIHVyaTsKLQotICAgICAgICAgICAgLy8gZG9uJ3Qgb3ZlcmxvYWQgYW55IE1vY2sgVGFncyBhbHJlYWR5Ci0gICAgICAgICAgICBpZiAoICEgY29udGV4dC5pc1RhZ0xpYnJhcnlSZWdpc3RlcmVkKGxpYnJhcnlVUkkpICkgewotICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJUYWdMaWJyYXJ5KGxpYnJhcnlVUkksIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEEgaGVscGVyIG1ldGhvZCB3aGljaCBsb2FkcyB0aGUgc3RhdGljIEplbGx5IHByb3BlcnRpZXMgb25jZSBvbiBzdGFydHVwCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBQcm9wZXJ0aWVzIGdldEplbGx5UHJvcGVydGllcygpIHsKLSAgICAgICAgaWYgKGplbGx5UHJvcGVydGllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBqZWxseVByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCi0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0gICAgICAgICAgICBVUkwgdXJsID0KLSAgICAgICAgICAgICAgICBnZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJvcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvamVsbHkucHJvcGVydGllcyIpOwotICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJMb2FkaW5nIEplbGx5IGRlZmF1bHQgdGFnIGxpYnJhcmllcyBmcm9tOiAiICsgdXJsKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpbiA9IHVybC5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgIGplbGx5UHJvcGVydGllcyAubG9hZChpbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ291bGQgbm90IGxvYWQgamVsbHkgcHJvcGVydGllcyBmcm9tOiAiICsgdXJsICsgIi4gUmVhc29uOiAiICsgZSwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgbG9nLmRlYnVnKCJlcnJvciBjbG9zaW5nIGplbGx5LnByb3BlcnRpZXMiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gamVsbHlQcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBuZXcgVGFnIHNjcmlwdCBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZVVSSSBhbmQgbmFtZSBvcgotICAgICAqIHJldHVybiBudWxsIGlmIHRoaXMgaXMgbm90IGEgY3VzdG9tIFRhZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVGFnU2NyaXB0IGNyZWF0ZVRhZygKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSwKLSAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSwKLSAgICAgICAgQXR0cmlidXRlcyBsaXN0KQotICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHVzZSB0aGUgVVJJIHRvIGxvYWQgYSB0YWdsaWIKLSAgICAgICAgICAgIFRhZ0xpYnJhcnkgdGFnbGliID0gY29udGV4dC5nZXRUYWdMaWJyYXJ5KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICBpZiAodGFnbGliID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwgJiYgbmFtZXNwYWNlVVJJLnN0YXJ0c1dpdGgoImplbGx5OiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBuYW1lc3BhY2VVUkkuc3Vic3RyaW5nKDYpOwotICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gZmluZCB0aGUgY2xhc3Mgb24gdGhlIGNsYXNwYXRoCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyB0YWdsaWJDbGFzcyA9IGdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKHVyaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YWdsaWIgPSAoVGFnTGlicmFyeSkgdGFnbGliQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJUYWdMaWJyYXJ5KG5hbWVzcGFjZVVSSSwgdGFnbGliKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVTQVhFeGNlcHRpb24oIkNvdWxkIG5vdCBsb2FkIGNsYXNzOiAiICsgdXJpICsgIiBzbyB0YWdsaWIgaW5zdGFudGlhdGlvbiBmYWlsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVTQVhFeGNlcHRpb24oIkNvbnN0cnVjdG9yIGZvciBjbGFzcyBpcyBub3QgYWNjZXNzaWJsZTogIiArIHVyaSArICIgc28gdGFnbGliIGluc3RhbnRpYXRpb24gZmFpbGVkIixlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVTQVhFeGNlcHRpb24oIkNsYXNzIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQ6ICIgKyB1cmkgKyAiIHNvIHRhZ2xpYiBpbnN0YW50aWF0aW9uIGZhaWxlZCIsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVTQVhFeGNlcHRpb24oIkNsYXNzIGlzIG5vdCBhIFRhZ0xpYnJhcnk6ICIgKyB1cmkgKyAiIHNvIHRhZ2xpYiBpbnN0YW50aWF0aW9uIGZhaWxlZCIsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGFnbGliICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBUYWdTY3JpcHQgc2NyaXB0ID0gdGFnbGliLmNyZWF0ZVRhZ1NjcmlwdChsb2NhbE5hbWUsIGxpc3QpOwotICAgICAgICAgICAgICAgIGlmICggc2NyaXB0ICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZVRhZ1NjcmlwdChzY3JpcHQpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGNsb25lIHRoZSBhdHRyaWJ1dGVzIHRvIGtlZXAgdGhlbSBhcm91bmQgYWZ0ZXIgdGhpcyBwYXJzZQotICAgICAgICAgICAgICAgICAgICBzY3JpcHQuc2V0U2F4QXR0cmlidXRlcyhuZXcgQXR0cmlidXRlc0ltcGwobGlzdCkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vdyBpdGVyYXRlIHRocm91Z2ggdGhyb3VnaCB0aGUgZXhwcmVzc2lvbnMKLSAgICAgICAgICAgICAgICAgICAgaW50IHNpemUgPSBsaXN0LmdldExlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBsaXN0LmdldExvY2FsTmFtZShpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IGxpc3QuZ2V0VmFsdWUoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ2xpYi5jcmVhdGVFeHByZXNzaW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFeHByZXNzaW9uRmFjdG9yeSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHByZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gY3JlYXRlQ29uc3RhbnRFeHByZXNzaW9uKGxvY2FsTmFtZSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0LmFkZEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBleHByZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gc2NyaXB0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cud2FybigKLSAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSB0YWdsaWIgb3IgVVJJOiAiICsgbmFtZXNwYWNlVVJJICsgIiB0YWcgbmFtZTogIiArIGxvY2FsTmFtZSwKLSAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgICAgIHRocm93IGNyZWF0ZVNBWEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgc3RhdGljIFRhZyB0aGF0IHJlcHJlc2VudHMgc29tZSBzdGF0aWMgY29udGVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVGFnU2NyaXB0IGNyZWF0ZVN0YXRpY1RhZygKLSAgICAgICAgZmluYWwgU3RyaW5nIG5hbWVzcGFjZVVSSSwKLSAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsTmFtZSwKLSAgICAgICAgZmluYWwgU3RyaW5nIHFOYW1lLAotICAgICAgICBBdHRyaWJ1dGVzIGxpc3QpCi0gICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RhdGljVGFnIHRhZyA9IG5ldyBTdGF0aWNUYWcoIG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxTmFtZSApOwotICAgICAgICAgICAgU3RhdGljVGFnU2NyaXB0IHNjcmlwdCA9IG5ldyBTdGF0aWNUYWdTY3JpcHQoCi0gICAgICAgICAgICAgICAgbmV3IFRhZ0ZhY3RvcnkoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBUYWcgY3JlYXRlVGFnKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdGljVGFnKCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgcU5hbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICBjb25maWd1cmVUYWdTY3JpcHQoc2NyaXB0KTsKLQotICAgICAgICAgICAgLy8gbm93IGl0ZXJhdGUgdGhyb3VnaCB0aHJvdWdoIHRoZSBleHByZXNzaW9ucwotICAgICAgICAgICAgaW50IHNpemUgPSBsaXN0LmdldExlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSBsaXN0LmdldFZhbHVlKGkpOwotICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IENvbXBvc2l0ZUV4cHJlc3Npb24ucGFyc2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSwgZ2V0RXhwcmVzc2lvbkZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyUU5hbWUgPSBsaXN0LmdldFFOYW1lKGkpOwotICAgICAgICAgICAgICAgIHNjcmlwdC5hZGRBdHRyaWJ1dGUoYXR0clFOYW1lLCBleHByZXNzaW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzY3JpcHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cud2FybigKLSAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBzdGF0aWMgdGFnIGZvciBVUkk6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBuYW1lc3BhY2VVUkkKLSAgICAgICAgICAgICAgICAgICAgKyAiIHRhZyBuYW1lOiAiCi0gICAgICAgICAgICAgICAgICAgICsgbG9jYWxOYW1lLAotICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgdGhyb3cgY3JlYXRlU0FYRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmUgYSBuZXdseSBjcmVhdGVkIFRhZ1NjcmlwdCBpbnN0YW5jZSBiZWZvcmUgYW55IEV4cHJlc3Npb25zIGFyZSBjcmVhdGVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYVRhZ1NjcmlwdAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVRhZ1NjcmlwdChUYWdTY3JpcHQgYVRhZ1NjcmlwdCkgewotICAgICAgICAvLyBzZXQgcGFyZW50IHJlbGF0aW9uc2hpcC4uLgotICAgICAgICBhVGFnU2NyaXB0LnNldFBhcmVudCh0aGlzLnRhZ1NjcmlwdCk7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSBuYW1lc3BhY2UgTWFwCi0gICAgICAgIGlmICggZWxlbWVudE5hbWVzcGFjZXMgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIGFUYWdTY3JpcHQuc2V0VGFnTmFtZXNwYWNlc01hcCggZWxlbWVudE5hbWVzcGFjZXMgKTsKLSAgICAgICAgICAgIGVsZW1lbnROYW1lc3BhY2VzID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIHRleHQgdG8gdGhlIGN1cnJlbnQgc2NyaXB0IGJsb2NrIHBhcnNpbmcgYW55IGVtYmVkZGVkCi0gICAgICogZXhwcmVzc2lvbnMgaW5vdCBFeHByZXNzaW9uU2NyaXB0IG9iamVjdHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVGV4dFNjcmlwdChTdHJpbmcgdGV4dCkgdGhyb3dzIEplbGx5RXhjZXB0aW9uIHsKLSAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0KLSAgICAgICAgICAgIENvbXBvc2l0ZUV4cHJlc3Npb24ucGFyc2UodGV4dCwgZ2V0RXhwcmVzc2lvbkZhY3RvcnkoKSk7Ci0KLSAgICAgICAgYWRkRXhwcmVzc2lvblNjcmlwdChzY3JpcHQsIGV4cHJlc3Npb24pOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgZ2l2ZW4gRXhwcmVzc2lvbiBvYmplY3QgdG8gdGhlIGN1cnJlbnQgU2NyaXB0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZEV4cHJlc3Npb25TY3JpcHQoU2NyaXB0QmxvY2sgc2NyaXB0LCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLSAgICAgICAgaWYgKCBleHByZXNzaW9uIGluc3RhbmNlb2YgQ29uc3RhbnRFeHByZXNzaW9uICkgewotICAgICAgICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50RXhwcmVzc2lvbgotICAgICAgICAgICAgICAgID0gKENvbnN0YW50RXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGNvbnN0YW50RXhwcmVzc2lvbi5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPSBudWxsICkgewotICAgICAgICAgICAgICAgIHNjcmlwdC5hZGRTY3JpcHQobmV3IFRleHRTY3JpcHQoIHZhbHVlLnRvU3RyaW5nKCkgKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICBpZiAoIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb21wb3NpdGVFeHByZXNzaW9uICkgewotICAgICAgICAgICAgQ29tcG9zaXRlVGV4dFNjcmlwdEJsb2NrIG5ld0Jsb2NrID0gbmV3IENvbXBvc2l0ZVRleHRTY3JpcHRCbG9jaygpOwotICAgICAgICAgICAgc2NyaXB0LmFkZFNjcmlwdChuZXdCbG9jayk7Ci0KLSAgICAgICAgICAgIENvbXBvc2l0ZUV4cHJlc3Npb24gY29tcG9zaXRlRXhwcmVzc2lvbgotICAgICAgICAgICAgICAgID0gKENvbXBvc2l0ZUV4cHJlc3Npb24pIGV4cHJlc3Npb247Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gY29tcG9zaXRlRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBhZGRFeHByZXNzaW9uU2NyaXB0KCBuZXdCbG9jaywgKEV4cHJlc3Npb24pIGl0ZXIubmV4dCgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzY3JpcHQuYWRkU2NyaXB0KG5ldyBFeHByZXNzaW9uU2NyaXB0KGV4cHJlc3Npb24pKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBFeHByZXNzaW9uIGNyZWF0ZUNvbnN0YW50RXhwcmVzc2lvbigKLSAgICAgICAgU3RyaW5nIHRhZ05hbWUsCi0gICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lLAotICAgICAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWUpICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKGF0dHJpYnV0ZVZhbHVlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRXhwcmVzc2lvbkZhY3RvcnkgY3JlYXRlRXhwcmVzc2lvbkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSmV4bEV4cHJlc3Npb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCBjb250ZXh0IFVSSSBhcyBhIFN0cmluZyBvciBudWxsIGlmIHRoZXJlIGlzIG5vCi0gICAgICogY3VycmVudCBjb250ZXh0IGRlZmluZWQgb24gdGhlIEplbGx5Q29udGV4dAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VycmVudFVSSSgpIHsKLSAgICAgICAgVVJMIHVybCA9IHRoaXMuZ2V0Q29udGV4dCgpLmdldEN1cnJlbnRVUkwoKTsKLSAgICAgICAgcmV0dXJuICh1cmwgIT0gbnVsbCkgPyB1cmwudG9TdHJpbmcoKSA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgU0FYIGV4Y2VwdGlvbiB3aGljaCBhbHNvIHVuZGVyc3RhbmRzIGFib3V0IHRoZSBsb2NhdGlvbiBpbgotICAgICAqIHRoZSBmaWxlIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgZXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNBWEV4Y2VwdGlvbiBjcmVhdGVTQVhFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGxvZy53YXJuKCJVbmRlcmx5aW5nIGV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICBpZiAobG9jYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZXJyb3IgPQotICAgICAgICAgICAgICAgICJFcnJvciBhdCAoIgotICAgICAgICAgICAgICAgICAgICArIGxvY2F0b3IuZ2V0TGluZU51bWJlcigpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgIgotICAgICAgICAgICAgICAgICAgICArIGxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiKTogIgotICAgICAgICAgICAgICAgICAgICArIG1lc3NhZ2U7Ci0gICAgICAgICAgICBpZiAoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTQVhQYXJzZUV4Y2VwdGlvbihlcnJvciwgbG9jYXRvciwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNBWFBhcnNlRXhjZXB0aW9uKGVycm9yLCBsb2NhdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsb2cuZXJyb3IoIk5vIExvY2F0b3IhIik7Ci0gICAgICAgIGlmIChlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU0FYRXhjZXB0aW9uKG1lc3NhZ2UsIGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTQVhFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBTQVggZXhjZXB0aW9uIHdoaWNoIGFsc28gdW5kZXJzdGFuZHMgYWJvdXQgdGhlIGxvY2F0aW9uIGluCi0gICAgICogdGhlIGRpZ2VzdGVyIGZpbGUgd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnMKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBleGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU0FYRXhjZXB0aW9uIGNyZWF0ZVNBWEV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotICAgICAgICByZXR1cm4gY3JlYXRlU0FYRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgU0FYIGV4Y2VwdGlvbiB3aGljaCBhbHNvIHVuZGVyc3RhbmRzIGFib3V0IHRoZSBsb2NhdGlvbiBpbgotICAgICAqIHRoZSBkaWdlc3RlciBmaWxlIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgZXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNBWEV4Y2VwdGlvbiBjcmVhdGVTQVhFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNBWEV4Y2VwdGlvbihtZXNzYWdlLCBudWxsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvcGFyc2VyL3BhY2thZ2UuaHRtbCBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9wYXJzZXIvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzRiZTA3Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9wYXJzZXIvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxodG1sPgotPGhlYWQ+Ci08L2hlYWQ+Ci08Ym9keT4KLQotICA8cD5KZWxseSBwYXJzZXJzIGJvdGggWE1MIHN5bnRheCBhbmQgbm9uLVhNTCBzeW50YXhlcyBhcmUgc3VwcG9ydGVkLgotICA8L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9zZXJ2bGV0L0plbGx5U2VydmxldC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3NlcnZsZXQvSmVsbHlTZXJ2bGV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MTA5NDAuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3NlcnZsZXQvSmVsbHlTZXJ2bGV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5zZXJ2bGV0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLS8qKgotICogU2VydmxldCBmb3IgaGFuZGxpbmcgZGlzcGxheSBvZiBKZWxseS1maWVkIFhNTCBmaWxlcy4gTW9kZWxsZWQgYWZ0ZXIgVmVsb2NpdHlTZXJ2bGV0LgotICoKLSAqIEBhdXRob3IgS2VsdmluIFRhbgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjcgJAotICovCi1wdWJsaWMgY2xhc3MgSmVsbHlTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgewotICAgIC8qKgotICAgICAqIFRoZSBIVFRQIHJlcXVlc3Qgb2JqZWN0IGNvbnRleHQga2V5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1QgPSAicmVxdWVzdCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgSFRUUCByZXNwb25zZSBvYmplY3QgY29udGV4dCBrZXkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0UgPSAicmVzcG9uc2UiOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoCi0gICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQotICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0gICAgICAgIGRvUmVxdWVzdChyZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0KAotICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKLSAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBkb1JlcXVlc3QocmVxdWVzdCwgcmVzcG9uc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgYWxsIHJlcXVlc3RzCi0gICAgICogQHBhcmFtIHJlcSBIdHRwU2VydmxldFJlcXVlc3Qgb2JqZWN0IGNvbnRhaW5pbmcgY2xpZW50IHJlcXVlc3QKLSAgICAgKiBAcGFyYW0gcmVzIEh0dHBTZXJ2bGV0UmVzcG9uc2Ugb2JqZWN0IGZvciB0aGUgcmVzcG9uc2UKLSAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9SZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0gICAgICAgIEplbGx5Q29udGV4dCBjb250ZXh0ID0gY3JlYXRlQ29udGV4dChyZXEsIHJlcyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVUkwgc2NyaXB0ID0gZ2V0U2NyaXB0KHJlcSk7Ci0gICAgICAgICAgICBydW5TY3JpcHQoc2NyaXB0LCBjb250ZXh0LCByZXEsIHJlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlcnJvcihyZXEsIHJlcywgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudmVsb2NpdHkuc2VydmxldC5WZWxvY2l0eVNlcnZsZXQjY3JlYXRlQ29udGV4dAotICAgICAqIEBwYXJhbSByZXEKLSAgICAgKiBAcGFyYW0gcmVzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBKZWxseUNvbnRleHQgY3JlYXRlQ29udGV4dCgKLSAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKLSAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKLQotICAgICAgICBKZWxseUNvbnRleHQgY3R4ID0gbmV3IEplbGx5U2VydmxldENvbnRleHQoZ2V0U2VydmxldENvbnRleHQoKSk7Ci0gICAgICAgIGN0eC5zZXRWYXJpYWJsZShSRVFVRVNULCByZXEpOwotICAgICAgICBjdHguc2V0VmFyaWFibGUoUkVTUE9OU0UsIHJlcyk7Ci0gICAgICAgIHJldHVybiBjdHg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogRWl0aGVyIHVzZSB0aGUgcXVlcnkgcGFyYW1ldGVyICJzY3JpcHQiLCBvciB0aGUgVVJJIGl0c2VsZgotICAgICAqIHRvIGRlbm90ZSB0aGUgc2NyaXB0IHRvIHJ1bi4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogRXhhbXBsZTogc2NyaXB0PWluZGV4LmplbGx5IG9yIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9mb28vaW5kZXguamVsbHkuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnZlbG9jaXR5LnNlcnZsZXQuVmVsb2NpdHlTZXJ2bGV0I2dldFRlbXBsYXRlCi0gICAgICogQHBhcmFtIHJlcQotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBVUkwgZ2V0U2NyaXB0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpCi0gICAgICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBzY3JpcHRVcmwgPSByZXEuZ2V0UGFyYW1ldGVyKCJzY3JpcHQiKTsKLSAgICAgICAgaWYgKHNjcmlwdFVybCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzY3JpcHRVcmwgPSByZXEuZ2V0UGF0aEluZm8oKTsKLSAgICAgICAgfQotICAgICAgICBVUkwgdXJsID0gZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXNvdXJjZShzY3JpcHRVcmwpOwotICAgICAgICBpZiAodXJsID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc2NyaXB0IHVybDoiICsgc2NyaXB0VXJsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXJsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS52ZWxvY2l0eS5zZXJ2bGV0LlZlbG9jaXR5U2VydmxldCNtZXJnZVRlbXBsYXRlCi0gICAgICogQHBhcmFtIHNjcmlwdAotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogQHBhcmFtIHJlcQotICAgICAqIEBwYXJhbSByZXMKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBKZWxseUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJ1blNjcmlwdCgKLSAgICAgICAgVVJMIHNjcmlwdCwKLSAgICAgICAgSmVsbHlDb250ZXh0IGNvbnRleHQsCi0gICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCi0gICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIEplbGx5RXhjZXB0aW9uIHsKLQotICAgICAgICBTZXJ2bGV0T3V0cHV0U3RyZWFtIG91dHB1dCA9IHJlcy5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgWE1MT3V0cHV0IHhtbE91dHB1dCA9IFhNTE91dHB1dC5jcmVhdGVYTUxPdXRwdXQob3V0cHV0KTsKLSAgICAgICAgY29udGV4dC5ydW5TY3JpcHQoc2NyaXB0LCB4bWxPdXRwdXQpOwotICAgICAgICB4bWxPdXRwdXQuZmx1c2goKTsKLSAgICAgICAgeG1sT3V0cHV0LmNsb3NlKCk7Ci0gICAgICAgIG91dHB1dC5mbHVzaCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZWQgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciB0aHJvd24gaW4gYW55IHBhcnQgb2YgZG9SZXF1ZXN0KCkgcHJvY2Vzc2luZy4KLSAgICAgKiA8YnI+PGJyPgotICAgICAqIERlZmF1bHQgd2lsbCBzZW5kIGEgc2ltcGxlIEhUTUwgcmVzcG9uc2UgaW5kaWNhdGluZyB0aGVyZSB3YXMgYSBwcm9ibGVtLgotICAgICAqPGJyPjxicj4KLSAgICAgKiBSaXBwZWQgZnJvbSBWZWxvY2l0eVNlcnZsZXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVxdWVzdCBvcmlnaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgZnJvbSBzZXJ2bGV0IGNvbnRhaW5lci4KLSAgICAgKiBAcGFyYW0gcmVzcG9uc2UgSHR0cFNlcnZsZXRSZXNwb25zZSBvYmplY3QgZnJvbSBzZXJ2bGV0IGNvbnRhaW5lci4KLSAgICAgKiBAcGFyYW0gY2F1c2UgIEV4Y2VwdGlvbiB0aGF0IHdhcyB0aHJvd24gYnkgc29tZSBvdGhlciBwYXJ0IG9mIHByb2Nlc3MuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZXJyb3IoCi0gICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAotICAgICAgICBFeGNlcHRpb24gY2F1c2UpCi0gICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGh0bWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGh0bWwuYXBwZW5kKCI8aHRtbD4iKTsKLSAgICAgICAgaHRtbC5hcHBlbmQoIjx0aXRsZT5FcnJvcjwvdGl0bGU+Iik7Ci0gICAgICAgIGh0bWwuYXBwZW5kKCI8Ym9keSBiZ2NvbG9yPVwiI2ZmZmZmZlwiPiIpOwotICAgICAgICBodG1sLmFwcGVuZCgiPGgyPkplbGx5U2VydmxldCA6IEVycm9yIHByb2Nlc3NpbmcgdGhlIHNjcmlwdDwvaDI+Iik7Ci0gICAgICAgIGh0bWwuYXBwZW5kKCI8cHJlPiIpOwotICAgICAgICBTdHJpbmcgd2h5ID0gY2F1c2UuZ2V0TWVzc2FnZSgpOwotICAgICAgICBpZiAod2h5ICE9IG51bGwgJiYgd2h5LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGh0bWwuYXBwZW5kKHdoeSk7Ci0gICAgICAgICAgICBodG1sLmFwcGVuZCgiPGJyPiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBjYXVzZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHN3KSk7Ci0KLSAgICAgICAgaHRtbC5hcHBlbmQoc3cudG9TdHJpbmcoKSk7Ci0gICAgICAgIGh0bWwuYXBwZW5kKCI8L3ByZT4iKTsKLSAgICAgICAgaHRtbC5hcHBlbmQoIjwvYm9keT4iKTsKLSAgICAgICAgaHRtbC5hcHBlbmQoIjwvaHRtbD4iKTsKLSAgICAgICAgcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkucHJpbnQoaHRtbC50b1N0cmluZygpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvc2VydmxldC9KZWxseVNlcnZsZXRDb250ZXh0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvc2VydmxldC9KZWxseVNlcnZsZXRDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMGJlYjkuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3NlcnZsZXQvSmVsbHlTZXJ2bGV0Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5zZXJ2bGV0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5Q29udGV4dDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprZWx2aW50QGFwYWNoZS5vcmciPktlbHZpbiBUYW48L2E+Ci0gKiBAdmVyc2lvbiAxLjEKLSAqLwotcHVibGljIGNsYXNzIEplbGx5U2VydmxldENvbnRleHQgZXh0ZW5kcyBKZWxseUNvbnRleHQgewotCi0gICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBjdHg7Ci0KLSAgICBwdWJsaWMgSmVsbHlTZXJ2bGV0Q29udGV4dCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmVsbHlTZXJ2bGV0Q29udGV4dChTZXJ2bGV0Q29udGV4dCBjdHgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5jdHggPSBjdHg7Ci0gICAgfQotCi0gICAgcHVibGljIEplbGx5U2VydmxldENvbnRleHQoSmVsbHlDb250ZXh0IHBhcmVudCwgU2VydmxldENvbnRleHQgY3R4KSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgICAgIHRoaXMuY3R4ID0gY3R4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsbG93IGFjY2VzcyBvZiByZWxhdGl2ZSBVUklzIHdoZW4gcGVyZm9ybWluZyAmbHQ7ajppbmNsdWRlJmd0Oy4KLSAgICAgKiBAcGFyYW0gcwotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBVUkwgZ2V0UmVzb3VyY2UoU3RyaW5nIHMpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3R4LmdldFJlc291cmNlKHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsbG93IGFjY2VzcyBvZiByZWxhdGl2ZSBVUklzIHdoZW4gcGVyZm9ybWluZyAmbHQ7ajppbmNsdWRlJmd0Oy4KLSAgICAgKiBAcGFyYW0gcwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gY3R4LmdldFJlc291cmNlQXNTdHJlYW0ocyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEplbGx5Q29udGV4dCBjcmVhdGVDaGlsZENvbnRleHQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKZWxseVNlcnZsZXRDb250ZXh0KHRoaXMsIGN0eCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3NlcnZsZXQvcGFja2FnZS5odG1sIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3NlcnZsZXQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWJhOThjLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9zZXJ2bGV0L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci0KLSAgPHA+Q2xhc3NlcyBmb3IgdXNpbmcgSmVsbHkgb24gdGhlIFNlcnZsZXQgcGxhdGZvcm0uCi0gIDwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvUmVzb3VyY2VzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9SZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc3MzY5Zi4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9SZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLQotLyoqCi0gKiA8cD5Qcm92aWRlcyBsb2NhbGUtbmV1dHJhbCBhY2Nlc3MgdG8gc3RyaW5nIHJlc291cmNlcy4gIE9ubHkgdGhlCi0gKiBkb2N1bWVudGF0aW9uIGFuZCBjb2RlIGFyZSBpbiBFbmdsaXNoLiA6LSkKLSAqCi0gKiA8cD5UaGUgbWFqb3IgZ29hbCwgYXNpZGUgZnJvbSBnbG9iYWxpemF0aW9uLCBpcyBjb252ZW5pZW5jZS4KLSAqIEFjY2VzcyB0byByZXNvdXJjZXMgd2l0aCBubyBwYXJhbWV0ZXJzIGlzIG1hZGUgaW4gdGhlIGZvcm06PC9wPgotICogPHByZT4KLSAqICAgICBSZXNvdXJjZXMuZ2V0TWVzc2FnZShNRVNTQUdFX05BTUUpOwotICogPC9wcmU+Ci0gKgotICogPHA+QWNjZXNzIHRvIHJlc291cmNlcyB3aXRoIG9uZSBwYXJhbWV0ZXIgd29ya3MgbGlrZTwvcD4KLSAqIDxwcmU+Ci0gKiAgICAgUmVzb3VyY2VzLmdldE1lc3NhZ2UoTUVTU0FHRV9OQU1FLCBhcmcxKTsKLSAqIDwvcHJlPgotICoKLSAqIDxwPi4uLiBhbmQgc28gb24uPC9wPgotICoKLSAqIEBhdXRob3IgU2hhd24gQmF5ZXJuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZXMgewotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBTdGF0aWMgZGF0YQotCi0gICAgLyoqIFRoZSBsb2NhdGlvbiBvZiBvdXIgcmVzb3VyY2VzLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9MT0NBVElPTgotICAgID0gIm9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLlJlc291cmNlcyI7Ci0KLSAgICAvKiogT3VyIGNsYXNzLXdpZGUgUmVzb3VyY2VCdW5kbGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmIgPQotICAgIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShSRVNPVVJDRV9MT0NBVElPTik7Ci0KLQotICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgLy8gUHVibGljIHN0YXRpYyBtZXRob2RzCi0KLSAgICAvKiogUmV0cmlldmVzIGEgbWVzc2FnZSB3aXRoIG5vIGFyZ3VtZW50cy4gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBuYW1lKQotICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gcmIuZ2V0U3RyaW5nKG5hbWUpOwotICAgIH0KLQotICAgIC8qKiBSZXRyaWV2ZXMgYSBtZXNzYWdlIHdpdGggYXJiaXRyYXJpbHkgbWFueSBhcmd1bWVudHMuICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcgbmFtZSwgT2JqZWN0W10gYSkKLSAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nIHJlcyA9IHJiLmdldFN0cmluZyhuYW1lKTsKLSAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQocmVzLCBhKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0cmlldmVzIGEgbWVzc2FnZSB3aXRoIG9uZSBhcmd1bWVudC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBuYW1lLCBPYmplY3QgYTEpCi0gICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgIHJldHVybiBnZXRNZXNzYWdlKG5hbWUsIG5ldyBPYmplY3RbXSB7IGExIH0pOwotICAgIH0KLQotICAgIC8qKiBSZXRyaWV2ZXMgYSBtZXNzYWdlIHdpdGggdHdvIGFyZ3VtZW50cy4gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBuYW1lLCBPYmplY3QgYTEsIE9iamVjdCBhMikKLSAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIGdldE1lc3NhZ2UobmFtZSwgbmV3IE9iamVjdFtdIHsgYTEsIGEyIH0pOwotICAgIH0KLQotICAgIC8qKiBSZXRyaWV2ZXMgYSBtZXNzYWdlIHdpdGggdGhyZWUgYXJndW1lbnRzLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBhMSwKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGEyLAotICAgICAgICAgICAgICAgICAgICBPYmplY3QgYTMpCi0gICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgIHJldHVybiBnZXRNZXNzYWdlKG5hbWUsIG5ldyBPYmplY3RbXSB7IGExLCBhMiwgYTMgfSk7Ci0gICAgfQotCi0gICAgLyoqIFJldHJpZXZlcyBhIG1lc3NhZ2Ugd2l0aCBmb3VyIGFyZ3VtZW50cy4gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICBPYmplY3QgYTEsCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBhMiwKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGEzLAotICAgICAgICAgICAgICAgICAgICBPYmplY3QgYTQpCi0gICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgIHJldHVybiBnZXRNZXNzYWdlKG5hbWUsIG5ldyBPYmplY3RbXSB7IGExLCBhMiwgYTMsIGE0IH0pOwotICAgIH0KLQotICAgIC8qKiBSZXRyaWV2ZXMgYSBtZXNzYWdlIHdpdGggZml2ZSBhcmd1bWVudHMuICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGExLAotICAgICAgICAgICAgICAgICAgICBPYmplY3QgYTIsCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBhMywKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGE0LAotICAgICAgICAgICAgICAgICAgICBPYmplY3QgYTUpCi0gICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgIHJldHVybiBnZXRNZXNzYWdlKG5hbWUsIG5ldyBPYmplY3RbXSB7IGExLCBhMiwgYTMsIGE0LCBhNSB9KTsKLSAgICB9Ci0KLSAgICAvKiogUmV0cmlldmVzIGEgbWVzc2FnZSB3aXRoIHNpeCBhcmd1bWVudHMuICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGExLAotICAgICAgICAgICAgICAgICAgICBPYmplY3QgYTIsCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBhMywKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGE0LAotICAgICAgICAgICAgICAgICAgICBPYmplY3QgYTUsCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBhNikKLSAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIGdldE1lc3NhZ2UobmFtZSwgbmV3IE9iamVjdFtdIHsgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiB9KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZDVlNjUuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMgCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29udmVudGlvbnM6Ci0jIC0gRm9yIGVycm9yIG1lc3NhZ2VzIGZyb20gcGFydGljdWxhciB0YWdzLCB0aGUgcmVzb3VyY2Ugc2hvdWxkCi0jICAgICAtIChhKSBoYXZlIGEgbmFtZSBiZWdpbm5pbmcgd2l0aCBUQUdOQU1FXwotIyAgICAgLSAoYikgY29udGFpbiB0aGUgbmFtZSBvZiB0aGUgdGFnIHdpdGhpbiB0aGUgbWVzc2FnZQotIyAtIEdlbmVyaWMgdGFnIG1lc3NhZ2VzIC0tIGkuZS4sIHRob3NlIHVzZWQgaW4gbW9yZSB0aGFuIG9uZSB0YWcgLS0KLSMgICBzaG91bGQgYmVnaW4gd2l0aCBUQUdfCi0jIC0gRXJyb3JzIGZvciBUYWdMaWJyYXJ5VmFsaWRhdG9ycyBzaG91bGQgYmVnaW4gd2l0aCBUTFZfCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHZW5lcmljIHRhZyBlcnJvciBtZXNzYWdlcwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1UQUdfTlVMTF9BVFRSSUJVVEU9XAotICAgIFRoZSAiezB9IiBhdHRyaWJ1dGUgaWxsZWdhbGx5IGV2YWx1YXRlZCB0byAibnVsbCIgb3IgIiIgaW4gJmx0O3sxfSZndDsKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBTcGVjaWZpYyB0YWcgZXJyb3IgbWVzc2FnZXMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDT1JFCi0KLUNIT09TRV9FWENMVVNJVklUWT1cCi0gICAgT25seSBvbmUgJmx0O2Nob29zZSZndDsgc3VidGFnIG1heSBldmFsdWF0ZSBpdHMgYm9keQotCi1FWFBSX0JBRF9WQUxVRT1cCi0gICAgSW4gJmx0O2V4cHImZ3Q7LCBhdHRyaWJ1dGUgdmFsdWU9InswfSIgZGlkbid0IGV2YWx1YXRlIHN1Y2Nlc3NmdWxseSwgXAotICAgIGJ1dCB0aGVyZSB3YXMgbm8gImRlZmF1bHQiIGF0dHJpYnV0ZSBhbmQgbm8gbm9uLXdoaXRlc3BhY2UgY29udGVudCBcCi0gICAgZm9yIHRoZSB0YWcuCi0KLUZPUkVBQ0hfU1RFUF9OT19SRVNVTFRTRVQ9XAotICAgIFN0ZXAgY2Fubm90IGJlID4gMSB3aGVuIGl0ZXJhdGluZyBvdmVyIGEgUmVzdWx0U2V0IHdpdGggJmx0O2ZvckVhY2gmZ3Q7Ci0KLUZPUkVBQ0hfQkFEX0lURU1TPVwKLSAgICBEb24ndCBrbm93IGhvdyB0byBpdGVyYXRlIG92ZXIgc3VwcGxpZWQgIml0ZW1zIiBpbiAmbHQ7Zm9yRWFjaCZndDsKLQotSU1QT1JUX0JBRF9SRUxBVElWRT1cCi0gICAgSW4gVVJMIHRhZ3MsIHdoZW4gdGhlICJjb250ZXh0IiBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCBcCi0gICAgdmFsdWVzIG9mIGJvdGggImNvbnRleHQiIGFuZCAidXJsIiBtdXN0IHN0YXJ0IHdpdGggIi8iLgotCi1JTVBPUlRfUkVMX1dJVEhPVVRfSFRUUD1cCi0gICAgUmVsYXRpdmUgJmx0O2ltcG9ydCZndDsgZnJvbSBub24tSFRUUCByZXF1ZXN0IG5vdCBhbGxvd2VkCi0gICAgCi1JTVBPUlRfUkVMX1dJVEhPVVRfRElTUEFUQ0hFUj1cCi0gICAgVW5hYmxlIHRvIGdldCBSZXF1ZXN0RGlzcGF0Y2hlciBmb3IgQ29udGV4dDogInswfSIgYW5kIFVSTDogInsxfSIuIFwKLSAgICBWZXJpZnkgdmFsdWVzIGFuZC9vciBlbmFibGUgY3Jvc3MgY29udGV4dCBhY2Nlc3MuCi0KLUlNUE9SVF9JTz1cCi0gICAgSS9PIGVycm9yIGluICZsdDtpbXBvcnQmZ3Q7IG9jY3VycmVkIHJlYWRpbmcgInswfSIKLQotSU1QT1JUX0lMTEVHQUxfU1RSRUFNPVwKLSAgICBVbmV4cGVjdGVkIGludGVybmFsIGVycm9yIGR1cmluZyAmbHQ7aW1wb3J0Jmd0OiBcCi0gICAgVGFyZ2V0IHNlcnZsZXQgY2FsbGVkIGdldFdyaXRlcigpLCB0aGVuIGdldE91dHB1dFN0cmVhbSgpCi0KLUlNUE9SVF9JTExFR0FMX1dSSVRFUj1cCi0gICAgVW5leHBlY3RlZCBpbnRlcm5hbCBlcnJvciBkdXJpbmcgJmx0O2ltcG9ydCZndDogXAotICAgIFRhcmdldCBzZXJ2bGV0IGNhbGxlZCBnZXRPdXRwdXRTdHJlYW0oKSwgdGhlbiBnZXRXcml0ZXIoKQotCi0jSU1QT1JUX0lMTEVHQUxfR0VUU1RSSU5HPVwKLSMgICAgVW5leHBlY3RlZCBpbnRlcm5hbCBlcnJvciBkdXJpbmcgJmx0O2ltcG9ydCZndDogXAotIyAgICBUYXJnZXQgc2VydmxldCBjYWxsZWQgbmVpdGhlciBnZXRPdXRwdXRTdHJlYW0oKSBub3IgZ2V0V3JpdGVyKCkKLQotUEFSQU1fT1VUU0lERV9QQVJFTlQ9XAotICAgICZsdDtwYXJhbSZndDsgb3V0c2lkZSAmbHQ7aW1wb3J0Jmd0OyBvciAmbHQ7dXJsRW5jb2RlJmd0OwotCi1QQVJBTV9FTkNPREVfQk9PTEVBTj1cCi0gICAgSW4gJmx0O3BhcmFtJmd0OywgImVuY29kZSIgbXVzdCBiZSAidHJ1ZSIgb3IgImZhbHNlIi4gIEdvdCAiezB9IiBpbnN0ZWFkLgotCi1TRVRfQkFEX1NDT1BFPVwKLSAgICBJbnZhbGlkICJzY29wZSIgYXR0cmlidXRlIGZvciAmbHQ7c2V0Jmd0OzogICJ7MH0iCi0KLVNFVF9JTlZBTElEX1BST1BFUlRZPVwKLSAgICBJbnZhbGlkIHByb3BlcnR5IGluICZsdDtzZXQmZ3Q7OiAgInswfSIKLQotU0VUX0lOVkFMSURfVEFSR0VUPVwKLSAgICBBdHRlbXB0IHRvIHNldCB0aGUgcHJvcGVydHkgb2YgYW4gaW52YWxpZCBvYmplY3QgaW4gJmx0O3NldCZndDsuCi0KLVNFVF9OT19WQUxVRT1cCi0gICAgTmVlZCBlaXRoZXIgbm9uLXdoaXRlc3BhY2UgYm9keSBvciAidmFsdWUiIGF0dHJpYnV0ZSBpbiAmbHQ7c2V0Jmd0OwotCi1VUkxFTkNPREVfTk9fVkFMVUU9XAotICAgIE5lZWQgZWl0aGVyIG5vbi13aGl0ZXNwYWNlIGJvZHkgb3IgInZhbHVlIiBhdHRyaWJ1dGUgaW4gJmx0O3VybEVuY29kZSZndDsKLQotV0hFTl9PVVRTSURFX0NIT09TRT1cCi0gICAgSWxsZWdhbCB1c2Ugb2YgJmx0O3doZW4mZ3Q7LXN0eWxlIHRhZyB3aXRob3V0ICZsdDtjaG9vc2UmZ3Q7IGFzIGl0cyBcCi0gICAgZGlyZWN0IHBhcmVudAotCi0jIEkxOE4KLQotTE9DQUxFX05PX0xBTkdVQUdFPVwKLSAgICBNaXNzaW5nIGxhbmd1YWdlIGNvbXBvbmVudCBpbiAndmFsdWUnIGF0dHJpYnV0ZSBpbiAmbHQ7c2V0TG9jYWxlJmd0OyAKLQotTE9DQUxFX0VNUFRZX0NPVU5UUlk9XAotICAgIEVtcHR5IGNvdW50cnkgY29tcG9uZW50IGluICd2YWx1ZScgYXR0cmlidXRlIGluICZsdDtzZXRMb2NhbGUmZ3Q7Ci0KLVBBUkFNX09VVFNJREVfTUVTU0FHRT1cCi0gICAgJmx0O3BhcmFtJmd0OyBvdXRzaWRlICZsdDttZXNzYWdlJmd0OwotCi1NRVNTQUdFX05PX0tFWT1cCi0gICAgJmx0O21lc3NhZ2UmZ3Q7IG5lZWRzICdrZXknIGF0dHJpYnV0ZSBvciBub24td2hpdGVzcGFjZSBib2R5Ci0KLUZPUk1BVF9OVU1CRVJfSU5WQUxJRF9UWVBFPVwKLSAgICBJbiAmbHQ7Zm9ybWF0TnVtYmVyJmd0OywgaW52YWxpZCAndHlwZScgYXR0cmlidXRlOiAiezB9IgotCi1GT1JNQVRfTlVNQkVSX05PX1ZBTFVFPVwKLSAgICAmbHQ7Zm9ybWF0TnVtYmVyJmd0OyBuZWVkcyAndmFsdWUnIGF0dHJpYnV0ZSBvciBub24td2hpdGVzcGFjZSBib2R5Ci0KLUZPUk1BVF9OVU1CRVJfUEFSU0VfRVJST1I9XAotICAgIEluICZsdDtmb3JtYXROdW1iZXImZ3Q7LCAndmFsdWUnIGF0dHJpYnV0ZSBjYW4gbm90IGJlIHBhcnNlZCBpbnRvIGphdmEubGFuZy5OdW1iZXI6ICJ7MH0iCi0KLUZPUk1BVF9OVU1CRVJfQ1VSUkVOQ1lfRVJST1I9XAotICAgIEluICZsdDtmb3JtYXROdW1iZXImZ3Q7LCB1bmFibGUgdG8gc2V0IGN1cnJlbmN5Ci0KLVBBUlNFX05VTUJFUl9JTlZBTElEX1RZUEU9XAotICAgIEluICZsdDtwYXJzZU51bWJlciZndDssIGludmFsaWQgJ3R5cGUnIGF0dHJpYnV0ZTogInswfSIKLQotUEFSU0VfTlVNQkVSX05PX1ZBTFVFPVwKLSAgICAmbHQ7cGFyc2VOdW1iZXImZ3Q7IG5lZWRzICd2YWx1ZScgYXR0cmlidXRlIG9yIG5vbi13aGl0ZXNwYWNlIGJvZHkKLQotUEFSU0VfTlVNQkVSX05PX1BBUlNFX0xPQ0FMRT1cCi0gICAgSW4gJmx0O3BhcnNlTnVtYmVyJmd0OywgYSBwYXJzZSBsb2NhbGUgY2FuIG5vdCBiZSBlc3RhYmxpc2hlZAotCi1QQVJTRV9OVU1CRVJfUEFSU0VfRVJST1I9XAotICAgIEluICZsdDtwYXJzZU51bWJlciZndDssICd2YWx1ZScgYXR0cmlidXRlIGNhbiBub3QgYmUgcGFyc2VkOiAiezB9IgotCi1GT1JNQVRfREFURV9JTlZBTElEX1RZUEU9XAotICAgIEluICZsdDtmb3JtYXREYXRlJmd0OywgaW52YWxpZCAndHlwZScgYXR0cmlidXRlOiAiezB9IgotCi1GT1JNQVRfREFURV9CQURfVElNRVpPTkU9XAotICAgIEluICZsdDtmb3JtYXREYXRlJmd0OywgJ3RpbWVab25lJyBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIGphdmEubGFuZy5TdHJpbmcgb3IgamF2YS51dGlsLlRpbWVab25lCi0KLUZPUk1BVF9EQVRFX0lOVkFMSURfREFURV9TVFlMRT1cCi0gICAgSW4gJmx0O2Zvcm1hdERhdGUmZ3Q7LCBpbnZhbGlkICdkYXRlU3R5bGUnIGF0dHJpYnV0ZTogInswfSIKLQotRk9STUFUX0RBVEVfSU5WQUxJRF9USU1FX1NUWUxFPVwKLSAgICBJbiAmbHQ7Zm9ybWF0RGF0ZSZndDssIGludmFsaWQgJ3RpbWVTdHlsZScgYXR0cmlidXRlOiAiezB9IgotCi1QQVJTRV9EQVRFX0lOVkFMSURfVFlQRT1cCi0gICAgSW4gJmx0O3BhcnNlRGF0ZSZndDssIGludmFsaWQgJ3R5cGUnIGF0dHJpYnV0ZTogInswfSIKLQotUEFSU0VfREFURV9CQURfVElNRVpPTkU9XAotICAgIEluICZsdDtwYXJzZURhdGUmZ3Q7LCAndGltZVpvbmUnIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgamF2YS5sYW5nLlN0cmluZyBvciBqYXZhLnV0aWwuVGltZVpvbmUKLQotUEFSU0VfREFURV9JTlZBTElEX0RBVEVfU1RZTEU9XAotICAgIEluICZsdDtwYXJzZURhdGUmZ3Q7LCBpbnZhbGlkICdkYXRlU3R5bGUnIGF0dHJpYnV0ZTogInswfSIKLQotUEFSU0VfREFURV9JTlZBTElEX1RJTUVfU1RZTEU9XAotICAgIEluICZsdDtwYXJzZURhdGUmZ3Q7LCBpbnZhbGlkICd0aW1lU3R5bGUnIGF0dHJpYnV0ZTogInswfSIKLQotUEFSU0VfREFURV9OT19WQUxVRT1cCi0gICAgJmx0O3BhcnNlRGF0ZSZndDsgbmVlZHMgJ3ZhbHVlJyBhdHRyaWJ1dGUgb3Igbm9uLXdoaXRlc3BhY2UgYm9keQotCi1QQVJTRV9EQVRFX1BBUlNFX0VSUk9SPVwKLSAgICBJbiAmbHQ7cGFyc2VEYXRlJmd0OywgJ3ZhbHVlJyBhdHRyaWJ1dGUgY2FuIG5vdCBiZSBwYXJzZWQ6ICJ7MH0iCi0KLVBBUlNFX0RBVEVfTk9fUEFSU0VfTE9DQUxFPVwKLSAgICBJbiAmbHQ7cGFyc2VEYXRlJmd0OywgYSBwYXJzZSBsb2NhbGUgY2FuIG5vdCBiZSBlc3RhYmxpc2hlZAotCi1VTkRFRklORURfS0VZPVwKLSAgICBVbmRlZmluZWQga2V5ICJ7MH0iIGluIHJlc291cmNlIGJ1bmRsZSAiezF9IgotCi1NSVNTSU5HX1JFU09VUkNFX0JVTkRMRT1cCi0gICAgUmVzb3VyY2UgYnVuZGxlIHdpdGggYmFzZSBuYW1lICJ7MH0iIG5vdCBmb3VuZAotCi0jIFNRTAotCi1EUklWRVJfSU5WQUxJRF9DTEFTUz1cCi0gICAgSW4gJmx0O2RyaXZlciZndDssIGludmFsaWQgZHJpdmVyIGNsYXNzIG5hbWU6ICJ7MH0iCi0KLURBVEFTT1VSQ0VfSU5WQUxJRD1cCi0gICAgVW5hYmxlIHRvIGdldCBjb25uZWN0aW9uLCBEYXRhU291cmNlIGludmFsaWQ6ICJ7MH0iCi0gCi1KREJDX1BBUkFNX0NPVU5UPVwKLSAgICBJbnZhbGlkIG51bWJlciBvZiBKREJDIHBhcmFtZXRlcnMgc3BlY2lmaWVkLgotCi1QQVJBTV9CQURfVkFMVUU9XAotICAgIEludmFsaWQgb3Igb3V0IG9mIGJvdW5kcyB2YWx1ZSBzcGVjaWZpZWQgaW4gcGFyYW1ldGVyLgotIAotVFJBTlNBQ1RJT05fTk9fU1VQUE9SVD1cCi0gICAgSW4gJmx0O3RyYW5zYWN0aW9uJmd0OywgZGF0YXNvdXJjZSBkb2VzIG5vdCBzdXBwb3J0IHRyYW5zYWN0aW9ucwotCi1UUkFOU0FDVElPTl9DT01NSVRfRVJST1I9XAotICAgIEluICZsdDt0cmFuc2FjdGlvbiZndDssIGVycm9yIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb246ICJ7MH0iCi0KLVRSQU5TQUNUSU9OX0lOVkFMSURfSVNPTEFUSU9OPVwKLSAgICBJbiAmbHQ7dHJhbnNhY3Rpb24mZ3Q7LCBpbnZhbGlkIHRyYW5zYWN0aW9uIGlzb2xhdGlvbgotCi1OT1RfU1VQUE9SVEVEPVwKLSAgICBOb3Qgc3VwcG9ydGVkCi0KLUVSUk9SX0dFVF9DT05ORUNUSU9OPVwKLSAgICBFcnJvciBnZXR0aW5nIGNvbm5lY3Rpb246ICJ7MH0iCi0KLUVSUk9SX05FU1RFRF9EQVRBU09VUkNFPVwKLSAgICBJdCBpcyBpbGxlZ2FsIHRvIHNwZWNpZnkgYSBEYXRhU291cmNlIHdoZW4gbmVzdGVkIHdpdGhpbiBhICZsdDt0cmFuc2FjdGlvbiZndDsKLQotU1FMX1BBUkFNX09VVFNJREVfUEFSRU5UPVwKLSAgICAmbHQ7cGFyYW0mZ3Q7IG9yICZsdDtkYXRlUGFyYW0mZ3Q7IG11c3QgYmUgc3VidGFnIG9mIFNRTEV4ZWN1dGlvblRhZyBhY3Rpb25zIGxpa2UgJmx0O3F1ZXJ5Jmd0OyBvciAmbHQ7dXBkYXRlJmd0OwotCi1TUUxfTk9fU1RBVEVNRU5UPVwKLSAgICBObyBTUUwgc3RhdGVtZW50IHNwZWNpZmllZAotCi1TUUxfUFJPQ0VTU19FUlJPUj1cCi0gICAgRXJyb3IgcHJvY2Vzc2luZyBTUUw6ICJ7MH0iCi0KLVNRTF9EQVRBU09VUkNFX0lOVkFMSURfVFlQRT1cCi0gICAgJ2RhdGFTb3VyY2UnIGlzIG5laXRoZXIgYSBTdHJpbmcgbm9yIGEgamF2YXguc3FsLkRhdGFTb3VyY2UKLQotU1FMX0RBVEFTT1VSQ0VfTlVMTD1cCi0gICAgJ2RhdGFTb3VyY2UnIGlzIG51bGwKLQotU1FMX01BWFJPV1NfUEFSU0VfRVJST1I9XAotICAgIEVycm9yIHBhcnNpbmcgJ2phdmF4LnNlcnZsZXQuanNwLmpzdGwuc3FsLm1heFJvd3MnIGNvbmZpZ3VyYXRpb24gc2V0dGluZzogInswfSIKLQotU1FMX01BWFJPV1NfSU5WQUxJRD1cCi0gICAgJ2phdmF4LnNlcnZsZXQuanNwLmpzdGwuc3FsLm1heFJvd3MnIGNvbmZpZ3VyYXRpb24gc2V0dGluZyBuZWl0aGVyIGFuIEludGVnZXIgbm9yIGEgU3RyaW5nCi0KLVNRTF9EQVRFX1BBUkFNX0lOVkFMSURfVFlQRT1cCi0gICAgSW4gJmx0O2RhdGVQYXJhbSZndDssIGludmFsaWQgJ3R5cGUnIGF0dHJpYnV0ZTogInswfSIKLQotIyBYTUwKLQotRk9SRUFDSF9OT1RfTk9ERVNFVD1cCi0gICAgJmx0O2ZvckVhY2gmZ3Q7IGNhbid0IGl0ZXJhdGUgb3ZlciBYUGF0aCBleHByZXNzaW9ucyB0aGF0IGRvbid0IHJldHVybiBhIG5vZGUtc2V0Ci0KLVBBUkFNX05PX1ZBTFVFPVwKLSAgICAmbHQ7cGFyYW0mZ3Q7IG5lZWRzICd2YWx1ZScgYXR0cmlidXRlIG9yIG5vbi13aGl0ZXNwYWNlIGJvZHkKLQotUEFSQU1fT1VUU0lERV9UUkFOU0ZPUk09XAotICAgICZsdDtwYXJhbSZndDsgb3V0c2lkZSAmbHQ7dHJhbnNmb3JtJmd0OwotCi1QQVJTRV9JTlZBTElEX1NPVVJDRT1cCi0gICAgVW5yZWNvZ25pemVkIG9iamVjdCBzdXBwbGllZCBhcyAneG1sVGV4dCcgYXR0cmlidXRlIHRvICZsdDtwYXJzZSZndDsKLQotUEFSU0VfTk9fU0FYVFJBTlNGT1JNRVI9XAotICAgIEZpbHRlciBzdXBwbGllZCB0byAmbHQ7cGFyc2UmZ3Q7LCBidXQgZGVmYXVsdCBUcmFuc2Zvcm1lckZhY3RvcnkgXAotICAgIGRvZXMgbm90IHN1cHBvcnQgU0FYLgotCi1UUkFOU0ZPUk1fTk9fVFJBTlNGT1JNRVI9XAotICAgICZsdDt0cmFuc2Zvcm0mZ3Q7IG5lZWRzIGVpdGhlciBhbiAneHNsdCcgYXR0cmlidXRlIG9yIGEgXAotICAgICd0cmFuc2Zvcm1lcicgYXR0cmlidXRlCi0KLVRSQU5TRk9STV9TT1VSQ0VfSU5WQUxJRF9MSVNUPVwKLSAgICAmbHQ7dHJhbnNmb3JtJmd0OyBlbmNvdW50ZXJlZCBhbiBpbnZhbGlkIGphdmEudXRpbC5MaXN0IHdoaWxlIHByb2Nlc3NpbmcgJ3htbFRleHQnIGF0dHJpYnV0ZS4gIFRoaXMgZXJyb3IgaXMgdHlwaWNhbGx5IGNhdXNlZCBpZiB5b3UgcGFzcyBhIG5vZGUtc2V0IHdpdGggbW9yZSB0aGFuIG9uZSBub2RlIHRvICZsdDt0cmFuc2Zvcm0mZ3Q7J3MgJ3htbFRleHQnIGF0dHJpYnV0ZS4KLQotVFJBTlNGT1JNX1NPVVJDRV9VTlJFQ09HTklaRUQ9XAotICAgICZsdDt0cmFuc2Zvcm0mZ3Q7IGVuY291bnRlcmVkIGFuIHVua25vd24gdHlwZSB3aGlsZSBwcm9jZXNzaW5nICd4bWxUZXh0JyBhdHRyaWJ1dGUKLQotVU5BQkxFX1RPX1JFU09MVkVfRU5USVRZPVwKLSAgICBDb3VsZCBub3QgcmVzb2x2ZSBlbnRpdHkgcmVmZXJlbmNlOiAiezB9IgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEpTVEwgY29yZSBUTFYgbWVzc2FnZXMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBQYXJhbWV0ZXJzIAotCi1UTFZfUEFSQU1FVEVSX0VSUk9SPVwKLSAgICBJbnZhbGlkIHZhbHVlIGZvciAiezB9IiB2YWxpZGF0b3IgcGFyYW1ldGVyIGluIFRMRAotCi0jIEdlbmVyaWMgZXJyb3JzCi0KLVRMVl9JTExFR0FMX0JPRFk9XAotICAgIEVuY291bnRlcmVkIGlsbGVnYWwgYm9keSBvZiB0YWcgInswfSIgdGFnLCBnaXZlbiBpdHMgYXR0cmlidXRlcy4KLQotVExWX01JU1NJTkdfQk9EWT1cCi0gICAgQSBib2R5IGlzIG5lY2Vzc2FyeSBpbnNpZGUgdGhlICJ7MH0iIHRhZywgZ2l2ZW4gaXRzIGF0dHJpYnV0ZXMuCi0KLVRMVl9JTExFR0FMX0NISUxEX1RBRz1cCi0gICAgSWxsZWdhbCBjaGlsZCB0YWcgaW4gInswfTp7MX0iIHRhZzogInsyfSIgdGFnCi0KLVRMVl9JTExFR0FMX1RFWFRfQk9EWT1cCi0gICAgSWxsZWdhbCB0ZXh0IGluc2lkZSAiezB9OnsxfSIgdGFnOiAiezJ9Li4uIi4KLQotVExWX0lOVkFMSURfQVRUUklCVVRFPVwKLSAgICBJbnZhbGlkICJ7MH0iIGF0dHJpYnV0ZSBpbiAiezF9IiB0YWc6ICJ7Mn0iCi0KLVRMVl9JTExFR0FMX09SUEhBTj1cCi0gICAgSW52YWxpZCB1c2Ugb2YgInswfSIgdGFnIG91dHNpZGUgbGVnaXRpbWF0ZSBwYXJlbnQgdGFnCi0KLVRMVl9QQVJFTlRfV0lUSE9VVF9TVUJUQUc9XAotICAgIElsbGVnYWwgInswfSIgd2l0aG91dCBjaGlsZCAiezF9IiB0YWcKLQotIyBFcnJvcnMgY3VzdG9taXplZCB0byBwYXJ0aWN1bGFyIHRhZ3MgKHNvcnQgb2YpICA6LSkKLQotVExWX0lMTEVHQUxfT1JERVI9XAotICAgIElsbGVnYWwgInswfSIgYWZ0ZXIgInsxfTp7Mn0iIHRhZyBpbiAiezF9OnszfSIgdGFnLgotCi1UTFZfSUxMRUdBTF9QQVJBTT1cCi0gICAgSWxsZWdhbCAiezB9OnsxfSIgdGFnIHdpdGhpbiAiezB9OnsyfSB7M309Jy4uLiciIHRhZwotCi1UTFZfREFOR0xJTkdfU0NPUEU9XAotICAgIElsbGVnYWwgJ3Njb3BlJyBhdHRyaWJ1dGUgd2l0aG91dCAndmFyJyBpbiAiezB9IiB0YWcuCi0KLVRMVl9FTVBUWV9WQVI9XAotICAgIEVtcHR5ICd2YXInIGF0dHJpYnV0ZSBpbiAiezB9IiB0YWcuCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL0FyZ1RhZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9BcmdUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzMmJlNy4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL0FyZ1RhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkNvbnZlcnNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5jb252ZXJ0ZXJzLkJvb2xlYW5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5jb252ZXJ0ZXJzLkJ5dGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5jb252ZXJ0ZXJzLkNoYXJhY3RlckNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLmNvbnZlcnRlcnMuRG91YmxlQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuY29udmVydGVycy5GbG9hdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLmNvbnZlcnRlcnMuSW50ZWdlckNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLmNvbnZlcnRlcnMuTG9uZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLmNvbnZlcnRlcnMuU2hvcnRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLS8qKgotICogQW4gYXJndW1lbnQgdG8gYSB7QGxpbmsgTmV3VGFnfSBvciB7QGxpbmsgSW52b2tlVGFnfS4KLSAqIFRoaXMgdGFnIE1VU1QgYmUgZW5jbG9zZWQgd2l0aGluIGFuIHtAbGluayBBcmdUYWdQYXJlbnR9Ci0gKiBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAYXV0aG9yIFJvZG5leSBXYWxkaG9mZgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjkgJAotICovCi1wdWJsaWMgY2xhc3MgQXJnVGFnIGV4dGVuZHMgQmFzZUNsYXNzTG9hZGVyVGFnIHsKLQotICAgIC8vIGNvbnN0cnVjdG9ycwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIEFyZ1RhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBhdHRyaWJ1dGUgc2V0dGVycwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGNsYXNzIG9yIHR5cGUsIGlmIGFueS4KLSAgICAgKiBUaGlzIG1heSBiZSBhIGZ1bGx5IHNwZWNpZmllZCBjbGFzcyBuYW1lIG9yCi0gICAgICogYSBwcmltaXRpdmUgdHlwZSBuYW1lCi0gICAgICogKDxjb2RlPmJvb2xlYW48Y29kZT4sIDxjb2RlPmludDwvY29kZT4sIDxjb2RlPmRvdWJsZTwvY29kZT4sIGV0Yy4pLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgdGhpcy50eXBlU3RyaW5nID0gdHlwZTsKLSAgICB9Ci0KLSAgICAvKiogVGhlIChwb3NzaWJseSBudWxsKSB2YWx1ZSBvZiB0aGlzIGFyZ3VtZW50LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvLyB0YWcgbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotCi0gICAgICAgIENsYXNzIGtsYXNzID0gbnVsbDsKLSAgICAgICAgaWYoImJvb2xlYW4iLmVxdWFscyh0eXBlU3RyaW5nKSkgewotICAgICAgICAgICAga2xhc3MgPSBCb29sZWFuLlRZUEU7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmKCJieXRlIi5lcXVhbHModHlwZVN0cmluZykpIHsKLSAgICAgICAgICAgIGtsYXNzID0gQnl0ZS5UWVBFOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZigic2hvcnQiLmVxdWFscyh0eXBlU3RyaW5nKSkgewotICAgICAgICAgICAga2xhc3MgPSBTaG9ydC5UWVBFOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZigiaW50Ii5lcXVhbHModHlwZVN0cmluZykpIHsKLSAgICAgICAgICAgIGtsYXNzID0gSW50ZWdlci5UWVBFOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZigiY2hhciIuZXF1YWxzKHR5cGVTdHJpbmcpKSB7Ci0gICAgICAgICAgICBrbGFzcyA9IENoYXJhY3Rlci5UWVBFOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZigiZmxvYXQiLmVxdWFscyh0eXBlU3RyaW5nKSkgewotICAgICAgICAgICAga2xhc3MgPSBGbG9hdC5UWVBFOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZigibG9uZyIuZXF1YWxzKHR5cGVTdHJpbmcpKSB7Ci0gICAgICAgICAgICBrbGFzcyA9IExvbmcuVFlQRTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwodmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYoImRvdWJsZSIuZXF1YWxzKHR5cGVTdHJpbmcpKSB7Ci0gICAgICAgICAgICBrbGFzcyA9IERvdWJsZS5UWVBFOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZihudWxsICE9IHR5cGVTdHJpbmcpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgIGtsYXNzID0gZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3ModHlwZVN0cmluZyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZihudWxsID09IHZhbHVlKSB7IC8vIGFuZCAoYnkgY29uc3RydWN0aW9uKSBudWxsID09IHR5cGVTdHJpbmcKLSAgICAgICAgICAgIGtsYXNzID0gT2JqZWN0LmNsYXNzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAga2xhc3MgPSB2YWx1ZS5nZXRDbGFzcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIWlzSW5zdGFuY2VPZihrbGFzcyx2YWx1ZSkpIHsKLSAgICAgICAgICAgIGlmIChrbGFzcy5lcXVhbHMoQ2xhc3MuY2xhc3MpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoKFN0cmluZykgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbHVlID0gY29udmVydChrbGFzcyx2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBBcmdUYWdQYXJlbnQgcGFyZW50ID0gKEFyZ1RhZ1BhcmVudClmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoQXJnVGFnUGFyZW50LmNsYXNzKTsKLSAgICAgICAgaWYobnVsbCA9PSBwYXJlbnQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiVGhpcyB0YWcgbXVzdCBiZSBlbmNsb3NlZCBpbnNpZGUgYW4gQXJnVGFnUGFyZW50IGltcGxlbWVudGF0aW9uIChmb3IgZXhhbXBsZSwgPG5ldz4gb3IgPGludm9rZT4pIiApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGFyZW50LmFkZEFyZ3VtZW50KGtsYXNzLHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHByaXZhdGUgbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydE5vdE51bGwoT2JqZWN0IHZhbHVlKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZihudWxsID09IHZhbHVlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIkEgIiArIHR5cGVTdHJpbmcgKyAiIGluc3RhbmNlIGNhbm5vdCBiZSBudWxsLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5zdGFuY2VPZihDbGFzcyBrbGFzcywgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiAobnVsbCA9PSB2YWx1ZSB8fCAoa2xhc3MuaXNJbnN0YW5jZSh2YWx1ZSkpKTsKLSAgICB9Ci0KLSAgICAvLyBhdHRyaWJ1dGVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKiogVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0eXBlLCBpZiBhbnkuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHlwZVN0cmluZzsKLQotICAgIC8qKiBUaGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciwgaWYgYW55ICovCi0gICAgcHJpdmF0ZSBPYmplY3QgdmFsdWU7Ci0KLSAgICAvLyBzdGF0aWMgc3R1ZmYKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBjb252ZXJ0KENsYXNzIGtsYXNzLCBPYmplY3QgdmFsdWUpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmKG51bGwgPT0gdmFsdWUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgaWYoIWtsYXNzLmlzSW5zdGFuY2UodmFsdWUpKSB7Ci0gICAgICAgICAgICBDb252ZXJ0ZXIgY29udmVydGVyID0gKENvbnZlcnRlcikoY29udmVydGVyTWFwLmdldChrbGFzcykpOwotICAgICAgICAgICAgaWYobnVsbCA9PSBjb252ZXJ0ZXIpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIkNhbid0IGNvbnZlcnQgIiArIHZhbHVlICsgIiB0byAiICsga2xhc3MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVyLmNvbnZlcnQoa2xhc3MsdmFsdWUpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2goQ29udmVyc2lvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiQ2FuJ3QgY29udmVydCAiICsgdmFsdWUgKyAiIHRvICIgKyBrbGFzcyArICIgKCIgKyBlLnRvU3RyaW5nKCkgKyAiKSIsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKiogTXkgYmFnIG9mIGNvbnZlcnRlcnMsIGJ5IHRhcmdldCBDbGFzcyAqLwotICAgIHByaXZhdGUgc3RhdGljIE1hcCBjb252ZXJ0ZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIC8vIHRoZXNlIGlubmVyIGNsYXNzZXMgc2hvdWxkIHByb2JhYmx5IG1vdmUgdG8gYmVhbnV0aWxzCi0gICAgc3RhdGljIHsKLSAgICAgICAgewotICAgICAgICAgICAgQ29udmVydGVyIGMgPSBuZXcgQm9vbGVhbkNvbnZlcnRlcigpOwotICAgICAgICAgICAgY29udmVydGVyTWFwLnB1dChCb29sZWFuLlRZUEUsYyk7Ci0gICAgICAgICAgICBjb252ZXJ0ZXJNYXAucHV0KEJvb2xlYW4uY2xhc3MsYyk7Ci0gICAgICAgIH0KLSAgICAgICAgewotICAgICAgICAgICAgQ29udmVydGVyIGMgPSBuZXcgQ2hhcmFjdGVyQ29udmVydGVyKCk7Ci0gICAgICAgICAgICBjb252ZXJ0ZXJNYXAucHV0KENoYXJhY3Rlci5UWVBFLGMpOwotICAgICAgICAgICAgY29udmVydGVyTWFwLnB1dChDaGFyYWN0ZXIuY2xhc3MsYyk7Ci0gICAgICAgIH0KLSAgICAgICAgewotICAgICAgICAgICAgQ29udmVydGVyIGMgPSBuZXcgQ29udmVydGVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY29udmVydChDbGFzcyBrbGFzcywgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGUoKChOdW1iZXIpdmFsdWUpLmJ5dGVWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbm5lci5jb252ZXJ0KGtsYXNzLHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwcml2YXRlIENvbnZlcnRlciBpbm5lciA9IG5ldyBCeXRlQ29udmVydGVyKCk7Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgY29udmVydGVyTWFwLnB1dChCeXRlLlRZUEUsYyk7Ci0gICAgICAgICAgICBjb252ZXJ0ZXJNYXAucHV0KEJ5dGUuY2xhc3MsYyk7Ci0gICAgICAgIH0KLSAgICAgICAgewotICAgICAgICAgICAgQ29udmVydGVyIGMgPSBuZXcgQ29udmVydGVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY29udmVydChDbGFzcyBrbGFzcywgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNob3J0KCgoTnVtYmVyKXZhbHVlKS5zaG9ydFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlubmVyLmNvbnZlcnQoa2xhc3MsdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHByaXZhdGUgQ29udmVydGVyIGlubmVyID0gbmV3IFNob3J0Q29udmVydGVyKCk7Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgY29udmVydGVyTWFwLnB1dChTaG9ydC5UWVBFLGMpOwotICAgICAgICAgICAgY29udmVydGVyTWFwLnB1dChTaG9ydC5jbGFzcyxjKTsKLSAgICAgICAgfQotICAgICAgICB7Ci0gICAgICAgICAgICBDb252ZXJ0ZXIgYyA9IG5ldyBDb252ZXJ0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBjb252ZXJ0KENsYXNzIGtsYXNzLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcigoKE51bWJlcil2YWx1ZSkuaW50VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5uZXIuY29udmVydChrbGFzcyx2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJpdmF0ZSBDb252ZXJ0ZXIgaW5uZXIgPSBuZXcgSW50ZWdlckNvbnZlcnRlcigpOwotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIGNvbnZlcnRlck1hcC5wdXQoSW50ZWdlci5UWVBFLGMpOwotICAgICAgICAgICAgY29udmVydGVyTWFwLnB1dChJbnRlZ2VyLmNsYXNzLGMpOwotICAgICAgICB9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENvbnZlcnRlciBjID0gbmV3IENvbnZlcnRlcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNvbnZlcnQoQ2xhc3Mga2xhc3MsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgICAgICAgICBpZih2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMb25nKCgoTnVtYmVyKXZhbHVlKS5sb25nVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5uZXIuY29udmVydChrbGFzcyx2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJpdmF0ZSBDb252ZXJ0ZXIgaW5uZXIgPSBuZXcgTG9uZ0NvbnZlcnRlcigpOwotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIGNvbnZlcnRlck1hcC5wdXQoTG9uZy5UWVBFLGMpOwotICAgICAgICAgICAgY29udmVydGVyTWFwLnB1dChMb25nLmNsYXNzLGMpOwotICAgICAgICB9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENvbnZlcnRlciBjID0gbmV3IENvbnZlcnRlcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNvbnZlcnQoQ2xhc3Mga2xhc3MsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgICAgICAgICBpZih2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdCgoKE51bWJlcil2YWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbm5lci5jb252ZXJ0KGtsYXNzLHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwcml2YXRlIENvbnZlcnRlciBpbm5lciA9IG5ldyBGbG9hdENvbnZlcnRlcigpOwotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIGNvbnZlcnRlck1hcC5wdXQoRmxvYXQuVFlQRSxjKTsKLSAgICAgICAgICAgIGNvbnZlcnRlck1hcC5wdXQoRmxvYXQuY2xhc3MsYyk7Ci0gICAgICAgIH0KLSAgICAgICAgewotICAgICAgICAgICAgQ29udmVydGVyIGMgPSBuZXcgQ29udmVydGVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY29udmVydChDbGFzcyBrbGFzcywgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERvdWJsZSgoKE51bWJlcil2YWx1ZSkuZG91YmxlVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5uZXIuY29udmVydChrbGFzcyx2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJpdmF0ZSBDb252ZXJ0ZXIgaW5uZXIgPSBuZXcgRG91YmxlQ29udmVydGVyKCk7Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgY29udmVydGVyTWFwLnB1dChEb3VibGUuVFlQRSxjKTsKLSAgICAgICAgICAgIGNvbnZlcnRlck1hcC5wdXQoRG91YmxlLmNsYXNzLGMpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9BcmdUYWdQYXJlbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvQXJnVGFnUGFyZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNjZkNDIuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9BcmdUYWdQYXJlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZTsKLQotLyoqIEludGVyZmFjZSBmb3IgY2xhc3NlcyB0aGF0IHN1cHBvcnQge0BsaW5rIEFyZ1RhZ30gY2hpbGRyZW4uCi0gICogQGF1dGhvciBSb2RuZXkgV2FsZGhvZmYKLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNCAkCi0gICovCi1wdWJsaWMgaW50ZXJmYWNlIEFyZ1RhZ1BhcmVudCB7Ci0gICAgcHVibGljIHZvaWQgYWRkQXJndW1lbnQoQ2xhc3MgdHlwZSwgT2JqZWN0IHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvQmFzZUNsYXNzTG9hZGVyVGFnLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL0Jhc2VDbGFzc0xvYWRlclRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDUwZjBhLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvQmFzZUNsYXNzTG9hZGVyVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudXRpbC5DbGFzc0xvYWRlclV0aWxzOwotCi0vKiogQWJzdHJhY3QgYmFzZSB0YWcgcHJvdmlkaW5nIHtAbGluayBDbGFzc0xvYWRlcn0gc3VwcG9ydC4KLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAYXV0aG9yIFJvZG5leSBXYWxkaG9mZgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlQ2xhc3NMb2FkZXJUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLSAgICAvKioKLSAgICAgKiBUaGUgY2xhc3MgbG9hZGVyIHRvIHVzZSBmb3IgaW5zdGFudGlhdGluZyBhcHBsaWNhdGlvbiBvYmplY3RzLgotICAgICAqIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlciwgb3IgdGhlIGNsYXNzIGxvYWRlcgotICAgICAqIHVzZWQgdG8gbG9hZCBYTUxQYXJzZXIgaXRzZWxmLCBpcyB1c2VkLCBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlCi0gICAgICogPGNvZGU+dXNlQ29udGV4dENsYXNzTG9hZGVyPC9jb2RlPiB2YXJpYWJsZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogRG8gd2Ugd2FudCB0byB1c2UgdGhlIENvbnRleHQgQ2xhc3NMb2FkZXIgd2hlbiBsb2FkaW5nIGNsYXNzZXMKLSAgICAgKiBmb3IgaW5zdGFudGlhdGluZyBuZXcgb2JqZWN0cz8gIERlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHVzZUNvbnRleHRDbGFzc0xvYWRlciA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjbGFzcyBsb2FkZXIgdG8gYmUgdXNlZCBmb3IgaW5zdGFudGlhdGluZyBhcHBsaWNhdGlvbiBvYmplY3RzCi0gICAgICogd2hlbiByZXF1aXJlZC4gIFRoaXMgaXMgZGV0ZXJtaW5lZCBiYXNlZCB1cG9uIHRoZSBmb2xsb3dpbmcgcnVsZXM6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5UaGUgY2xhc3MgbG9hZGVyIHNldCBieSA8Y29kZT5zZXRDbGFzc0xvYWRlcigpPC9jb2RlPiwgaWYgYW55PC9saT4KLSAgICAgKiA8bGk+VGhlIHRocmVhZCBjb250ZXh0IGNsYXNzIGxvYWRlciwgaWYgaXQgZXhpc3RzIGFuZCB0aGUKLSAgICAgKiAgICAgPGNvZGU+dXNlQ29udGV4dENsYXNzTG9hZGVyPC9jb2RlPiBwcm9wZXJ0eSBpcyBzZXQgdG8gdHJ1ZTwvbGk+Ci0gICAgICogPGxpPlRoZSBjbGFzcyBsb2FkZXIgdXNlZCB0byBsb2FkIHRoZSBYTUxQYXJzZXIgY2xhc3MgaXRzZWxmLgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgewotICAgICAgICByZXR1cm4gQ2xhc3NMb2FkZXJVdGlscy5nZXRDbGFzc0xvYWRlcihjbGFzc0xvYWRlciwgdXNlQ29udGV4dENsYXNzTG9hZGVyLCBnZXRDbGFzcygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNsYXNzIGxvYWRlciB0byBiZSB1c2VkIGZvciBpbnN0YW50aWF0aW5nIGFwcGxpY2F0aW9uIG9iamVjdHMKLSAgICAgKiB3aGVuIHJlcXVpcmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTG9hZGVyIFRoZSBuZXcgY2xhc3MgbG9hZGVyIHRvIHVzZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiAgdG8gcmV2ZXJ0IHRvIHRoZSBzdGFuZGFyZCBydWxlcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGJvb2xlYW4gYXMgdG8gd2hldGhlciB0aGUgY29udGV4dCBjbGFzc2xvYWRlciBzaG91bGQgYmUgdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRVc2VDb250ZXh0Q2xhc3NMb2FkZXIoKSB7Ci0gICAgICAgIHJldHVybiB1c2VDb250ZXh0Q2xhc3NMb2FkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdG8gdXNlIHRoZSBDb250ZXh0IENsYXNzTG9hZGVyICh0aGUgb25lIGZvdW5kIGJ5Ci0gICAgICogY2FsbGluZyA8Y29kZT5UaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpPC9jb2RlPikKLSAgICAgKiB0byByZXNvbHZlL2xvYWQgY2xhc3Nlcy4gIElmIG5vdAotICAgICAqIHVzaW5nIENvbnRleHQgQ2xhc3NMb2FkZXIsIHRoZW4gdGhlIGNsYXNzLWxvYWRpbmcgZGVmYXVsdHMgdG8KLSAgICAgKiB1c2luZyB0aGUgY2FsbGluZy1jbGFzcycgQ2xhc3NMb2FkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYm9vbGVhbiBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlIEplbGx5Q29udGV4dCBDbGFzc0xvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VDb250ZXh0Q2xhc3NMb2FkZXIoYm9vbGVhbiB1c2UpIHsKLSAgICAgICAgdXNlQ29udGV4dENsYXNzTG9hZGVyID0gdXNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvQnJlYWtUYWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvQnJlYWtUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5YWI4Yi4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL0JyZWFrVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsLkJyZWFrRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkV4cHJlc3Npb247Ci0KLS8qKgotICogQSB0YWcgd2hpY2ggdGVybWluYXRlcyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBjdXJyZW50ICZsdDtmb3JFYWNoJmd0OyBvciAmbGc7d2hpbGUmZ3Q7Ci0gKiBsb29wLiBUaGlzIHRhZyBjYW4gdGFrZSBhbiBvcHRpb25hbCBib29sZWFuIHRlc3QgYXR0cmlidXRlIHdoaWNoIGlmIGl0cyB0cnVlCi0gKiB0aGVuIHRoZSBicmVhayBvY2N1cnMgb3RoZXJ3aXNlIHRoZSBsb29wIGNvbnRpbnVlcyBwcm9jZXNzaW5nLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS45ICQKLSAqLwotcHVibGljIGNsYXNzIEJyZWFrVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogVGhlIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuICovCi0gICAgcHJpdmF0ZSBFeHByZXNzaW9uIHRlc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBJZiBzcGVjaWZpZWQsIHRoZSBnaXZlbiB2YXJpYWJsZSB3aWxsIGhvbGQgYSB0cnVlL2ZhbHNlIHZhbHVlCi0gICAgICogaW5kaWNhdGluZyBpZiB0aGUgbG9vcCB3YXMgYnJva2VuLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHZhcjsKLQotICAgIHB1YmxpYyBCcmVha1RhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEJyZWFrRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBicm9rZW4gPSBmYWxzZTsKLSAgICAgICAgaWYgKHRlc3QgPT0gbnVsbCB8fCB0ZXN0LmV2YWx1YXRlQXNCb29sZWFuKGNvbnRleHQpKSB7Ci0gICAgICAgICAgICBicm9rZW4gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICggdmFyICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKCB0aGlzLnZhciwgU3RyaW5nLnZhbHVlT2YoYnJva2VuKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBicm9rZW4gKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnJlYWtFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEplbGx5IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUgKG9wdGlvbmFsKS4KLSAgICAgKiBJZiB0aGlzIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIGV2YWx1YXRlcyB0bwotICAgICAqIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gdGhlIGxvb3AgaXMgdGVybWluYXRlZAotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3QgdGhlIEplbGx5IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXN0KEV4cHJlc3Npb24gdGVzdCkgewotICAgICAgICB0aGlzLnRlc3QgPSB0ZXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhcmlhYmxlIG5hbWUgdG8gZXhwb3J0IGluZGljYXRpbmcgaWYgdGhlIGl0ZW0gd2FzIGJyb2tlbgotICAgICAqIEBwYXJhbSB2YXIgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gYmUgZXhwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvQ2FzZVRhZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9DYXNlVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZWQ5NzIuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9DYXNlVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5FeHByZXNzaW9uOwotCi0vKioKLSAqIEEgdGFnIHdoaWNoIGNvbmRpdGlvbmFsbHkgZXZhbHVhdGVzIGl0cyBib2R5IGlmCi0gKiBteSB7QGxpbmsgI3NldFZhbHVlIHZhbHVlfSBhdHRyaWJ1dGUgZXF1YWxzIG15IGFuY2VzdG9yCi0gKiB7QGxpbmsgU3dpdGNoVGFnICZsdDtzd2l0Y2gmZ3Q7fSB0YWcncwotICoge0BsaW5rIFN3aXRjaFRhZyNzZXRPbiAib24ifSBhdHRyaWJ1dGUuCi0gKgotICogVGhpcyB0YWcgbXVzdCBiZSBjb250YWluZWQgd2l0aGluIHRoZSBib2R5IG9mIHNvbWUKLSAqIHtAbGluayBTd2l0Y2hUYWcgJmx0O3N3aXRjaCZndDt9IHRhZy4KLSAqCi0gKiBAc2VlIFN3aXRjaFRhZwotICoKLSAqIEBhdXRob3IgUm9kbmV5IFdhbGRob2ZmCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOCAkICREYXRlOiAyMDA0LzA5LzA5IDEyOjI3OjUzICQKLSAqLwotcHVibGljIGNsYXNzIENhc2VUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIHB1YmxpYyBDYXNlVGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShFeHByZXNzaW9uIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWVFeHByZXNzaW9uID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmFsbFRocnUoYm9vbGVhbiBmYWxsVGhydSkgewotICAgICAgICB0aGlzLmZhbGxUaHJ1ID0gZmFsbFRocnU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYobnVsbCA9PSB0aGlzLnZhbHVlRXhwcmVzc2lvbikgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oInZhbHVlIik7Ci0gICAgICAgIH0KLSAgICAgICAgU3dpdGNoVGFnIHRhZyA9IChTd2l0Y2hUYWcpZmluZEFuY2VzdG9yV2l0aENsYXNzKFN3aXRjaFRhZy5jbGFzcyk7Ci0gICAgICAgIGlmKG51bGwgPT0gdGFnKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIlRoaXMgdGFnIG11c3QgYmUgZW5jbG9zZWQgaW5zaWRlIGEgPHN3aXRjaD4gdGFnIiApOwotICAgICAgICB9Ci0gICAgICAgIGlmKHRhZy5oYXNEZWZhdWx0QmVlbkVuY291bnRlcmVkKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiPGRlZmF1bHQ+IHNob3VsZCBiZSB0aGUgbGFzdCB0YWcgd2l0aGluIGEgPHN3aXRjaD4iICk7Ci0gICAgICAgIH0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gdmFsdWVFeHByZXNzaW9uLmV2YWx1YXRlKGNvbnRleHQpOwotICAgICAgICBpZih0YWcuaXNGYWxsaW5nVGhydSgpIHx8Ci0gICAgICAgICAgIChudWxsID09IHRhZy5nZXRWYWx1ZSgpICYmIG51bGwgPT0gdmFsdWUpIHx8Ci0gICAgICAgICAgIChudWxsICE9IHRhZy5nZXRWYWx1ZSgpICYmIHRhZy5nZXRWYWx1ZSgpLmVxdWFscyh2YWx1ZSkpKSB7Ci0gICAgICAgICAgICB0YWcuY2FzZU1hdGNoZWQoKTsKLSAgICAgICAgICAgIHRhZy5zZXRGYWxsaW5nVGhydShmYWxsVGhydSk7Ci0gICAgICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBBdHRyaWJ1dGVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHJpdmF0ZSBFeHByZXNzaW9uIHZhbHVlRXhwcmVzc2lvbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZhbGxUaHJ1ID0gZmFsc2U7Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvQ2F0Y2hUYWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvQ2F0Y2hUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjOTRiYi4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL0NhdGNoVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqCi0gKiBBIHRhZyB3aGljaCBjYXRjaGVzIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IGl0cyBib2R5LgotICogVGhpcyBhbGxvd3MgY29uZGl0aW9uYWwgbG9naWMgdG8gYmUgcGVyZm9ybWVkIGJhc2VkIG9uIGlmIGV4Y2VwdGlvbnMKLSAqIGFyZSB0aHJvd24gb3IgdG8gZG8gc29tZSBraW5kIG9mIGN1c3RvbSBleGNlcHRpb24gbG9nZ2luZyBsb2dpYy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXRjaFRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyOwotCi0gICAgcHVibGljIENhdGNoVGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAodmFyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRleHQucmVtb3ZlVmFyaWFibGUodmFyKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgaWYgKHZhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgd2hpY2ggaXMgZXhwb3NlZCB3aXRoIHRoZSBFeGNlcHRpb24gdGhhdCBnZXRzCi0gICAgICogdGhyb3duIGJ5IGV2YWx1YXRpbmcgdGhlIGJvZHkgb2YgdGhpcyB0YWcgb3Igd2hpY2ggaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMKLSAgICAgKiBubyBleGNlcHRpb24gdGhyb3duLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0gICAgICAgIHRoaXMudmFyID0gdmFyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvQ2hvb3NlVGFnLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL0Nob29zZVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDlhNzE4Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvQ2hvb3NlVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqIEEgdGFnIHdoaWNoIGNvbmRpdGlvbmFsbHkgZXZhbHVhdGVzIGl0cyBib2R5IGJhc2VkIG9uIHNvbWUgY29uZGl0aW9uCi0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEyICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBDaG9vc2VUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBibG9ja0V2YWx1YXRlZDsKLQotICAgIHB1YmxpYyBDaG9vc2VUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHNldEJsb2NrRXZhbHVhdGVkKGZhbHNlKTsKLSAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQmxvY2tFdmFsdWF0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBibG9ja0V2YWx1YXRlZDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRCbG9ja0V2YWx1YXRlZChib29sZWFuIGJsb2NrRXZhbHVhdGVkKSB7Ci0gICAgICAgIHRoaXMuYmxvY2tFdmFsdWF0ZWQgPSBibG9ja0V2YWx1YXRlZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL0NvcmVUYWdMaWJyYXJ5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL0NvcmVUYWdMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMTA1MjUuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9Db3JlVGFnTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ0xpYnJhcnk7Ci0KLS8qKgotICAqIFRoaXMgaXMgdGhlIGNvcmUgdGFnIGxpYnJhcnkgZm9yIGplbGx5IGFuZCBjb250YWlucyBjb21tb25seQotICAqIHVzZWQgdGFncy4KLSAgKiBUaGlzIGNsYXNzIGNvdWxkIGJlIGdlbmVyYXRlZCBieSBYRG9jbGV0Ci0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMzICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBDb3JlVGFnTGlicmFyeSBleHRlbmRzIFRhZ0xpYnJhcnkgewotCi0gICAgcHVibGljIENvcmVUYWdMaWJyYXJ5KCkgewotICAgICAgICByZWdpc3RlclRhZygiamVsbHkiLCBKZWxseVRhZy5jbGFzcyk7Ci0KLSAgICAgICAgLy8gY29yZSB0YWdzCi0gICAgICAgIHJlZ2lzdGVyVGFnKCJvdXQiLCBFeHByVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImNhdGNoIiwgQ2F0Y2hUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygiZm9yRWFjaCIsIEZvckVhY2hUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygic2V0IiwgU2V0VGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInJlbW92ZSIsIFJlbW92ZVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJ3aGlsZSIsIFdoaWxlVGFnLmNsYXNzKTsKLQotICAgICAgICAvLyBjb25kaXRpb25hbCB0YWdzCi0gICAgICAgIHJlZ2lzdGVyVGFnKCJpZiIsIElmVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImNob29zZSIsIENob29zZVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJ3aGVuIiwgV2hlblRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJvdGhlcndpc2UiLCBPdGhlcndpc2VUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygic3dpdGNoIiwgU3dpdGNoVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImNhc2UiLCBDYXNlVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImRlZmF1bHQiLCBEZWZhdWx0VGFnLmNsYXNzKTsKLQotICAgICAgICAvLyBvdGhlciB0YWdzCi0gICAgICAgIHJlZ2lzdGVyVGFnKCJpbmNsdWRlIiwgSW5jbHVkZVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJpbXBvcnQiLCBJbXBvcnRUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygibXV0ZSIsIE11dGVUYWcuY2xhc3MpOwotCi0gICAgICAgIC8vIGV4dGVuc2lvbnMgdG8gSlNUTAotICAgICAgICByZWdpc3RlclRhZygiYXJnIiwgQXJnVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImJyZWFrIiwgQnJlYWtUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygiZXhwciIsIEV4cHJUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygiZmlsZSIsIEZpbGVUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygiZ2V0U3RhdGljIiwgR2V0U3RhdGljVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImludm9rZSIsIEludm9rZVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJpbnZva2VTdGF0aWMiLCBJbnZva2VTdGF0aWNUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygibmV3IiwgTmV3VGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInBhcnNlIiwgUGFyc2VUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygic2NvcGUiLCBTY29wZVRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJzZXRQcm9wZXJ0aWVzIiwgU2V0UHJvcGVydGllc1RhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJ0aHJlYWQiLCBUaHJlYWRUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygidXNlQmVhbiIsIFVzZUJlYW5UYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygidXNlTGlzdCIsIFVzZUxpc3RUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygid2hpdGVzcGFjZSIsIFdoaXRlc3BhY2VUYWcuY2xhc3MpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9EZWZhdWx0VGFnLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL0RlZmF1bHRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU4YTA5OS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL0RlZmF1bHRUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0KLS8qKgotICogQSB0YWcgd2hpY2ggY29uZGl0aW9uYWxseSBldmFsdWF0ZXMgaXRzIGJvZHkgaWYKLSAqIG5vbmUgb2YgaXRzIHByZWNlZWRpbmcgc2libGluZyB7QGxpbmsgQ2FzZVRhZyAmbHQ7Y2FzZSZndDt9Ci0gKiB0YWdzIGhhdmUgYmVlbiBldmFsdWF0ZWQuCi0gKgotICogVGhpcyB0YWcgbXVzdCBiZSBjb250YWluZWQgd2l0aGluIHRoZSBib2R5IG9mIHNvbWUKLSAqIHtAbGluayBTd2l0Y2hUYWcgJmx0O3N3aXRjaCZndDt9IHRhZy4KLSAqCi0gKiBAc2VlIFN3aXRjaFRhZwotICoKLSAqIEBhdXRob3IgUm9kbmV5IFdhbGRob2ZmCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOCAkICREYXRlOiAyMDA0LzA5LzA5IDEyOjI3OjUzICQKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIHB1YmxpYyBEZWZhdWx0VGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZhbGxUaHJ1KGJvb2xlYW4gZmFsbFRocnUpIHsKLSAgICAgICAgdGhpcy5mYWxsVGhydSA9IGZhbGxUaHJ1OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN3aXRjaFRhZyB0YWcgPSAoU3dpdGNoVGFnKWZpbmRBbmNlc3RvcldpdGhDbGFzcyhTd2l0Y2hUYWcuY2xhc3MpOwotICAgICAgICBpZihudWxsID09IHRhZykgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJUaGlzIHRhZyBtdXN0IGJlIGVuY2xvc2VkIGluc2lkZSBhIDxzd2l0Y2g+IHRhZyIgKTsKLSAgICAgICAgfQotICAgICAgICBpZih0YWcuaGFzRGVmYXVsdEJlZW5FbmNvdW50ZXJlZCgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIk9ubHkgb25lIDxkZWZhdWx0PiB0YWcgaXMgYWxsb3dlZCBwZXIgPHN3aXRjaD4uIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGFnLmRlZmF1bHRFbmNvdW50ZXJlZCgpOwotICAgICAgICBpZih0YWcuaXNGYWxsaW5nVGhydSgpIHx8ICghdGFnLmhhc1NvbWVDYXNlTWF0Y2hlZCgpKSkgewotICAgICAgICAgICAgdGFnLmNhc2VNYXRjaGVkKCk7Ci0gICAgICAgICAgICB0YWcuc2V0RmFsbGluZ1RocnUoZmFsbFRocnUpOwotICAgICAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQXR0cmlidXRlcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHByaXZhdGUgYm9vbGVhbiBmYWxsVGhydSA9IGZhbHNlOwotCi19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL0V4cHJUYWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvRXhwclRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzhjNGZmLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvRXhwclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKiBBIHRhZyB3aGljaCBldmFsdWF0ZXMgYW4gZXhwcmVzc2lvbgotICAqCi0gICogQHRhZyBvdXQKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjE2ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBFeHByVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogVGhlIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuICovCi0gICAgcHJpdmF0ZSBFeHByZXNzaW9uIHZhbHVlOwotCi0gICAgcHVibGljIEV4cHJUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGV4dCA9IHZhbHVlLmV2YWx1YXRlQXNTdHJpbmcoY29udGV4dCk7Ci0gICAgICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUodGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oImNvdWxkIG5vdCB3cml0ZSB0aGUgWE1MT3V0cHV0IixlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBKZXhsIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuCi0gICAgICoKLSAgICAgKiBAcmVxdWlyZWQgdHJ1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKEV4cHJlc3Npb24gdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvRmlsZVRhZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9GaWxlVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMzkwYTQuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9GaWxlVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnV0aWwuU2FmZUNvbnRlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5kb200ai5pby5IVE1MV3JpdGVyOwotaW1wb3J0IG9yZy5kb200ai5pby5PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmRvbTRqLmlvLlhNTFdyaXRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogQSB0YWcgdGhhdCBwaXBlcyBpdHMgYm9keSB0byBhIGZpbGUgZGVub3RlZCBieSB0aGUgbmFtZSBhdHRyaWJ1dGUgb3IgdG8gYW4gaW4gbWVtb3J5IFN0cmluZwotICogd2hpY2ggaXMgdGhlbiBvdXRwdXQgdG8gYSB2YXJpYWJsZSBkZW5vdGVkIGJ5IHRoZSB2YXIgdmFyaWFibGUuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86dmluYXljQGFwYWNoZS5vcmciPlZpbmF5IENoYW5kcmFuPC9hPgotICovCi1wdWJsaWMgY2xhc3MgRmlsZVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotICAgIHByaXZhdGUgYm9vbGVhbiBkb0FwcGVuZCA9IGZhbHNlOwotICAgIHByaXZhdGUgU3RyaW5nIHZhcjsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgYm9vbGVhbiBvbWl0WG1sRGVjbGFyYXRpb24gPSBmYWxzZTsKLSAgICBwcml2YXRlIFN0cmluZyBvdXRwdXRNb2RlID0gInhtbCI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHByZXR0eVByaW50OwotICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nOwotCi0gICAgcHVibGljIEZpbGVUYWcoKXsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoZmluYWwgWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICggbmFtZSAhPSBudWxsICkgewotICAgICAgICAgICAgICAgIFN0cmluZyBlbmNvZGluZyA9ICh0aGlzLmVuY29kaW5nICE9IG51bGwpID8gdGhpcy5lbmNvZGluZyA6ICJVVEYtOCI7Ci0gICAgICAgICAgICAgICAgV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIG5ldyBGaWxlT3V0cHV0U3RyZWFtKCBuYW1lLCBkb0FwcGVuZCApLCBlbmNvZGluZyApOwotICAgICAgICAgICAgICAgIHdyaXRlQm9keSh3cml0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodmFyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgICAgIHdyaXRlQm9keSh3cml0ZXIpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUodmFyLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICJUaGlzIHRhZyBtdXN0IGhhdmUgZWl0aGVyIHRoZSAnbmFtZScgb3IgdGhlICd2YXInIHZhcmlhYmxlcyBkZWZpbmVkIiApOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiY291bGQgbm90IHdyaXRlIGZpbGUiLGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmlsZSBuYW1lIGZvciB0aGUgb3V0cHV0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0aGUgWE1MIGRlY2xhcmF0aW9uIHNob3VsZCBiZSBvdXRwdXQgb3Igbm90Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T21pdFhtbERlY2xhcmF0aW9uKGJvb2xlYW4gb21pdFhtbERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIHRoaXMub21pdFhtbERlY2xhcmF0aW9uID0gb21pdFhtbERlY2xhcmF0aW9uOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgb3V0cHV0IG1vZGUsIHdoZXRoZXIgWE1MIG9yIEhUTUwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRNb2RlKFN0cmluZyBvdXRwdXRNb2RlKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0TW9kZSA9IG91dHB1dE1vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIHByZXR0eSBwcmludGluZyBtb2RlIGlzIHR1cm5lZCBvbi4gVGhlIGRlZmF1bHQgaXMgb2ZmIHNvIHRoYXQgd2hpdGVzcGFjZSBpcyBwcmVzZXJ2ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmV0dHlQcmludChib29sZWFuIHByZXR0eVByaW50KSB7Ci0gICAgICAgIHRoaXMucHJldHR5UHJpbnQgPSBwcmV0dHlQcmludDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBYTUwgZW5jb2RpbmcgbW9kZSwgd2hpY2ggZGVmYXVsdHMgdG8gVVRGLTgKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHsKLSAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHdldGhlciB0byBhcHBlbmQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZQotICAgICAqIChub3QgcmVhbGx5IHNvbWV0aGluZyB5b3Ugbm9ybWFsbHkgZG8gd2l0aCBhbiBYTUwgZmlsZSkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QXBwZW5kKGJvb2xlYW4gZG9BcHBlbmQpIHsKLSAgICAgICAgdGhpcy5kb0FwcGVuZCA9IGRvQXBwZW5kOwotICAgIH0KLSAgICAKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhci4KLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFyKCkgewotICAgICAgICByZXR1cm4gdmFyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhci4KLSAgICAgKiBAcGFyYW0gdmFyIFRoZSB2YXIgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBib2R5IGZvIHRoaXMgdGFnIHRvIHRoZSBnaXZlbiBXcml0ZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUJvZHkoV3JpdGVyIHdyaXRlcikgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSmVsbHlUYWdFeGNlcHRpb24gewotCi0gICAgICAgIFhNTE91dHB1dCBuZXdPdXRwdXQgPSBjcmVhdGVYTUxPdXRwdXQod3JpdGVyKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gYXZvaWQgbXVsdGlwbGUgc3RhcnQvZW5kIGRvY3VtZW50IGV2ZW50cwotICAgICAgICAgICAgbmV3T3V0cHV0LnNldENvbnRlbnRIYW5kbGVyKAotICAgICAgICAgICAgICAgIG5ldyBTYWZlQ29udGVudEhhbmRsZXIobmV3T3V0cHV0LmdldENvbnRlbnRIYW5kbGVyKCkpCi0gICAgICAgICAgICApOwotICAgICAgICAgICAgbmV3T3V0cHV0LnN0YXJ0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGludm9rZUJvZHkobmV3T3V0cHV0KTsKLSAgICAgICAgICAgIG5ld091dHB1dC5lbmREb2N1bWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsgbmV3T3V0cHV0LmNsb3NlKCk7IH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBYTUxPdXRwdXQgZnJvbSB0aGUgZ2l2ZW4gV3JpdGVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBYTUxPdXRwdXQgY3JlYXRlWE1MT3V0cHV0KFdyaXRlciB3cml0ZXIpIHsKLQotICAgICAgICBPdXRwdXRGb3JtYXQgZm9ybWF0ID0gbnVsbDsKLSAgICAgICAgaWYgKHByZXR0eVByaW50KSB7Ci0gICAgICAgICAgICBmb3JtYXQgPSBPdXRwdXRGb3JtYXQuY3JlYXRlUHJldHR5UHJpbnQoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGZvcm1hdCA9IG5ldyBPdXRwdXRGb3JtYXQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIGVuY29kaW5nICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBmb3JtYXQuc2V0RW5jb2RpbmcoIGVuY29kaW5nICk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBvbWl0WG1sRGVjbGFyYXRpb24gKSB7Ci0gICAgICAgICAgICBmb3JtYXQuc2V0U3VwcHJlc3NEZWNsYXJhdGlvbih0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNIdG1sID0gb3V0cHV0TW9kZSAhPSBudWxsICYmIG91dHB1dE1vZGUuZXF1YWxzSWdub3JlQ2FzZSggImh0bWwiICk7Ci0gICAgICAgIGZpbmFsIFhNTFdyaXRlciB4bWxXcml0ZXIgPSAoaXNIdG1sKQotICAgICAgICAgICAgPyBuZXcgSFRNTFdyaXRlcih3cml0ZXIsIGZvcm1hdCkKLSAgICAgICAgICAgIDogbmV3IFhNTFdyaXRlcih3cml0ZXIsIGZvcm1hdCk7Ci0KLSAgICAgICAgeG1sV3JpdGVyLnNldEVzY2FwZVRleHQoaXNFc2NhcGVUZXh0KCkpOwotCi0gICAgICAgIFhNTE91dHB1dCBhbnN3ZXIgPSBuZXcgWE1MT3V0cHV0KCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBhbnN3ZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sV3JpdGVyKTsKLSAgICAgICAgYW5zd2VyLnNldExleGljYWxIYW5kbGVyKHhtbFdyaXRlcik7Ci0gICAgICAgIHJldHVybiBhbnN3ZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9Gb3JFYWNoVGFnLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL0ZvckVhY2hUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdlNmZiOS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL0ZvckVhY2hUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLmpzdGwuY29yZS5Mb29wVGFnU3RhdHVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5CcmVha0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gICogSXRlcmF0ZXMgb3ZlciBhIGNvbGxlY3Rpb24sIGl0ZXJhdG9yIG9yIGFuIGFycmF5IG9mIG9iamVjdHMuCi0gICogVXNlcyB0aGUgc2FtZSBzeW50YXggYXMgdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvanNwL2pzdGwvIj5KU1RMPC9hPgotICAqIDxjb2RlPmZvckVhY2g8L2NvZGU+IHRhZyBkb2VzLgotICAqCi0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yOSAkCi0gICovCi1wdWJsaWMgY2xhc3MgRm9yRWFjaFRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEZvckVhY2hUYWcuY2xhc3MpOwotCi0gICAgLyoqIEhvbGRzIHRoZSB2YXJpYWJsZSBuYW1lIHRvIGV4cG9ydCBmb3IgdGhlIGl0ZW0gYmVpbmcgaXRlcmF0ZWQgb3Zlci4gKi8KLSAgICBwcml2YXRlIEV4cHJlc3Npb24gaXRlbXM7Ci0KLSAgICAvKioKLSAgICAgKiBJZiBzcGVjaWZpZWQgdGhlbiB0aGUgY3VycmVudCBpdGVtIGl0ZXJhdGVkIHRocm91Z2ggd2lsbCBiZSBkZWZpbmVkCi0gICAgICogYXMgdGhlIGdpdmVuIHZhcmlhYmxlIG5hbWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyOwotCi0gICAgLyoqCi0gICAgICogSWYgc3BlY2lmaWVkIHRoZW4gdGhlIGN1cnJlbnQgaW5kZXggY291bnRlciB3aWxsIGJlIGRlZmluZWQKLSAgICAgKiBhcyB0aGUgZ2l2ZW4gdmFyaWFibGUgbmFtZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBpbmRleFZhcjsKLSAgICAKLSAgICAvKiogdmFyaWFibGUgdG8gaG9sZCBsb29wIHN0YXR1cyAqLwotICAgIHByaXZhdGUgU3RyaW5nIHN0YXR1c1ZhcjsKLQotICAgIC8qKiBUaGUgc3RhcnRpbmcgaW5kZXggdmFsdWUgKi8KLSAgICBwcml2YXRlIGludCBiZWdpbjsKLQotICAgIC8qKiBUaGUgZW5kaW5nIGluZGV4IHZhbHVlICovCi0gICAgcHJpdmF0ZSBpbnQgZW5kID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0KLSAgICAvKiogVGhlIGluZGV4IGluY3JlbWVudCBzdGVwICovCi0gICAgcHJpdmF0ZSBpbnQgc3RlcCA9IDE7Ci0KLSAgICAvKiogVGhlIGl0ZXJhdGlvbiBpbmRleCAqLwotICAgIHByaXZhdGUgaW50IGluZGV4OwotCi0gICAgcHVibGljIEZvckVhY2hUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygicnVubmluZyB3aXRoIGl0ZW1zOiAiICsgaXRlbXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChpdGVtcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IGl0ZW1zLmV2YWx1YXRlQXNJdGVyYXRvcihjb250ZXh0KTsKLSAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJdGVyYXRpbmcgdGhyb3VnaDogIiArIGl0ZXIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZmlyc3QgaXRlbXMgb2YgdGhlIGl0ZXJhdG9yCi0gICAgICAgICAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgYmVnaW4gJiYgaXRlci5oYXNOZXh0KCk7IGluZGV4KysgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBzZXQgdXAgdGhlIHN0YXR1cwotICAgICAgICAgICAgICAgIExvb3BTdGF0dXMgc3RhdHVzID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzVmFyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdXAgc3RhdGlpIGFzIHJlcXVpcmVkIGJ5IEpTVEwKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBzdGF0dXNCZWdpbiA9IChiZWdpbiA9PSAwKSA/IG51bGwgOiBuZXcgSW50ZWdlcihiZWdpbik7Ci0gICAgICAgICAgICAgICAgICAgIEludGVnZXIgc3RhdHVzRW5kID0gKGVuZCA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkgPyBudWxsIDogbmV3IEludGVnZXIoZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBzdGF0dXNTdGVwID0gKHN0ZXAgPT0gMSkgPyBudWxsIDogbmV3IEludGVnZXIoc3RlcCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBMb29wU3RhdHVzKHN0YXR1c0JlZ2luLCBzdGF0dXNFbmQsIHN0YXR1c1N0ZXApOwotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHN0YXR1c1Zhciwgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBib29sZWFuIGZpcnN0VGltZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgaW5kZXggPD0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUodmFyLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4VmFyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoaW5kZXhWYXIsIG5ldyBJbnRlZ2VyKGluZGV4KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBzdGF0dXMgdmFyIHVwCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXNWYXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXRDb3VudChjb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0Q3VycmVudCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0Rmlyc3QoZmlyc3RUaW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXRJbmRleChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgZmlyc3QgdGltZSB1cCBmb3IgdGhlIG5leHQgaXRlcmF0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0VGltZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9ICFmaXJzdFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gbm93IHdlIG5lZWQgdG8gd29yayBvdXQgdGhlIG5leHQgaW5kZXggZm9yIHN0YXR1cyBpc0xhc3QKLSAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGFsc28gYWR2YW5jZSB0aGUgaXRlcmF0b3IgYW5kIGluZGV4IGZvciB0aGUgbG9vcC4KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmaW5pc2hlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDE7IGkgPCBzdGVwICYmICFmaW5pc2hlZDsgaSsrLCBpbmRleCsrICkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIGl0ZXIuaGFzTmV4dCgpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzVmFyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXRMYXN0KGZpbmlzaGVkIHx8ICFpdGVyLmhhc05leHQoKSB8fCBpbmRleCA+IGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBlbmQgPT0gSW50ZWdlci5NQVhfVkFMVUUgJiYgYmVnaW4gPT0gMCApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oICJpdGVtcyIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YXJOYW1lID0gdmFyOwotICAgICAgICAgICAgICAgICAgICBpZiAoIHZhck5hbWUgPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhck5hbWUgPSBpbmRleFZhcjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdXAgdGhlIHN0YXR1cwotICAgICAgICAgICAgICAgICAgICBMb29wU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXNWYXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHVwIHN0YXRpaSBhcyByZXF1aXJlZCBieSBKU1RMCi0gICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIHN0YXR1c0JlZ2luID0gbmV3IEludGVnZXIoYmVnaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBzdGF0dXNFbmQgPSBuZXcgSW50ZWdlcihlbmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBzdGF0dXNTdGVwID0gbmV3IEludGVnZXIoc3RlcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZXcgTG9vcFN0YXR1cyhzdGF0dXNCZWdpbiwgc3RhdHVzRW5kLCBzdGF0dXNTdGVwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoc3RhdHVzVmFyLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbmRleCA9IGJlZ2luOyBpbmRleCA8PSBlbmQ7IGluZGV4ICs9IHN0ZXAgKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG5ldyBJbnRlZ2VyKGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YXJOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhck5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgc3RhdHVzIHZhciB1cAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0SW5kZXgoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXRDb3VudChjb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldEN1cnJlbnQodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXRGaXJzdChpbmRleCA9PSBiZWdpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldExhc3QoaW5kZXggPiBlbmQgLSBzdGVwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQnJlYWtFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJsb29wIHRlcm1pbmF0ZWQgYnkgYnJlYWs6ICIgKyBlLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGV4cHJlc3Npb24gdXNlZCB0byBpdGVyYXRlIG92ZXIuCi0gICAgICogVGhpcyBleHByZXNzaW9uIGNvdWxkIHJlc29sdmUgdG8gYW4gSXRlcmF0b3IsIENvbGxlY3Rpb24sIE1hcCwgQXJyYXksCi0gICAgICogRW51bWVyYXRpb24gb3IgY29tbWEgc2VwYXJhdGVkIFN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJdGVtcyhFeHByZXNzaW9uIGl0ZW1zKSB7Ci0gICAgICAgIHRoaXMuaXRlbXMgPSBpdGVtczsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyB0aGUgdmFyaWFibGUgbmFtZSB0byBleHBvcnQgZm9yIHRoZSBpdGVtIGJlaW5nIGl0ZXJhdGVkIG92ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotICAgICAgICB0aGlzLnZhciA9IHZhcjsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyB0aGUgdmFyaWFibGUgbmFtZSB0byBleHBvcnQgdGhlIGN1cnJlbnQgaW5kZXggY291bnRlciB0bwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluZGV4VmFyKFN0cmluZyBpbmRleFZhcikgewotICAgICAgICB0aGlzLmluZGV4VmFyID0gaW5kZXhWYXI7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIHN0YXJ0aW5nIGluZGV4IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmVnaW4oaW50IGJlZ2luKSB7Ci0gICAgICAgIHRoaXMuYmVnaW4gPSBiZWdpbjsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyB0aGUgZW5kaW5nIGluZGV4IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW5kKGludCBlbmQpIHsKLSAgICAgICAgdGhpcy5lbmQgPSBlbmQ7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIGluZGV4IGluY3JlbWVudCBzdGVwCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3RlcChpbnQgc3RlcCkgewotICAgICAgICB0aGlzLnN0ZXAgPSBzdGVwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhcmlhYmxlIG5hbWUgdG8gZXhwb3J0IHRoZSBjdXJyZW50IHN0YXR1cyB0by4KLSAgICAgKiBUaGUgc3RhdHVzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBKU1RMIExvb3BUYWdTdGF0dXMgaW50ZXJmYWNlIHRoYXQgcHJvdmlkZXMKLSAgICAgKiB0aGUgZm9sbG93aW5nIGJlYW4gcHJvcGVydGllczoKLSAgICAgKiA8dWw+Ci0gICAgICogICA8bGk+Y3VycmVudCAtIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBsb29wIGl0ZW1zIGJlaW5nIGl0ZXJhdGVkPC9saT4KLSAgICAgKiAgIDxsaT5pbmRleCAgIC0gdGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIGl0ZW1zIGJlaW5nIGl0ZXJhdGVkPC9saT4KLSAgICAgKiAgIDxsaT5maXJzdCAgIC0gdHJ1ZSBpZiB0aGlzIGlzIHRoZSBmaXJzdCBpdGVyYXRpb24sIGZhbHNlIG90aGVyd2lzZTwvbGk+Ci0gICAgICogICA8bGk+bGFzdCAgICAtIHRydWUgaWYgdGhpcyBpcyB0aGUgbGFzdCBpdGVyYXRpb24sIGZhbHNlIG90aGVyd2lzZTwvbGk+Ci0gICAgICogICA8bGk+YmVnaW4gICAtIHRoZSBzdGFydGluZyBpbmRleCBvZiB0aGUgbG9vcDwvbGk+Ci0gICAgICogICA8bGk+c3RlcCAgICAtIHRoZSBzdGVwcGluZyB2YWx1ZSBvZiB0aGUgbG9vcDwvbGk+Ci0gICAgICogICA8bGk+ZW5kICAgICAtIHRoZSBlbmQgaW5kZXggb2YgdGhlIGxvb3A8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyU3RhdHVzKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy5zdGF0dXNWYXIgPSB2YXI7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEhvbGRzIHRoZSBzdGF0dXMgb2YgdGhlIGxvb3AuIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTG9vcFN0YXR1cyBpbXBsZW1lbnRzIExvb3BUYWdTdGF0dXMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgSW50ZWdlciBiZWdpbjsKLSAgICAgICAgcHJpdmF0ZSBpbnQgY291bnQ7Ci0gICAgICAgIHByaXZhdGUgT2JqZWN0IGN1cnJlbnQ7Ci0gICAgICAgIHByaXZhdGUgSW50ZWdlciBlbmQ7Ci0gICAgICAgIHByaXZhdGUgaW50IGluZGV4OwotICAgICAgICBwcml2YXRlIEludGVnZXIgc3RlcDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGZpcnN0OwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbGFzdDsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBMb29wU3RhdHVzKEludGVnZXIgYmVnaW4sIEludGVnZXIgZW5kLCBJbnRlZ2VyIHN0ZXApIHsKLSAgICAgICAgICAgIHRoaXMuYmVnaW4gPSBiZWdpbjsKLSAgICAgICAgICAgIHRoaXMuZW5kID0gZW5kOwotICAgICAgICAgICAgdGhpcy5zdGVwID0gc3RlcDsKLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBiZWdpbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBJbnRlZ2VyIGdldEJlZ2luKCkgewotICAgICAgICAgICAgcmV0dXJuIGJlZ2luOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvdW50LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBjb3VudDsKLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjdXJyZW50LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRDdXJyZW50KCkgewotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZW5kLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEludGVnZXIgZ2V0RW5kKCkgewotICAgICAgICAgICAgcmV0dXJuIGVuZDsKLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmaXJzdC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRmlyc3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmlyc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaW5kZXguCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldEluZGV4KCkgewotICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxhc3QuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0xhc3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGFzdDsKLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzdGVwLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEludGVnZXIgZ2V0U3RlcCgpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGVwOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0gY291bnQgVGhlIGNvdW50IHRvIHNldC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENvdW50KGludCBjb3VudCkgewotICAgICAgICAgICAgdGhpcy5jb3VudCA9IGNvdW50OwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0gY3VycmVudCBUaGUgY3VycmVudCB0byBzZXQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50KE9iamVjdCBjdXJyZW50KSB7Ci0gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSBjdXJyZW50OwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0gZmlyc3QgVGhlIGZpcnN0IHRvIHNldC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0KGJvb2xlYW4gZmlyc3QpIHsKLSAgICAgICAgICAgIHRoaXMuZmlyc3QgPSBmaXJzdDsKLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogQHBhcmFtIGxhc3QgVGhlIGxhc3QgdG8gc2V0LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TGFzdChib29sZWFuIGxhc3QpIHsKLSAgICAgICAgICAgIHRoaXMubGFzdCA9IGxhc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggdG8gc2V0LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SW5kZXgoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL0dldFN0YXRpY1RhZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9HZXRTdGF0aWNUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQwNzE4OC4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL0dldFN0YXRpY1RhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnV0aWwuQ2xhc3NMb2FkZXJVdGlsczsKLQotCi0vKioKLSAqIEEgdGFnIHdoaWNoIGNhbiByZXRyaWV2ZSB0aGUgdmFsdWUgb2YgYSBzdGF0aWMgZmllbGQgb2YgYSBnaXZlbiBjbGFzcy4KLSAqIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgcmVxdWlyZWQ6PGJyIC8+Ci0gKiA8dWw+Ci0gKiAgIDxsaT52YXIgLSBUaGUgdmFyaWFibGUgdG8gd2hpY2ggdG8gYXNzaWduIHRoZSByZXN1bHRpbmcgdmFsdWUuPC9saT4KLSAqICAgPGxpPmZpZWxkIC0gVGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBmaWVsZCB0byByZXRyaWV2ZS48L2xpPgotICogICA8bGk+Y2xhc3NOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNsYXNzIGNvbnRhaW5pbmcgdGhlIHN0YXRpYyBmaWVsZC48L2xpPgotICogPC91bD4KLSAqCi0gKiBFeGFtcGxlIHVzYWdlOgotICogPHByZT4KLSAqICZsdDtqOmdldFN0YXRpYyB2YXI9ImNsb3NlT3BlcmF0aW9uIiBjbGFzc05hbWU9ImphdmF4LnN3aW5nLkpGcmFtZSIKLSAqICAgICAgICAgICAgICBmaWVsZD0iRVhJVF9PTl9DTE9TRSIvJmd0OwotICogPC9wcmU+Ci0gKgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMgJAotICovCi0KLXB1YmxpYyBjbGFzcyBHZXRTdGF0aWNUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgdmFyaWFibGUgdG8gd2hpY2ggdG8gYXNzaWduIHRoZSByZXN1bHRpbmcgdmFsdWUuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyOwotCi0gICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgZmllbGQgdG8gcmV0cmlldmUuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmllbGQ7Ci0KLSAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGNsYXNzIGNvbnRhaW5pbmcgdGhlIHN0YXRpYyBmaWVsZC4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7Ci0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGV4cG9ydGVkIGJ5IHRoaXMgdGFnLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhciBUaGUgdmFyaWFibGUgbmFtZS4KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0gICAgICAgIHRoaXMudmFyID0gdmFyOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgdG8gcmV0cmlldmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBtZXRob2QgbmFtZQotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgc2V0RmllbGQoU3RyaW5nIGZpZWxkKSB7Ci0gICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyBjb250YWluaW5nIHRoZSBzdGF0aWMgZmllbGQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSBjbGFzcy4KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgIH0KLQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0KLSAgICAgICAgaWYodmFyID09IG51bGwpCi0gICAgICAgICAgICBtZXNzYWdlID0gInZhciI7Ci0gICAgICAgIGVsc2UgaWYoZmllbGQgPT0gbnVsbCkKLSAgICAgICAgICAgIG1lc3NhZ2UgPSAiZmllbGQiOwotICAgICAgICBlbHNlIGlmKGNsYXNzTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgbWVzc2FnZSA9ICJjbGFzc05hbWUiOwotCi0gICAgICAgIGlmKG1lc3NhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKG1lc3NhZ2UpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyB0eXBlICAgICA9IENsYXNzTG9hZGVyVXRpbHMuZ2V0Q2xhc3NMb2FkZXIoZ2V0Q2xhc3MoKSkubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBPYmplY3QgcmVzdWx0ICA9IHR5cGUuZ2V0RmllbGQoZmllbGQpLmdldChudWxsKTsKLSAgICAgICAgICAgIEplbGx5Q29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotCi0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhciwgcmVzdWx0KTsKLQotICAgICAgICB9IGNhdGNoKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgIG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiQ291bGQgbm90IGFjY2VzcyAiICsgY2xhc3NOYW1lICsgIi4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyICsgIi4gIE9yaWdpbmFsIGV4Y2VwdGlvbiBtZXNzYWdlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5nZXRNZXNzYWdlKCksIHQpOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLQotLyogRW1hY3MgY29uZmlndXJhdGlvbgotICogTG9jYWwgdmFyaWFibGVzOiAgICAgICAgKioKLSAqIG1vZGU6ICAgICAgICAgICAgIGphdmEgICoqCi0gKiBjLWJhc2ljLW9mZnNldDogICA0ICAgICAqKgotICogaW5kZW50LXRhYnMtbW9kZTogbmlsICAgKioKLSAqIEVuZDogICAgICAgICAgICAgICAgICAgICoqCi0gKi8KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvSWZUYWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvSWZUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE1N2NmZi4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL0lmVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5FeHByZXNzaW9uOwotCi0vKiogQSB0YWcgd2hpY2ggY29uZGl0aW9uYWxseSBldmFsdWF0ZXMgaXRzIGJvZHkgYmFzZWQgb24gc29tZSBjb25kaXRpb24KLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTQgJAotICAqLwotcHVibGljIGNsYXNzIElmVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogVGhlIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuICovCi0gICAgcHJpdmF0ZSBFeHByZXNzaW9uIHRlc3Q7Ci0KLSAgICBwdWJsaWMgSWZUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0ZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh0ZXN0LmV2YWx1YXRlQXNCb29sZWFuKGNvbnRleHQpKSB7Ci0gICAgICAgICAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oICJ0ZXN0IiApOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqIFNldHMgdGhlIEplbGx5IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuIElmIHRoaXMgcmV0dXJucyB0cnVlLCB0aGUgYm9keSBvZgotICAgICAqIHRoZSB0YWcgaXMgZXZhbHVhdGVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdCB0aGUgSmVsbHkgZXhwcmVzc2lvbiB0byBldmFsdWF0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRlc3QoRXhwcmVzc2lvbiB0ZXN0KSB7Ci0gICAgICAgIHRoaXMudGVzdCA9IHRlc3Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9JbXBvcnRUYWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvSW1wb3J0VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YTk2NjkuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9JbXBvcnRUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqIEltcG9ydHMgYW5vdGhlciBzY3JpcHQuCi0gKgotICogIDxwPgotICogIEJ5IGRlZmF1bHQsIHRoZSBpbXBvcnRlZCBzY3JpcHQgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8KLSAqICB0aGUgcGFyZW50IHNjcmlwdCdzIHZhcmlhYmxlIGNvbnRleHQuICBUaGlzIGJlaGF2aW91cgotICogIG1heSBiZSBtb2RpZmllZCB1c2luZyB0aGUgPGNvZGU+aW5oZXJpdDwvY29kZT4gYXR0cmlidXRlLgotICogIDwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpib2JAZW5nLndlcmtlbi5jb20iPmJvYiBtY3doaXJ0ZXI8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTAgJAotICovCi0KLXB1YmxpYyBjbGFzcyBJbXBvcnRUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKgotICAgICAqIHRoZSBsb2NhdGlvbiBvZiB0aGUgc2NyaXB0IGJlaW5nIGltcG9ydGVkLCByZWxhdGl2ZSB0byB0aGUKLSAgICAgKiBjdXJyZW50IHNjcmlwdAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHVyaTsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdGhlIGltcG9ydGVkIHNjcmlwdCBoYXMgYWNjZXNzIHRvIHRoZSBjYWxsZXIncyB2YXJpYWJsZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaW5oZXJpdDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmaWxlIHRvIGJlIGltcG9ydGVkLiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCB1cmkuCi0gICAgICogdXJpIHRha2VzIHByZWNlZGVuY2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlsZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBJbXBvcnQgdGFnLgotICAgICAqLwotICAgIHB1YmxpYyBJbXBvcnRUYWcoKSB7Ci0gICAgfQotCi0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogUGVyZm9ybSB0YWcgcHJvY2Vzc2luZwotICAgICAqIEBwYXJhbSBvdXRwdXQgdGhlIGRlc3RpbmF0aW9uIGZvciBvdXRwdXQKLSAgICAgKiBAdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24gaWYgYSByZXF1aXJlZCBhdHRyaWJ1dGUgaXMgbWlzc2luZwotICAgICAqIEB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gb24gYW55IG90aGVyIGVycm9ycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCAmJiBmaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCAidXJpIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh1cmkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IEplbGx5Q29udGV4dCBvZiB0aGUgVVJJCi0gICAgICAgICAgICAgICAgLy8gdGFrZSBvZmYgdGhlIHNjcmlwdCBuYW1lIGZyb20gdGhlIFVSTAotICAgICAgICAgICAgICAgIGNvbnRleHQucnVuU2NyaXB0KHVyaSwgb3V0cHV0LCB0cnVlLCBpc0luaGVyaXQoKSApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnJ1blNjcmlwdChuZXcgamF2YS5pby5GaWxlKGZpbGUpLCBvdXRwdXQsIHRydWUsCi0gICAgICAgICAgICAgICAgICBpc0luaGVyaXQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEplbGx5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiY291bGQgbm90IGltcG9ydCBzY3JpcHQiLGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB3aGV0aGVyIHByb3BlcnR5IGluaGVyaXRlbmNlIGlzIGVuYWJsZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luaGVyaXQoKSB7Ci0gICAgICAgIHJldHVybiBpbmhlcml0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciBwcm9wZXJ0eSBpbmhlcml0ZW5jZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5oZXJpdChib29sZWFuIGluaGVyaXQpIHsKLSAgICAgICAgdGhpcy5pbmhlcml0ID0gaW5oZXJpdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBVUkkgKHJlbGF0aXZlIFVSSSBvciBhYnNvbHV0ZSBVUkwpIGZvciB0aGUgc2NyaXB0IHRvIGV2YWx1YXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVyaShTdHJpbmcgdXJpKSB7Ci0gICAgICAgIHRoaXMudXJpID0gdXJpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmlsZSBmb3IgdGhlIHNjcmlwdCB0byBldmFsdWF0ZS4KLSAgICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKFN0cmluZyBmaWxlKSB7Ci0gICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL0luY2x1ZGVUYWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvSW5jbHVkZVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjQ1MzY1Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvSW5jbHVkZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKiogQSB0YWcgd2hpY2ggY29uZGl0aW9uYWxseSBldmFsdWF0ZXMgaXRzIGJvZHkgYmFzZWQgb24gc29tZSBjb25kaXRpb24KLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTYgJAotICAqLwotCi1wdWJsaWMgY2xhc3MgSW5jbHVkZVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdXJpOwotICAgIHByaXZhdGUgRmlsZSBmaWxlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZEV4cG9ydDsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkSW5oZXJpdDsKLQotICAgIHB1YmxpYyBJbmNsdWRlVGFnKCkgewotICAgICAgICB0aGlzLnNob3VsZEV4cG9ydCA9IGZhbHNlOwotICAgICAgICB0aGlzLnNob3VsZEluaGVyaXQgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluaGVyaXQoU3RyaW5nIGluaGVyaXQpIHsKLSAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHMoaW5oZXJpdCkpIHsKLSAgICAgICAgICAgIHRoaXMuc2hvdWxkSW5oZXJpdCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnNob3VsZEluaGVyaXQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4cG9ydChTdHJpbmcgZXhwb3J0KSB7Ci0gICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzKGV4cG9ydCkpIHsKLSAgICAgICAgICAgIHRoaXMuc2hvdWxkRXhwb3J0ID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMuc2hvdWxkRXhwb3J0ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luaGVyaXQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNob3VsZEluaGVyaXQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFeHBvcnQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNob3VsZEV4cG9ydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIEZpbGUgZ2V0RmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmlsZSB0byBiZSBpbmNsdWRlZCB3aGljaCBpcyBlaXRoZXIgYW4gYWJzb2x1dGUgZmlsZSBvciBhIGZpbGUKLSAgICAgKiByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZmlsZSkgewotICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgIH0KLQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpCi0gICAgICAgIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKHVyaSA9PSBudWxsICYmIGZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oInVyaSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgSmVsbHlDb250ZXh0IG9mIHRoZSBVUkkKLSAgICAgICAgLy8gdGFrZSBvZmYgdGhlIHNjcmlwdCBuYW1lIGZyb20gdGhlIFVSTAotICAgICAgICBTdHJpbmcgdGV4dCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAodXJpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0ZXh0ID0gdXJpOwotICAgICAgICAgICAgICAgIGNvbnRleHQucnVuU2NyaXB0KHVyaSwgb3V0cHV0LCBpc0V4cG9ydCgpLCBpc0luaGVyaXQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0ZXh0ID0gZmlsZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGNvbnRleHQucnVuU2NyaXB0KGZpbGUsIG91dHB1dCwgaXNFeHBvcnQoKSwgaXNJbmhlcml0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChKZWxseUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oImNvdWxkIG5vdCBpbmNsdWRlIGplbGx5IHNjcmlwdDogIiArIHRleHQgKyAiLiBSZWFzb246ICIgKyBlLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKiogU2V0cyB0aGUgVVJJIChyZWxhdGl2ZSBVUkkgb3IgYWJzb2x1dGUgVVJMKSBmb3IgdGhlIHNjcmlwdCB0byBldmFsdWF0ZS4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVcmkoU3RyaW5nIHVyaSkgewotICAgICAgICB0aGlzLnVyaSA9IHVyaTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL0ludm9rZVN0YXRpY1RhZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9JbnZva2VTdGF0aWNUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiMGFkOS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL0ludm9rZVN0YXRpY1RhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudXRpbC5DbGFzc0xvYWRlclV0aWxzOwotCi0vKioKLSAgKiBBIFRhZyB3aGljaCBjYW4gaW52b2tlIGEgc3RhdGljIG1ldGhvZCBvbiBhIGNsYXNzLCB3aXRob3V0IGFuCi0gICogaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGJlaW5nIG5lZWRlZC4KLSAgKiA8cD4KLSAgKiBMaWtlIHRoZSB7QGxpbmsgSW52b2tlVGFnfSwgdGhpcyB0YWcgY2FuIHRha2UgYSBzZXQgb2YKLSAgKiBhcmd1bWVudHMgdXNpbmcgdGhlIHtAbGluayBBcmdUYWd9LgotICAqIDwvcD4KLSAgKiA8cD4KLSAgKiAgVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSByZXF1aXJlZDo8YnIgLz4KLSAgKiA8dWw+Ci0gICogICA8bGk+dmFyIC0gVGhlIHZhcmlhYmxlIHRvIGFzc2lnbiB0aGUgcmV0dXJuIG9mIHRoZSBtZXRob2QgY2FsbCB0bzwvbGk+Ci0gICogICA8bGk+bWV0aG9kIC0gVGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBtZXRob2QgdG8gaW52b2tlPC9saT4KLSAgKiAgIDxsaT5jbGFzc05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgY29udGFpbmluZyB0aGUgc3RhdGljIG1ldGhvZDwvbGk+Ci0gICogPC91bD4KLSAgKiA8L3A+Ci0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpyb2JlcnRAYnVsbC1lbnRlcnByaXNlcy5jb20+Um9iZXJ0IE1jSW50b3NoPC9hPgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS45ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBJbnZva2VTdGF0aWNUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IGltcGxlbWVudHMgQXJnVGFnUGFyZW50IHsKLQotICAgIC8qKiB0aGUgdmFyaWFibGUgZXhwb3J0ZWQgKi8KLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0KLSAgICAvKiogdGhlIHZhcmlhYmxlIHdoZXJlIHRoZSBtZXRob2QncyBleGNlcHRpb24gaXMgZXhwb3J0ZWQgKi8KLSAgICBwcml2YXRlIFN0cmluZyBleGNlcHRpb25WYXI7Ci0KLSAgICAvKiogdGhlIG1ldGhvZCB0byBpbnZva2UgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtZXRob2ROYW1lOwotCi0gICAgLyoqIHRoZSBvYmplY3QgdG8gaW52b2tlIHRoZSBtZXRob2Qgb24gKi8KLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7Ci0KLSAgICBwcml2YXRlIExpc3QgcGFyYW1UeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIExpc3QgcGFyYW1WYWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwdWJsaWMgSW52b2tlU3RhdGljVGFnKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGV4cG9ydGVkIGJ5IHRoaXMgdGFnCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFyIFRoZSB2YXJpYWJsZSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIG5hbWUgb2YgYSB2YXJpYWJsZSB0aGF0IGV4cG9ydHMgdGhlIGV4Y2VwdGlvbiB0aHJvd24gYnkKLSAgICAgKiB0aGUgbWV0aG9kJ3MgaW52b2NhdGlvbiAoaWYgYW55KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvblZhcihTdHJpbmcgdmFyKSB7Ci0gICAgICAgIHRoaXMuZXhjZXB0aW9uVmFyID0gdmFyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnZva2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXRob2QgVGhlIG1ldGhvZCBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWV0aG9kKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0gICAgICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgY29udGFpbmluZyB0aGUgc3RhdGljIG1ldGhvZAotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgbmFtZSBvZiB0aGUgY2xhc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIGFyZ3VtZW50IHRvIHN1cHBseSB0byB0aGUgbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHlwZSBUaGUgQ2xhc3MgdHlwZSBvZiB0aGUgYXJndW1lbnQKLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBhcmd1bWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEFyZ3VtZW50KENsYXNzIHR5cGUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBwYXJhbVR5cGVzLmFkZCh0eXBlKTsKLSAgICAgICAgcGFyYW1WYWx1ZXMuYWRkKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICggbnVsbCA9PSBtZXRob2ROYW1lKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oICJtZXRob2QiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0KLSAgICAgICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IHBhcmFtVmFsdWVzLnRvQXJyYXkoKTsKLSAgICAgICAgICAgIENsYXNzW10gdHlwZXMgPSAoQ2xhc3NbXSkocGFyYW1UeXBlcy50b0FycmF5KG5ldyBDbGFzc1twYXJhbVR5cGVzLnNpemUoKV0pKTsKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBsb2FkQ2xhc3MoKS5nZXRNZXRob2QoIG1ldGhvZE5hbWUsIHR5cGVzICk7Ci0gICAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gbWV0aG9kLmludm9rZSggbnVsbCwgdmFsdWVzICk7Ci0gICAgICAgICAgICBpZihudWxsICE9IHZhcikgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUodmFyLCByZXN1bHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBcmdUYWcgcGFyZW50QXJnID0gKEFyZ1RhZykoZmluZEFuY2VzdG9yV2l0aENsYXNzKEFyZ1RhZy5jbGFzcykpOwotICAgICAgICAgICAgaWYobnVsbCAhPSBwYXJlbnRBcmcpIHsKLSAgICAgICAgICAgICAgICBwYXJlbnRBcmcuc2V0VmFsdWUocmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVMb2FkQ2xhc3NGYWlsZWRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVMb2FkQ2xhc3NGYWlsZWRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY3JlYXRlTG9hZENsYXNzRmFpbGVkRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmKG51bGwgIT0gZXhjZXB0aW9uVmFyKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZShleGNlcHRpb25WYXIsZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigibWV0aG9kICIgKyBtZXRob2ROYW1lICsKLSAgICAgICAgICAgICAgICAgICAgIiB0aHJldyBleGNlcHRpb246ICIrIGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICBlLmdldFRhcmdldEV4Y2VwdGlvbigpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBwYXJhbVR5cGVzLmNsZWFyKCk7Ci0gICAgICAgICAgICBwYXJhbVZhbHVlcy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIGNsYXNzIHVzaW5nIGVpdGhlciB0aGUgY2xhc3MgbG9hZGVyIHdoaWNoIGxvYWRlZCBtZSBvciB0aGUKLSAgICAgKiBjdXJyZW50IHRocmVhZHMgY29udGV4dCBjbGFzcyBsb2FkZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ2xhc3MgbG9hZENsYXNzKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gQ2xhc3NMb2FkZXJVdGlscy5sb2FkQ2xhc3MoY2xhc3NOYW1lLCBnZXRDbGFzcygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgSmVsbHlUYWdFeGNlcHRpb24gaW5zdGFuY2UgZnJvbSBhIGdpdmVuCi0gICAgICogZmFpbHVyZSBleGNlcHRpb24KLSAgICAgKiBAcGFyYW0gZSBpcyB0aGUgZXhjZXB0aW9uIHdoaWNoIG9jY3VycmVkIGF0dGVtcHRpbmcgdG8gbG9hZCB0aGUgY2xhc3MKLSAgICAgKiBAcmV0dXJuIEplbGx5VGFnRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEplbGx5VGFnRXhjZXB0aW9uIGNyZWF0ZUxvYWRDbGFzc0ZhaWxlZEV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotICAgICAgICByZXR1cm4gbmV3IEplbGx5VGFnRXhjZXB0aW9uKAotICAgICAgICAgICAgIkNvdWxkIG5vdCBsb2FkIGNsYXNzOiAiICsgY2xhc3NOYW1lICsgIi4gUmVhc29uOiAiICsgZSwgZQotICAgICAgICApOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9JbnZva2VUYWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvSW52b2tlVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NDc1MjMuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9JbnZva2VUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLk1ldGhvZFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKioKLSAgKiBBIHRhZyB3aGljaCBjYWxscyBhIG1ldGhvZCBpbiBhbiBvYmplY3QgaW5zdGFudGllZCBieSBjb3JlOm5ldwotICAqCi0gICoKLSAgKiBAYXV0aG9yIFJvZG5leSBXYWxkaG9mZgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMCAkCi0gICovCi1wdWJsaWMgY2xhc3MgSW52b2tlVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCBpbXBsZW1lbnRzIEFyZ1RhZ1BhcmVudCB7Ci0KLSAgICAvKiogdGhlIHZhcmlhYmxlIGV4cG9ydGVkICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyOwotCi0gICAgLyoqIHRoZSB2YXJpYWJsZSB3aGVyZSB0aGUgbWV0aG9kJ3MgZXhjZXB0aW9uIGlzIGV4cG9ydGVkICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXhjZXB0aW9uVmFyOwotCi0gICAgLyoqIHRoZSBtZXRob2QgdG8gaW52b2tlICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWV0aG9kTmFtZTsKLQotICAgIC8qKiB0aGUgb2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uICovCi0gICAgcHJpdmF0ZSBPYmplY3Qgb25JbnN0YW5jZTsKLQotICAgIHByaXZhdGUgTGlzdCBwYXJhbVR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByaXZhdGUgTGlzdCBwYXJhbVZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHB1YmxpYyBJbnZva2VUYWcoKSB7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGV4cG9ydGVkIGJ5IHRoaXMgdGFnICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIG5hbWUgb2YgYSB2YXJpYWJsZSB0aGF0IGV4cG9ydHMgdGhlIGV4Y2VwdGlvbiB0aHJvd24gYnkKLSAgICAgKiB0aGUgbWV0aG9kJ3MgaW52b2NhdGlvbiAoaWYgYW55KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvblZhcihTdHJpbmcgdmFyKSB7Ci0gICAgICAgIHRoaXMuZXhjZXB0aW9uVmFyID0gdmFyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGhvZChTdHJpbmcgbWV0aG9kKSB7Ci0gICAgICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPbihPYmplY3QgaW5zdGFuY2UpIHsKLSAgICAgICAgdGhpcy5vbkluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQXJndW1lbnQoQ2xhc3MgdHlwZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHBhcmFtVHlwZXMuYWRkKHR5cGUpOwotICAgICAgICBwYXJhbVZhbHVlcy5hZGQodmFsdWUpOwotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiwgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAoIG51bGwgPT0gbWV0aG9kTmFtZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oICJtZXRob2QiICk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBudWxsID09IG9uSW5zdGFuY2UgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiggIm9uIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotCi0gICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IHBhcmFtVmFsdWVzLnRvQXJyYXkoKTsKLSAgICAgICAgQ2xhc3NbXSB0eXBlcyA9IChDbGFzc1tdKShwYXJhbVR5cGVzLnRvQXJyYXkobmV3IENsYXNzW3BhcmFtVHlwZXMuc2l6ZSgpXSkpOwotCi0gICAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzdWx0ID0gTWV0aG9kVXRpbHMuaW52b2tlTWV0aG9kKG9uSW5zdGFuY2UsbWV0aG9kTmFtZSx2YWx1ZXMsdHlwZXMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZihudWxsICE9IGV4Y2VwdGlvblZhcikgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoZXhjZXB0aW9uVmFyLGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIm1ldGhvZCAiICsgbWV0aG9kTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICIgdGhyZXcgZXhjZXB0aW9uOiAiKyBlLmdldFRhcmdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgZS5nZXRUYXJnZXRFeGNlcHRpb24oKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgcGFyYW1UeXBlcy5jbGVhcigpOwotICAgICAgICAgICAgcGFyYW1WYWx1ZXMuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFyZ1RhZyBwYXJlbnRBcmcgPSAoQXJnVGFnKShmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoQXJnVGFnLmNsYXNzKSk7Ci0gICAgICAgIGlmKG51bGwgIT0gcGFyZW50QXJnKSB7Ci0gICAgICAgICAgICBwYXJlbnRBcmcuc2V0VmFsdWUocmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICBpZihudWxsICE9IHZhcikgewotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL0plbGx5VGFnLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL0plbGx5VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNTVhOTkuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9KZWxseVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLQotLyoqIFRoZSByb290IEplbGx5IHRhZyB3aGljaCBzaG91bGQgYmUgZXZhbHVhdGVkIGZpcnN0Ci0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjE0ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBKZWxseVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKCBKZWxseVRhZy5jbGFzcyApOwotCi0gICAgcHVibGljIEplbGx5VGFnKCkgewotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotCi0gICAgICAgIGlmICggbG9nLmlzRGVidWdFbmFibGVkKCkgKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoICJSdW5uaW5nIGJvZHk6ICIgKyBnZXRCb2R5KCkgKTsKLSAgICAgICAgfQotICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19Ci0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvTXV0ZVRhZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9NdXRlVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MDIzYTkuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9NdXRlVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0KLS8qKiBBIHRhZyB3aGljaCBleGVjdXRlcyBpdHMgYm9keSBidXQgcGFzc2luZyBubyBvdXRwdXQuCi0gKiAgPHA+Ci0gKiBVc2luZyB0aGlzIHRhZyB3aWxsIHN0aWxsIHRha2UgdGhlIHRpbWUgdG8gcGVyZm9ybSB0b1N0cmluZyBvbiBlYWNoIG9iamVjdAotICogcmV0dXJuZWQgdG8gdGhlIG91dHB1dCAoYnV0IHRoaXMgdG9TdHJpbmcgdmFsdWUgaXMgZGlzY2FyZGVkLgotICogQSBmdXR1cmUgdmVyc2lvbiBzaG91bGQgZ28gbW9yZSBpbnRlcm5hbGx5IHNvIHRoYXQgdGhpcyBpcyBhdm9pZGVkLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnBhdWxAYWN0aXZlbWF0aC5vcmciPlBhdWwgTGliYnJlY2h0PC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICAqLwotcHVibGljIGNsYXNzIE11dGVUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBNdXRlVGFnKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZSB0aGUgYm9keSBhbmQgcHJvZHVjZSBubyBvdXRwdXQuCi0gICAgICogQHBhcmFtIG91dHB1dCB0YWcgb3V0cHV0LCB3aGljaCBpcyBpZ25vcmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmludm9rZUJvZHkobmV3IE11dGVYTUxPdXRwdXQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW4gWE1MT3V0cHV0IHdoaWNoIHJlYWxseSBvdXRwdXRzIG5vdGhpbmcsIGluIHBhcnRpY3VsYXIsIGF2b2lkcyBjYWxsaW5nCi0gICAgICogdG9TdHJpbmcoKSBpbiBvYmplY3RzIHJldHVybmVkLi4uCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIE11dGVYTUxPdXRwdXQgZXh0ZW5kcyBYTUxPdXRwdXQgewotICAgICAgICBwdWJsaWMgTXV0ZVhNTE91dHB1dCgpIHsKLSAgICAgICAgICAgIHN1cGVyKG5ldyBEZWZhdWx0SGFuZGxlcigpKTsKLSAgICAgICAgfQotICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogRG8gbm90aGluZywgbm90IGV2ZW4gaW52b2tlIHRoZSB0b1N0cmluZyEKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9iamVjdERhdGEoT2JqZWN0IG8pIHsKLSAgICAgICAgfQotICAgIH0gLy8gY2xhc3MgTXV0ZVhNTE91dHB1dAotfSAvLyBjbGFzcyBUYWdTdXBwb3J0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9OZXdUYWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvTmV3VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMGQwYTYuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9OZXdUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkNvbnN0cnVjdG9yVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLS8qKiBBIHRhZyB3aGljaCBjcmVhdGVzIGEgbmV3IG9iamVjdCBvZiB0aGUgZ2l2ZW4gdHlwZQotICAqCi0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICAqIEB2ZXJzaW9uICRSZXZpc2lvbjokCi0gICovCi1wdWJsaWMgY2xhc3MgTmV3VGFnIGV4dGVuZHMgQmFzZUNsYXNzTG9hZGVyVGFnIGltcGxlbWVudHMgQXJnVGFnUGFyZW50IHsKLQotICAgIC8qKiB0aGUgdmFyaWFibGUgZXhwb3J0ZWQgKi8KLSAgICBwcml2YXRlIFN0cmluZyB2YXI7Ci0KLSAgICAvKiogdGhlIGNsYXNzIG5hbWUgb2YgdGhlIG9iamVjdCB0byBpbnN0YW50aWF0ZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKLQotICAgIHByaXZhdGUgTGlzdCBwYXJhbVR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByaXZhdGUgTGlzdCBwYXJhbVZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHB1YmxpYyBOZXdUYWcoKSB7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGV4cG9ydGVkIGJ5IHRoaXMgdGFnICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIG9iamVjdCB0byBpbnN0YW50aWF0ZSAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEFyZ3VtZW50KENsYXNzIHR5cGUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBwYXJhbVR5cGVzLmFkZCh0eXBlKTsKLSAgICAgICAgcGFyYW1WYWx1ZXMuYWRkKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgQXJnVGFnIHBhcmVudEFyZyA9IG51bGw7Ci0gICAgICAgIGlmICggdmFyID09IG51bGwgKSB7Ci0gICAgICAgICAgICBwYXJlbnRBcmcgPSAoQXJnVGFnKShmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoQXJnVGFnLmNsYXNzKSk7Ci0gICAgICAgICAgICBpZihudWxsID09IHBhcmVudEFyZykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCAidmFyIiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICggY2xhc3NOYW1lID09IG51bGwgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiggImNsYXNzTmFtZSIgKTsKLSAgICAgICAgfQotICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIHRoZUNsYXNzID0gZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoIGNsYXNzTmFtZSApOwotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgICAgICAgICBpZihwYXJhbVR5cGVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0ID0gdGhlQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0W10gdmFsdWVzID0gcGFyYW1WYWx1ZXMudG9BcnJheSgpOwotICAgICAgICAgICAgICAgIENsYXNzW10gdHlwZXMgPSAoQ2xhc3NbXSkocGFyYW1UeXBlcy50b0FycmF5KG5ldyBDbGFzc1twYXJhbVR5cGVzLnNpemUoKV0pKTsKLSAgICAgICAgICAgICAgICBvYmplY3QgPSBDb25zdHJ1Y3RvclV0aWxzLmludm9rZUNvbnN0cnVjdG9yKHRoZUNsYXNzLHZhbHVlcyx0eXBlcyk7Ci0gICAgICAgICAgICAgICAgcGFyYW1UeXBlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIHBhcmFtVmFsdWVzLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihudWxsICE9IHZhcikgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUodmFyLCBvYmplY3QpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwYXJlbnRBcmcuc2V0VmFsdWUob2JqZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL090aGVyd2lzZVRhZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9PdGhlcndpc2VUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFmNjhhOS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL090aGVyd2lzZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLS8qKiBUaGUgb3RoZXJ3aXNlIGJsb2NrIG9mIGEgY2hvb3NlL3doZW4vb3RoZXJ3aXNlIGdyb3VwIG9mIHRhZ3MKLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTMgJAotICAqLwotcHVibGljIGNsYXNzIE90aGVyd2lzZVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgcHVibGljIE90aGVyd2lzZVRhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgQ2hvb3NlVGFnIHRhZyA9IChDaG9vc2VUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyggQ2hvb3NlVGFnLmNsYXNzICk7Ci0gICAgICAgIGlmICggdGFnID09IG51bGwgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICJUaGlzIHRhZyBtdXN0IGJlIGVuY2xvc2VkIGluc2lkZSBhIDxjaG9vc2U+IHRhZyIgKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoICEgdGFnLmlzQmxvY2tFdmFsdWF0ZWQoKSApIHsKLSAgICAgICAgICAgIHRhZy5zZXRCbG9ja0V2YWx1YXRlZCh0cnVlKTsKLSAgICAgICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvUGFyc2VUYWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvUGFyc2VUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JhNGFmNS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL1BhcnNlVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5TY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkucGFyc2VyLlhNTFBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotCi0vKioKLSAqIFBhcnNlcyB0aGUgb3V0cHV0IG9mIHRoaXMgdGFncyBib2R5IG9yIG9mIGEgZ2l2ZW4gU3RyaW5nIGFzIGEgSmVsbHkgc2NyaXB0Ci0gKiB0aGVuIGVpdGhlciBvdXRwdXR0aW5nIHRoZSBTY3JpcHQgYXMgYSB2YXJpYWJsZSBvciBleGVjdXRpbmcgdGhlIHNjcmlwdC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJzZVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBhcnNlVGFnLmNsYXNzKTsKLQotICAgIC8qKiBUaGUgdmFyaWFibGUgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgdGhlIGRvY3VtZW50ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyOwotCi0gICAgLyoqIFRoZSBtYXJrdXAgdGV4dCB0byBiZSBwYXJzZWQgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0ZXh0OwotCi0gICAgLyoqIFRoZSBYTUxSZWFkZXIgdXNlZCB0byBwYXJzZXIgdGhlIGRvY3VtZW50ICovCi0gICAgcHJpdmF0ZSBYTUxSZWFkZXIgeG1sUmVhZGVyOwotCi0gICAgLyoqIFRoZSBKZWxseSBwYXJzZXIgKi8KLSAgICBwcml2YXRlIFhNTFBhcnNlciBqZWxseVBhcnNlcjsKLQotICAgIHB1YmxpYyBQYXJzZVRhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnI2RvVGFnKG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkKLSAgICAgICAgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgdGV4dCA9IGdldFRleHQoKTsKLSAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFyc2VUZXh0KHRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcGFyc2VCb2R5KG91dHB1dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gZ2V0SmVsbHlQYXJzZXIoKS5nZXRTY3JpcHQoKTsKLSAgICAgICAgaWYgKHZhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhciwgc2NyaXB0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIGludm9rZSB0aGUgc2NyaXB0Ci0gICAgICAgICAgICBzY3JpcHQucnVuKGNvbnRleHQsIG91dHB1dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqIFRoZSB2YXJpYWJsZSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgRG9jdW1lbnQgdmFyaWFibGUgY3JlYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFyKCkgewotICAgICAgICByZXR1cm4gdmFyOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSB2YXJpYWJsZSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgRG9jdW1lbnQgdmFyaWFibGUgY3JlYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0gICAgICAgIHRoaXMudmFyID0gdmFyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRleHQgdG8gYmUgcGFyc2VkCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0gICAgICAgIHJldHVybiB0ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRleHQgdG8gYmUgcGFyc2VkIGJ5IHRoaXMgcGFyc2VyCi0gICAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgdG8gYmUgcGFyc2VkIGJ5IHRoaXMgcGFyc2VyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OwotICAgIH0KLQotCi0gICAgLyoqIEByZXR1cm4gdGhlIFhNTFJlYWRlciB1c2VkIGZvciBwYXJzaW5nLCBjcmVhdGluZyBvbmUgbGF6aWx5IGlmIG5lZWQgYmUgICovCi0gICAgcHVibGljIFhNTFJlYWRlciBnZXRYTUxSZWFkZXIoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHhtbFJlYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB4bWxSZWFkZXIgPSBjcmVhdGVYTUxSZWFkZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4geG1sUmVhZGVyOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSBYTUxSZWFkZXIgdXNlZCBmb3IgcGFyc2luZyAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhNTFJlYWRlcihYTUxSZWFkZXIgeG1sUmVhZGVyKSB7Ci0gICAgICAgIHRoaXMueG1sUmVhZGVyID0geG1sUmVhZGVyOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBYTUxQYXJzZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MUGFyc2VyIGdldEplbGx5UGFyc2VyKCkgewotICAgICAgICBpZiAoamVsbHlQYXJzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgamVsbHlQYXJzZXIgPSBjcmVhdGVKZWxseVBhcnNlcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBqZWxseVBhcnNlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBqZWxseVBhcnNlci4KLSAgICAgKiBAcGFyYW0gamVsbHlQYXJzZXIgVGhlIGplbGx5UGFyc2VyIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEplbGx5UGFyc2VyKFhNTFBhcnNlciBqZWxseVBhcnNlcikgewotICAgICAgICB0aGlzLmplbGx5UGFyc2VyID0gamVsbHlQYXJzZXI7Ci0gICAgfQotCi0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgWE1MUmVhZGVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhNTFJlYWRlciBjcmVhdGVYTUxSZWFkZXIoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICBTQVhQYXJzZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLSAgICAgICAgcmV0dXJuIHBhcnNlci5nZXRYTUxSZWFkZXIoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgYm9keSBvZiB0aGlzIHRhZyBhbmQgcmV0dXJucyB0aGUgcGFyc2VkIGRvY3VtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcGFyc2VCb2R5KFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIENvbnRlbnRIYW5kbGVyIGhhbmRsZXIgPSBnZXRKZWxseVBhcnNlcigpOwotICAgICAgICBYTUxPdXRwdXQgbmV3T3V0cHV0ID0gbmV3IFhNTE91dHB1dChoYW5kbGVyKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaGFuZGxlci5zdGFydERvY3VtZW50KCk7Ci0gICAgICAgICAgICBpbnZva2VCb2R5KG5ld091dHB1dCk7Ci0gICAgICAgICAgICBoYW5kbGVyLmVuZERvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIGdpdmUgcGllY2Ugb2YgdGV4dCBhcyBiZWluZyBtYXJrdXAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZVRleHQoU3RyaW5nIHRleHQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICggbG9nLmlzRGVidWdFbmFibGVkKCkgKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoICJBYm91dCB0byBwYXJzZTogIiArIHRleHQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZXRYTUxSZWFkZXIoKS5wYXJzZSggbmV3IElucHV0U291cmNlKCBuZXcgU3RyaW5nUmVhZGVyKCB0ZXh0ICkgKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IEplbGx5IHBhcnNlcgotICAgICAqIEByZXR1cm4gWE1MUGFyc2VyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhNTFBhcnNlciBjcmVhdGVKZWxseVBhcnNlcigpIHsKLSAgICAgICAgWE1MUGFyc2VyIGFuc3dlciA9IG5ldyBYTUxQYXJzZXIoKTsKLSAgICAgICAgYW5zd2VyLnNldENvbnRleHQoY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBhbnN3ZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9SZW1vdmVUYWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvUmVtb3ZlVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MWRkYmQuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9SZW1vdmVUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbjsKLQotLyoqCi0gKiBBIHRhZyB3aGljaCByZW1vdmVzIHRoZSB2YXJpYWJsZSBvZiB0aGUgZ2l2ZW4gbmFtZSBmcm9tIHRoZSBjdXJyZW50IHZhcmlhYmxlIHNjb3BlLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgcHJpdmF0ZSBFeHByZXNzaW9uIHZhcjsKLQotICAgIHB1YmxpYyBSZW1vdmVUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHZhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnJlbW92ZVZhcmlhYmxlKCB2YXIuZXZhbHVhdGVBc1N0cmluZyhjb250ZXh0KSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oInZhciIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgd2hpY2ggd2lsbCBiZSByZW1vdmVkIGJ5IHRoaXMgdGFnLi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXIoRXhwcmVzc2lvbiB2YXIpIHsKLSAgICAgICAgdGhpcy52YXIgPSB2YXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9TY29wZVRhZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9TY29wZVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDA5M2Q4Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvU2NvcGVUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLS8qKgotICogQSB0YWcgd2hpY2ggY3JlYXRlcyBhIG5ldyBjaGlsZCB2YXJpYWJsZSBzY29wZSBmb3IgaXRzIGJvZHkuCi0gKiBTbyBhbnkgdmFyaWFibGVzIGRlZmluZWQgd2l0aGluIGl0cyBib2R5IHdpbGwgbm8gbG9uZ2VyIGJlIGluIHNjb3BlCi0gKiBhZnRlciB0aGlzIHRhZy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBTY29wZVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIEplbGx5Q29udGV4dCBuZXdDb250ZXh0ID0gY29udGV4dC5uZXdKZWxseUNvbnRleHQoKTsKLSAgICAgICAgZ2V0Qm9keSgpLnJ1bihuZXdDb250ZXh0LCBvdXRwdXQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvU2V0UHJvcGVydGllc1RhZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9TZXRQcm9wZXJ0aWVzVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNDNlNWYuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9TZXRQcm9wZXJ0aWVzVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkJlYW5VdGlsczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1hcFRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5CZWFuU291cmNlOwotCi0vKioKLSAqIEEgdGFnIHdoaWNoIHNldHMgdGhlIGJlYW4gcHJvcGVydGllcyBvbiB0aGUgZ2l2ZW4gYmVhbi4KLSAqIFNvIGlmIHlvdSB1c2VkIGl0IGFzIGZvbGxvd3MsIGZvciBleGFtcGxlIHVzaW5nIHRoZSAmbHQ7ajpuZXcmZ3Q7IHRhZy4KLSAqIDxwcmU+Ci0gKiAmbHQ7ajpuZXcgY2xhc3NOYW1lPSJjb20uYWNtZS5QZXJzb24iIHZhcj0icGVyc29uIi8mZ3Q7Ci0gKiAmbHQ7ajpzZXRQcm9wZXJ0aWVzIG9iamVjdD0iJHtwZXJzb259IiBuYW1lPSJKYW1lcyIgbG9jYXRpb249IiR7bG9jfSIvJmd0OwotICogPC9wcmU+Ci0gKiBUaGVuIGl0IHdvdWxkIHNldCB0aGUgbmFtZSBhbmQgbG9jYXRpb24gcHJvcGVydGllcyBvbiB0aGUgYmVhbiBkZW5vdGVkIGJ5Ci0gKiB0aGUgZXhwcmVzc2lvbiAke3BlcnNvbn0uCi0gKiA8cD4KLSAqIFRoaXMgdGFnIGNhbiBhbHNvIGJlIG5lc3RlZCBpbnNpZGUgYSBiZWFuIHRhZyBzdWNoIGFzIHRoZSAmbHQ7dXNlQmVhbiZndDsgdGFnCi0gKiBvciBhIEplbGx5U3dpbmcgdGFnIHRvIHNldCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzLCBtYXliZSBpbnNpZGUgc29tZSBjb25kaXRpb25hbAotICogbG9naWMuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMgJAotICovCi1wdWJsaWMgY2xhc3MgU2V0UHJvcGVydGllc1RhZyBleHRlbmRzIE1hcFRhZ1N1cHBvcnQgIHsKLQotICAgIHB1YmxpYyBTZXRQcm9wZXJ0aWVzVGFnKCl7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uLCBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIE1hcCBhdHRyaWJ1dGVzID0gZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBPYmplY3QgYmVhbiA9IGF0dHJpYnV0ZXMucmVtb3ZlKCAib2JqZWN0IiApOwotICAgICAgICBpZiAoIGJlYW4gPT0gbnVsbCApIHsKLSAgICAgICAgICAgIC8vIGxldHMgdHJ5IGZpbmQgYSBwYXJlbnQgYmVhbgotICAgICAgICAgICAgQmVhblNvdXJjZSB0YWcgPSAoQmVhblNvdXJjZSkgZmluZEFuY2VzdG9yV2l0aENsYXNzKEJlYW5Tb3VyY2UuY2xhc3MpOwotICAgICAgICAgICAgaWYgKHRhZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYmVhbiA9IHRhZy5nZXRCZWFuKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSmVsbHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJlYW4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCJiZWFuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2V0QmVhblByb3BlcnRpZXMoYmVhbiwgYXR0cmlidXRlcyk7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJvcGVydGllcyBvbiB0aGUgYmVhbi4gRGVyaXZlZCB0YWdzIGNvdWxkIGltcGxlbWVudCBzb21lIGN1c3RvbQotICAgICAqIHR5cGUgY29udmVyc2lvbiBldGMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0QmVhblByb3BlcnRpZXMoT2JqZWN0IGJlYW4sIE1hcCBhdHRyaWJ1dGVzKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQmVhblV0aWxzLnBvcHVsYXRlKGJlYW4sIGF0dHJpYnV0ZXMpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiY291bGQgbm90IHNldCB0aGUgcHJvcGVydGllcyBvbiBhIGJlYW4iLGUpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiY291bGQgbm90IHNldCB0aGUgcHJvcGVydGllcyBvbiBhIGJlYW4iLGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9TZXRUYWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvU2V0VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOWZiOWYuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9TZXRUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkJlYW5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0KLS8qKiBBIHRhZyB3aGljaCBzZXRzIGEgdmFyaWFibGUgZnJvbSB0aGUgcmVzdWx0IG9mIGFuIGV4cHJlc3Npb24KLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTggJAotICAqLwotcHVibGljIGNsYXNzIFNldFRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNldFRhZy5jbGFzcyk7Ci0KLSAgICAvKiogVGhlIHZhcmlhYmxlIG5hbWUgdG8gZXhwb3J0LiAqLwotICAgIHByaXZhdGUgU3RyaW5nIHZhcjsKLQotICAgIC8qKiBUaGUgdmFyaWFibGUgc2NvcGUgdG8gZXhwb3J0ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2NvcGU7Ci0KLSAgICAvKiogVGhlIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuICovCi0gICAgcHJpdmF0ZSBFeHByZXNzaW9uIHZhbHVlOwotCi0gICAgLyoqIFRoZSBkZWZhdWx0IHZhbHVlICovCi0gICAgcHJpdmF0ZSBFeHByZXNzaW9uIGRlZmF1bHRWYWx1ZTsKLQotICAgIC8qKiBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0byBzZXQgYSBwcm9wZXJ0eS4gKi8KLSAgICBwcml2YXRlIE9iamVjdCB0YXJnZXQ7Ci0KLSAgICAvKiogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldCBvbiB0aGUgdGFyZ2V0IG9iamVjdC4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKLQotICAgIC8qKiBTaG91bGQgd2UgWE1MIGVuY29kZSB0aGUgYm9keSBvZiB0aGlzIHRhZyBhcyB0ZXh0PyAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGUgPSB0cnVlOwotCi0gICAgcHVibGljIFNldFRhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gcGVyZm9ybSB2YWxpZGF0aW9uIHVwIGZyb250IHRvIGZhaWwgZmFzdAotICAgICAgICBpZiAoIHZhciAhPSBudWxsICkgewotICAgICAgICAgICAgaWYgKCB0YXJnZXQgIT0gbnVsbCB8fCBwcm9wZXJ0eSAhPSBudWxsICkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIlRoZSAndGFyZ2V0JyBhbmQgJ3Byb3BlcnR5JyBhdHRyaWJ1dGVzIGNhbm5vdCBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlICd2YXInIGF0dHJpYnV0ZSIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmICggdGFyZ2V0ID09IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCAiRWl0aGVyIGEgJ3Zhcicgb3IgYSAndGFyZ2V0JyBhdHRyaWJ1dGUgbXVzdCBiZSBkZWZpbmVkIGZvciB0aGlzIHRhZyIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICggcHJvcGVydHkgPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICJUaGUgJ3RhcmdldCcgYXR0cmlidXRlIHJlcXVpcmVzIHRoZSAncHJvcGVydHknIGF0dHJpYnV0ZSIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBhbnN3ZXIgPSBudWxsOwotICAgICAgICBpZiAoIHZhbHVlICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBhbnN3ZXIgPSB2YWx1ZS5ldmFsdWF0ZShjb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiBpc0VtcHR5KGFuc3dlcikpIHsKLSAgICAgICAgICAgICAgICBhbnN3ZXIgPSBkZWZhdWx0VmFsdWUuZXZhbHVhdGUoY29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhbnN3ZXIgPSBnZXRCb2R5VGV4dChpc0VuY29kZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggdmFyICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBpZiAoIHNjb3BlICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIHNjb3BlLCBhbnN3ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIGFuc3dlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzZXRQcm9wZXJ0eVZhbHVlKCB0YXJnZXQsIHByb3BlcnR5LCBhbnN3ZXIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKiogU2V0cyB0aGUgdmFyaWFibGUgbmFtZSB0byBkZWZpbmUgZm9yIHRoaXMgZXhwcmVzc2lvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0gICAgICAgIHRoaXMudmFyID0gdmFyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhcmlhYmxlIHNjb3BlIGZvciB0aGlzIHZhcmlhYmxlLiBGb3IgZXhhbXBsZSBzZXR0aW5nIHRoaXMgdmFsdWUgdG8gJ3BhcmVudCcgd2lsbAotICAgICAqIHNldCB0aGlzIHZhbHVlIGluIHRoZSBwYXJlbnQgc2NvcGUuIFdoZW4gSmVsbHkgaXMgcnVuIGZyb20gaW5zaWRlIGEgU2VydmxldCBlbnZpcm9ubWVudAotICAgICAqIHRoZW4gb3RoZXIgc2NvcGVzIHdpbGwgYmUgYXZhaWxhYmxlIHN1Y2ggYXMgJ3JlcXVlc3QnLCAnc2Vzc2lvbicgb3IgJ2FwcGxpY2F0aW9uJy4KLSAgICAgKgotICAgICAqIE90aGVyIGFwcGxpY2F0aW9ucyBtYXkgaW1wbGVtZW50IHRoZWlyIG93biBjdXN0b20gc2NvcGVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNjb3BlKFN0cmluZyBzY29wZSkgewotICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoRXhwcmVzc2lvbiB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSB0byBiZSB1c2VkIGlmIHRoZSB2YWx1ZSBleHByc2VzaW9uIHJlc3VsdHMKLSAgICAgKiBpbiBhIG51bGwgdmFsdWUgb3IgYmxhbmsgU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRvIHNldCBhIHByb3BlcnR5LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChPYmplY3QgdGFyZ2V0KSB7Ci0gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQgb24gdGhlIHRhcmdldCBvYmplY3QuICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGJvZHkgb2YgdGhpcyB0YWcgd2lsbCBiZSBYTUwgZW5jb2RlZCBvciBub3QuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmNvZGUoKSB7Ci0gICAgICAgIHJldHVybiBlbmNvZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIHRoZSBib2R5IG9mIHRoZSB0YWcgc2hvdWxkIGJlIFhNTCBlbmNvZGVkIGFzIHRleHQgKHNvIHRoYXQgJmx0OyBhbmQgJmd0OyBhcmUKLSAgICAgKiBlbmNvZGVkIGFzICZhbXA7bHQ7IGFuZCAmYW1wO2d0Oykgb3IgbGVhdmUgdGhlIHRleHQgYXMgWE1MIHdoaWNoIGlzIHRoZSBkZWZhdWx0LgotICAgICAqIFRoaXMgaXMgb25seSB1c2VkIGlmIHRoaXMgdGFnIGlzIHNwZWNpZmllZCB3aXRoIG5vIHZhbHVlIHNvIHRoYXQgdGhlIHRleHQgYm9keSBvZiB0aGlzCi0gICAgICogdGFnIGlzIHVzZWQgYXMgdGhlIGJvZHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlKGJvb2xlYW4gZW5jb2RlKSB7Ci0gICAgICAgIHRoaXMuZW5jb2RlID0gZW5jb2RlOwotICAgIH0KLQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5VmFsdWUoIE9iamVjdCB0YXJnZXQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlICkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCB0YXJnZXQgaW5zdGFuY2VvZiBNYXAgKSB7Ci0gICAgICAgICAgICAgICAgTWFwIG1hcCA9IChNYXApIHRhcmdldDsKLSAgICAgICAgICAgICAgICBtYXAucHV0KCBwcm9wZXJ0eSwgdmFsdWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIEJlYW5VdGlscy5zZXRQcm9wZXJ0eSggdGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoICJGYWlsZWQgdG8gc2V0IHRoZSBwcm9wZXJ0eTogIiArIHByb3BlcnR5ICsgIiBvbiBiZWFuOiAiICsgdGFyZ2V0ICsgIiB0byB2YWx1ZTogIiArIHZhbHVlICsgIiBkdWUgdG8gZXhjZXB0aW9uOiAiICsgZSwgZSApOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvciggIkZhaWxlZCB0byBzZXQgdGhlIHByb3BlcnR5OiAiICsgcHJvcGVydHkgKyAiIG9uIGJlYW46ICIgKyB0YXJnZXQgKyAiIHRvIHZhbHVlOiAiICsgdmFsdWUgKyAiIGR1ZSB0byBleGNlcHRpb246ICIgKyBlLCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIG51bGwgb3IgYW4gZW1wdHkgU3RyaW5nCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNFbXB0eShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLSAgICAgICAgICAgIHJldHVybiBzLmxlbmd0aCgpID09IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9Td2l0Y2hUYWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvU3dpdGNoVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMzZjNDAuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9Td2l0Y2hUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5FeHByZXNzaW9uOwotCi0KLS8qKgotICogRXhlY3V0ZXMgdGhlIGNoaWxkICZsdDtjYXNlJmd0OyB0YWcgd2hvc2UgdmFsdWUgZXF1YWxzIG15IG9uIGF0dHJpYnV0ZS4KLSAqIEV4ZWN1dGVzIGEgY2hpbGQgJmx0O2RlZmF1bHQmZ3Q7IHRhZyB3aGVuIHByZXNlbnQgYW5kIG5vICZsdDtjYXNlJmd0OyB0YWcgaGFzCi0gKiB5ZXQgbWF0Y2hlZC4KLSAqCi0gKiBAc2VlIENhc2VUYWcKLSAqIEBzZWUgRGVmYXVsdFRhZwotICoKLSAqIEBhdXRob3IgUm9kbmV5IFdhbGRob2ZmCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNyAkICREYXRlOiAyMDA0LzA5LzA5IDEyOjI3OjUzICQKLSAqLwotcHVibGljIGNsYXNzIFN3aXRjaFRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgcHVibGljIFN3aXRjaFRhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSB0byBzd2l0Y2ggb24uCi0gICAgICogTm90ZSB0aGF0IHRoZSB7QGxpbmsgRXhwcmVzc2lvbn0gaXMgZXZhbHVhdGVkIG9ubHkgb25jZSwgd2hlbiB0aGUKLSAgICAgKiAmbHQ7c3dpdGNoJmd0OyB0YWcgaXMgZXZhbHVhdGVkLgotICAgICAqIEBwYXJhbSBvbiB0aGUgdmFsdWUgdG8gc3dpdGNoIG9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T24oRXhwcmVzc2lvbiBvbikgewotICAgICAgICB0aGlzLm9uID0gb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYobnVsbCA9PSBvbikgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oIm9uIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IG9uLmV2YWx1YXRlKGNvbnRleHQpOwotICAgICAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJvdGVjdGVkIHByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNTb21lQ2FzZU1hdGNoZWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNvbWVDYXNlTWF0Y2hlZDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjYXNlTWF0Y2hlZCgpIHsKLSAgICAgICAgdGhpcy5zb21lQ2FzZU1hdGNoZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRmFsbGluZ1RocnUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZhbGxpbmdUaHJ1OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldEZhbGxpbmdUaHJ1KGJvb2xlYW4gZmFsbGluZ1RocnUpIHsKLSAgICAgICAgdGhpcy5mYWxsaW5nVGhydSA9IGZhbGxpbmdUaHJ1OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNEZWZhdWx0QmVlbkVuY291bnRlcmVkKCkgewotICAgICAgICByZXR1cm4gZGVmYXVsdEVuY291bnRlcmVkOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRlZmF1bHRFbmNvdW50ZXJlZCgpIHsKLSAgICAgICAgdGhpcy5kZWZhdWx0RW5jb3VudGVyZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8vIEF0dHJpYnV0ZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwcml2YXRlIGJvb2xlYW4gc29tZUNhc2VNYXRjaGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZhbGxpbmdUaHJ1ID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRFbmNvdW50ZXJlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgRXhwcmVzc2lvbiBvbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBPYmplY3QgdmFsdWUgPSBudWxsOwotCi19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL1RocmVhZFRhZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9UaHJlYWRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM4MWRlMy4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL1RocmVhZFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKiBBIHRhZyB0aGF0IHNwYXducyB0aGUgY29udGFpbmVkIHNjcmlwdCBpbiBhIHNlcGFyYXRlIHRocmVhZAotICAqCi0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86dmluYXljQGFwYWNoZS5vcmciPlZpbmF5IENoYW5kcmFuPC9hPgotICAqLwotcHVibGljIGNsYXNzIFRocmVhZFRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgIHsKLSAgICAvKiogVGhyZWFkIE5hbWUgKi8KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICAvKiogdGhlIGRlc3RpbmF0aW9uIG9mIG91dHB1dCAqLwotICAgIHByaXZhdGUgWE1MT3V0cHV0IHhtbE91dHB1dDsKLSAgICAvKiogU2hvdWxkIHdlIGNsb3NlIHRoZSB1bmRlcmx5aW5nIG91dHB1dCAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZU91dHB1dDsKLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVGhyZWFkVGFnLmNsYXNzKTsKLQotICAgIHB1YmxpYyBUaHJlYWRUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKGZpbmFsIFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICggeG1sT3V0cHV0ID09IG51bGwgKSB7Ci0gICAgICAgICAgICAvLyBsZXRzIGRlZmF1bHQgdG8gc3lzdGVtLm91dAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB4bWxPdXRwdXQgPSBYTUxPdXRwdXQuY3JlYXRlWE1MT3V0cHV0KCBTeXN0ZW0ub3V0ICk7Ci0gICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBsZXRzIGNyZWF0ZSBhIGNoaWxkIGNvbnRleHQKLSAgICAgICAgZmluYWwgSmVsbHlDb250ZXh0IG5ld0NvbnRleHQgPSBjb250ZXh0Lm5ld0plbGx5Q29udGV4dCgpOwotCi0gICAgICAgIFRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKAotICAgICAgICAgICAgbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEJvZHkoKS5ydW4obmV3Q29udGV4dCwgeG1sT3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbG9zZU91dHB1dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sT3V0cHV0LmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRXJyb3JFbmFibGVkKCkpIGxvZy5lcnJvcigiZXJyb3IgcnVubmluZyB0aHJlYWQgdGFnIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIGlmICggbmFtZSAhPSBudWxsICkgewotICAgICAgICAgICAgdGhyZWFkLnNldE5hbWUoIG5hbWUgKTsKLSAgICAgICAgfQotICAgICAgICB0aHJlYWQuc3RhcnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB0aHJlYWQuCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlc3RpbmF0aW9uIG9mIG91dHB1dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhtbE91dHB1dChYTUxPdXRwdXQgeG1sT3V0cHV0KSB7Ci0gICAgICAgIHRoaXMuY2xvc2VPdXRwdXQgPSBmYWxzZTsKLSAgICAgICAgdGhpcy54bWxPdXRwdXQgPSB4bWxPdXRwdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBmaWxlIHdoaWNoIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBvdXRwdXQKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgb3V0cHV0IGZpbGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbGUoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuY2xvc2VPdXRwdXQgPSB0cnVlOwotICAgICAgICBzZXRYbWxPdXRwdXQoIFhNTE91dHB1dC5jcmVhdGVYTUxPdXRwdXQobmV3IEZpbGVPdXRwdXRTdHJlYW0obmFtZSkpICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9Vc2VCZWFuVGFnLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL1VzZUJlYW5UYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEyMWVlYy4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL1VzZUJlYW5UYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkJlYW5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLlByb3BlcnR5VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NYXBUYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuQmVhblNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudXRpbC5DbGFzc0xvYWRlclV0aWxzOwotCi0vKioKLSAqIEEgdGFnIHdoaWNoIGluc3RhbnRpYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY2xhc3MKLSAqIGFuZCB0aGVuIHNldHMgdGhlIHByb3BlcnRpZXMgb24gdGhlIGJlYW4uCi0gKiBUaGUgY2xhc3MgY2FuIGJlIHNwZWNpZmllZCB2aWEgYSB7QGxpbmsgamF2YS5sYW5nLkNsYXNzfSBpbnN0YW5jZSBvcgotICogYSBTdHJpbmcgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGxvYWQgdGhlIGNsYXNzIHVzaW5nIGVpdGhlciB0aGUgY3VycmVudAotICogdGhyZWFkJ3MgY29udGV4dCBjbGFzcyBsb2FkZXIgb3IgdGhlIGNsYXNzIGxvYWRlciB1c2VkIHRvIGxvYWQgdGhpcwotICogSmVsbHkgbGlicmFyeS4KLSAqCi0gKiBUaGlzIHRhZyBjYW4gYmUgdXNlZCBpdCBhcyBmb2xsb3dzLAotICogPHByZT4KLSAqICZsdDtqOnVzZUJlYW4gdmFyPSJwZXJzb24iIGNsYXNzPSJjb20uYWNtZS5QZXJzb24iIG5hbWU9IkphbWVzIiBsb2NhdGlvbj0iJHtsb2N9Ii8mZ3Q7Ci0gKiAmbHQ7ajp1c2VCZWFuIHZhcj0ib3JkZXIiIGNsYXNzPSIke29yZGVyQ2xhc3N9IiBhbW91bnQ9IjEyIiBwcmljZT0iMTIzLjQ1NiIvJmd0OwotICogPC9wcmU+Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMgJAotICovCi1wdWJsaWMgY2xhc3MgVXNlQmVhblRhZyBleHRlbmRzIE1hcFRhZ1N1cHBvcnQgaW1wbGVtZW50cyBCZWFuU291cmNlIHsKLQotICAgIC8qKiB0aGUgY3VycmVudCBiZWFuIGluc3RhbmNlICovCi0gICAgcHJpdmF0ZSBPYmplY3QgYmVhbjsKLQotICAgIC8qKiB0aGUgZGVmYXVsdCBjbGFzcyB0byB1c2UgaWYgbm8gQ2xhc3MgaXMgc3BlY2lmaWVkICovCi0gICAgcHJpdmF0ZSBDbGFzcyBkZWZhdWx0Q2xhc3M7Ci0KLSAgICAvKioKLSAgICAgKiBhIFNldCBvZiBTdHJpbmdzIG9mIHByb3BlcnR5IG5hbWVzIHRvIGlnbm9yZSAocmVtb3ZlIGZyb20gdGhlCi0gICAgICogTWFwIG9mIGF0dHJpYnV0ZXMgYmVmb3JlIHBhc3NpbmcgdG8gQ29udmVydFV0aWxzKQotICAgICAqLwotICAgIHByaXZhdGUgU2V0IGlnbm9yZVByb3BlcnRpZXM7Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGlzIHRhZyBmaW5kcyBhbiBhdHRyaWJ1dGUgaW4gdGhlIFhNTCB0aGF0J3Mgbm90Ci0gICAgICogaWdub3JlZCBieSB7QGxpbmsgI2lnbm9yZVByb3BlcnRpZXN9IGFuZCBpc24ndCBhCi0gICAgICogYmVhbiBwcm9wZXJ0eSwgc2hvdWxkIGl0IHRocm93IGFuIGV4Y2VwdGlvbj8KLSAgICAgKiBAc2VlICNzZXRJZ25vcmVVbmtub3duUHJvcGVydGllcyhib29sZWFuKQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpZ25vcmVVbmtub3duUHJvcGVydGllcyA9IGZhbHNlOwotCi0KLSAgICBwdWJsaWMgVXNlQmVhblRhZygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVXNlQmVhblRhZyhDbGFzcyBkZWZhdWx0Q2xhc3MpIHsKLSAgICAgICAgdGhpcy5kZWZhdWx0Q2xhc3MgPSBkZWZhdWx0Q2xhc3M7Ci0gICAgfQotCi0gICAgLy8gQmVhblNvdXJjZSBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGJlYW4gdGhhdCBoYXMganVzdCBiZWVuIGNyZWF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oKSB7Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIE1hcCBhdHRyaWJ1dGVzID0gZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBTdHJpbmcgdmFyID0gKFN0cmluZykgYXR0cmlidXRlcy5nZXQoICJ2YXIiICk7Ci0gICAgICAgIE9iamVjdCBjbGFzc09iamVjdCA9IGF0dHJpYnV0ZXMuZ2V0KCAiY2xhc3MiICk7Ci0gICAgICAgIGFkZElnbm9yZVByb3BlcnR5KCJjbGFzcyIpOwotICAgICAgICBhZGRJZ25vcmVQcm9wZXJ0eSgidmFyIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHRoaXMgbWV0aG9kIGNvdWxkIHJldHVybiBudWxsIGluIGRlcml2ZWQgY2xhc3NlcwotICAgICAgICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBjb252ZXJ0VG9DbGFzcyhjbGFzc09iamVjdCk7Ci0KLSAgICAgICAgICAgIGJlYW4gPSBuZXdJbnN0YW5jZSh0aGVDbGFzcywgYXR0cmlidXRlcywgb3V0cHV0KTsKLSAgICAgICAgICAgIHNldEJlYW5Qcm9wZXJ0aWVzKGJlYW4sIGF0dHJpYnV0ZXMpOwotCi0gICAgICAgICAgICAvLyBpbnZva2UgYm9keSB3aGljaCBjb3VsZCByZXN1bHQgaW4gb3RoZXIgcHJvcGVydGllcyBiZWluZyBzZXQKLSAgICAgICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLQotICAgICAgICAgICAgcHJvY2Vzc0JlYW4odmFyLCBiZWFuKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBBbGxvdyBkZXJpdmVkIGNsYXNzZXMgdG8gcHJvZ3JhbWF0aWNhbGx5IHNldCB0aGUgYmVhbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEJlYW4oT2JqZWN0IGJlYW4pIHsKLSAgICAgICAgdGhpcy5iZWFuID0gYmVhbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdHRlbXB0cyB0byBjb252ZXJ0IHRoZSBnaXZlbiBvYmplY3QgdG8gYSBDbGFzcyBpbnN0YW5jZS4KLSAgICAgKiBJZiB0aGUgY2xhc3NPYmplY3QgaXMgYWxyZWFkeSBhIENsYXNzIGl0IHdpbGwgYmUgcmV0dXJuZWQKLSAgICAgKiBvdGhlcndpc2UgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBTdHJpbmcgYW5kIGxvYWRlZAotICAgICAqIHVzaW5nIHRoZSBkZWZhdWx0IGNsYXNzIGxvYWRpbmcgbWVjaGFuaXNtLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDbGFzcyBjb252ZXJ0VG9DbGFzcyhPYmplY3QgY2xhc3NPYmplY3QpCi0gICAgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpZiAoY2xhc3NPYmplY3QgaW5zdGFuY2VvZiBDbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIChDbGFzcykgY2xhc3NPYmplY3Q7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIGNsYXNzT2JqZWN0ID09IG51bGwgKSB7Ci0gICAgICAgICAgICBDbGFzcyB0aGVDbGFzcyA9IGdldERlZmF1bHRDbGFzcygpOwotICAgICAgICAgICAgaWYgKHRoZUNsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbigiY2xhc3MiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGVDbGFzczsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjbGFzc09iamVjdC50b1N0cmluZygpOwotICAgICAgICAgICAgcmV0dXJuIGxvYWRDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIGdpdmVuIGNsYXNzIHVzaW5nIHRoZSBkZWZhdWx0IGNsYXNzIGxvYWRpbmcgbWVjaGFuaXNtCi0gICAgICogd2hpY2ggaXMgdG8gdHJ5IHVzZSB0aGUgY3VycmVudCBUaHJlYWQncyBjb250ZXh0IGNsYXNzIGxvYWRlciBmaXJzdAotICAgICAqIG90aGVyaXNlIHVzZSB0aGUgY2xhc3MgbG9hZGVyIHdoaWNoIGxvYWRlZCB0aGlzIGNsYXNzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gQ2xhc3NMb2FkZXJVdGlscy5sb2FkQ2xhc3MoY2xhc3NOYW1lLCBnZXRDbGFzcygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBnaXZlbiBjbGFzcywgd2hpY2ggYnkgZGVmYXVsdCB3aWxsIGludm9rZSB0aGUKLSAgICAgKiBkZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqIERlcml2ZWQgdGFncyBjb3VsZCBkbyBzb21ldGhpbmcgZGlmZmVyZW50IGhlcmUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBuZXdJbnN0YW5jZShDbGFzcyB0aGVDbGFzcywgTWFwIGF0dHJpYnV0ZXMsIFhNTE91dHB1dCBvdXRwdXQpCi0gICAgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiB0aGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJvcGVydGllcyBvbiB0aGUgYmVhbi4gRGVyaXZlZCB0YWdzIGNvdWxkIGltcGxlbWVudCBzb21lIGN1c3RvbQotICAgICAqIHR5cGUgY29udmVyc2lvbiBldGMuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgbWV0aG9kIGlnbm9yZXMgYWxsIHByb3BlcnR5IG5hbWVzIGluIHRoZSBTZXQgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRJZ25vcmVQcm9wZXJ0eVNldCgpfS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRCZWFuUHJvcGVydGllcyhPYmplY3QgYmVhbiwgTWFwIGF0dHJpYnV0ZXMpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIE1hcCBhdHRyc1RvVXNlID0gbmV3IEhhc2hNYXAoYXR0cmlidXRlcyk7Ci0gICAgICAgIGF0dHJzVG9Vc2Uua2V5U2V0KCkucmVtb3ZlQWxsKGdldElnbm9yZVByb3BlcnR5U2V0KCkpOwotCi0gICAgICAgIHZhbGlkYXRlQmVhblByb3BlcnRpZXMoYmVhbiwgYXR0cnNUb1VzZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJlYW5VdGlscy5wb3B1bGF0ZShiZWFuLCBhdHRyc1RvVXNlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oImNvdWxkIG5vdCBzZXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGJlYW4iLGUpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbigiY291bGQgbm90IHNldCB0aGUgcHJvcGVydGllcyBvZiB0aGUgYmVhbiIsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB7QGxpbmsgI2lzSWdub3JlVW5rbm93blByb3BlcnRpZXMoKX0gcmV0dXJucyB0cnVlLCBtYWtlIHN1cmUgdGhhdAotICAgICAqIGV2ZXJ5IG5vbi1pZ25vcmVkICh7QHNlZSAjYWRkSWdub3JlUHJvcGVydHkoU3RyaW5nKX0pIHByb3BlcnR5Ci0gICAgICogbWF0Y2hlcyBhIHdyaXRhYmxlIHByb3BlcnR5IG9uIHRoZSB0YXJnZXQgYmVhbi4KLSAgICAgKiBAcGFyYW0gYmVhbiB0aGUgYmVhbiB0byB2YWxpZGF0ZQotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRoZSBsaXN0IG9mIHByb3BlcnRpZXMgdG8gdmFsaWRhdGUKLSAgICAgKiBAdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHdoZW4gYSBwcm9wZXJ0eSBpcyBub3Qgd3JpdGVhYmxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVCZWFuUHJvcGVydGllcyhPYmplY3QgYmVhbiwgTWFwIGF0dHJpYnV0ZXMpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaXNJZ25vcmVVbmtub3duUHJvcGVydGllcygpKSB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGk9YXR0cmlidXRlcy5rZXlTZXQoKS5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCEgUHJvcGVydHlVdGlscy5pc1dyaXRlYWJsZShiZWFuLCBhdHRyTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5VGFnRXhjZXB0aW9uKCJObyBiZWFuIHByb3BlcnR5IGZvdW5kOiAiICsgYXR0ck5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ5IGRlZmF1bHQgdGhpcyB3aWxsIGV4cG9ydCB0aGUgYmVhbiB1c2luZyB0aGUgZ2l2ZW4gdmFyaWFibGUgaWYgaXQgaXMgZGVmaW5lZC4KLSAgICAgKiBUaGlzIFN0cmF0ZWd5IG1ldGhvZCBhbGxvd3MgZGVyaXZlZCB0YWdzIHRvIHByb2Nlc3MgdGhlIGJlYW5zIGluIGRpZmZlcmVudCB3YXlzCi0gICAgICogc3VjaCBhcyB0byByZWdpc3RlciB0aGlzIGJlYW4gd2l0aCBpdHMgcGFyZW50IHRhZyBldGMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0JlYW4oU3RyaW5nIHZhciwgT2JqZWN0IGJlYW4pIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh2YXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSh2YXIsIGJlYW4pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgQXJnVGFnIHBhcmVudEFyZyA9IChBcmdUYWcpKGZpbmRBbmNlc3RvcldpdGhDbGFzcyhBcmdUYWcuY2xhc3MpKTsKLSAgICAgICAgICAgIGlmKG51bGwgIT0gcGFyZW50QXJnKSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50QXJnLnNldFZhbHVlKGJlYW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWxsb3dzIGRlcml2ZWQgY2xhc3NlcyB0byBwcm92aWRlIGEgZGVmYXVsdCBiZWFuIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENsYXNzIGdldERlZmF1bHRDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbmFtZSB0byB0aGUgU2V0IG9mIHByb3BlcnR5IG5hbWVzIHRoYXQgd2lsbCBiZSBza2lwcGVkIHdoZW4gc2V0dGluZwotICAgICAqIGJlYW4gcHJvcGVydGllcy4gSW4gb3RoZXIgd29yZHMsIG5hbWVzIGFkZGVkIGhlcmUgd29uJ3QgYmUgc2V0IGludG8gdGhlIGJlYW4KLSAgICAgKiBpZiB0aGV5J3JlIHByZXNlbnQgaW4gdGhlIGF0dHJpYnV0ZSBNYXAuCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRJZ25vcmVQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotICAgICAgICBnZXRJZ25vcmVQcm9wZXJ0eVNldCgpLmFkZChuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBTZXQgb2YgcHJvcGVydHkgbmFtZXMgdGhhdCBzaG91bGQgYmUgaWdub3JlZCB3aGVuIHNldHRpbmcgdGhlCi0gICAgICogcHJvcGVydGllcyBvZiB0aGUgYmVhbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU2V0IGdldElnbm9yZVByb3BlcnR5U2V0KCkgewotICAgICAgICBpZiAoaWdub3JlUHJvcGVydGllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZ25vcmVQcm9wZXJ0aWVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpZ25vcmVQcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUge0BsaW5rICNzZXRJZ25vcmVVbmtub3duUHJvcGVydGllcyhib29sZWFuKX0KLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmVVbmtub3duUHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIGlnbm9yZVVua25vd25Qcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoaXMgdGFnIGZpbmRzIGFuIGF0dHJpYnV0ZSBpbiB0aGUgWE1MIHRoYXQncyBub3QKLSAgICAgKiBpZ25vcmVkIGJ5IHtAbGluayAjaWdub3JlUHJvcGVydGllc30gYW5kIGlzbid0IGEKLSAgICAgKiBiZWFuIHByb3BlcnR5LCBzaG91bGQgaXQgdGhyb3cgYW4gZXhjZXB0aW9uPwotICAgICAqIEBwYXJhbSBpZ25vcmVVbmtub3duUHJvcGVydGllcyBTZXRzIHtAbGluayAjaWdub3JlVW5rbm93blByb3BlcnRpZXN9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZVVua25vd25Qcm9wZXJ0aWVzKGJvb2xlYW4gaWdub3JlVW5rbm93blByb3BzKSB7Ci0gICAgICAgIHRoaXMuaWdub3JlVW5rbm93blByb3BlcnRpZXMgPSBpZ25vcmVVbmtub3duUHJvcHM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9Vc2VMaXN0VGFnLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL1VzZUxpc3RUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjNzRjNy4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL1VzZUxpc3RUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5Db2xsZWN0aW9uVGFnOwotCi0vKioKLSAqIEEgdGFnIHdoaWNoIGNyZWF0ZXMgYSBMaXN0IGltcGxlbWVudGF0aW9uIGFuZCBvcHRpb25hbGx5Ci0gKiBhZGRzIGFsbCBvZiB0aGUgZWxlbWVudHMgaWRlbnRpZmllZCBieSB0aGUgaXRlbXMgYXR0cmlidXRlLgotICogVGhlIGV4YWN0IGltcGxlbWVudGF0aW9uIG9mIExpc3QgY2FuIGJlIHNwZWNpZmllZCB2aWEgdGhlCi0gKiBjbGFzcyBhdHRyaWJ1dGUKLSAqIDwvcHJlPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKLSAqLwotcHVibGljIGNsYXNzIFVzZUxpc3RUYWcgZXh0ZW5kcyBVc2VCZWFuVGFnIGltcGxlbWVudHMgQ29sbGVjdGlvblRhZyB7Ci0KLSAgICBwcml2YXRlIEV4cHJlc3Npb24gaXRlbXM7Ci0KLSAgICBwdWJsaWMgVXNlTGlzdFRhZygpewotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldExpc3QoKSB7Ci0gICAgICAgIHJldHVybiAoTGlzdCkgZ2V0QmVhbigpOwotICAgIH0KLQotCi0gICAgLy8gQ29sbGVjdGlvblRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBhZGRJdGVtKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBnZXRMaXN0KCkuYWRkKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvLyBEeW5hVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBDbGFzcyBnZXRBdHRyaWJ1dGVUeXBlKFN0cmluZyBuYW1lKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpZiAobmFtZS5lcXVhbHMoIml0ZW1zIikpIHsKLSAgICAgICAgICAgIHJldHVybiBFeHByZXNzaW9uLmNsYXNzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGVUeXBlKG5hbWUpOwotICAgIH0KLQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0QmVhblByb3BlcnRpZXMoT2JqZWN0IGJlYW4sIE1hcCBhdHRyaWJ1dGVzKSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBpdGVtcyA9IChFeHByZXNzaW9uKSBhdHRyaWJ1dGVzLnJlbW92ZSgiaXRlbXMiKTsKLSAgICAgICAgc3VwZXIuc2V0QmVhblByb3BlcnRpZXMoYmVhbiwgYXR0cmlidXRlcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0JlYW4oU3RyaW5nIHZhciwgT2JqZWN0IGJlYW4pIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnByb2Nlc3NCZWFuKHZhciwgYmVhbik7Ci0KLSAgICAgICAgTGlzdCBsaXN0ID0gZ2V0TGlzdCgpOwotCi0gICAgICAgIC8vIGlmIHRoZSBpdGVtcyB2YXJpYWJsZSBpcyBzcGVjaWZpZWQgbGV0cyBhcHBlbmQgYWxsIHRoZSBpdGVtcwotICAgICAgICBpZiAoaXRlbXMgIT0gbnVsbCkgewotICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IGl0ZW1zLmV2YWx1YXRlQXNJdGVyYXRvcihjb250ZXh0KTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKCBpdGVyLm5leHQoKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENsYXNzIGdldERlZmF1bHRDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIEFycmF5TGlzdC5jbGFzczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL1doZW5UYWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvV2hlblRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDk1OGI5Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvV2hlblRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbjsKLQotLyoqIEEgdGFnIHdoaWNoIGNvbmRpdGlvbmFsbHkgZXZhbHVhdGVzIGl0cyBib2R5IGJhc2VkIG9uIHNvbWUgY29uZGl0aW9uCi0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjE1ICQKLSAgKi8KLXB1YmxpYyBjbGFzcyBXaGVuVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogVGhlIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuICovCi0gICAgcHJpdmF0ZSBFeHByZXNzaW9uIHRlc3Q7Ci0KLSAgICBwdWJsaWMgV2hlblRhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgQ2hvb3NlVGFnIHRhZyA9IChDaG9vc2VUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyggQ2hvb3NlVGFnLmNsYXNzICk7Ci0gICAgICAgIGlmICggdGFnID09IG51bGwgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oICJUaGlzIHRhZyBtdXN0IGJlIGVuY2xvc2VkIGluc2lkZSBhIDxjaG9vc2U+IHRhZyIgKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoICEgdGFnLmlzQmxvY2tFdmFsdWF0ZWQoKSAmJiB0ZXN0ICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBpZiAoIHRlc3QuZXZhbHVhdGVBc0Jvb2xlYW4oIGNvbnRleHQgKSApIHsKLSAgICAgICAgICAgICAgICB0YWcuc2V0QmxvY2tFdmFsdWF0ZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqIFNldHMgdGhlIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuICovCi0gICAgcHVibGljIHZvaWQgc2V0VGVzdChFeHByZXNzaW9uIHRlc3QpIHsKLSAgICAgICAgdGhpcy50ZXN0ID0gdGVzdDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvV2hpbGVUYWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvV2hpbGVUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM1MThlOC4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL1doaWxlVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuQnJlYWtFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogQSB0YWcgd2hpY2ggcGVyZm9ybXMgYW4gaXRlcmF0aW9uIHdoaWxlIHRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbiBpcyB0cnVlLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmVyaWNAZXJpY2FsZXhhbmRlci5uZXQiPkVyaWMgQWxleGFuZGVyPC9hPgotICogQGF1dGhvciBkSW9uIEdpbGxhcmQKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xNSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBXaGlsZVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFdoaWxlVGFnLmNsYXNzKTsKLQotICAgIC8qKiBUaGUgZXhwcmVzc2lvbiB0byB1c2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSB3aGlsZSBzaG91bGQgY29udGludWUgKi8KLSAgICBwcml2YXRlIEV4cHJlc3Npb24gdGVzdDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyB3aGlsZSB0YWcKLSAgICAgKi8KLSAgICBwdWJsaWMgV2hpbGVUYWcoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGFnIGludGVyZmFjZQotICAgICAqIEBwYXJhbSBvdXRwdXQgZGVzdGluYXRpb24gZm9yIHhtbCBvdXRwdXQKLSAgICAgKiBAdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24gd2hlbiB0aGUgdGVzdCBhdHRyaWJ1dGUgaXMgbWlzc2luZwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGZvciBhbnl0aGluZyBlbHNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24sIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3aGlsZSAodGVzdC5ldmFsdWF0ZUFzQm9vbGVhbihnZXRDb250ZXh0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJldmFsdWF0ZWQgdG8gdHJ1ZSEgZ29ubmEga2VlcCBvbiBjaHVnZ2luISIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludm9rZUJvZHkob3V0cHV0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoQnJlYWtFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoImxvb3AgdGVybWluYXRlZCBieSBicmVhazogIiArIGUsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCJ0ZXN0Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgZm9yIHRoZSBleHByZXNzaW9uCi0gICAgICogQHBhcmFtIGUgdGhlIGV4cHJlc3Npb24gdG8gdGVzdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRlc3QoRXhwcmVzc2lvbiBlKSB7Ci0gICAgICAgIHRoaXMudGVzdCA9IGU7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9jb3JlL1doaXRlc3BhY2VUYWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvV2hpdGVzcGFjZVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjM0YjI1Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvV2hpdGVzcGFjZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBBIHNpbXBsZSB0YWcgdXNlZCB0byBwcmVzZXJ2ZSB3aGl0ZXNwYWNlIGluc2lkZSBpdHMgYm9keQotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS43ICQKLSAqLwotcHVibGljIGNsYXNzIFdoaXRlc3BhY2VUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyggV2hpdGVzcGFjZVRhZy5jbGFzcyApOwotCi0gICAgcHVibGljIFdoaXRlc3BhY2VUYWcoKSB7Ci0gICAgICAgIHNldFRyaW0oZmFsc2UpOwotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotCi0gICAgICAgIGlmICggbG9nLmlzRGVidWdFbmFibGVkKCkgKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoICJSdW5uaW5nIGJvZHk6ICIgKyBnZXRCb2R5KCkgKTsKLSAgICAgICAgfQotICAgICAgICBpbnZva2VCb2R5KG91dHB1dCk7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2NvcmUvcGFja2FnZS5odG1sIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MzM1ZDkuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvY29yZS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGh0bWw+Ci08aGVhZD4KLTwvaGVhZD4KLTxib2R5PgotCi0gIDxwPlRoZSBjb3JlIFRhZ3MgZnJvbSB0aGUgSlNUTCBwbHVzIEplbGx5IGV4dGVuc2lvbnMuCi0gIDwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0L0Jhc2VKZWxseVRlc3QuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0L0Jhc2VKZWxseVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RmYjA3Zi4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdC9CYXNlSmVsbHlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50ZXN0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqCi0gKiBAYXV0aG9yIFJvZG5leSBXYWxkaG9mZgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwNC8xMC8yNiAyMzo1NDozNyAkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlSmVsbHlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIEJhc2VKZWxseVRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgamVsbHkgPSBuZXcgSmVsbHkoKTsKLSAgICAgICAgY29udGV4dCA9IG5ldyBKZWxseUNvbnRleHQoKTsKLSAgICAgICAgeG1sT3V0cHV0ID0gWE1MT3V0cHV0LmNyZWF0ZUR1bW15WE1MT3V0cHV0KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXBTY3JpcHQoU3RyaW5nIHNjcmlwdG5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVUkwgdXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKHNjcmlwdG5hbWUpOwotICAgICAgICBpZihudWxsID09IHVybCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgSmVsbHkgc2NyaXB0OiAiICsgc2NyaXB0bmFtZQotICAgICAgICAgICAgICAgICsgIiBpbiBwYWNrYWdlIG9mIGNsYXNzOiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLSAgICAgICAgamVsbHkuc2V0VXJsKHVybCk7Ci0KLSAgICAgICAgU3RyaW5nIGV4dHVybCA9IHVybC50b0V4dGVybmFsRm9ybSgpOwotICAgICAgICBpbnQgbGFzdFNsYXNoID0gZXh0dXJsLmxhc3RJbmRleE9mKCIvIik7Ci0gICAgICAgIFN0cmluZyBleHRCYXNlID0gZXh0dXJsLnN1YnN0cmluZygwLGxhc3RTbGFzaCsxKTsKLSAgICAgICAgVVJMIGJhc2V1cmwgPSBuZXcgVVJMKGV4dEJhc2UpOwotICAgICAgICBjb250ZXh0LnNldEN1cnJlbnRVUkwoYmFzZXVybCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEplbGx5IGdldEplbGx5KCkgewotICAgICAgICByZXR1cm4gamVsbHk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEplbGx5Q29udGV4dCBnZXRKZWxseUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBjb250ZXh0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBYTUxPdXRwdXQgZ2V0WE1MT3V0cHV0KCkgewotICAgICAgICByZXR1cm4geG1sT3V0cHV0OwotICAgIH0KLQotICAgIHByaXZhdGUgSmVsbHkgamVsbHkgPSBudWxsOwotICAgIHByaXZhdGUgSmVsbHlDb250ZXh0IGNvbnRleHQgPSBudWxsOwotICAgIHByaXZhdGUgWE1MT3V0cHV0IHhtbE91dHB1dCA9IG51bGw7Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS91dGlsL0NsYXNzTG9hZGVyVXRpbHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS91dGlsL0NsYXNzTG9hZGVyVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJkNDFhZi4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdXRpbC9DbGFzc0xvYWRlclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogQSBjbGFzcyB0byBjZW50cmFsaXplIHRoZSBjbGFzcyBsb2FkZXIgbWFuYWdlbWVudCBjb2RlLgotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NMb2FkZXJVdGlscyB7Ci0KLSAgICAvKiogbG9nIGZvciBkZWJ1ZyBldGMgb3V0cHV0ICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENsYXNzTG9hZGVyVXRpbHMuY2xhc3MpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY2xhc3MgbG9hZGVyIHRvIGJlIHVzZWQgZm9yIGluc3RhbnRpYXRpbmcgYXBwbGljYXRpb24gb2JqZWN0cwotICAgICAqIHdoZW4gcmVxdWlyZWQuICBUaGlzIGlzIGRldGVybWluZWQgYmFzZWQgdXBvbiB0aGUgZm9sbG93aW5nIHJ1bGVzOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+VGhlIHNwZWNpZmllZCBjbGFzcyBsb2FkZXIsIGlmIGFueTwvbGk+Ci0gICAgICogPGxpPlRoZSB0aHJlYWQgY29udGV4dCBjbGFzcyBsb2FkZXIsIGlmIGl0IGV4aXN0cyBhbmQgPGNvZGU+dXNlQ29udGV4dENsYXNzTG9hZGVyPC9jb2RlPiBpcyB0cnVlPC9saT4KLSAgICAgKiA8bGk+VGhlIGNsYXNzIGxvYWRlciB1c2VkIHRvIGxvYWQgdGhlIGNhbGxpbmcgY2xhc3MuCi0gICAgICogPGxpPlRoZSBTeXN0ZW0gY2xhc3MgbG9hZGVyLgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBzcGVjaWZpZWRMb2FkZXIsIGJvb2xlYW4gdXNlQ29udGV4dENsYXNzTG9hZGVyLCBDbGFzcyBjYWxsaW5nQ2xhc3MpIHsKLSAgICAgICAgaWYgKHNwZWNpZmllZExvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3BlY2lmaWVkTG9hZGVyOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1c2VDb250ZXh0Q2xhc3NMb2FkZXIpIHsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIGlmIChjbGFzc0xvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXRDbGFzc0xvYWRlcihjYWxsaW5nQ2xhc3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY2xhc3MgbG9hZGVyIHRvIGJlIHVzZWQgZm9yIGluc3RhbnRpYXRpbmcgYXBwbGljYXRpb24gb2JqZWN0cwotICAgICAqIHdoZW4gYSBjb250ZXh0IGNsYXNzIGxvYWRlciBpcyBub3Qgc3BlY2lmaWVkLiAgVGhpcyBpcyBkZXRlcm1pbmVkIGJhc2VkIHVwb24gdGhlIGZvbGxvd2luZyBydWxlczoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPlRoZSBzcGVjaWZpZWQgY2xhc3MgbG9hZGVyLCBpZiBhbnk8L2xpPgotICAgICAqIDxsaT5UaGUgY2xhc3MgbG9hZGVyIHVzZWQgdG8gbG9hZCB0aGUgY2FsbGluZyBjbGFzcy4KLSAgICAgKiA8bGk+VGhlIFN5c3RlbSBjbGFzcyBsb2FkZXIuCi0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHNwZWNpZmllZExvYWRlciwgQ2xhc3MgY2FsbGluZ0NsYXNzKSB7Ci0gICAgICAgIGlmIChzcGVjaWZpZWRMb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHNwZWNpZmllZExvYWRlcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0Q2xhc3NMb2FkZXIoY2FsbGluZ0NsYXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGxvYWRlciBmb3IgdGhlIGdpdmVuIGNsYXNzLiAKLSAgICAgKiBAcGFyYW0gY2xhenogdGhlIGNsYXNzIHRvIHJldHJpZXZlIHRoZSBsb2FkZXIgZm9yCi0gICAgICogQHJldHVybiB0aGUgY2xhc3MgbG9hZGVyIHRoYXQgbG9hZGVkIHRoZSBwcm92aWRlZCBjbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoQ2xhc3MgY2xhenopIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2FsbGVyc0xvYWRlciA9IGNsYXp6LmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIGlmIChjYWxsZXJzTG9hZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGNhbGxlcnNMb2FkZXIgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYWxsZXJzTG9hZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIHRoZSBnaXZlbiBjbGFzcyB1c2luZyB0aGUgY3VycmVudCBUaHJlYWQncyBjb250ZXh0IGNsYXNzIGxvYWRlciBmaXJzdAotICAgICAqIG90aGVyd2lzZSB1c2UgdGhlIGNsYXNzIGxvYWRlciB3aGljaCBsb2FkZWQgdGhpcyBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lLCBDbGFzcyBjYWxsaW5nQ2xhc3MpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q2xhc3NMb2FkZXIoY2FsbGluZ0NsYXNzKS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBsb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gY2xhc3MgdXNpbmc6Ci0gICAgICogPG9sPgotICAgICAqIDxsaT50aGUgc3BlY2lmaWVkIGNsYXNzbG9hZGVyLDwvbGk+Ci0gICAgICogPGxpPnRoZSBjdXJyZW50IFRocmVhZCdzIGNvbnRleHQgY2xhc3MgbG9hZGVyIGZpcnN0LCBpZiBhc2tlZDwvbGk+Ci0gICAgICogPGxpPm90aGVyd2lzZSB1c2UgdGhlIGNsYXNzIGxvYWRlciB3aGljaCBsb2FkZWQgdGhpcyBjbGFzcy48L2xpPgotICAgICAqIDwvb2w+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3NMb2FkZXIgc3BlY2lmaWVkTG9hZGVyLCBib29sZWFuIHVzZUNvbnRleHRMb2FkZXIsIENsYXNzIGNhbGxpbmdDbGFzcykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBDbGFzcyBjbGF6eiA9IG51bGw7Ci0gICAgICAgIGlmIChzcGVjaWZpZWRMb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjbGF6eiA9IHNwZWNpZmllZExvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiY291bGRuJ3QgZmluZCBjbGFzcyBpbiBzcGVjaWZpZWQgbG9hZGVyIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNsYXp6ID09IG51bGwgJiYgdXNlQ29udGV4dExvYWRlcikgewotICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY29udGV4dExvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICBpZiAoY29udGV4dExvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY2xhenogPSBjb250ZXh0TG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoImNvdWxkbid0IGZpbmQgY2xhc3MgaW4gc3BlY2lmaWVkIGxvYWRlciIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkgewotICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gZ2V0Q2xhc3NMb2FkZXIoY2FsbGluZ0NsYXNzKTsKLSAgICAgICAgICAgIGNsYXp6ID0gbG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbGF6ejsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdXRpbC9Db21tYW5kTGluZVBhcnNlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3V0aWwvQ29tbWFuZExpbmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIyN2YwZC4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdXRpbC9Db21tYW5kTGluZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuQ29tbWFuZExpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5HbnVQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5QYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5IZWxwRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuU2NyaXB0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBwYXJzZSBjb21tYW5kIGxpbmUgb3B0aW9ucyB1c2luZyBDTEkuCi0gKiBVc2luZyBhIHNlcGFyYXRlIGNsYXNzIGFsbG93cyB1cyB0byBydW4gSmVsbHkgd2l0aG91dAotICogQ0xJIGluIHRoZSBjbGFzc3BhdGggd2hlbiB0aGUgY29tbWFuZCBsaW5lIGludGVyZmFjZQotICogaXMgbm90IGluIHVzZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAYXV0aG9yIE1vcmdhbiBEZWxhZ3JhbmdlCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTAgJAotICovCi1wdWJsaWMgY2xhc3MgQ29tbWFuZExpbmVQYXJzZXIgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBDb21tYW5kTGluZVBhcnNlciBfaW5zdGFuY2UgPSBuZXcgQ29tbWFuZExpbmVQYXJzZXIoKTsKLSAgICAKLSAgICBwcml2YXRlIE9wdGlvbnMgY21kTGluZU9wdGlvbnMgPSBudWxsOwotCi0gICAgcHVibGljIHN0YXRpYyBDb21tYW5kTGluZVBhcnNlciBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIF9pbnN0YW5jZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBvdXQgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIGFuZCBjb25maWd1cmUKLSAgICAgKiB0aGUgZ2l2ZSBKZWxseSBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmdzICAgb3B0aW9ucyBmcm9tIHRoZSBjb21tYW5kIGxpbmUKLSAgICAgKiBAZXhjZXB0aW9uIEplbGx5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgICAgaWYgdGhlIGNvbW1hbmQgbGluZSBjb3VsZCBub3QgYmUgcGFyc2VkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW52b2tlQ29tbWFuZExpbmVKZWxseShTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotICAgICAgICBDb21tYW5kTGluZSBjbWRMaW5lID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNtZExpbmUgPSBwYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyhhcmdzKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEplbGx5RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBjaGVjayBmb3IgLWggb3IgLXYKLSAgICAgICAgaWYgKGNtZExpbmUuaGFzT3B0aW9uKCJoIikpIHsKLSAgICAgICAgICAgIG5ldyBIZWxwRm9ybWF0dGVyKCkucHJpbnRIZWxwKCJqZWxseSBbc2NyaXB0RmlsZV0gWy1zY3JpcHQgc2NyaXB0RmlsZV0gWy1vIG91dHB1dEZpbGVdIFstRHN5c3Byb3A9c3lzcHJvcHZhbF0gWy1hd3RdIiwKLSAgICAgICAgICAgICAgICBjbWRMaW5lT3B0aW9ucyk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY21kTGluZS5oYXNPcHRpb24oInYiKSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJKZWxseSAiICsgSmVsbHkuZ2V0SmVsbHlWZXJzaW9uKCkpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgY29tcGlsZWQ6ICIgKyBKZWxseS5nZXRKZWxseUJ1aWxkRGF0ZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiIik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgLXNjcmlwdCBvcHRpb24uIElmIHRoZXJlIGlzbid0IG9uZSB0aGVuIHVzZSBhcmdzWzBdCi0gICAgICAgIFN0cmluZyBzY3JpcHRGaWxlID0gbnVsbDsKLSAgICAgICAgaWYgKGNtZExpbmUuaGFzT3B0aW9uKCJzY3JpcHQiKSkgewotICAgICAgICAgICAgc2NyaXB0RmlsZSA9IGNtZExpbmUuZ2V0T3B0aW9uVmFsdWUoInNjcmlwdCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2NyaXB0RmlsZSA9IGFyZ3NbMF07Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGNoZWNrIHRoZSAtYXd0IG9wdGlvbi4KLSAgICAgICAgYm9vbGVhbiBydW5JblN3aW5nVGhyZWFkID0gY21kTGluZS5oYXNPcHRpb24oImF3dCIpIHx8IGNtZExpbmUuaGFzT3B0aW9uKCJzd2luZyIpOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFVzZSBjbGFzc2xvYWRlciB0byBmaW5kIGZpbGUKLSAgICAgICAgLy8KLSAgICAgICAgVVJMIHVybCA9IENsYXNzTG9hZGVyVXRpbHMuZ2V0Q2xhc3NMb2FkZXIoZ2V0Q2xhc3MoKSkuZ2V0UmVzb3VyY2Uoc2NyaXB0RmlsZSk7Ci0gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBzY3JpcHQgZmlsZSBleGlzdHMKLSAgICAgICAgaWYgKHVybCA9PSBudWxsICYmICEobmV3IEZpbGUoc2NyaXB0RmlsZSkpLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlFeGNlcHRpb24oIlNjcmlwdCBmaWxlICIgKyBzY3JpcHRGaWxlICsgIiBub3QgZm91bmQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBleHRyYWN0IHRoZSAtbyBvcHRpb24gZm9yIHRoZSBvdXRwdXQgZmlsZSB0byB1c2UKLSAgICAgICAgICAgIGZpbmFsIFhNTE91dHB1dCBvdXRwdXQgPSBjbWRMaW5lLmhhc09wdGlvbigibyIpID8KLSAgICAgICAgICAgICAgICAgICAgWE1MT3V0cHV0LmNyZWF0ZVhNTE91dHB1dChuZXcgRmlsZVdyaXRlcihjbWRMaW5lLmdldE9wdGlvblZhbHVlKCJvIikpKSA6Ci0gICAgICAgICAgICAgICAgICAgIFhNTE91dHB1dC5jcmVhdGVYTUxPdXRwdXQoU3lzdGVtLm91dCk7Ci0KLSAgICAgICAgICAgIEplbGx5IGplbGx5ID0gbmV3IEplbGx5KCk7Ci0gICAgICAgICAgICBqZWxseS5zZXRTY3JpcHQoc2NyaXB0RmlsZSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIFNjcmlwdCBzY3JpcHQgPSBqZWxseS5jb21waWxlU2NyaXB0KCk7Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0aGUgc3lzdGVtIHByb3BlcnRpZXMgYW5kIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCi0gICAgICAgICAgICBmaW5hbCBKZWxseUNvbnRleHQgY29udGV4dCA9IGplbGx5LmdldEplbGx5Q29udGV4dCgpOwotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSgiYXJncyIsIGFyZ3MpOwotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSgiY29tbWFuZExpbmUiLCBjbWRMaW5lKTsKLSAgICAgICAgICAgIGlmIChydW5JblN3aW5nVGhyZWFkKSB7Ci0gICAgICAgICAgICAgICAgamF2YXguc3dpbmcuU3dpbmdVdGlsaXRpZXMuaW52b2tlQW5kV2FpdChuZXcgUnVubmFibGUoKSB7IHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5ydW4oY29udGV4dCwgb3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB9ICk7IH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2NyaXB0LnJ1bihjb250ZXh0LCBvdXRwdXQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBub3cgbGV0cyB3YWl0IGZvciBhbGwgdGhyZWFkcyB0byBjbG9zZQotICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSBjb21tYW5kIGxpbmUgdXNpbmcgQ0xJLiAtbyBhbmQgLXNjcmlwdCBhcmUgcmVzZXJ2ZWQgZm9yIEplbGx5LgotICAgICAqIC1Ec3lzcHJvcD1zeXN2YWwgaXMgc3VwcG9ydCBvbiB0aGUgY29tbWFuZCBsaW5lIGFzIHdlbGwuCi0gICAgICovCi0gICAgcHVibGljIENvbW1hbmRMaW5lIHBhcnNlQ29tbWFuZExpbmVPcHRpb25zKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGNyZWF0ZSB0aGUgZXhwZWN0ZWQgb3B0aW9ucwotICAgICAgICBjbWRMaW5lT3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIGNtZExpbmVPcHRpb25zLmFkZE9wdGlvbigibyIsIHRydWUsICJPdXRwdXQgZmlsZSIpOwotICAgICAgICBjbWRMaW5lT3B0aW9ucy5hZGRPcHRpb24oInNjcmlwdCIsIHRydWUsICJKZWxseSBzY3JpcHQgdG8gcnVuIik7Ci0gICAgICAgIGNtZExpbmVPcHRpb25zLmFkZE9wdGlvbigiaCIsImhlbHAiLCBmYWxzZSwgIkdpdmUgdGhpcyBoZWxwIG1lc3NhZ2UiKTsKLSAgICAgICAgY21kTGluZU9wdGlvbnMuYWRkT3B0aW9uKCJ2IiwidmVyc2lvbiIsIGZhbHNlLCAicHJpbnRzIEplbGx5J3MgdmVyc2lvbiBhbmQgZXhpdHMiKTsKLSAgICAgICAgY21kTGluZU9wdGlvbnMuYWRkT3B0aW9uKCJzY3JpcHQiLCB0cnVlLCAiSmVsbHkgc2NyaXB0IHRvIHJ1biIpOwotICAgICAgICBjbWRMaW5lT3B0aW9ucy5hZGRPcHRpb24oImF3dCIsIGZhbHNlLCAiV2V0aGVyIHRvIHJ1biBpbiB0aGUgQVdUIHRocmVhZC4iKTsKLSAgICAgICAgY21kTGluZU9wdGlvbnMuYWRkT3B0aW9uKCJzd2luZyIsIGZhbHNlLCAiU3lub255bSBvZiBcIi1hd3RcIi4iKTsKLSAgICAgICAgTGlzdCBidWlsdGluT3B0aW9uTmFtZXMgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXXsKLSAgICAgICAgICAgICItbyIsIi1zY3JpcHQiLCItaCIsIi0taGVscCIsIi12IiwiLS12ZXJzaW9uIiwiLWF3dCIsIi1zd2luZyJ9KTsKLSAgICAgICAgCi0gICAgICAgIC8vIC1EIG9wdGlvbnMgd2lsbCBiZSBhZGRlZCB0byB0aGUgc3lzdGVtIHByb3BlcnRpZXMKLSAgICAgICAgUHJvcGVydGllcyBzeXNQcm9wcyA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCk7Ci0KLSAgICAgICAgLy8gZmlsdGVyIHRoZSBzeXN0ZW0gcHJvcGVydHkgc2V0dGluZyBmcm9tIHRoZSBhcmcgbGlzdAotICAgICAgICAvLyBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgQ0xJIHBhcnNlcgotICAgICAgICBBcnJheUxpc3QgZmlsdGVyZWRBcmdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGZvciAoaW50IGk9MDtpPGFyZ3MubGVuZ3RoO2krKykgewotICAgICAgICAgICAgU3RyaW5nIGFyZyA9IGFyZ3NbaV07Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSAtRCBwcm9wZXJ0eSBwYXJzZSBpdCBhbmQgYWRkIGl0IHRvIHRoZSBzeXN0ZW0gcHJvcGVydGllcy4KLSAgICAgICAgICAgIC8vIC1EIGFyZ3Mgd2lsbCBub3QgYmUgY29waWVkIGludG8gdGhlIGZpbHRlcmVkQXJnTGlzdC4KLSAgICAgICAgICAgIGlmIChhcmcuc3RhcnRzV2l0aCgiLUQiKSAmJiAoYXJnLmxlbmd0aCgpID4gMikpIHsKLSAgICAgICAgICAgICAgICBhcmcgPSBhcmcuc3Vic3RyaW5nKDIpOwotICAgICAgICAgICAgICAgIGludCBlUG9zID0gYXJnLmluZGV4T2YoIj0iKTsKLSAgICAgICAgICAgICAgICBpZihlUG9zPT0tMSB8fCBlUG9zPT0wIHx8IGVQb3M9PWFyZy5sZW5ndGgoKS0xKQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkludmFsaWQgc3lzdGVtIHByb3BlcnR5OiBcIiIgKyBhcmcgKyAiXCIuIik7Ci0gICAgICAgICAgICAgICAgc3lzUHJvcHMuc2V0UHJvcGVydHkoYXJnLnN1YnN0cmluZygwLGVQb3MpLCBhcmcuc3Vic3RyaW5nKGVQb3MrMSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBhZGQgdGhpcyB0byB0aGUgZmlsdGVyZWQgbGlzdCBvZiBhcmd1bWVudHMKLSAgICAgICAgICAgICAgICBmaWx0ZXJlZEFyZ0xpc3QuYWRkKGFyZyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGQgYWRkaXRpb25hbCAiLT8iIG9wdGlvbnMgdG8gdGhlIG9wdGlvbnMgb2JqZWN0LiBpZiB0aGlzIGlzIG5vdCBkb25lCi0gICAgICAgICAgICAgICAgLy8gdGhlIG9ubHkgb3B0aW9ucyBhbGxvd2VkIHdvdWxkIGJlIHRoZSBidWlsdGluLW9uZXMuCi0gICAgICAgICAgICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKCItIikgJiYgYXJnLmxlbmd0aCgpID4gMSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIShidWlsdGluT3B0aW9uTmFtZXMuY29udGFpbnMoYXJnKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNtZExpbmVPcHRpb25zLmFkZE9wdGlvbihhcmcuc3Vic3RyaW5nKDEsIGFyZy5sZW5ndGgoKSksIHRydWUsICJkeW5hbWljIG9wdGlvbiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWFrZSB0aGUgZmlsdGVyZWRBcmdMaXN0IGludG8gYW4gYXJyYXkKLSAgICAgICAgU3RyaW5nW10gZmlsdGVyQXJncyA9IG5ldyBTdHJpbmdbZmlsdGVyZWRBcmdMaXN0LnNpemUoKV07Ci0gICAgICAgIGZpbHRlcmVkQXJnTGlzdC50b0FycmF5KGZpbHRlckFyZ3MpOwotCi0gICAgICAgIC8vIHBhcnNlIHRoZSBjb21tYW5kIGxpbmUKLSAgICAgICAgUGFyc2VyIHBhcnNlciA9IG5ldyBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLkdudVBhcnNlcigpOwotICAgICAgICByZXR1cm4gcGFyc2VyLnBhcnNlKGNtZExpbmVPcHRpb25zLCBmaWx0ZXJBcmdzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS91dGlsL05lc3RlZFJ1bnRpbWVFeGNlcHRpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS91dGlsL05lc3RlZFJ1bnRpbWVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0MGIwNy4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdXRpbC9OZXN0ZWRSdW50aW1lRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLS8qKgotICogQSB7QGxpbmsgUnVudGltZUV4Y2VwdGlvbn0gd2hpY2ggaXMgbmVzdGVkIHRvIHByZXNlcnZlIHN0YWNrIHRyYWNlcy4KLSAqCi0gKiBUaGlzIGNsYXNzIGFsbG93cyB0aGUgZm9sbG93aW5nIGNvZGUgdG8gYmUgd3JpdHRlbiB0byBjb252ZXJ0IGEgcmVndWxhcgotICogRXhjZXB0aW9uIGludG8gYSB7QGxpbmsgUnVudGltZUV4Y2VwdGlvbn0gd2l0aG91dCBsb3NpbmcgdGhlIHN0YWNrIHRyYWNlLgotICoKLSAqIDxwcmU+Ci0gKiAgICB0cnkgewotICogICAgICAgIC4uLgotICogICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAqICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAqICAgIH0KLSAqIDwvcHJlPgotICoKLSAqIEBhdXRob3IgSmFtZXMgU3RyYWNoYW4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKLSAqLwotCi1wdWJsaWMgY2xhc3MgTmVzdGVkUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0gICAgLyoqCi0gICAgICogSG9sZHMgdGhlIHJlZmVyZW5jZSB0byB0aGUgZXhjZXB0aW9uIG9yIGVycm9yIHRoYXQgY2F1c2VkCi0gICAgICogdGhpcyBleGNlcHRpb24gdG8gYmUgdGhyb3duLgotICAgICAqLwotICAgIHByaXZhdGUgVGhyb3dhYmxlIGNhdXNlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+TmVzdGVkUnVudGltZUV4Y2VwdGlvbjwvY29kZT4gd2l0aCBzcGVjaWZpZWQKLSAgICAgKiBuZXN0ZWQgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYXVzZSB0aGUgZXhjZXB0aW9uIG9yIGVycm9yIHRoYXQgY2F1c2VkIHRoaXMgZXhjZXB0aW9uIHRvIGJlCi0gICAgICogdGhyb3duCi0gICAgICovCi0gICAgcHVibGljIE5lc3RlZFJ1bnRpbWVFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIHRoaXMuY2F1c2UgPSBjYXVzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPk5lc3RlZFJ1bnRpbWVFeGNlcHRpb248L2NvZGU+IHdpdGggc3BlY2lmaWVkCi0gICAgICogZGV0YWlsIG1lc3NhZ2UgYW5kIG5lc3RlZCA8Y29kZT5UaHJvd2FibGU8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZyAgICB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjYXVzZSAgdGhlIGV4Y2VwdGlvbiBvciBlcnJvciB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbiB0byBiZQotICAgICAqIHRocm93bgotICAgICAqLwotICAgIHB1YmxpYyBOZXN0ZWRSdW50aW1lRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtc2cpOwotICAgICAgICB0aGlzLmNhdXNlID0gY2F1c2U7Ci0gICAgfQotCi0gICAgcHVibGljIFRocm93YWJsZSBnZXRDYXVzZSgpIHsKLSAgICAgICAgcmV0dXJuIGNhdXNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsKLSAgICAgICAgY2F1c2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIG91dCkgewotICAgICAgICBjYXVzZS5wcmludFN0YWNrVHJhY2Uob3V0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRXcml0ZXIgb3V0KSB7Ci0gICAgICAgIGNhdXNlLnByaW50U3RhY2tUcmFjZShvdXQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3V0aWwvU2FmZUNvbnRlbnRIYW5kbGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdXRpbC9TYWZlQ29udGVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkNTg2NC4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdXRpbC9TYWZlQ29udGVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS51dGlsOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgb25seSBvbmUgc3RhcnQgYW5kIGVuZCBkb2N1bWVudCBldmVudCBpcyBwYXNzZWQgb250byB0aGUgdW5kZXJseWluZwotICogQ29udGVudEhhbmRsZXIuIFRoaXMgb2JqZWN0IGNhbiBvbmx5IGJlIHVzZWQgb25jZSBhbmQgdGhlbiBkaXNjYXJkZWQuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICovCi1wdWJsaWMgY2xhc3MgU2FmZUNvbnRlbnRIYW5kbGVyIGltcGxlbWVudHMgQ29udGVudEhhbmRsZXIgewotICAgIHByaXZhdGUgQ29udGVudEhhbmRsZXIgaGFuZGxlcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gZG9jdW1lbnRTdGFydGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBkb2N1bWVudEVuZGVkOwotCi0gICAgcHVibGljIFNhZmVDb250ZW50SGFuZGxlcihDb250ZW50SGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghIGRvY3VtZW50U3RhcnRlZCkgewotICAgICAgICAgICAgaGFuZGxlci5zdGFydERvY3VtZW50KCk7Ci0gICAgICAgICAgICBkb2N1bWVudFN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBpZiAoISBkb2N1bWVudEVuZGVkKSB7Ci0gICAgICAgICAgICBoYW5kbGVyLmVuZERvY3VtZW50KCk7Ci0gICAgICAgICAgICBkb2N1bWVudEVuZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhcmcwCi0gICAgICogQHBhcmFtIGFyZzEKLSAgICAgKiBAcGFyYW0gYXJnMgotICAgICAqIEB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gYXJnMCwgaW50IGFyZzEsIGludCBhcmcyKQotICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgaGFuZGxlci5jaGFyYWN0ZXJzKGFyZzAsIGFyZzEsIGFyZzIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhcmcwCi0gICAgICogQHBhcmFtIGFyZzEKLSAgICAgKiBAcGFyYW0gYXJnMgotICAgICAqIEB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKQotICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgaGFuZGxlci5lbmRFbGVtZW50KGFyZzAsIGFyZzEsIGFyZzIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhcmcwCi0gICAgICogQHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmRQcmVmaXhNYXBwaW5nKFN0cmluZyBhcmcwKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgaGFuZGxlci5lbmRQcmVmaXhNYXBwaW5nKGFyZzApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhcmcwCi0gICAgICogQHBhcmFtIGFyZzEKLSAgICAgKiBAcGFyYW0gYXJnMgotICAgICAqIEB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZShjaGFyW10gYXJnMCwgaW50IGFyZzEsIGludCBhcmcyKQotICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgaGFuZGxlci5pZ25vcmFibGVXaGl0ZXNwYWNlKGFyZzAsIGFyZzEsIGFyZzIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhcmcwCi0gICAgICogQHBhcmFtIGFyZzEKLSAgICAgKiBAdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpCi0gICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBoYW5kbGVyLnByb2Nlc3NpbmdJbnN0cnVjdGlvbihhcmcwLCBhcmcxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYXJnMAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcihMb2NhdG9yIGFyZzApIHsKLSAgICAgICAgaGFuZGxlci5zZXREb2N1bWVudExvY2F0b3IoYXJnMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFyZzAKLSAgICAgKiBAdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNraXBwZWRFbnRpdHkoU3RyaW5nIGFyZzApIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBoYW5kbGVyLnNraXBwZWRFbnRpdHkoYXJnMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFyZzAKLSAgICAgKiBAcGFyYW0gYXJnMQotICAgICAqIEBwYXJhbSBhcmcyCi0gICAgICogQHBhcmFtIGFyZzMKLSAgICAgKiBAdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudCgKLSAgICAgICAgU3RyaW5nIGFyZzAsCi0gICAgICAgIFN0cmluZyBhcmcxLAotICAgICAgICBTdHJpbmcgYXJnMiwKLSAgICAgICAgQXR0cmlidXRlcyBhcmczKQotICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgaGFuZGxlci5zdGFydEVsZW1lbnQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFyZzAKLSAgICAgKiBAcGFyYW0gYXJnMQotICAgICAqIEB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRQcmVmaXhNYXBwaW5nKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkKLSAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGhhbmRsZXIuc3RhcnRQcmVmaXhNYXBwaW5nKGFyZzAsIGFyZzEpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS91dGlsL1RhZ1V0aWxzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdXRpbC9UYWdVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDlmODdlLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS91dGlsL1RhZ1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlNjcmlwdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5Db21wb3NpdGVUZXh0U2NyaXB0QmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuU2NyaXB0QmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuVGV4dFNjcmlwdDsKLQotLyoqIENvbnRhaW5zIHN0YXRpYyBtZXRob2RzIHRvIGhlbHAgdGFnIGRldmVsb3BlcnMuCi0gKiBAYXV0aG9yIEhhbnMgR2lsZGUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdVdGlscyB7Ci0gICAgcHJpdmF0ZSBUYWdVdGlscygpIHsKLSAgICAgICAgCi0gICAgfQotCi0gICAgLyoqIFRyaW1zIHRoZSB3aGl0ZXNwYWNlIGZyb20gYSBzY3JpcHQgYW5kIGl0cyBjaGlsZHJlbi4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJpbVNjcmlwdChTY3JpcHQgYm9keSkgewotICAgICAgICBzeW5jaHJvbml6ZWQoYm9keSkgewotICAgICAgICAgICAgaWYgKCBib2R5IGluc3RhbmNlb2YgQ29tcG9zaXRlVGV4dFNjcmlwdEJsb2NrICkgewotICAgICAgICAgICAgICAgIENvbXBvc2l0ZVRleHRTY3JpcHRCbG9jayBibG9jayA9IChDb21wb3NpdGVUZXh0U2NyaXB0QmxvY2spIGJvZHk7Ci0gICAgICAgICAgICAgICAgYmxvY2sudHJpbVdoaXRlc3BhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGlmICggYm9keSBpbnN0YW5jZW9mIFNjcmlwdEJsb2NrICkgewotICAgICAgICAgICAgICAgIFNjcmlwdEJsb2NrIGJsb2NrID0gKFNjcmlwdEJsb2NrKSBib2R5OwotICAgICAgICAgICAgICAgIGJsb2NrLnRyaW1XaGl0ZXNwYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggYm9keSBpbnN0YW5jZW9mIFRleHRTY3JpcHQgKSB7Ci0gICAgICAgICAgICAgICAgVGV4dFNjcmlwdCB0ZXh0U2NyaXB0ID0gKFRleHRTY3JpcHQpIGJvZHk7Ci0gICAgICAgICAgICAgICAgdGV4dFNjcmlwdC50cmltV2hpdGVzcGFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3hwYXRoL1hQYXRoQ29tcGFyYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3hwYXRoL1hQYXRoQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTc4MjY1Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS94cGF0aC9YUGF0aENvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS54cGF0aDsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnV0aWwuTmVzdGVkUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZG9tNGouTm9kZTsKLWltcG9ydCBvcmcuamF4ZW4uSmF4ZW5FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmpheGVuLlhQYXRoOwotCi0vKioKLSAqIENvbXBhcmVzIHhtbCBub2RlcyBieSBleHRyYWN0aW5nIHRoZSB2YWx1ZSBhdCB4cGF0aCBhbmQKLSAqIGNvbXBhcmluZyBpdC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBqaG9ybWFuLm9yZyI+SmFzb24gSG9ybWFuPC9hPgotICogQHZlcnNpb24gJElkOiBYUGF0aENvbXBhcmF0b3IuamF2YSx2IDEuNCAyMDA0LzA5LzA5IDEyOjI5OjM2IGRpb24gRXhwICQKLSAqLwotCi1wdWJsaWMgY2xhc3MgWFBhdGhDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0KLSAgICAvKiogVGhlIHhwYXRoIHRvIHVzZSB0byBleHRyYWN0IHZhbHVlIGZyb20gbm9kZXMgdG8gY29tcGFyZSAqLwotICAgIHByaXZhdGUgWFBhdGggeHBhdGggPSBudWxsOwotCi0gICAgLyoqIFNvcnQgZGVzY2VuZGluZyBvciBhc2NlbmRpbmcgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZGVzY2VuZGluZyA9IGZhbHNlOwotCi0gICAgcHVibGljIFhQYXRoQ29tcGFyYXRvcigpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyBYUGF0aENvbXBhcmF0b3IoWFBhdGggeHBhdGgsIGJvb2xlYW4gZGVzY2VuZGluZykgewotICAgICAgICB0aGlzLnhwYXRoID0geHBhdGg7Ci0gICAgICAgIHRoaXMuZGVzY2VuZGluZyA9IGRlc2NlbmRpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WHBhdGgoWFBhdGggeHBhdGgpIHsKLSAgICAgICAgdGhpcy54cGF0aCA9IHhwYXRoOwotICAgIH0KLQotICAgIHB1YmxpYyBYUGF0aCBnZXRYcGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIHhwYXRoOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NlbmRpbmcoYm9vbGVhbiBkZXNjZW5kaW5nKSB7Ci0gICAgICAgIHRoaXMuZGVzY2VuZGluZyA9IGRlc2NlbmRpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0gICAgICAgIHJldHVybiBjb21wYXJlKChOb2RlKW8xLCAoTm9kZSlvMik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBjb21wYXJlKE5vZGUgbjEsIE5vZGUgbjIpIHsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgLy8gYXBwbHkgdGhlIHhwYXRocy4gbm90IHVzaW5nIHN0cmluZ1ZhbHVlT2Ygc2luY2UgSSBkb24ndAotICAgICAgICAgICAgLy8gd2FudCBhbGwgb2YgdGhlIGNoaWxkIG5vZGVzIGFwcGVuZGVkIHRvIHRoZSBzdHJpbmdzCi0gICAgICAgICAgICBPYmplY3QgdmFsMSA9IHhwYXRoLmV2YWx1YXRlKG4xKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWwyID0geHBhdGguZXZhbHVhdGUobjIpOwotCi0gICAgICAgICAgICAvLyByZXR1cm4gaWYgbnVsbAotICAgICAgICAgICAgaWYgKHZhbDEgPT0gbnVsbCB8fCB2YWwyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsMSA9PSBudWxsID8gKHZhbDIgPT0gbnVsbCA/IDEgOiAtMSkgOiAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb21wYXJhYmxlIGMxID0gZ2V0Q29tcGFyYWJsZVZhbHVlKHZhbDEpOwotICAgICAgICAgICAgQ29tcGFyYWJsZSBjMiA9IGdldENvbXBhcmFibGVWYWx1ZSh2YWwyKTsKLQotICAgICAgICAgICAgLy8gY29tcGFyZSBkZXNjZW5kaW5nIG9yIGFzY2VuZGluZwotICAgICAgICAgICAgaWYgKCFkZXNjZW5kaW5nKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGMxLmNvbXBhcmVUbyhjMik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBjMi5jb21wYXJlVG8oYzEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEpheGVuRXhjZXB0aW9uIGUpIHsKLQotICAgICAgICAgICAgdGhyb3cgbmV3IFhQYXRoU29ydEV4Y2VwdGlvbigiZXJyb3Igc29ydGluZyBub2RlcyIsIGUpOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUdXJucyB0aGUgWFBhdGggcmVzdWx0IHZhbHVlIGludG8gYSBDb21wYXJhYmxlIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29tcGFyYWJsZSBnZXRDb21wYXJhYmxlVmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgIExpc3QgbGlzdCA9IChMaXN0KSB2YWx1ZTsKLSAgICAgICAgICAgIGlmIChsaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWx1ZSA9IGxpc3QuZ2V0KDApOwotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbXBhcmFibGUpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ29tcGFyYWJsZSkgdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgdmFsdWU7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE15IG93biBydW50aW1lIGV4Y2VwdGlvbiBpbiBjYXNlIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGggc29ydC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFhQYXRoU29ydEV4Y2VwdGlvbiBleHRlbmRzIE5lc3RlZFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBwdWJsaWMgWFBhdGhTb3J0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS94cGF0aC9YUGF0aFNvdXJjZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3hwYXRoL1hQYXRoU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OTUzYzEuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3hwYXRoL1hQYXRoU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS54cGF0aDsKLQotCi0vKioKLSAqIEEgdGFnIHdoaWNoIGlzIGNhcGFibGUgb2YgcHJvZHVjaW5nIGEgc291cmNlIG9mIFhQYXRoIGNvbnRleHQgb2JqZWN0cwotICogc3VjaCBhcyAmbHQ7eDpmb3JFYWNoJmd0OwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAqLwotcHVibGljIGludGVyZmFjZSBYUGF0aFNvdXJjZSB7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFhQYXRoU291cmNlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS94cGF0aC9YUGF0aFRhZ1N1cHBvcnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS94cGF0aC9YUGF0aFRhZ1N1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE3ODllNi4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkveHBhdGgvWFBhdGhUYWdTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS54cGF0aDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotCi0vKiogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyB1c2VmdWwgZm9yIGltcGxlbWVudGF0aW9uIGluaGVyaXRlbmNlCi0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjQgJAotICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFhQYXRoVGFnU3VwcG9ydCBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0WFBhdGhDb250ZXh0KCkgewotICAgICAgICBYUGF0aFNvdXJjZSB0YWcgPSAoWFBhdGhTb3VyY2UpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyggWFBhdGhTb3VyY2UuY2xhc3MgKTsKLSAgICAgICAgaWYgKCB0YWcgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIHJldHVybiB0YWcuZ2V0WFBhdGhTb3VyY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9NRVRBLUlORi9zZXJ2aWNlcy9qZWxseS50ZXN0LWxpYnJhcnkgYi9zcmMvdGVzdC9NRVRBLUlORi9zZXJ2aWNlcy9qZWxseS50ZXN0LWxpYnJhcnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MzNkZjQuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3QvTUVUQS1JTkYvc2VydmljZXMvamVsbHkudGVzdC1saWJyYXJ5CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRlc3QuaW1wbC5EdW1teVRhZ0xpYnJhcnkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9sb2c0ai5wcm9wZXJ0aWVzIGIvc3JjL3Rlc3QvbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmMjIxZC4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMgCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWxvZzRqLnJvb3RDYXRlZ29yeSA9IElORk8sIGNvbnNvbGUKLQotbG9nNGouYXBwZW5kZXIuY29uc29sZT1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuY29uc29sZS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5jb25zb2xlLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lbSVuCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvVGVzdENvcmVUYWdzLmphdmEgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvVGVzdENvcmVUYWdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDJhN2YuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L1Rlc3RDb3JlVGFncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuVGV4dFNjcmlwdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkucGFyc2VyLlhNTFBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqIFRlc3RzIHRoZSBjb3JlIHRhZ3MKLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTUgJAotICAqLwotcHVibGljIGNsYXNzIFRlc3RDb3JlVGFncyBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUZXN0Q29yZVRhZ3MuY2xhc3MpOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3RDb3JlVGFncy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RDb3JlVGFncyhTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSgic3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rlc3RfYXJncy5qZWxseSIpOwotICAgICAgICBYTUxQYXJzZXIgcGFyc2VyID0gbmV3IFhNTFBhcnNlcigpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gcGFyc2VyLnBhcnNlKGluKTsKLSAgICAgICAgc2NyaXB0ID0gc2NyaXB0LmNvbXBpbGUoKTsKLSAgICAgICAgbG9nLmRlYnVnKCJGb3VuZDogIiArIHNjcmlwdCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlBhcnNlZCBhIFNjcmlwdCIsIHNjcmlwdCBpbnN0YW5jZW9mIFNjcmlwdCk7Ci0gICAgICAgIFN0cmluZ1tdIGFyZ3MgPSB7ICJvbmUiLCAidHdvIiwgInRocmVlIiB9OwotICAgICAgICBKZWxseUNvbnRleHQgY29udGV4dCA9IG5ldyBKZWxseUNvbnRleHQoKTsKLSAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSgiYXJncyIsIGFyZ3MpOwotICAgICAgICBTdHJpbmdXcml0ZXIgYnVmZmVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBzY3JpcHQucnVuKGNvbnRleHQsIFhNTE91dHB1dC5jcmVhdGVYTUxPdXRwdXQoYnVmZmVyKSk7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gYnVmZmVyLnRvU3RyaW5nKCkudHJpbSgpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXZhbHVhdGVkIHNjcmlwdCBhcy4uLiIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKHRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygiUHJvZHVjZXMgdGhlIGNvcnJlY3Qgb3V0cHV0IiwgIm9uZSB0d28gdGhyZWUiLCB0ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHJpbUVuZFdoaXRlc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVGV4dFNjcmlwdCB0ZXh0U2NyaXB0ID0gbmV3IFRleHRTY3JpcHQoIiAiKTsKLSAgICAgICAgdGV4dFNjcmlwdC50cmltRW5kV2hpdGVzcGFjZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHRleHRTY3JpcHQuZ2V0VGV4dCgpKTsKLQotICAgICAgICB0ZXh0U2NyaXB0ID0gbmV3IFRleHRTY3JpcHQoIiIpOwotICAgICAgICB0ZXh0U2NyaXB0LnRyaW1FbmRXaGl0ZXNwYWNlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgdGV4dFNjcmlwdC5nZXRUZXh0KCkpOwotCi0gICAgICAgIHRleHRTY3JpcHQgPSBuZXcgVGV4dFNjcmlwdCgiIGZvbyAiKTsKLSAgICAgICAgdGV4dFNjcmlwdC50cmltRW5kV2hpdGVzcGFjZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiBmb28iLCB0ZXh0U2NyaXB0LmdldFRleHQoKSk7Ci0KLSAgICAgICAgdGV4dFNjcmlwdCA9IG5ldyBUZXh0U2NyaXB0KCJmb28iKTsKLSAgICAgICAgdGV4dFNjcmlwdC50cmltRW5kV2hpdGVzcGFjZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHRleHRTY3JpcHQuZ2V0VGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHJpbVN0YXJ0V2hpdGVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUZXh0U2NyaXB0IHRleHRTY3JpcHQgPSBuZXcgVGV4dFNjcmlwdCgiICIpOwotICAgICAgICB0ZXh0U2NyaXB0LnRyaW1TdGFydFdoaXRlc3BhY2UoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0U2NyaXB0LmdldFRleHQoKSk7Ci0KLSAgICAgICAgdGV4dFNjcmlwdCA9IG5ldyBUZXh0U2NyaXB0KCIiKTsKLSAgICAgICAgdGV4dFNjcmlwdC50cmltU3RhcnRXaGl0ZXNwYWNlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgdGV4dFNjcmlwdC5nZXRUZXh0KCkpOwotCi0gICAgICAgIHRleHRTY3JpcHQgPSBuZXcgVGV4dFNjcmlwdCgiIGZvbyAiKTsKLSAgICAgICAgdGV4dFNjcmlwdC50cmltU3RhcnRXaGl0ZXNwYWNlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZm9vICIsIHRleHRTY3JpcHQuZ2V0VGV4dCgpKTsKLQotICAgICAgICB0ZXh0U2NyaXB0ID0gbmV3IFRleHRTY3JpcHQoImZvbyIpOwotICAgICAgICB0ZXh0U2NyaXB0LnRyaW1TdGFydFdoaXRlc3BhY2UoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCB0ZXh0U2NyaXB0LmdldFRleHQoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L1Rlc3RKZWxseS5qYXZhIGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L1Rlc3RKZWxseS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjEzNzJjLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9UZXN0SmVsbHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmp1bml0LkplbGx5VGVzdFN1aXRlOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIHRvIHJ1biBqZWxseSB0ZXN0IGNhc2VzIGFzIHBhcnQgb2YgQW50J3MgSlVuaXQgdGVzdHMKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0SmVsbHkgZXh0ZW5kcyBKZWxseVRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUZXN0UnVubmVyLnJ1biggc3VpdGUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVUZXN0U3VpdGUoVGVzdEplbGx5LmNsYXNzLCAic3VpdGUuamVsbHkiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvVGVzdEplbGx5Q29udGV4dC5qYXZhIGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L1Rlc3RKZWxseUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmMDI4Yy4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvVGVzdEplbGx5Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJwcm95YWxAYXBhY2hlLm9yZyI+cGV0ZXIgcm95YWw8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0SmVsbHlDb250ZXh0IGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgVGVzdEplbGx5Q29udGV4dCggU3RyaW5nIHMgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0VmFyaWFibGVzQW5kUmV0YWluQ29udGV4dEVudHJ5KCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIEplbGx5Q29udGV4dCBqYyA9IG5ldyBKZWxseUNvbnRleHQoKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKCAiSW5pdGlhbCB2YXJpYWJsZSBvZiBjb250ZXh0IiwgamMuZ2V0VmFyaWFibGUoICJjb250ZXh0IiApICk7Ci0KLSAgICAgICAgamMuc2V0VmFyaWFibGVzKCBuZXcgSGFzaE1hcCgpICk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggIlZhbHVlIGFmdGVyIHNldFZhcmlhYmxlcygpIiwgamMuZ2V0VmFyaWFibGUoICJjb250ZXh0IiApICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L1Rlc3RUcmltLmphdmEgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvVGVzdFRyaW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNjYTVkYy4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvVGVzdFRyaW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5UZXh0U2NyaXB0OwotCi0vKioKLSAqIFRlc3RzIHRoZSB3aGl0ZXNwYWNlIHRyaW1pbmcgb2Ygc2NyaXB0cy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0VHJpbSBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShUZXN0VHJpbS5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RUcmltKFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRyaW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVGV4dFNjcmlwdCBzY3JpcHQgPSBuZXcgVGV4dFNjcmlwdCggIiAgIGZvbyAgICAiICk7Ci0gICAgICAgIHNjcmlwdC50cmltV2hpdGVzcGFjZSgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggImZvbyIsIHNjcmlwdC5nZXRUZXh0KCkgKTsKLQotICAgICAgICBzY3JpcHQgPSBuZXcgVGV4dFNjcmlwdCggIiBmb28gIiApOwotICAgICAgICBzY3JpcHQudHJpbVdoaXRlc3BhY2UoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJmb28iLCBzY3JpcHQuZ2V0VGV4dCgpICk7Ci0KLSAgICAgICAgc2NyaXB0ID0gbmV3IFRleHRTY3JpcHQoICJmb28iICk7Ci0gICAgICAgIHNjcmlwdC50cmltV2hpdGVzcGFjZSgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggImZvbyIsIHNjcmlwdC5nZXRUZXh0KCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHJpbVN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRleHRTY3JpcHQgc2NyaXB0ID0gbmV3IFRleHRTY3JpcHQoICIgICBmb28gICAgIiApOwotICAgICAgICBzY3JpcHQudHJpbVN0YXJ0V2hpdGVzcGFjZSgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggImZvbyAgICAiLCBzY3JpcHQuZ2V0VGV4dCgpICk7Ci0KLSAgICAgICAgc2NyaXB0ID0gbmV3IFRleHRTY3JpcHQoICIgZm9vICIgKTsKLSAgICAgICAgc2NyaXB0LnRyaW1TdGFydFdoaXRlc3BhY2UoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJmb28gIiwgc2NyaXB0LmdldFRleHQoKSApOwotCi0gICAgICAgIHNjcmlwdCA9IG5ldyBUZXh0U2NyaXB0KCAiZm9vIiApOwotICAgICAgICBzY3JpcHQudHJpbVN0YXJ0V2hpdGVzcGFjZSgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggImZvbyIsIHNjcmlwdC5nZXRUZXh0KCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHJpbUVuZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUZXh0U2NyaXB0IHNjcmlwdCA9IG5ldyBUZXh0U2NyaXB0KCAiICAgZm9vICAgICIgKTsKLSAgICAgICAgc2NyaXB0LnRyaW1FbmRXaGl0ZXNwYWNlKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiICAgZm9vIiwgc2NyaXB0LmdldFRleHQoKSApOwotCi0gICAgICAgIHNjcmlwdCA9IG5ldyBUZXh0U2NyaXB0KCAiIGZvbyAiICk7Ci0gICAgICAgIHNjcmlwdC50cmltRW5kV2hpdGVzcGFjZSgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggIiBmb28iLCBzY3JpcHQuZ2V0VGV4dCgpICk7Ci0KLSAgICAgICAgc2NyaXB0ID0gbmV3IFRleHRTY3JpcHQoICJmb28iICk7Ci0gICAgICAgIHNjcmlwdC50cmltRW5kV2hpdGVzcGFjZSgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggImZvbyIsIHNjcmlwdC5nZXRUZXh0KCkgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvVGVzdFhNTE91dHB1dC5qYXZhIGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L1Rlc3RYTUxPdXRwdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0Y2ZhNS4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvVGVzdFhNTE91dHB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHk7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5TY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGVzdC5CYXNlSmVsbHlUZXN0OwotCi0vKioKLSAqIEBhdXRob3IgSGFucyBHaWxkZQotICoKLSAqLwotcHVibGljIGNsYXNzIFRlc3RYTUxPdXRwdXQgZXh0ZW5kcyBCYXNlSmVsbHlUZXN0IHsKLQotICAgIC8qKiBKVW5pdCBjb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFRlc3RYTUxPdXRwdXQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RPdXRwdXRHb29kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFVwU2NyaXB0KCJvdXRwdXRHb29kLmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBnZXRKZWxseSgpLmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIAotICAgICAgICBzY3JpcHQucnVuKGdldEplbGx5Q29udGV4dCgpLFhNTE91dHB1dC5jcmVhdGVYTUxPdXRwdXQoYm9zKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiPGh0bWw+PC9odG1sPngiLGJvcy50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE91dHB1dEJhZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRVcFNjcmlwdCgib3V0cHV0QmFkLmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBnZXRKZWxseSgpLmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIAotICAgICAgICBzY3JpcHQucnVuKGdldEplbGx5Q29udGV4dCgpLFhNTE91dHB1dC5jcmVhdGVYTUxPdXRwdXQoYm9zKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiPGh0bWw+PC9odG1sPiIsYm9zLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3V0cHV0QmFkR29vZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRVcFNjcmlwdCgib3V0cHV0QmFkLmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBnZXRKZWxseSgpLmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIAotICAgICAgICBYTUxPdXRwdXQgb3VwdXQgPSBYTUxPdXRwdXQuY3JlYXRlWE1MT3V0cHV0KGJvcyk7Ci0gICAgICAgIAotICAgICAgICBzY3JpcHQucnVuKGdldEplbGx5Q29udGV4dCgpLG91cHV0KTsKLSAgICAgICAgb3VwdXQuZmx1c2goKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8aHRtbD48L2h0bWw+Iixib3MudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RPdXRwdXREYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFVwU2NyaXB0KCJvdXRwdXREYXRhLmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBnZXRKZWxseSgpLmNvbXBpbGVTY3JpcHQoKTsKLQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBYTUxPdXRwdXQgb3VwdXQgPSBYTUxPdXRwdXQuY3JlYXRlWE1MT3V0cHV0KGJvcyk7Ci0KLSAgICAgICAgc2NyaXB0LnJ1bihnZXRKZWxseUNvbnRleHQoKSxvdXB1dCk7Ci0gICAgICAgIG91cHV0LmZsdXNoKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiW3N0cmluZ10iLGJvcy50b1N0cmluZygpLnRyaW0oKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2JlbmNobWFyay9iZW5jaG1hcmsuamVsbHkgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYmVuY2htYXJrL2JlbmNobWFyay5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFiYTAyMi4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYmVuY2htYXJrL2JlbmNobWFyay5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSByZXZhbHVhdGVzIHRoZSBzYW1lIHNjcmlwdCBtYW55IHRpbWVzIHRvIHRlc3QgcGVyZm9ybWFuY2UgLS0+Ci0KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiPgotCi0gIDxqOnVzZUJlYW4gdmFyPSJzdGFydCIgY2xhc3M9ImphdmEudXRpbC5EYXRlIiAvPgotICBTdGFydGVkIGF0OiAke3N0YXJ0fQotICAgIAotICA8ajpmb3JFYWNoIGJlZ2luPSIxIiBlbmQ9IjEwMDAiPgotICAgICAgPGo6aW5jbHVkZSB1cmk9InNhbXBsZS5qZWxseSIvPgotICA8L2o6Zm9yRWFjaD4KLSAgCi0gIDxqOnVzZUJlYW4gdmFyPSJlbmQiIGNsYXNzPSJqYXZhLnV0aWwuRGF0ZSIgLz4KLSAgRmluaXNoZWQgYXQ6ICR7ZW5kfQotPC9qOmplbGx5PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9iZW5jaG1hcmsvc2FtcGxlLmplbGx5IGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2JlbmNobWFyay9zYW1wbGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNmJhMWUuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2JlbmNobWFyay9zYW1wbGUuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gYSBkdW1teSBmaWxlLS0+Ci0KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiPgotCi0gICAgPGo6aWYgdGVzdD0iJHsxPT0yfSI+ICAgIAotICAgICAgICA8c3RhdGljPgotICAgICAgICAgICAgPHNvbWUgaWQ9IjEyIj4KLSAgICAgICAgICAgICAgICA8ZHVtbXkgeD0iJHtkdW1teS53aGF0ZXZlcn0iPgotICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIHNvbWUgc3RhdGljIFhNTAotICAgICAgICAgICAgICAgIDwvZHVtbXk+Ci0gICAgICAgICAgICAgICAgPGR1bW15IHg9IiR7ZHVtbXkud2hhdGV2ZXJ9Ij4KLSAgICAgICAgICAgICAgICAgICAgc29tZSAke2V9Ci0gICAgICAgICAgICAgICAgPC9kdW1teT4KLSAgICAgICAgICAgIDwvc29tZT4KLSAgICAgICAgPC9zdGF0aWM+Ci0gICAgPC9qOmlmPiAgICAgICAgCi0KLSAgPGo6Zm9yRWFjaCB2YXI9ImkiIGJlZ2luPSIxIiBlbmQ9IjEwMCI+Ci0gICAgICA8ajpzZXQgdmFyPSJkdW1teSIgdmFsdWU9IiR7aX0iLz4KLSAgPC9qOmZvckVhY2g+Ci08L2o6amVsbHk+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvQmFzZU1lbW9yeUxlYWtUZXN0LmphdmEgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9CYXNlTWVtb3J5TGVha1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjZDFjMC4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9CYXNlTWVtb3J5TGVha1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlNjcmlwdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5wYXJzZXIuWE1MUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBdXRvbWF0ZXMgdGhlIGJhc2ljIHByb2Nlc3Mgb2YgdGVzdGluZyBhIHRhZyBsaWJyYXJ5IGZvciBhIG1lbW9yeSBsZWFrLgotICogPHA+Ci0gKiBUbyB1c2UgaXQsIGV4dGVuZCBpdC4gVXNlIHRoZSB7QGxpbmsgcnVuU2NyaXB0TWFueVRpbWVzKFN0cmluZywgaW50KX0KLSAqIG1ldGhvZCBpbiB5b3VyIHVuaXQgdGVzdHMuCi0gKiAKLSAqIEBhdXRob3IgSGFucyBHaWxkZQotICogIAotICovCi1wdWJsaWMgY2xhc3MgQmFzZU1lbW9yeUxlYWtUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhCYXNlTWVtb3J5TGVha1Rlc3QuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogVGhlIEpVbml0IGNvbnN0cnVjdG9yCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgQmFzZU1lbW9yeUxlYWtUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qKiBSdW5zIGEgc2NyaXB0IGNvdW50IHRpbWVzIGFuZCByZXBvcnRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgImxlYWtlZCIuCi0gICAgICogTm90ZSB0aGF0ICJsZWFrZWQiIG1lYW5zICJub3QgY29sbGVjdGVkIGJ5IHRoZSBHQyIKLSAgICAgKiBhbmQgY2FuIGVhc2lseSBiZSBkaWZmZXJlbnQgYmV0d2VlbiBKVk0ncy4gVGhpcyBpcyBiZWNhdXNlIGFsbCAKLSAgICAgKiBmcmVlZCByZWZlcmVuY2VzIG1heSBub3QgYmUgYXZhaWxhYmxlIGZvciBHQyBpbiB0aGUgc2hvcnQgdGltZQotICAgICAqIGJldHdlZW4gdGhlaXIgZnJlZWluZyBhbmQgdGhlIGNvbXBsZXRpb24gb2YgdGhpcyB0ZXN0LgotICAgICAqIDxwLz4KLSAgICAgKiBIb3dldmVyLCBydW5uaW5nIGEgCi0gICAgICogc2NyaXB0IDEwLDAwMCBvciAxMDAsMDAwIHRpbWVzIHNob3VsZCBiZSBhIHByZXR0eSBnb29kIHRlc3QKLSAgICAgKiBmb3IgYSBtZW1vcnkgbGVhay4gSWYgdGhlcmUncyBub3QgdG9vIG11Y2ggbWVtb3J5ICJsZWFrZWQiLAotICAgICAqIHlvdSdyZSBwcm9iYWJseSBPSy4KLSAgICAgKiBAcGFyYW0gc2NyaXB0TmFtZSBUaGUgcGF0aCB0byB0aGUgc2NyaXB0LCBmcm9tIHRoZSBjbGFzc2xvYWRlciBvZiB0aGUgY3VycmVudCBjbGFzcy4KLSAgICAgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiB0aW1lcyB0byBydW4gdGhlIHNjcmlwdC4KLSAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgImxlYWtlZCIKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEplbGx5RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgcnVuU2NyaXB0TWFueVRpbWVzKFN0cmluZyBzY3JpcHROYW1lLCBpbnQgY291bnQpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSmVsbHlFeGNlcHRpb24gewotICAgICAgICBSdW50aW1lIHJ0ID0gUnVudGltZS5nZXRSdW50aW1lKCk7Ci0gICAgICAgIEplbGx5Q29udGV4dCBqYyA9IG5ldyBKZWxseUNvbnRleHQoKTsKLSAgICAgICAgamMuc2V0Q2xhc3NMb2FkZXIoZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLQotICAgICAgICBYTUxPdXRwdXQgb3V0cHV0ID0gWE1MT3V0cHV0LmNyZWF0ZUR1bW15WE1MT3V0cHV0KCk7Ci0gICAgICAgIAotICAgICAgICBVUkwgdXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKHNjcmlwdE5hbWUpOwotCi0gICAgICAgIFN0cmluZyBleHR1cmwgPSB1cmwudG9FeHRlcm5hbEZvcm0oKTsKLSAgICAgICAgaW50IGxhc3RTbGFzaCA9IGV4dHVybC5sYXN0SW5kZXhPZigiLyIpOwotICAgICAgICBTdHJpbmcgZXh0QmFzZSA9IGV4dHVybC5zdWJzdHJpbmcoMCxsYXN0U2xhc2grMSk7Ci0gICAgICAgIFVSTCBiYXNldXJsID0gbmV3IFVSTChleHRCYXNlKTsKLSAgICAgICAgamMuc2V0Q3VycmVudFVSTChiYXNldXJsKTsKLSAgICAgICAgCi0gICAgICAgIElucHV0U3RyZWFtIGlzID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbaXMuYXZhaWxhYmxlKCldOwotICAgICAgICBpcy5yZWFkKGJ5dGVzKTsKLQotICAgICAgICBJbnB1dFN0cmVhbSBzY3JpcHRJU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLSAgICAgICAgSW5wdXRTb3VyY2Ugc2NyaXB0SVNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShzY3JpcHRJU3RyZWFtKTsKLQotICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICBpcyA9IG51bGw7Ci0gICAgICAgIGJ5dGVzID0gbnVsbDsKLQotICAgICAgICBydC5ydW5GaW5hbGl6YXRpb24oKTsKLSAgICAgICAgcnQuZ2MoKTsKLQotICAgICAgICBsb25nIHN0YXJ0ID0gcnQudG90YWxNZW1vcnkoKSAtIHJ0LmZyZWVNZW1vcnkoKTsKLSAgICAgICAgbG9nLmluZm8oIlN0YXJ0aW5nIG1lbW9yeSB0ZXN0IHdpdGggdXNlZCBtZW1vcnkgb2YgIiArIHN0YXJ0KTsKLQotICAgICAgICBYTUxQYXJzZXIgcGFyc2VyOwotICAgICAgICBTY3JpcHQgc2NyaXB0OwotCi0gICAgICAgIGludCBvdXRwdXRFdmVyeVhJdGVyYXRpb25zID0gb3V0cHV0RXZlcnlYSXRlcmF0aW9ucygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgc2NyaXB0SVN0cmVhbS5yZXNldCgpOwotICAgICAgICAgICAgcGFyc2VyID0gbmV3IFhNTFBhcnNlcigpOwotCi0gICAgICAgICAgICBzY3JpcHQgPSBwYXJzZXIucGFyc2Uoc2NyaXB0SVNvdXJjZSk7Ci0gICAgICAgICAgICBzY3JpcHQucnVuKGpjLCBvdXRwdXQpOwotICAgICAgICAgICAgLy8gUEw6IEkgZG9uJ3Qgc2VlIHdoeSBidXQgcmVtb3ZpbmcgdGhlIGNsZWFyIGhlcmUgCi0gICAgICAgICAgICAvLyAgICAgZG9lcyBtYWtlIHRoZSB0ZXN0IGZhaWwhCi0gICAgICAgICAgICAvLyAgICAgQXMgaWYgdGhlIFdlYWtIYXNoTWFwIHdhc24ndCB3ZWFrIGVub3VnaC4uLgotICAgICAgICAgICAgCi0gICAgICAgICAgICAvL0hhbnM6IFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHJlbGF0aW9uc2hpcAotICAgICAgICAgICAgLy8gIGJldHdlZW4gVGFnU2NyaXB0IGFuZCBUYWcgcHJldmVudHMgV2Vha0hhc2hNYXAKLSAgICAgICAgICAgIC8vICBmcm9tIHdvcmtpbmcgaW4gdGhpcyBjYXNlLCB3aGljaCBpcyB3aHkgSSByZW1vdmVkIGl0LgotICAgICAgICAgICAgamMuY2xlYXIoKTsKLQotICAgICAgICAgICAgaWYgKG91dHB1dEV2ZXJ5WEl0ZXJhdGlvbnMgIT0gMCAmJiBpICUgb3V0cHV0RXZlcnlYSXRlcmF0aW9ucyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcGFyc2VyID0gbnVsbDsKLSAgICAgICAgICAgICAgICBzY3JpcHQgPSBudWxsOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJ0LnJ1bkZpbmFsaXphdGlvbigpOwotICAgICAgICAgICAgICAgIHJ0LmdjKCk7Ci0gICAgICAgICAgICAgICAgbG9uZyBtaWRkbGUgPSBydC50b3RhbE1lbW9yeSgpIC0gcnQuZnJlZU1lbW9yeSgpOwotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJUYWdIb2xkZXJNYXAgaGFzICIgKyBqYy5nZXRUaHJlYWRTY3JpcHREYXRhTWFwKCkuc2l6ZSgpICsgIiBlbnRyaWVzLiIpOwotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJNZW1vcnkgdGVzdCBhZnRlciAiICsgaSArICIgcnVuczogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAobWlkZGxlIC0gc3RhcnQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcnQuZ2MoKTsKLQotICAgICAgICBqYyA9IG51bGw7Ci0gICAgICAgIG91dHB1dCA9IG51bGw7Ci0gICAgICAgIHBhcnNlciA9IG51bGw7Ci0gICAgICAgIHNjcmlwdCA9IG51bGw7Ci0KLSAgICAgICAgc2NyaXB0SVN0cmVhbSA9IG51bGw7Ci0gICAgICAgIHNjcmlwdElTb3VyY2UgPSBudWxsOwotCi0gICAgICAgIHJ0LnJ1bkZpbmFsaXphdGlvbigpOwotICAgICAgICBydC5nYygpOwotICAgICAgICAKLSAgICAgICAgbG9uZyBudWxsc0RvbmUgPSBydC50b3RhbE1lbW9yeSgpIC0gcnQuZnJlZU1lbW9yeSgpOwotICAgICAgICBsb2cuaW5mbygiTWVtb3J5IHRlc3QgY29tcGxldGVkLCBtZW1vcnkgXCJsZWFrZWRcIjogIiArIChudWxsc0RvbmUgLSBzdGFydCkpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGxzRG9uZSAtIHN0YXJ0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgb3V0cHV0RXZlcnlYSXRlcmF0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIDEwMDA7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9DdXN0b21lci5qYXZhIGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvQ3VzdG9tZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NhNTE0MS4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9DdXN0b21lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBIHNhbXBsZSBiZWFuIHRoYXQgd2UgY2FuIGNvbnN0cnVjdCB2aWEgSmVsbHkgdGFncwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbWVyIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsKLSAgICBwcml2YXRlIFN0cmluZyBsb2NhdGlvbjsKLSAgICBwcml2YXRlIExpc3Qgb3JkZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0KLSAgICBwdWJsaWMgQ3VzdG9tZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIEN1c3RvbWVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHNldE5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEN1c3RvbWVyKFN0cmluZyBuYW1lLCBTdHJpbmcgY2l0eSkgewotICAgICAgICBzZXROYW1lKG5hbWUpOwotICAgICAgICBzZXRDaXR5KGNpdHkpOwotICAgIH0KLQotICAgIHB1YmxpYyBDdXN0b21lcihTdHJpbmcgbmFtZSwgU3RyaW5nIGNpdHksIE9yZGVyIGFuT3JkZXIpIHsKLSAgICAgICAgc2V0TmFtZShuYW1lKTsKLSAgICAgICAgc2V0Q2l0eShjaXR5KTsKLSAgICAgICAgYWRkT3JkZXIoYW5PcmRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIEN1c3RvbWVyKEN1c3RvbWVyIGN1c3QpIHsKLSAgICAgICAgc2V0TmFtZShjdXN0LmdldE5hbWUoKSk7Ci0gICAgICAgIHNldENpdHkoY3VzdC5nZXRDaXR5KCkpOwotICAgICAgICBzZXRMb2NhdGlvbihjdXN0LmdldExvY2F0aW9uKCkpOwotICAgICAgICBMaXN0IGxpc3QgPSBjdXN0LmdldE9yZGVycygpOwotICAgICAgICBpZihudWxsICE9IGxpc3QpIHsKLSAgICAgICAgICAgIGZvcihJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIGFkZE9yZGVyKChPcmRlcilpdGVyLm5leHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICJbbmFtZT0iICsgbmFtZSArICI7Y2l0eT0iICsgY2l0eSArICJdIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IE9yZGVyIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBPcmRlciBjcmVhdGVPcmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBPcmRlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldE9yZGVycygpIHsKLSAgICAgICAgcmV0dXJuIG9yZGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRPcmRlcihPcmRlciBvcmRlcikgewotICAgICAgICBvcmRlcnMuYWRkKG9yZGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVPcmRlcihPcmRlciBvcmRlcikgewotICAgICAgICBvcmRlcnMucmVtb3ZlKG9yZGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaXR5LgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDaXR5KCkgewotICAgICAgICByZXR1cm4gY2l0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbi4KLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lLgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjaXR5LgotICAgICAqIEBwYXJhbSBjaXR5IFRoZSBjaXR5IHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENpdHkoU3RyaW5nIGNpdHkpIHsKLSAgICAgICAgdGhpcy5jaXR5ID0gY2l0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsb2NhdGlvbi4KLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGxvY2F0aW9uIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZS4KLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL0V4Y2VwdGlvbkJlYW4uamF2YSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL0V4Y2VwdGlvbkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU4ZDI2MC4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9FeGNlcHRpb25CZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlOwotCi0vKioKLSAqIEEgc2FtcGxlIGJlYW4gdGhhdCB0aHJvd3MgZXhjZXB0aW9ucyB3aGVuIGl0cyBtZXRob2RzIGFyZSBpbnZva2VkLgotICovCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uQmVhbiB7Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uQmVhbigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnN0YW5jZU1ldGhvZCggU3RyaW5nIG1zZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIG1zZyApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdGF0aWNNZXRob2QoIFN0cmluZyBtc2cpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCBtc2cgKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL09yZGVyLmphdmEgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9PcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWUxMmJmLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL09yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlOwotCi0vKioKLSAqIEEgc2FtcGxlIGJlYW4gdGhhdCB3ZSBjYW4gY29uc3RydWN0IHZpYSBKZWxseSB0YWdzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAotICovCi1wdWJsaWMgY2xhc3MgT3JkZXIgewotCi0gICAgcHJpdmF0ZSBQcm9kdWN0IHByb2R1Y3Q7Ci0gICAgcHJpdmF0ZSBpbnQgYW1vdW50OwotICAgIHByaXZhdGUgZG91YmxlIHByaWNlOwotCi0gICAgcHVibGljIE9yZGVyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiT3JkZXJbYW1vdW50PSIgKyBhbW91bnQgKyAiO3ByaWNlPSIgKyBwcmljZSArICI7cHJvZHVjdD0iICsgcHJvZHVjdCArICJdIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgUHJvZHVjdAotICAgICAqLwotICAgIHB1YmxpYyBQcm9kdWN0IGNyZWF0ZVByb2R1Y3QoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJvZHVjdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFtb3VudC4KLSAgICAgKiBAcmV0dXJuIGludAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0QW1vdW50KCkgewotICAgICAgICByZXR1cm4gYW1vdW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByaWNlLgotICAgICAqIEByZXR1cm4gZG91YmxlCi0gICAgICovCi0gICAgcHVibGljIGRvdWJsZSBnZXRQcmljZSgpIHsKLSAgICAgICAgcmV0dXJuIHByaWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFtb3VudC4KLSAgICAgKiBAcGFyYW0gYW1vdW50IFRoZSBhbW91bnQgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QW1vdW50KGludCBhbW91bnQpIHsKLSAgICAgICAgdGhpcy5hbW91bnQgPSBhbW91bnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJpY2UuCi0gICAgICogQHBhcmFtIHByaWNlIFRoZSBwcmljZSB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmljZShkb3VibGUgcHJpY2UpIHsKLSAgICAgICAgdGhpcy5wcmljZSA9IHByaWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb2R1Y3QuCi0gICAgICogQHJldHVybiBQcm9kdWN0Ci0gICAgICovCi0gICAgcHVibGljIFByb2R1Y3QgZ2V0UHJvZHVjdCgpIHsKLSAgICAgICAgcmV0dXJuIHByb2R1Y3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJvZHVjdC4KLSAgICAgKiBAcGFyYW0gcHJvZHVjdCBUaGUgcHJvZHVjdCB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0KFByb2R1Y3QgcHJvZHVjdCkgewotICAgICAgICB0aGlzLnByb2R1Y3QgPSBwcm9kdWN0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvUHJvZHVjdC5qYXZhIGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvUHJvZHVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGJkZmM1Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL1Byb2R1Y3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmNvcmU7Ci0KLS8qKgotICogQSBzYW1wbGUgYmVhbiB0aGF0IHdlIGNhbiBjb25zdHJ1Y3QgdmlhIEplbGx5IHRhZ3MKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9kdWN0IHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICBwdWJsaWMgUHJvZHVjdCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlByb2R1Y3RbaWQ9IiArIGlkICsgIjtuYW1lPSIgKyBuYW1lICsgIl0iOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpZC4KLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lLgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBpZC4KLSAgICAgKiBAcGFyYW0gaWQgVGhlIGlkIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZS4KLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9UZXN0QXJnVGFnLmphdmEgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9UZXN0QXJnVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNmZhZjEuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvVGVzdEFyZ1RhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuU2NyaXB0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZS5BcmdUYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZS5BcmdUYWdQYXJlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRlc3QuQmFzZUplbGx5VGVzdDsKLQotLyoqCi0gKiBAYXV0aG9yIFJvZG5leSBXYWxkaG9mZgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjkgJCAkRGF0ZTogMjAwNC8xMC8yNiAyMzo1NDozNyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0QXJnVGFnIGV4dGVuZHMgQmFzZUplbGx5VGVzdCB7Ci0KLSAgICBwdWJsaWMgVGVzdEFyZ1RhZyhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShUZXN0QXJnVGFnLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBwYXJlbnRUYWcgPSBuZXcgTW9ja0FyZ1RhZ1BhcmVudCgpOwotICAgICAgICBhcmdUYWcgPSBuZXcgQXJnVGFnKCk7Ci0gICAgICAgIGFyZ1RhZy5zZXRDb250ZXh0KGdldEplbGx5Q29udGV4dCgpKTsKLSAgICAgICAgYXJnVGFnLnNldFBhcmVudChwYXJlbnRUYWcpOwotICAgICAgICBhcmdUYWcuc2V0Qm9keShuZXcgTW9ja1NjcmlwdCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgICAgICBwYXJlbnRUYWcgPSBudWxsOwotICAgICAgICBhcmdUYWcgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb0Jvb2xlYW5Gcm9tU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFyZ1RhZy5zZXRUeXBlKCJib29sZWFuIik7Ci0gICAgICAgIGFyZ1RhZy5zZXRWYWx1ZSgidHJ1ZSIpOwotICAgICAgICBhcmdUYWcuZG9UYWcoZ2V0WE1MT3V0cHV0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5UWVBFLHBhcmVudFRhZy5nZXRUeXBlKDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSxwYXJlbnRUYWcuZ2V0VmFsdWUoMCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb0NoYXJGcm9tU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFyZ1RhZy5zZXRUeXBlKCJjaGFyIik7Ci0gICAgICAgIGFyZ1RhZy5zZXRWYWx1ZSgiWCIpOwotICAgICAgICBhcmdUYWcuZG9UYWcoZ2V0WE1MT3V0cHV0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQ2hhcmFjdGVyLlRZUEUscGFyZW50VGFnLmdldFR5cGUoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENoYXJhY3RlcignWCcpLHBhcmVudFRhZy5nZXRWYWx1ZSgwKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRvQnl0ZUZyb21TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXJnVGFnLnNldFR5cGUoImJ5dGUiKTsKLSAgICAgICAgYXJnVGFnLnNldFZhbHVlKCIxNyIpOwotICAgICAgICBhcmdUYWcuZG9UYWcoZ2V0WE1MT3V0cHV0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZS5UWVBFLHBhcmVudFRhZy5nZXRUeXBlKDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBCeXRlKChieXRlKTE3KSxwYXJlbnRUYWcuZ2V0VmFsdWUoMCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb0J5dGVGcm9tTnVtYmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFyZ1RhZy5zZXRUeXBlKCJieXRlIik7Ci0gICAgICAgIGFyZ1RhZy5zZXRWYWx1ZShuZXcgRG91YmxlKDE3LjNkKSk7Ci0gICAgICAgIGFyZ1RhZy5kb1RhZyhnZXRYTUxPdXRwdXQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCeXRlLlRZUEUscGFyZW50VGFnLmdldFR5cGUoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEJ5dGUoKGJ5dGUpMTcpLHBhcmVudFRhZy5nZXRWYWx1ZSgwKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRvU2hvcnRGcm9tU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFyZ1RhZy5zZXRUeXBlKCJzaG9ydCIpOwotICAgICAgICBhcmdUYWcuc2V0VmFsdWUoIjE3Iik7Ci0gICAgICAgIGFyZ1RhZy5kb1RhZyhnZXRYTUxPdXRwdXQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTaG9ydC5UWVBFLHBhcmVudFRhZy5nZXRUeXBlKDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBTaG9ydCgoc2hvcnQpMTcpLHBhcmVudFRhZy5nZXRWYWx1ZSgwKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRvU2hvcnRGcm9tTnVtYmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFyZ1RhZy5zZXRUeXBlKCJzaG9ydCIpOwotICAgICAgICBhcmdUYWcuc2V0VmFsdWUobmV3IERvdWJsZSgxNy4zZCkpOwotICAgICAgICBhcmdUYWcuZG9UYWcoZ2V0WE1MT3V0cHV0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2hvcnQuVFlQRSxwYXJlbnRUYWcuZ2V0VHlwZSgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuZXcgU2hvcnQoKHNob3J0KTE3KSxwYXJlbnRUYWcuZ2V0VmFsdWUoMCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb0ludEZyb21TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXJnVGFnLnNldFR5cGUoImludCIpOwotICAgICAgICBhcmdUYWcuc2V0VmFsdWUoIjE3Iik7Ci0gICAgICAgIGFyZ1RhZy5kb1RhZyhnZXRYTUxPdXRwdXQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLlRZUEUscGFyZW50VGFnLmdldFR5cGUoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoKGludCkxNykscGFyZW50VGFnLmdldFZhbHVlKDApKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9JbnRGcm9tTnVtYmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFyZ1RhZy5zZXRUeXBlKCJpbnQiKTsKLSAgICAgICAgYXJnVGFnLnNldFZhbHVlKG5ldyBEb3VibGUoMTcuM2QpKTsKLSAgICAgICAgYXJnVGFnLmRvVGFnKGdldFhNTE91dHB1dCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuVFlQRSxwYXJlbnRUYWcuZ2V0VHlwZSgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigoaW50KTE3KSxwYXJlbnRUYWcuZ2V0VmFsdWUoMCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb0Zsb2F0RnJvbVN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhcmdUYWcuc2V0VHlwZSgiZmxvYXQiKTsKLSAgICAgICAgYXJnVGFnLnNldFZhbHVlKCIxNy4zIik7Ci0gICAgICAgIGFyZ1RhZy5kb1RhZyhnZXRYTUxPdXRwdXQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhGbG9hdC5UWVBFLHBhcmVudFRhZy5nZXRUeXBlKDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBGbG9hdCgoZmxvYXQpMTcuMykscGFyZW50VGFnLmdldFZhbHVlKDApKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9GbG9hdEZyb21OdW1iZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXJnVGFnLnNldFR5cGUoImZsb2F0Iik7Ci0gICAgICAgIGFyZ1RhZy5zZXRWYWx1ZShuZXcgRG91YmxlKDE3LjNkKSk7Ci0gICAgICAgIGFyZ1RhZy5kb1RhZyhnZXRYTUxPdXRwdXQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhGbG9hdC5UWVBFLHBhcmVudFRhZy5nZXRUeXBlKDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBGbG9hdCgoZmxvYXQpMTcuMykscGFyZW50VGFnLmdldFZhbHVlKDApKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9Mb25nRnJvbVN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhcmdUYWcuc2V0VHlwZSgibG9uZyIpOwotICAgICAgICBhcmdUYWcuc2V0VmFsdWUoIjE3Iik7Ci0gICAgICAgIGFyZ1RhZy5kb1RhZyhnZXRYTUxPdXRwdXQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMb25nLlRZUEUscGFyZW50VGFnLmdldFR5cGUoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExvbmcoKGludCkxNykscGFyZW50VGFnLmdldFZhbHVlKDApKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9Mb25nRnJvbU51bWJlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhcmdUYWcuc2V0VHlwZSgibG9uZyIpOwotICAgICAgICBhcmdUYWcuc2V0VmFsdWUobmV3IERvdWJsZSgxNy4zZCkpOwotICAgICAgICBhcmdUYWcuZG9UYWcoZ2V0WE1MT3V0cHV0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTG9uZy5UWVBFLHBhcmVudFRhZy5nZXRUeXBlKDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMb25nKChsb25nKTE3KSxwYXJlbnRUYWcuZ2V0VmFsdWUoMCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb0RvdWJsZUZyb21TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXJnVGFnLnNldFR5cGUoImRvdWJsZSIpOwotICAgICAgICBhcmdUYWcuc2V0VmFsdWUoIjE3LjMiKTsKLSAgICAgICAgYXJnVGFnLmRvVGFnKGdldFhNTE91dHB1dCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKERvdWJsZS5UWVBFLHBhcmVudFRhZy5nZXRUeXBlKDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBEb3VibGUoKGRvdWJsZSkxNy4zKSxwYXJlbnRUYWcuZ2V0VmFsdWUoMCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb0RvdWJsZUZyb21OdW1iZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXJnVGFnLnNldFR5cGUoImRvdWJsZSIpOwotICAgICAgICBhcmdUYWcuc2V0VmFsdWUobmV3IExvbmcoMTdMKSk7Ci0gICAgICAgIGFyZ1RhZy5kb1RhZyhnZXRYTUxPdXRwdXQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhEb3VibGUuVFlQRSxwYXJlbnRUYWcuZ2V0VHlwZSgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuZXcgRG91YmxlKChkb3VibGUpMTcpLHBhcmVudFRhZy5nZXRWYWx1ZSgwKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRvUHJpbWl0aXZlRnJvbU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gdHlwZXMgPSB7ICJib29sZWFuIiwgImNoYXIiLCAiYnl0ZSIsICJzaG9ydCIsICJpbnQiLCAiZmxvYXQiLCAibG9uZyIsICJkb3VibGUiIH07Ci0gICAgICAgIGZvcihpbnQgaT0wO2k8dHlwZXMubGVuZ3RoO2krKykgewotICAgICAgICAgICAgYXJnVGFnLnNldFR5cGUodHlwZXNbaV0pOwotICAgICAgICAgICAgYXJnVGFnLnNldFZhbHVlKG51bGwpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBhcmdUYWcuZG9UYWcoZ2V0WE1MT3V0cHV0KCkpOwotICAgICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIEplbGx5RXhjZXB0aW9uIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChKZWxseUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGcm9tTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBDbGFzc1tdIHR5cGVzID0geyBCb29sZWFuLmNsYXNzLCBDaGFyYWN0ZXIuY2xhc3MsIEJ5dGUuY2xhc3MsIFNob3J0LmNsYXNzLCBJbnRlZ2VyLmNsYXNzLCBGbG9hdC5jbGFzcywgTG9uZy5jbGFzcywgRG91YmxlLmNsYXNzLCBTdHJpbmcuY2xhc3MsIE9iamVjdC5jbGFzcyB9OwotICAgICAgICBmb3IoaW50IGk9MDtpPHR5cGVzLmxlbmd0aDtpKyspIHsKLSAgICAgICAgICAgIGFyZ1RhZy5zZXRUeXBlKHR5cGVzW2ldLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBhcmdUYWcuc2V0VmFsdWUobnVsbCk7Ci0gICAgICAgICAgICBhcmdUYWcuZG9UYWcoZ2V0WE1MT3V0cHV0KCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHR5cGVzW2ldLHBhcmVudFRhZy5nZXRUeXBlKGkpKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwocGFyZW50VGFnLmdldFZhbHVlKGkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTW9ja0FyZ1RhZ1BhcmVudCBwYXJlbnRUYWcgPSBudWxsOwotICAgIHByaXZhdGUgQXJnVGFnIGFyZ1RhZyA9IG51bGw7Ci0KLSAgICBjbGFzcyBNb2NrQXJnVGFnUGFyZW50IGV4dGVuZHMgVGFnU3VwcG9ydCBpbXBsZW1lbnRzIEFyZ1RhZ1BhcmVudCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGFkZEFyZ3VtZW50KENsYXNzIHR5cGUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgdHlwZUxpc3QuYWRkKHR5cGUpOwotICAgICAgICAgICAgdmFsdWVMaXN0LmFkZCh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSAgewotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBDbGFzcyBnZXRUeXBlKGludCBpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKENsYXNzKSh0eXBlTGlzdC5nZXQoaSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBPYmplY3QgZ2V0VmFsdWUoaW50IGkpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZUxpc3QuZ2V0KGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBMaXN0IHR5cGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwcml2YXRlIExpc3QgdmFsdWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLQotICAgIGNsYXNzIE1vY2tTY3JpcHQgaW1wbGVtZW50cyBTY3JpcHQgewotICAgICAgICBwdWJsaWMgU2NyaXB0IGNvbXBpbGUoKSB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oSmVsbHlDb250ZXh0IGNvbnRleHQsIFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9UZXN0QnJlYWtUYWcuamF2YSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL1Rlc3RCcmVha1RhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2RkNDQxLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL1Rlc3RCcmVha1RhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuY29yZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuU2NyaXB0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50ZXN0LkJhc2VKZWxseVRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0QnJlYWtUYWcgZXh0ZW5kcyBCYXNlSmVsbHlUZXN0Ci17Ci0KLSAgICBwdWJsaWMgVGVzdEJyZWFrVGFnKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0U3VpdGUgc3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShUZXN0QnJlYWtUYWcuY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVCcmVha1RhZygpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHNldFVwU2NyaXB0KCJ0ZXN0QnJlYWtUYWcuamVsbHkiKTsKLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IGdldEplbGx5KCkuY29tcGlsZVNjcmlwdCgpOwotCi0gICAgICAgIHNjcmlwdC5ydW4oZ2V0SmVsbHlDb250ZXh0KCksIGdldFhNTE91dHB1dCgpKTsKLQotICAgICAgICBTdHJpbmcgc2ltcGxlUmVzdWx0ID0gKFN0cmluZykgZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoInNpbXBsZVJlc3VsdCIpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygic2ltcGxlUmVzdWx0IiwgIjEyMzQ1Iiwgc2ltcGxlUmVzdWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZGl0aW9uYWxCcmVha1RhZygpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHNldFVwU2NyaXB0KCJ0ZXN0QnJlYWtUYWcuamVsbHkiKTsKLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IGdldEplbGx5KCkuY29tcGlsZVNjcmlwdCgpOwotCi0gICAgICAgIHNjcmlwdC5ydW4oZ2V0SmVsbHlDb250ZXh0KCksIGdldFhNTE91dHB1dCgpKTsKLQotICAgICAgICBTdHJpbmcgc2ltcGxlUmVzdWx0ID0gKFN0cmluZykgZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImNvbmRpdGlvbmFsUmVzdWx0Iik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb25kaXRpb25hbFJlc3VsdCIsICIxMjM0NSIsIHNpbXBsZVJlc3VsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhckJyZWFrVGFnKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc2V0VXBTY3JpcHQoInRlc3RCcmVha1RhZy5qZWxseSIpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gZ2V0SmVsbHkoKS5jb21waWxlU2NyaXB0KCk7Ci0KLSAgICAgICAgc2NyaXB0LnJ1bihnZXRKZWxseUNvbnRleHQoKSwgZ2V0WE1MT3V0cHV0KCkpOwotCi0gICAgICAgIFN0cmluZyB2YXJCcm9rZW4gPSAoU3RyaW5nKSBnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgidmFyQnJva2VuIik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YXJCcm9rZW4iLCAidHJ1ZSIsIHZhckJyb2tlbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhck5vQnJlYWtUYWcoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzZXRVcFNjcmlwdCgidGVzdEJyZWFrVGFnLmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBnZXRKZWxseSgpLmNvbXBpbGVTY3JpcHQoKTsKLQotICAgICAgICBzY3JpcHQucnVuKGdldEplbGx5Q29udGV4dCgpLCBnZXRYTUxPdXRwdXQoKSk7Ci0KLSAgICAgICAgU3RyaW5nIHZhck5vdEJyb2tlbiA9IChTdHJpbmcpIGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJ2YXJOb3RCcm9rZW4iKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoInZhck5vdEJyb2tlbiIsICJmYWxzZSIsIHZhck5vdEJyb2tlbik7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL1Rlc3RDaG9vc2VUYWcuamF2YSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL1Rlc3RDaG9vc2VUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRlMGQ0MS4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9UZXN0Q2hvb3NlVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5TY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRlc3QuQmFzZUplbGx5VGVzdDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpid2FsZGluZ0BhcGFjaGUub3JnIj5CZW4gV2FsZGluZzwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIFRlc3RDaG9vc2VUYWcgZXh0ZW5kcyBCYXNlSmVsbHlUZXN0Ci17Ci0KLSAgICBwdWJsaWMgVGVzdENob29zZVRhZyhTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGVzdENob29zZVRhZy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUZpbGVUYWcoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzZXRVcFNjcmlwdCgidGVzdENob29zZVRhZy5qZWxseSIpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gZ2V0SmVsbHkoKS5jb21waWxlU2NyaXB0KCk7Ci0KLSAgICAgICAgc2NyaXB0LnJ1bihnZXRKZWxseUNvbnRleHQoKSwgZ2V0WE1MT3V0cHV0KCkpOwotCi0gICAgICAgIFN0cmluZyByZXN1bHRUcnVlID0gKFN0cmluZykgZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoInJlc3VsdC50cnVlIik7Ci0gICAgICAgIFN0cmluZyByZXN1bHRGYWxzZSA9IChTdHJpbmcpIGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJyZXN1bHQuZmFsc2UiKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoInJlc3VsdC50cnVlIiwgIkFDIiwgcmVzdWx0VHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVzdWx0LmZhbHNlIiwgIkJDIiwgcmVzdWx0RmFsc2UpOwotICAgIH0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL1Rlc3RDb3JlTWVtb3J5TGVhay5qYXZhIGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvVGVzdENvcmVNZW1vcnlMZWFrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2OGM0NTAuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvVGVzdENvcmVNZW1vcnlMZWFrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlOwotCi0vKiogVGVzdHMgZm9yIGJhc2ljIG1lbW9yeSBsZWFraW5nIGluIGNvcmUgdGFncy4gUnVucyBhIGZldyB0ZXN0IHNjcmlwdHMgbWFueSB0aW1lcy4KLSAqIEBhdXRob3IgSGFucyBHaWxkZQotICoKLSAqLwotcHVibGljIGNsYXNzIFRlc3RDb3JlTWVtb3J5TGVhayBleHRlbmRzIEJhc2VNZW1vcnlMZWFrVGVzdCB7Ci0KLSAgICAvKiogVGhlIEpVbml0IGNvbnN0cnVjdG9yLgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFRlc3RDb3JlTWVtb3J5TGVhayhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEJhc2ljU2NyaXB0Rm9yTGVhaygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRUcnVlKHJ1blNjcmlwdE1hbnlUaW1lcygiYy5qZWxseSIsIDEwMDAwKSA8IDIwMDAwMCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9UZXN0RmlsZVRhZy5qYXZhIGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvVGVzdEZpbGVUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA3ZTU3My4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9UZXN0RmlsZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5TY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGVzdC5CYXNlSmVsbHlUZXN0OwotaW1wb3J0IG9yZy5kb200ai5pby5IVE1MV3JpdGVyOwotaW1wb3J0IG9yZy5kb200ai5pby5PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmRvbTRqLmlvLlhNTFdyaXRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86cm9iZXJ0QGJ1bGwtZW50ZXJwcmlzZXMuY29tIj5Sb2JlcnQgTWNJbnRvc2g8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0RmlsZVRhZyBleHRlbmRzIEJhc2VKZWxseVRlc3QKLXsKLQotICAgIHB1YmxpYyBUZXN0RmlsZVRhZyhTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGVzdEZpbGVUYWcuY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVGaWxlVGFnKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc2V0VXBTY3JpcHQoInRlc3RGaWxlVGFnLmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBnZXRKZWxseSgpLmNvbXBpbGVTY3JpcHQoKTsKLQotICAgICAgICBzY3JpcHQucnVuKGdldEplbGx5Q29udGV4dCgpLCBnZXRYTUxPdXRwdXQoKSk7Ci0KLSAgICAgICAgU3RyaW5nIGRhdGEgPSAoU3RyaW5nKWdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJ0ZXN0RmlsZVRhZyIpOwotCi0gICAgICAgIC8vRklYTUUgVGhpcyBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IGF0dHJpYnV0ZSBvcmRlcmluZwotICAgICAgICBhc3NlcnRFcXVhbHMoImZ1bGx5IHF1YWxpZmllZCBhdHRyaWJ1dGVzIG5vdCBwYXNzZWQiLAotICAgICAgICAgICAgICAgICI8aHRtbCB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIiB4bWw6bGFuZz1cImVuXCIgbGFuZz1cImVuXCI+PC9odG1sPiIsCi0gICAgICAgICAgICAgICAgZGF0YSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERvbTRYbWxucygpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBPdXRwdXRGb3JtYXQgZm9ybWF0ID0gbmV3IE91dHB1dEZvcm1hdCgpOwotICAgICAgICBmaW5hbCBYTUxXcml0ZXIgeG1sV3JpdGVyID0gbmV3IEhUTUxXcml0ZXIod3JpdGVyLCBmb3JtYXQpOwotICAgICAgICB4bWxXcml0ZXIuc2V0RXNjYXBlVGV4dChmYWxzZSk7Ci0KLSAgICAgICAgWE1MT3V0cHV0IG91dHB1dCA9IG5ldyBYTUxPdXRwdXQoeG1sV3JpdGVyLCB4bWxXcml0ZXIpOwotCi0gICAgICAgIFN0cmluZyBnb2xkZW4gPSAiPGh0bWwgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCIgeG1sOmxhbmc9XCJlblwiIGxhbmc9XCJlblwiPlxuIjsKLSAgICAgICAgZ29sZGVuICs9ICI8aHRtbD4iOwotCi0gICAgICAgIG91dHB1dC5zdGFydERvY3VtZW50KCk7Ci0gICAgICAgIG91dHB1dC53cml0ZShnb2xkZW4pOwotICAgICAgICBvdXRwdXQuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvdXRwdXQgc2hvdWxkIGNvbnRhaW4gdGhlIG5hbWVzcGFjZXMiLCBnb2xkZW4sIHdyaXRlci50b1N0cmluZygpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL1Rlc3RGb3JFYWNoVGFnLmphdmEgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9UZXN0Rm9yRWFjaFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzQyMzFhLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL1Rlc3RGb3JFYWNoVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5TY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRlc3QuQmFzZUplbGx5VGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpiZW5hbmRlcnNvbkBiZW5hbmRlcnNvbi51cyI+QmVuIEFuZGVyc29uPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjIgJAotICovCi1wdWJsaWMgY2xhc3MgVGVzdEZvckVhY2hUYWcgZXh0ZW5kcyBCYXNlSmVsbHlUZXN0Ci17Ci0KLSAgICBwdWJsaWMgVGVzdEZvckVhY2hUYWcoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3RGb3JFYWNoVGFnLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yRWFjaFRhZygpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHNldFVwU2NyaXB0KCJ0ZXN0Rm9yRWFjaFRhZy5qZWxseSIpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gZ2V0SmVsbHkoKS5jb21waWxlU2NyaXB0KCk7Ci0KLSAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuc2V0VmFyaWFibGUoIm15TGlzdCIsIAotICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyIwIiwgIlZPSUQiLCAiMSIsICJWT0lEIiwgIjIiLCAiVk9JRCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIiwgIlZPSUQiLCAiNCIsICJWT0lEIiwgIjUifSk7Ci0gICAgICAgIGdldEplbGx5Q29udGV4dCgpLnNldFZhcmlhYmxlKCJ0ZXN0TXlMaXN0IiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgc2NyaXB0LnJ1bihnZXRKZWxseUNvbnRleHQoKSwgZ2V0WE1MT3V0cHV0KCkpOwotCi0gICAgICAgIFN0cmluZyByZXN1bHRPcmRlcmVkID0gCi0gICAgICAgICAgICAgICAgKFN0cmluZykgZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoInJlc3VsdC5vcmRlcmVkIik7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigicmF3IHJlc3VsdCBpcyAnIiArIHJlc3VsdE9yZGVyZWQgKyAiJyIpOwotICAgICAgICByZXN1bHRPcmRlcmVkID0gU3RyaW5nVXRpbHMucmVwbGFjZShyZXN1bHRPcmRlcmVkLCAiICIsICIiKTsKLSAgICAgICAgcmVzdWx0T3JkZXJlZCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UocmVzdWx0T3JkZXJlZCwgIlxuIiwgIiIpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygicmVzdWx0Lm9yZGVyZWQiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIkZJUlNUXzI2Ml8xMjEvTUlERExFXzI0Mi9MQVNUXzM2My8iLAotICAgICAgICAgICAgICAgICAgICAgcmVzdWx0T3JkZXJlZCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JFYWNoVGFnTnVtTGlzdCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHNldFVwU2NyaXB0KCJ0ZXN0Rm9yRWFjaFRhZy5qZWxseSIpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gZ2V0SmVsbHkoKS5jb21waWxlU2NyaXB0KCk7Ci0KLSAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuc2V0VmFyaWFibGUoInRlc3ROdW1MaXN0IiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgc2NyaXB0LnJ1bihnZXRKZWxseUNvbnRleHQoKSwgZ2V0WE1MT3V0cHV0KCkpOwotCi0gICAgICAgIFN0cmluZyByZXN1bHRPcmRlcmVkID0gCi0gICAgICAgICAgICAgICAgKFN0cmluZykgZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoInJlc3VsdC5vcmRlcmVkIik7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigicmF3IHJlc3VsdCBpcyAnIiArIHJlc3VsdE9yZGVyZWQgKyAiJyIpOwotICAgICAgICByZXN1bHRPcmRlcmVkID0gU3RyaW5nVXRpbHMucmVwbGFjZShyZXN1bHRPcmRlcmVkLCAiICIsICIiKTsKLSAgICAgICAgcmVzdWx0T3JkZXJlZCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UocmVzdWx0T3JkZXJlZCwgIlxuIiwgIiIpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygicmVzdWx0Lm9yZGVyZWQiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIkZJUlNUXzI2Ml8xMjIvTUlERExFXzI0NC9MQVNUXzM2Ni8iLAotICAgICAgICAgICAgICAgICAgICAgcmVzdWx0T3JkZXJlZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvVGVzdEdldFN0YXRpY1RhZy5qYXZhIGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvVGVzdEdldFN0YXRpY1RhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTViODFiLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL1Rlc3RHZXRTdGF0aWNUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmNvcmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlNjcmlwdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRlc3QuQmFzZUplbGx5VGVzdDsKLQotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCi0gKi8KLQotcHVibGljIGNsYXNzIFRlc3RHZXRTdGF0aWNUYWcgZXh0ZW5kcyBCYXNlSmVsbHlUZXN0IHsKLQotICAgIHB1YmxpYyBUZXN0R2V0U3RhdGljVGFnKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0U3VpdGUgc3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGVzdEdldFN0YXRpY1RhZy5jbGFzcyk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgSW50ZWdlci5NQVhfVkFMVUUgdXNpbmcgdGFnIGFuZCB2ZXJpZmllcyBhZ2FpbnN0IGRpcmVjdAotICAgICAqIGFjY2Vzcy4KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnRlZ2VyTWF4VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBzZXRVcFNjcmlwdCggInRlc3RHZXRTdGF0aWNUYWcuamVsbHkiICk7Ci0KLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IGdldEplbGx5KCkuY29tcGlsZVNjcmlwdCgpOwotCi0gICAgICAgIGdldEplbGx5Q29udGV4dCgpLnNldFZhcmlhYmxlKCAidGVzdC5JbnRlZ2VyLk1BWF9WQUxVRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUgKTsKLQotICAgICAgICBzY3JpcHQucnVuKCBnZXRKZWxseUNvbnRleHQoKSwgZ2V0WE1MT3V0cHV0KCkgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIG5ldyBJbnRlZ2VyKGphdmEubGFuZy5JbnRlZ2VyLk1BWF9WQUxVRSksCi0gICAgICAgICAgICAgICAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoInZhbHVlIiApICk7Ci0gICAgfQotCi0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyBhIG5vbi1leGlzdGVudCBmaWVsZCBhbmQgdmVyaWZpZXMgZXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkR2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgc2V0VXBTY3JpcHQoICJ0ZXN0R2V0U3RhdGljVGFnLmplbGx5IiApOwotCi0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBnZXRKZWxseSgpLmNvbXBpbGVTY3JpcHQoKTsKLQotICAgICAgICBnZXRKZWxseUNvbnRleHQoKS5zZXRWYXJpYWJsZSggInRlc3QuSW52YWxpZEdldCIsIEJvb2xlYW4uVFJVRSApOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzY3JpcHQucnVuKCBnZXRKZWxseUNvbnRleHQoKSwgZ2V0WE1MT3V0cHV0KCkgKTsKLSAgICAgICAgfSBjYXRjaChKZWxseVRhZ0V4Y2VwdGlvbiBqdGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZhaWwoIkplbGx5VGFnRXhjZXB0aW9uIG5vdCB0aHJvd24uIik7Ci0gICAgfQotCi19Ci0KLS8qIEVtYWNzIGNvbmZpZ3VyYXRpb24KLSAqIExvY2FsIHZhcmlhYmxlczogICAgICAgICoqCi0gKiBtb2RlOiAgICAgICAgICAgICBqYXZhICAqKgotICogYy1iYXNpYy1vZmZzZXQ6ICAgNCAgICAgKioKLSAqIGluZGVudC10YWJzLW1vZGU6IG5pbCAgICoqCi0gKiBFbmQ6ICAgICAgICAgICAgICAgICAgICAqKgotICovCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9UZXN0SW5jbHVkZVRhZy5qYXZhIGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvVGVzdEluY2x1ZGVUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JkNjk5Mi4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9UZXN0SW5jbHVkZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5TY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ0xpYnJhcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqCi0gKiBNYWtlcyBzdXJlIHRoYXQgbmVzdGVkIGluY2x1ZGVzIHdvcmsgY29ycmVjdGx5Ci0gKgotICogQGF1dGhvciBNb3JnYW4gRGVsYWdyYW5nZQotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMgJAotICovCi1wdWJsaWMgY2xhc3MgVGVzdEluY2x1ZGVUYWcgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBKZWxseSBqZWxseSA9IG51bGw7Ci0gICAgSmVsbHlDb250ZXh0IGNvbnRleHQgPSBudWxsOwotICAgIFhNTE91dHB1dCB4bWxPdXRwdXQgPSBudWxsOwotCi0gICAgcHVibGljIFRlc3RJbmNsdWRlVGFnKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3RJbmNsdWRlVGFnLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcChTdHJpbmcgc2NyaXB0TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFVSTCB1cmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2Uoc2NyaXB0TmFtZSk7Ci0gICAgICAgIGlmICggdXJsID09IG51bGwgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBKZWxseSBzY3JpcHQ6ICIgKyBzY3JpcHROYW1lCi0gICAgICAgICAgICAgICAgKyAiIGluIHBhY2thZ2Ugb2YgY2xhc3M6ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgICAgIHNldFVwRnJvbVVSTCh1cmwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVwRnJvbVVSTChVUkwgdXJsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY29udGV4dCA9IG5ldyBDb3JlVGFnbGliT25seUNvbnRleHQoKTsKLSAgICAgICAgeG1sT3V0cHV0ID0gWE1MT3V0cHV0LmNyZWF0ZUR1bW15WE1MT3V0cHV0KCk7Ci0KLSAgICAgICAgamVsbHkgPSBuZXcgSmVsbHkoKTsKLQotICAgICAgICBqZWxseS5zZXRVcmwodXJsKTsKLQotICAgICAgICBTdHJpbmcgZXh0dXJsID0gdXJsLnRvRXh0ZXJuYWxGb3JtKCk7Ci0gICAgICAgIGludCBsYXN0U2xhc2ggPSBleHR1cmwubGFzdEluZGV4T2YoIi8iKTsKLSAgICAgICAgU3RyaW5nIGV4dEJhc2UgPSBleHR1cmwuc3Vic3RyaW5nKDAsbGFzdFNsYXNoKzEpOwotICAgICAgICBVUkwgYmFzZXVybCA9IG5ldyBVUkwoZXh0QmFzZSk7Ci0gICAgICAgIGNvbnRleHQuc2V0Q3VycmVudFVSTChiYXNldXJsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5uZXJtb3N0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHBlcmZvcm1zIG5vIGluY2x1ZGVzCi0gICAgICAgIHNldFVwKCJjLmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBqZWxseS5jb21waWxlU2NyaXB0KCk7Ci0gICAgICAgIHNjcmlwdC5ydW4oY29udGV4dCx4bWxPdXRwdXQpOwotICAgICAgICBhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBzZXQgJ2MnIHZhcmlhYmxlIHRvICd0cnVlJyIsCi0gICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRWYXJpYWJsZSgiYyIpLmVxdWFscygidHJ1ZSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWlkZGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHBlcmZvcm1zIG9uZSBpbmNsdWRlCi0gICAgICAgIHNldFVwKCJiLmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBqZWxseS5jb21waWxlU2NyaXB0KCk7Ci0gICAgICAgIHNjcmlwdC5ydW4oY29udGV4dCx4bWxPdXRwdXQpOwotICAgICAgICBhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBzZXQgJ2MnIHZhcmlhYmxlIHRvICd0cnVlJyIsCi0gICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRWYXJpYWJsZSgiYyIpLmVxdWFscygidHJ1ZSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgc2V0ICdiJyB2YXJpYWJsZSB0byAndHJ1ZSciLAotICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0VmFyaWFibGUoImIiKS5lcXVhbHMoInRydWUiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE91dGVybW9zdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBwZXJmb3JtcyBvbmUgbmVzdGVkIGluY2x1ZGUKLSAgICAgICAgc2V0VXAoImEuamVsbHkiKTsKLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IGplbGx5LmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgc2NyaXB0LnJ1bihjb250ZXh0LHhtbE91dHB1dCk7Ci0gICAgICAgIGFzc2VydFRydWUoInNob3VsZCBoYXZlIHNldCAnYycgdmFyaWFibGUgdG8gJ3RydWUnIiwKLSAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFZhcmlhYmxlKCJjIikuZXF1YWxzKCJ0cnVlIikpOwotICAgICAgICBhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBzZXQgJ2InIHZhcmlhYmxlIHRvICd0cnVlJyIsCi0gICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRWYXJpYWJsZSgiYiIpLmVxdWFscygidHJ1ZSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgc2V0ICdhJyB2YXJpYWJsZSB0byAndHJ1ZSciLAotICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0VmFyaWFibGUoImEiKS5lcXVhbHMoInRydWUiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zdXJlIHRoYXQgaW5jbHVkZXMgaGFwcGVuIGNvcnJlY3RseSB3aGVuIEplbGx5IHNjcmlwdHMKLSAgICAgKiBhcmUgcmVmZXJlbmNlZCBhcyBhIGZpbGUgKHJhdGhlciB0aGFuIGFzIGEgY2xhc3NwYXRoCi0gICAgICogZWxlbWVudCkuICBTcGVjaWZpY2FsbHkgY2hlY2tzIHRvIG1ha2Ugc3VyZSBpbmNsdWRlcyBzdWNjZWVkCi0gICAgICogd2hlbiB0aGUgaW5pdGlhbCBzY3JpcHQgaXMgbm90IGluIHRoZSB1c2VyLmRpciBkaXJlY3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVJbmNsdWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHRlc3Rpbmcgb3V0ZXJtb3N0Ci0gICAgICAgIHNldFVwRnJvbVVSTChuZXcgVVJMKCJmaWxlOnNyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL2EuamVsbHkiKSk7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBqZWxseS5jb21waWxlU2NyaXB0KCk7Ci0gICAgICAgIHNjcmlwdC5ydW4oY29udGV4dCx4bWxPdXRwdXQpOwotICAgICAgICBhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBzZXQgJ2MnIHZhcmlhYmxlIHRvICd0cnVlJyIsCi0gICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRWYXJpYWJsZSgiYyIpLmVxdWFscygidHJ1ZSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgc2V0ICdiJyB2YXJpYWJsZSB0byAndHJ1ZSciLAotICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0VmFyaWFibGUoImIiKS5lcXVhbHMoInRydWUiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoInNob3VsZCBoYXZlIHNldCAnYScgdmFyaWFibGUgdG8gJ3RydWUnIiwKLSAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFZhcmlhYmxlKCJhIikuZXF1YWxzKCJ0cnVlIikpOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgQ29yZVRhZ2xpYk9ubHlDb250ZXh0IGV4dGVuZHMgSmVsbHlDb250ZXh0IHsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbnMgbWFrZXMgc3VyZSB0aGF0IG9ubHkgImplbGx5OmNvcmUiCi0gICAgICAgICAqIHRhZ2xpYiBpcyBpbnN0YW50aWF0ZWQsIGluc3VyaW5nIHRoYXQgIm9wdGlvbmFsIiBkZXBlbmRlbmNpZXMKLSAgICAgICAgICogYXJlIG5vdCBpbmFkdmVydGFudGx5IGNhbGxlZC4gIFNwZWNpZmljYWxseSBhZGRyZXNzZXMgYSBidWcKLSAgICAgICAgICogaW4gb2xkZXIgSmVsbHkgZGV2IHZlcnNpb25zIHdoZXJlIGEgbmVzdGVkIGluY2x1ZGUKLSAgICAgICAgICogd291bGQgdHJpZ2dlciBpbnN0YW50aWF0aW9uIG9mIGFsbCB0YWcgbGlicmFyaWVzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJCi0gICAgICAgICAqIEByZXR1cm4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBUYWdMaWJyYXJ5IGdldFRhZ0xpYnJhcnkoU3RyaW5nIG5hbWVzcGFjZVVSSSkgIHsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkuZXF1YWxzKCJqZWxseTpjb3JlIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VGFnTGlicmFyeShuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9DbGFzc0RlZkZvdW5kRXJyb3IoIlVuZXhwZWN0ZWQgdGFnIGxpYnJhcnkgdXJpOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvVGVzdEludm9rZVN0YXRpY1RhZy5qYXZhIGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvVGVzdEludm9rZVN0YXRpY1RhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWY2N2Y4Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL1Rlc3RJbnZva2VTdGF0aWNUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuU2NyaXB0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50ZXN0LkJhc2VKZWxseVRlc3Q7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86cm9iZXJ0QGJ1bGwtZW50ZXJwcmlzZXMuY29tIj5Sb2JlcnQgTWNJbnRvc2g8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0SW52b2tlU3RhdGljVGFnIGV4dGVuZHMgQmFzZUplbGx5VGVzdCB7Ci0KLSAgICBwdWJsaWMgVGVzdEludm9rZVN0YXRpY1RhZyhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShUZXN0SW52b2tlU3RhdGljVGFnLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEdldHMgdGhlIFN5c3RlbSBwcm9wZXJ0eSAnamF2YS5ydW50aW1lLnZlcnNpb24nIGFuZCBjb21wYXJlcyBpdCB3aXRoLAotICAgICAqICB3ZWxsLCB0aGUgc2FtZSBzeXN0ZW0gcHJvcGVydHkKLSAgICAgKi8KLSAgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVN5c3RlbUludm9rZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRVcFNjcmlwdCggInRlc3RJbnZva2VTdGF0aWNUYWcuamVsbHkiICk7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBnZXRKZWxseSgpLmNvbXBpbGVTY3JpcHQoKTsKLQotICAgICAgICBnZXRKZWxseUNvbnRleHQoKS5zZXRWYXJpYWJsZSggInRlc3Quc2ltcGxlU3lzdGVtSW52b2tlIixCb29sZWFuLlRSVUUgKTsKLQotICAgICAgICBnZXRKZWxseUNvbnRleHQoKS5zZXRWYXJpYWJsZSggInByb3BlcnR5TmFtZSIsICJqYXZhLnJ1bnRpbWUudmVyc2lvbiIgKTsKLSAgICAgICAgc2NyaXB0LnJ1biggZ2V0SmVsbHlDb250ZXh0KCksZ2V0WE1MT3V0cHV0KCkgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCBTeXN0ZW0uZ2V0UHJvcGVydHkoICJqYXZhLnJ1bnRpbWUudmVyc2lvbiIgKS5lcXVhbHMoIGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJwcm9wZXJ0eU5hbWUiICkgKSApOwotICAgIH0KLQotICAgICAvKioKLSAgICAgKiAgU2V0cyB0aGUgU3lzdGVtIHByb3BlcnR5ICdURVNUIFBST1BFUlRZJyB0byB0aGUgdmFsdWUgJ0plbGx5IGlzIGNvb2wnIGFuZCBjb21wYXJlcyBpdCB3aXRoLAotICAgICAqICB3ZWxsLCB0aGUgc2FtZSBzeXN0ZW0gcHJvcGVydHkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3lzdGVtSW52b2tlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFVwU2NyaXB0KCAidGVzdEludm9rZVN0YXRpY1RhZy5qZWxseSIgKTsKLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IGdldEplbGx5KCkuY29tcGlsZVNjcmlwdCgpOwotCi0gICAgICAgIGdldEplbGx5Q29udGV4dCgpLnNldFZhcmlhYmxlKCAidGVzdC5zeXN0ZW1JbnZva2UiLEJvb2xlYW4uVFJVRSApOwotCi0gICAgICAgIGdldEplbGx5Q29udGV4dCgpLnNldFZhcmlhYmxlKCAicHJvcGVydHlOYW1lIiwgIlRFU1QgUFJPUEVSVFkiICk7Ci0gICAgICAgIGdldEplbGx5Q29udGV4dCgpLnNldFZhcmlhYmxlKCAicHJvcGVydHlWYWx1ZSIsICJKZWxseSBpcyBjb29sIiApOwotICAgICAgICBzY3JpcHQucnVuKCBnZXRKZWxseUNvbnRleHQoKSxnZXRYTUxPdXRwdXQoKSApOwotCi0gICAgICAgIGFzc2VydFRydWUoIFN5c3RlbS5nZXRQcm9wZXJ0eSggIlRFU1QgUFJPUEVSVFkiICkuZXF1YWxzKCAiSmVsbHkgaXMgY29vbCIgKSApOwotCi0gICAgfQotCi0gICAgIC8qKgotICAgICAqICBVc2VzIHRoZSBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCBjbGFzcyB0byBmb3JtYXQgYSB0ZXh0IG1lc3NhZ2UKLSAgICAgKiAgd2l0aCAzIGFyZ3VtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZUZvcm1hdEludm9rZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkgKTsKLSAgICAgICAgc2V0VXBTY3JpcHQoICJ0ZXN0SW52b2tlU3RhdGljVGFnLmplbGx5IiApOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gZ2V0SmVsbHkoKS5jb21waWxlU2NyaXB0KCk7Ci0KLSAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuc2V0VmFyaWFibGUoICJ0ZXN0Lm1lc3NhZ2VGb3JtYXRJbnZva2UiLCBCb29sZWFuLlRSVUUgKTsKLQotICAgICAgICBPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFszXTsKLSAgICAgICAgYXJnc1swXSA9ICJKZWxseSI7Ci0gICAgICAgIGFyZ3NbMV0gPSAiY29vbGVzdCI7Ci0gICAgICAgIGFyZ3NbMl0gPSAidXNlZCI7Ci0KLSAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuc2V0VmFyaWFibGUoICJhcmdzIiwgYXJncyApOwotICAgICAgICBnZXRKZWxseUNvbnRleHQoKS5zZXRWYXJpYWJsZSggIm1lc3NhZ2UiLCAiSXMgbm90IHswfSB0aGUgezF9IHRoaW5nIHlvdSBoYXZlIGV2ZXIgezJ9PyIgKTsKLSAgICAgICAgc2NyaXB0LnJ1biggZ2V0SmVsbHlDb250ZXh0KCksZ2V0WE1MT3V0cHV0KCkgKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKCBnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgibWVzc2FnZSIpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJtZXNzYWdlIikuZXF1YWxzKCJJcyBub3QgSmVsbHkgdGhlIGNvb2xlc3QgdGhpbmcgeW91IGhhdmUgZXZlciB1c2VkPyIpICk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlVGhhdFRocm93c0V4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRVcFNjcmlwdCggInRlc3RJbnZva2VTdGF0aWNUYWcuamVsbHkiICk7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBnZXRKZWxseSgpLmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuc2V0VmFyaWFibGUoInRlc3QuaW52b2tlVGhhdFRocm93c0V4Y2VwdGlvbiIsQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgc2NyaXB0LnJ1bihnZXRKZWxseUNvbnRleHQoKSxnZXRYTUxPdXRwdXQoKSk7Ci0gICAgICAgIFN0cmluZyBleGNlcHRpb25NZXNzYWdlID0gKFN0cmluZykgZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImV4Y2VwdGlvbk1lc3NhZ2UiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggZXhjZXB0aW9uTWVzc2FnZSApOwotICAgICAgICBFeGNlcHRpb24gamVsbHlFeGNlcHRpb24gPSAoRXhjZXB0aW9uKSBnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiamVsbHlFeGNlcHRpb24iKTsKLSAgICAgICAgYXNzZXJ0TnVsbCggamVsbHlFeGNlcHRpb24gKTsKLSAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IChFeGNlcHRpb24pIGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJleGNlcHRpb25UaHJvd24iKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggZXhjZXB0aW9uICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZXhjZXB0aW9uTWVzc2FnZSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VUaGF0RG9lc05vdEhhbmRsZUV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRVcFNjcmlwdCggInRlc3RJbnZva2VTdGF0aWNUYWcuamVsbHkiICk7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBnZXRKZWxseSgpLmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuc2V0VmFyaWFibGUoInRlc3QuaW52b2tlVGhhdERvZXNOb3RIYW5kbGVFeGNlcHRpb24iLEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIHNjcmlwdC5ydW4oZ2V0SmVsbHlDb250ZXh0KCksZ2V0WE1MT3V0cHV0KCkpOwotICAgICAgICBTdHJpbmcgZXhjZXB0aW9uTWVzc2FnZSA9IChTdHJpbmcpIGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJleGNlcHRpb25NZXNzYWdlIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIGV4Y2VwdGlvbk1lc3NhZ2UgKTsKLSAgICAgICAgSmVsbHlFeGNlcHRpb24gamVsbHlFeGNlcHRpb24gPSAoSmVsbHlFeGNlcHRpb24pIGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJqZWxseUV4Y2VwdGlvbiIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCBqZWxseUV4Y2VwdGlvbiApOwotICAgICAgICBhc3NlcnRUcnVlKCAibWVzc2FnZXMgYXJlIHRoZSBzYW1lIiwgISBleGNlcHRpb25NZXNzYWdlLmVxdWFscyhqZWxseUV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJleGNlcHRpb24gJyIgKyBqZWxseUV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkgKyAiJyBkb2VzIG5vdCBlbmRzIHdpdGggJyIgKwotICAgICAgICAgICAgICAgIGV4Y2VwdGlvbk1lc3NhZ2UrIiciLCBqZWxseUV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkuZW5kc1dpdGgoZXhjZXB0aW9uTWVzc2FnZSkgKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggamVsbHlFeGNlcHRpb24uZ2V0Q2F1c2UoKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGV4Y2VwdGlvbk1lc3NhZ2UsIGplbGx5RXhjZXB0aW9uLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpICk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9UZXN0SW52b2tlVGFnLmphdmEgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9UZXN0SW52b2tlVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMjk5NTEuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvVGVzdEludm9rZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmNvcmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5TY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmNvcmUuQ3VzdG9tZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRlc3QuQmFzZUplbGx5VGVzdDsKLQotLyoqCi0gKiBAYXV0aG9yIFJvZG5leSBXYWxkaG9mZgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjkgJCAkRGF0ZTogMjAwNC8xMC8yNiAyMzo1NDozNyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0SW52b2tlVGFnIGV4dGVuZHMgQmFzZUplbGx5VGVzdCB7Ci0KLSAgICBwdWJsaWMgVGVzdEludm9rZVRhZyhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShUZXN0SW52b2tlVGFnLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUludm9rZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRVcFNjcmlwdCgidGVzdEludm9rZVRhZy5qZWxseSIpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gZ2V0SmVsbHkoKS5jb21waWxlU2NyaXB0KCk7Ci0gICAgICAgIGdldEplbGx5Q29udGV4dCgpLnNldFZhcmlhYmxlKCJ0ZXN0LnNpbXBsZUludm9rZSIsQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgc2NyaXB0LnJ1bihnZXRKZWxseUNvbnRleHQoKSxnZXRYTUxPdXRwdXQoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImZvbyIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiZm9vIikgaW5zdGFuY2VvZiBDdXN0b21lcik7Ci0gICAgICAgIEN1c3RvbWVyIGN1c3RvbWVyID0gKEN1c3RvbWVyKShnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiZm9vIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkphbmUgRG9lIixjdXN0b21lci5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkNoaWNhZ28iLGN1c3RvbWVyLmdldENpdHkoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoY3VzdG9tZXIuZ2V0T3JkZXJzKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSxjdXN0b21lci5nZXRPcmRlcnMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGN1c3RvbWVyLmdldE9yZGVycygpLmdldCgwKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEludm9rZVdpdGhWYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0VXBTY3JpcHQoInRlc3RJbnZva2VUYWcuamVsbHkiKTsKLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IGdldEplbGx5KCkuY29tcGlsZVNjcmlwdCgpOwotICAgICAgICBnZXRKZWxseUNvbnRleHQoKS5zZXRWYXJpYWJsZSgidGVzdC5pbnZva2VXaXRoVmFyIixCb29sZWFuLlRSVUUpOwotICAgICAgICBzY3JpcHQucnVuKGdldEplbGx5Q29udGV4dCgpLGdldFhNTE91dHB1dCgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgic2l6ZSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgic2l6ZSIpIGluc3RhbmNlb2YgSW50ZWdlcik7Ci0gICAgICAgIEludGVnZXIgc2l6ZSA9IChJbnRlZ2VyKShnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgic2l6ZSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsc2l6ZS5pbnRWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlV2l0aFJldHVybmVkVmFsdWVBc0FyZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRVcFNjcmlwdCgidGVzdEludm9rZVRhZy5qZWxseSIpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gZ2V0SmVsbHkoKS5jb21waWxlU2NyaXB0KCk7Ci0gICAgICAgIGdldEplbGx5Q29udGV4dCgpLnNldFZhcmlhYmxlKCJ0ZXN0Lmludm9rZVdpdGhSZXR1cm5lZFZhbHVlQXNBcmciLEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIHNjcmlwdC5ydW4oZ2V0SmVsbHlDb250ZXh0KCksZ2V0WE1MT3V0cHV0KCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJjdXN0b21lciIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiY3VzdG9tZXIiKSBpbnN0YW5jZW9mIEN1c3RvbWVyKTsKLSAgICAgICAgQ3VzdG9tZXIgY3VzdG9tZXIgPSAoQ3VzdG9tZXIpKGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJjdXN0b21lciIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJKYW5lIERvZSIsY3VzdG9tZXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDaGljYWdvIixjdXN0b21lci5nZXRDaXR5KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VXaXRoUmV0dXJuZWRWYWx1ZUFzQXJnQW5kVmFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFVwU2NyaXB0KCJ0ZXN0SW52b2tlVGFnLmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBnZXRKZWxseSgpLmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuc2V0VmFyaWFibGUoInRlc3QuaW52b2tlV2l0aFJldHVybmVkVmFsdWVBc0FyZ0FuZFZhciIsQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgc2NyaXB0LnJ1bihnZXRKZWxseUNvbnRleHQoKSxnZXRYTUxPdXRwdXQoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImN1c3RvbWVyIikpOwotICAgICAgICBhc3NlcnRUcnVlKGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJjdXN0b21lciIpIGluc3RhbmNlb2YgQ3VzdG9tZXIpOwotICAgICAgICBDdXN0b21lciBjdXN0b21lciA9IChDdXN0b21lcikoZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImN1c3RvbWVyIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkphbmUgRG9lIixjdXN0b21lci5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkNoaWNhZ28iLGN1c3RvbWVyLmdldENpdHkoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImFyZ3R3byIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDaGljYWdvIixnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiYXJndHdvIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VUaGF0VGhyb3dzRXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFVwU2NyaXB0KCJ0ZXN0SW52b2tlVGFnLmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBnZXRKZWxseSgpLmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuc2V0VmFyaWFibGUoInRlc3QuaW52b2tlVGhhdFRocm93c0V4Y2VwdGlvbiIsQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgc2NyaXB0LnJ1bihnZXRKZWxseUNvbnRleHQoKSxnZXRYTUxPdXRwdXQoKSk7Ci0gICAgICAgIFN0cmluZyBleGNlcHRpb25NZXNzYWdlID0gKFN0cmluZykgZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImV4Y2VwdGlvbk1lc3NhZ2UiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggZXhjZXB0aW9uTWVzc2FnZSApOwotICAgICAgICBhc3NlcnROb3ROdWxsKCBnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiZXhjZXB0aW9uQmVhbiIpKTsKLSAgICAgICAgRXhjZXB0aW9uIGplbGx5RXhjZXB0aW9uID0gKEV4Y2VwdGlvbikgZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImplbGx5RXhjZXB0aW9uIik7Ci0gICAgICAgIGFzc2VydE51bGwoIGplbGx5RXhjZXB0aW9uICk7Ci0gICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSAoRXhjZXB0aW9uKSBnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiZXhjZXB0aW9uVGhyb3duIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIGV4Y2VwdGlvbiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGV4Y2VwdGlvbk1lc3NhZ2UsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlVGhhdERvZXNOb3RIYW5kbGVFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0VXBTY3JpcHQoInRlc3RJbnZva2VUYWcuamVsbHkiKTsKLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IGdldEplbGx5KCkuY29tcGlsZVNjcmlwdCgpOwotICAgICAgICBnZXRKZWxseUNvbnRleHQoKS5zZXRWYXJpYWJsZSgidGVzdC5pbnZva2VUaGF0RG9lc05vdEhhbmRsZUV4Y2VwdGlvbiIsQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgc2NyaXB0LnJ1bihnZXRKZWxseUNvbnRleHQoKSxnZXRYTUxPdXRwdXQoKSk7Ci0gICAgICAgIFN0cmluZyBleGNlcHRpb25NZXNzYWdlID0gKFN0cmluZykgZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImV4Y2VwdGlvbk1lc3NhZ2UiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggZXhjZXB0aW9uTWVzc2FnZSApOwotICAgICAgICBhc3NlcnROb3ROdWxsKCBnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiZXhjZXB0aW9uQmVhbiIpKTsKLSAgICAgICAgSmVsbHlFeGNlcHRpb24gamVsbHlFeGNlcHRpb24gPSAoSmVsbHlFeGNlcHRpb24pIGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJqZWxseUV4Y2VwdGlvbiIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCBqZWxseUV4Y2VwdGlvbiApOwotICAgICAgICBhc3NlcnRUcnVlKCAibWVzc2FnZXMgYXJlIHRoZSBzYW1lIiwgISBleGNlcHRpb25NZXNzYWdlLmVxdWFscyhqZWxseUV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJleGNlcHRpb24gJyIgKyBqZWxseUV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkgKyAiJyBkb2VzIG5vdCBlbmRzIHdpdGggJyIgKwotICAgICAgICAgICAgICAgIGV4Y2VwdGlvbk1lc3NhZ2UrIiciLCBqZWxseUV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkuZW5kc1dpdGgoZXhjZXB0aW9uTWVzc2FnZSkgKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggamVsbHlFeGNlcHRpb24uZ2V0Q2F1c2UoKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGV4Y2VwdGlvbk1lc3NhZ2UsIGplbGx5RXhjZXB0aW9uLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpICk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL1Rlc3ROZXdUYWcuamF2YSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL1Rlc3ROZXdUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUxMThjOC4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9UZXN0TmV3VGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5TY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmNvcmUuQ3VzdG9tZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRlc3QuQmFzZUplbGx5VGVzdDsKLQotLyoqCi0gKiBAYXV0aG9yIFJvZG5leSBXYWxkaG9mZgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjggJCAkRGF0ZTogMjAwNC8xMC8yNiAyMzo1NDozNyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0TmV3VGFnIGV4dGVuZHMgQmFzZUplbGx5VGVzdCB7Ci0KLSAgICBwdWJsaWMgVGVzdE5ld1RhZyhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShUZXN0TmV3VGFnLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlTmV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFVwU2NyaXB0KCJ0ZXN0TmV3VGFnLmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBnZXRKZWxseSgpLmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuc2V0VmFyaWFibGUoInRlc3Quc2ltcGxlTmV3IixCb29sZWFuLlRSVUUpOwotICAgICAgICBzY3JpcHQucnVuKGdldEplbGx5Q29udGV4dCgpLGdldFhNTE91dHB1dCgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiZm9vIikpOwotICAgICAgICBhc3NlcnRUcnVlKGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJmb28iKSBpbnN0YW5jZW9mIEN1c3RvbWVyKTsKLSAgICAgICAgQ3VzdG9tZXIgY3VzdG9tZXIgPSAoQ3VzdG9tZXIpKGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJmb28iKSk7Ci0gICAgICAgIGFzc2VydE51bGwoY3VzdG9tZXIuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3VGhlbk92ZXJ3cml0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRVcFNjcmlwdCgidGVzdE5ld1RhZy5qZWxseSIpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gZ2V0SmVsbHkoKS5jb21waWxlU2NyaXB0KCk7Ci0gICAgICAgIGdldEplbGx5Q29udGV4dCgpLnNldFZhcmlhYmxlKCJ0ZXN0Lm5ld1RoZW5PdmVyd3JpdGUiLEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIHNjcmlwdC5ydW4oZ2V0SmVsbHlDb250ZXh0KCksZ2V0WE1MT3V0cHV0KCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJmb28iKSk7Ci0gICAgICAgIGFzc2VydFRydWUoZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImZvbyIpIGluc3RhbmNlb2YgRGF0ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5ld1dpdGhMaXRlcmFsQXJnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFVwU2NyaXB0KCJ0ZXN0TmV3VGFnLmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBnZXRKZWxseSgpLmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuc2V0VmFyaWFibGUoInRlc3QubmV3V2l0aExpdGVyYWxBcmciLEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIHNjcmlwdC5ydW4oZ2V0SmVsbHlDb250ZXh0KCksZ2V0WE1MT3V0cHV0KCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJmb28iKSk7Ci0gICAgICAgIGFzc2VydFRydWUoZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImZvbyIpIGluc3RhbmNlb2YgQ3VzdG9tZXIpOwotICAgICAgICBDdXN0b21lciBjdXN0b21lciA9IChDdXN0b21lcikoZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImZvbyIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjdXN0b21lci5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkphbmUgRG9lIixjdXN0b21lci5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdXaXRoVHdvQXJncygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRVcFNjcmlwdCgidGVzdE5ld1RhZy5qZWxseSIpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gZ2V0SmVsbHkoKS5jb21waWxlU2NyaXB0KCk7Ci0gICAgICAgIGdldEplbGx5Q29udGV4dCgpLnNldFZhcmlhYmxlKCJ0ZXN0Lm5ld1dpdGhUd29BcmdzIixCb29sZWFuLlRSVUUpOwotICAgICAgICBzY3JpcHQucnVuKGdldEplbGx5Q29udGV4dCgpLGdldFhNTE91dHB1dCgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiZm9vIikpOwotICAgICAgICBhc3NlcnRUcnVlKGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJmb28iKSBpbnN0YW5jZW9mIEN1c3RvbWVyKTsKLSAgICAgICAgQ3VzdG9tZXIgY3VzdG9tZXIgPSAoQ3VzdG9tZXIpKGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJmb28iKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoY3VzdG9tZXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJKYW5lIERvZSIsY3VzdG9tZXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjdXN0b21lci5nZXRDaXR5KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkNoaWNhZ28iLGN1c3RvbWVyLmdldENpdHkoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5ld1dpdGhFeHByZXNzaW9uQXJnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFVwU2NyaXB0KCJ0ZXN0TmV3VGFnLmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBnZXRKZWxseSgpLmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuc2V0VmFyaWFibGUoInRlc3QubmV3V2l0aEV4cHJlc3Npb25BcmciLEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIHNjcmlwdC5ydW4oZ2V0SmVsbHlDb250ZXh0KCksZ2V0WE1MT3V0cHV0KCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJmb28iKSk7Ci0gICAgICAgIGFzc2VydFRydWUoZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImZvbyIpIGluc3RhbmNlb2YgQ3VzdG9tZXIpOwotICAgICAgICBDdXN0b21lciBjdXN0b21lciA9IChDdXN0b21lcikoZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImZvbyIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjdXN0b21lci5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkphbmUgRG9lIixjdXN0b21lci5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdXaXRoTnVsbEFyZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRVcFNjcmlwdCgidGVzdE5ld1RhZy5qZWxseSIpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gZ2V0SmVsbHkoKS5jb21waWxlU2NyaXB0KCk7Ci0gICAgICAgIGdldEplbGx5Q29udGV4dCgpLnNldFZhcmlhYmxlKCJ0ZXN0Lm5ld1dpdGhOdWxsQXJnIixCb29sZWFuLlRSVUUpOwotICAgICAgICBzY3JpcHQucnVuKGdldEplbGx5Q29udGV4dCgpLGdldFhNTE91dHB1dCgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiZm9vIikpOwotICAgICAgICBhc3NlcnRUcnVlKGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJmb28iKSBpbnN0YW5jZW9mIEN1c3RvbWVyKTsKLSAgICAgICAgQ3VzdG9tZXIgY3VzdG9tZXIgPSAoQ3VzdG9tZXIpKGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJmb28iKSk7Ci0gICAgICAgIGFzc2VydE51bGwoY3VzdG9tZXIuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3V2l0aE5ld0FyZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRVcFNjcmlwdCgidGVzdE5ld1RhZy5qZWxseSIpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gZ2V0SmVsbHkoKS5jb21waWxlU2NyaXB0KCk7Ci0gICAgICAgIGdldEplbGx5Q29udGV4dCgpLnNldFZhcmlhYmxlKCJ0ZXN0Lm5ld1dpdGhOZXdBcmciLEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIHNjcmlwdC5ydW4oZ2V0SmVsbHlDb250ZXh0KCksZ2V0WE1MT3V0cHV0KCkpOwotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJmb28iKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJmb28iKSBpbnN0YW5jZW9mIEN1c3RvbWVyKTsKLSAgICAgICAgICAgIEN1c3RvbWVyIGN1c3RvbWVyID0gKEN1c3RvbWVyKShnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiZm9vIikpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjdXN0b21lci5nZXROYW1lKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLGN1c3RvbWVyLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiYmFyIikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiYmFyIikgaW5zdGFuY2VvZiBDdXN0b21lcik7Ci0gICAgICAgICAgICBDdXN0b21lciBjdXN0b21lciA9IChDdXN0b21lcikoZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImJhciIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiSmFuZSBEb2UiLGN1c3RvbWVyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkNoaWNhZ28iLGN1c3RvbWVyLmdldENpdHkoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGN1c3RvbWVyLmdldE9yZGVycygpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLGN1c3RvbWVyLmdldE9yZGVycygpLnNpemUoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGN1c3RvbWVyLmdldE9yZGVycygpLmdldCgwKSk7Ci0gICAgICAgIH0KLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgicXV4IikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgicXV4IikgaW5zdGFuY2VvZiBDdXN0b21lcik7Ci0gICAgICAgICAgICBDdXN0b21lciBjdXN0b21lciA9IChDdXN0b21lcikoZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoInF1eCIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiSmFuZSBEb2UiLGN1c3RvbWVyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkNoaWNhZ28iLGN1c3RvbWVyLmdldENpdHkoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGN1c3RvbWVyLmdldE9yZGVycygpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLGN1c3RvbWVyLmdldE9yZGVycygpLnNpemUoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGN1c3RvbWVyLmdldE9yZGVycygpLmdldCgwKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3V2l0aFVzZUJlYW5BcmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0VXBTY3JpcHQoInRlc3ROZXdUYWcuamVsbHkiKTsKLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IGdldEplbGx5KCkuY29tcGlsZVNjcmlwdCgpOwotICAgICAgICBnZXRKZWxseUNvbnRleHQoKS5zZXRWYXJpYWJsZSgidGVzdC5uZXdXaXRoVXNlQmVhbkFyZyIsQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgc2NyaXB0LnJ1bihnZXRKZWxseUNvbnRleHQoKSxnZXRYTUxPdXRwdXQoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImZvbyIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiZm9vIikgaW5zdGFuY2VvZiBDdXN0b21lcik7Ci0gICAgICAgIEN1c3RvbWVyIGN1c3RvbWVyID0gKEN1c3RvbWVyKShnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiZm9vIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkphbmUgRG9lIixjdXN0b21lci5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkNoaWNhZ28iLGN1c3RvbWVyLmdldENpdHkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTG9jYXRpb24iLGN1c3RvbWVyLmdldExvY2F0aW9uKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL1Rlc3RTd2l0Y2hUYWcuamF2YSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL1Rlc3RTd2l0Y2hUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVhMmY0Mi4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9UZXN0U3dpdGNoVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuY29yZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lk1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlNjcmlwdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGVzdC5CYXNlSmVsbHlUZXN0OwotCi0vKioKLSAqIEBhdXRob3IgUm9kbmV5IFdhbGRob2ZmCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOSAkICREYXRlOiAyMDA0LzEwLzI2IDIzOjU0OjM3ICQKLSAqLwotcHVibGljIGNsYXNzIFRlc3RTd2l0Y2hUYWcgZXh0ZW5kcyBCYXNlSmVsbHlUZXN0IHsKLQotICAgIHB1YmxpYyBUZXN0U3dpdGNoVGFnKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3RTd2l0Y2hUYWcuY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlU3dpdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFVwU2NyaXB0KCJ0ZXN0U3dpdGNoVGFnLmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBnZXRKZWxseSgpLmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuc2V0VmFyaWFibGUoInN3aXRjaC5vbi5hIiwidHdvIik7Ci0gICAgICAgIHNjcmlwdC5ydW4oZ2V0SmVsbHlDb250ZXh0KCksZ2V0WE1MT3V0cHV0KCkpOwotICAgICAgICBhc3NlcnROdWxsKCJzaG91bGQgbm90IGhhdmUgJ2Eub25lJyB2YXJpYWJsZSBzZXQiLAotICAgICAgICAgICAgICAgICAgIGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJhLm9uZSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgc2V0ICdhLnR3bycgdmFyaWFibGUgdG8gJ3RydWUnIiwKLSAgICAgICAgICAgICAgICAgICBnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiYS50d28iKS5lcXVhbHMoInRydWUiKSk7Ci0gICAgICAgIGFzc2VydE51bGwoInNob3VsZCBub3QgaGF2ZSAnYS50aHJlZScgdmFyaWFibGUgc2V0IiwKLSAgICAgICAgICAgICAgICAgICBnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiYS50aHJlZSIpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgic2hvdWxkIG5vdCBoYXZlICdhLm51bGwnIHZhcmlhYmxlIHNldCIsCi0gICAgICAgICAgICAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImEubnVsbCIpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgic2hvdWxkIG5vdCBoYXZlICdhLmRlZmF1bHQnIHZhcmlhYmxlIHNldCIsCi0gICAgICAgICAgICAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImEuZGVmYXVsdCIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFsbFRocnUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0VXBTY3JpcHQoInRlc3RTd2l0Y2hUYWcuamVsbHkiKTsKLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IGdldEplbGx5KCkuY29tcGlsZVNjcmlwdCgpOwotICAgICAgICBnZXRKZWxseUNvbnRleHQoKS5zZXRWYXJpYWJsZSgic3dpdGNoLm9uLmEiLCJvbmUiKTsKLSAgICAgICAgc2NyaXB0LnJ1bihnZXRKZWxseUNvbnRleHQoKSxnZXRYTUxPdXRwdXQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoInNob3VsZCBoYXZlIHNldCAnYS5vbmUnIHZhcmlhYmxlIHRvICd0cnVlJyIsCi0gICAgICAgICAgICAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImEub25lIikuZXF1YWxzKCJ0cnVlIikpOwotICAgICAgICBhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBzZXQgJ2EudHdvJyB2YXJpYWJsZSB0byAndHJ1ZSciLAotICAgICAgICAgICAgICAgICAgIGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJhLnR3byIpLmVxdWFscygidHJ1ZSIpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgic2hvdWxkIG5vdCBoYXZlICdhLnRocmVlJyB2YXJpYWJsZSBzZXQiLAotICAgICAgICAgICAgICAgICAgIGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJhLnRocmVlIikpOwotICAgICAgICBhc3NlcnROdWxsKCJzaG91bGQgbm90IGhhdmUgJ2EubnVsbCcgdmFyaWFibGUgc2V0IiwKLSAgICAgICAgICAgICAgICAgICBnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiYS5udWxsIikpOwotICAgICAgICBhc3NlcnROdWxsKCJzaG91bGQgbm90IGhhdmUgJ2EuZGVmYXVsdCcgdmFyaWFibGUgc2V0IiwKLSAgICAgICAgICAgICAgICAgICBnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiYS5kZWZhdWx0IikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFVwU2NyaXB0KCJ0ZXN0U3dpdGNoVGFnLmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBnZXRKZWxseSgpLmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuc2V0VmFyaWFibGUoInN3aXRjaC5vbi5hIiwibmVnYXRpdmUgb25lIik7Ci0gICAgICAgIHNjcmlwdC5ydW4oZ2V0SmVsbHlDb250ZXh0KCksZ2V0WE1MT3V0cHV0KCkpOwotICAgICAgICBhc3NlcnROdWxsKCJzaG91bGQgbm90IGhhdmUgJ2Eub25lJyB2YXJpYWJsZSBzZXQiLAotICAgICAgICAgICAgICAgICAgIGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJhLm9uZSIpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgic2hvdWxkIG5vdCBoYXZlICdhLnR3bycgdmFyaWFibGUgc2V0IiwKLSAgICAgICAgICAgICAgICAgICBnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiYS50d28iKSk7Ci0gICAgICAgIGFzc2VydE51bGwoInNob3VsZCBub3QgaGF2ZSAnYS50aHJlZScgdmFyaWFibGUgc2V0IiwKLSAgICAgICAgICAgICAgICAgICBnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiYS50aHJlZSIpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgic2hvdWxkIG5vdCBoYXZlICdhLm51bGwnIHZhcmlhYmxlIHNldCIsCi0gICAgICAgICAgICAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImEubnVsbCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgc2V0ICdhLmRlZmF1bHQnIHZhcmlhYmxlIHRvICd0cnVlJyIsCi0gICAgICAgICAgICAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImEuZGVmYXVsdCIpLmVxdWFscygidHJ1ZSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbENhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0VXBTY3JpcHQoInRlc3RTd2l0Y2hUYWcuamVsbHkiKTsKLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IGdldEplbGx5KCkuY29tcGlsZVNjcmlwdCgpOwotICAgICAgICBnZXRKZWxseUNvbnRleHQoKS5zZXRWYXJpYWJsZSgic3dpdGNoLm9uLmEiLG51bGwpOwotICAgICAgICBzY3JpcHQucnVuKGdldEplbGx5Q29udGV4dCgpLGdldFhNTE91dHB1dCgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgic2hvdWxkIG5vdCBoYXZlICdhLm9uZScgdmFyaWFibGUgc2V0IiwKLSAgICAgICAgICAgICAgICAgICBnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiYS5vbmUiKSk7Ci0gICAgICAgIGFzc2VydE51bGwoInNob3VsZCBub3QgaGF2ZSAnYS50d28nIHZhcmlhYmxlIHNldCIsCi0gICAgICAgICAgICAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImEudHdvIikpOwotICAgICAgICBhc3NlcnROdWxsKCJzaG91bGQgbm90IGhhdmUgJ2EudGhyZWUnIHZhcmlhYmxlIHNldCIsCi0gICAgICAgICAgICAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImEudGhyZWUiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoInNob3VsZCBoYXZlIHNldCAnYS5udWxsJyB2YXJpYWJsZSB0byAndHJ1ZSciLAotICAgICAgICAgICAgICAgICAgIGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJhLm51bGwiKS5lcXVhbHMoInRydWUiKSk7Ci0gICAgICAgIGFzc2VydE51bGwoInNob3VsZCBub3QgaGF2ZSAnYS5kZWZhdWx0JyB2YXJpYWJsZSBzZXQiLAotICAgICAgICAgICAgICAgICAgIGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJhLmRlZmF1bHQiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN3aXRjaFdpdGhvdXRPbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRVcFNjcmlwdCgidGVzdFN3aXRjaFRhZy5qZWxseSIpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gZ2V0SmVsbHkoKS5jb21waWxlU2NyaXB0KCk7Ci0gICAgICAgIGdldEplbGx5Q29udGV4dCgpLnNldFZhcmlhYmxlKCJzd2l0Y2gud2l0aG91dC5vbiIsbmV3IEJvb2xlYW4odHJ1ZSkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2NyaXB0LnJ1bihnZXRKZWxseUNvbnRleHQoKSxnZXRYTUxPdXRwdXQoKSk7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2goTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENhc2VXaXRob3V0U3dpdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFVwU2NyaXB0KCJ0ZXN0U3dpdGNoVGFnLmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBnZXRKZWxseSgpLmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuc2V0VmFyaWFibGUoImNhc2Uud2l0aG91dC5zd2l0Y2giLG5ldyBCb29sZWFuKHRydWUpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNjcmlwdC5ydW4oZ2V0SmVsbHlDb250ZXh0KCksZ2V0WE1MT3V0cHV0KCkpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgSmVsbHlFeGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaChKZWxseUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRXaXRob3V0U3dpdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFVwU2NyaXB0KCJ0ZXN0U3dpdGNoVGFnLmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBnZXRKZWxseSgpLmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuc2V0VmFyaWFibGUoImRlZmF1bHQud2l0aG91dC5zd2l0Y2giLG5ldyBCb29sZWFuKHRydWUpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNjcmlwdC5ydW4oZ2V0SmVsbHlDb250ZXh0KCksZ2V0WE1MT3V0cHV0KCkpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgSmVsbHlFeGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaChKZWxseUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENhc2VXaXRob3V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0VXBTY3JpcHQoInRlc3RTd2l0Y2hUYWcuamVsbHkiKTsKLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IGdldEplbGx5KCkuY29tcGlsZVNjcmlwdCgpOwotICAgICAgICBnZXRKZWxseUNvbnRleHQoKS5zZXRWYXJpYWJsZSgiY2FzZS53aXRob3V0LnZhbHVlIixuZXcgQm9vbGVhbih0cnVlKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzY3JpcHQucnVuKGdldEplbGx5Q29udGV4dCgpLGdldFhNTE91dHB1dCgpKTsKLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaChNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVEZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRVcFNjcmlwdCgidGVzdFN3aXRjaFRhZy5qZWxseSIpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gZ2V0SmVsbHkoKS5jb21waWxlU2NyaXB0KCk7Ci0gICAgICAgIGdldEplbGx5Q29udGV4dCgpLnNldFZhcmlhYmxlKCJtdWx0aXBsZS5kZWZhdWx0cyIsbmV3IEJvb2xlYW4odHJ1ZSkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2NyaXB0LnJ1bihnZXRKZWxseUNvbnRleHQoKSxnZXRYTUxPdXRwdXQoKSk7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBKZWxseUV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoKEplbGx5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZUFmdGVyRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRVcFNjcmlwdCgidGVzdFN3aXRjaFRhZy5qZWxseSIpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gZ2V0SmVsbHkoKS5jb21waWxlU2NyaXB0KCk7Ci0gICAgICAgIGdldEplbGx5Q29udGV4dCgpLnNldFZhcmlhYmxlKCJjYXNlLmFmdGVyLmRlZmF1bHQiLG5ldyBCb29sZWFuKHRydWUpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNjcmlwdC5ydW4oZ2V0SmVsbHlDb250ZXh0KCksZ2V0WE1MT3V0cHV0KCkpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgSmVsbHlFeGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaChKZWxseUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9UZXN0VXNlQmVhblRhZy5qYXZhIGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvVGVzdFVzZUJlYW5UYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkZWNjZi4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9UZXN0VXNlQmVhblRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuY29yZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuU2NyaXB0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50ZXN0LkJhc2VKZWxseVRlc3Q7Ci0KLS8qKgotICogVGVzdHMgZm9yIFVzZUJlYW4gdGFnCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0VXNlQmVhblRhZyBleHRlbmRzIEJhc2VKZWxseVRlc3QgewotCi0gICAgcHVibGljIFRlc3RVc2VCZWFuVGFnKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3RVc2VCZWFuVGFnLmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGEgc2ltcGxlIHVzZUJlYW4gdGFnIHdvcmtzIG9rCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAgICAgc2V0VXBTY3JpcHQoInRlc3RVc2VCZWFuVGFnLmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBnZXRKZWxseSgpLmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgZ2V0SmVsbHlDb250ZXh0KCkuc2V0VmFyaWFibGUoInRlc3Quc2ltcGxlIixCb29sZWFuLlRSVUUpOwotICAgICAgICBzY3JpcHQucnVuKGdldEplbGx5Q29udGV4dCgpLGdldFhNTE91dHB1dCgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiZm9vIikpOwotICAgICAgICBhc3NlcnRUcnVlKGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJmb28iKSBpbnN0YW5jZW9mIEN1c3RvbWVyKTsKLSAgICAgICAgQ3VzdG9tZXIgY3VzdG9tZXIgPSAoQ3VzdG9tZXIpKGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJmb28iKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibmFtZSBub3Qgc2V0IiwgInRlc3RpbmciLCBjdXN0b21lci5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImNpdHkgbm90IHNldCIsICJzeWRuZXkiLCBjdXN0b21lci5nZXRDaXR5KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRlc3QgZXh0ZW5zaW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRVcFNjcmlwdCgidGVzdFVzZUJlYW5UYWcuamVsbHkiKTsKLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IGdldEplbGx5KCkuY29tcGlsZVNjcmlwdCgpOwotICAgICAgICBnZXRKZWxseUNvbnRleHQoKS5zZXRWYXJpYWJsZSgidGVzdC5leHRlbnNpb24iLEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIHNjcmlwdC5ydW4oZ2V0SmVsbHlDb250ZXh0KCksZ2V0WE1MT3V0cHV0KCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGdldEplbGx5Q29udGV4dCgpLmdldFZhcmlhYmxlKCJmb28iKSk7Ci0gICAgICAgIGFzc2VydFRydWUoZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImZvbyIpIGluc3RhbmNlb2YgQ3VzdG9tZXIpOwotICAgICAgICBDdXN0b21lciBjdXN0b21lciA9IChDdXN0b21lcikoZ2V0SmVsbHlDb250ZXh0KCkuZ2V0VmFyaWFibGUoImZvbyIpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgibmFtZSBzZXQgd3JvbmdseSIsIGN1c3RvbWVyLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiY2l0eSBub3Qgc2V0IiwgInN5ZG5leSIsIGN1c3RvbWVyLmdldENpdHkoKSk7Ci0gICAgfQotCi0gICAgLyoqIFRlc3Qgc2V0IGEgYmFkIHByb3BlcnR5IG5hbWUgb24gYSBiZWFuLCBzaG91bGQgZmFpbC4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRVcFNjcmlwdCgidGVzdFVzZUJlYW5UYWcuamVsbHkiKTsKLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IGdldEplbGx5KCkuY29tcGlsZVNjcmlwdCgpOwotICAgICAgICBnZXRKZWxseUNvbnRleHQoKS5zZXRWYXJpYWJsZSgidGVzdC5iYWRQcm9wZXJ0eSIsQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgc2NyaXB0LnJ1bihnZXRKZWxseUNvbnRleHQoKSxnZXRYTUxPdXRwdXQoKSk7Ci0gICAgICAgIEV4Y2VwdGlvbiBlID0gKEV4Y2VwdGlvbilnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiZXgiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiU2hvdWxkIGhhdmUgZmFpbGVkIHRvIHNldCBpbnZhbGlkIGJlYW4gcHJvcGVydHkiLCBlKTsKLSAgICB9Ci0KLSAgICAvKiogVGVzdCBzZXQgYSBiYWQgcHJvcGVydHkgbmFtZSBvbiBhIGJlYW4sIHRoaXMgc2hvdWxkIGJlIHNpbGVudGx5IGlnbm9yZWQuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWdub3JlZEJhZFByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFVwU2NyaXB0KCJ0ZXN0VXNlQmVhblRhZy5qZWxseSIpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gZ2V0SmVsbHkoKS5jb21waWxlU2NyaXB0KCk7Ci0gICAgICAgIGdldEplbGx5Q29udGV4dCgpLnNldFZhcmlhYmxlKCJ0ZXN0LmJhZFByb3BlcnR5SWdub3JlZCIsQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgc2NyaXB0LnJ1bihnZXRKZWxseUNvbnRleHQoKSxnZXRYTUxPdXRwdXQoKSk7Ci0gICAgICAgIEN1c3RvbWVyIGN1c3RvbWVyID0gKEN1c3RvbWVyKShnZXRKZWxseUNvbnRleHQoKS5nZXRWYXJpYWJsZSgiZm9vIikpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJTaG91bGQgaGF2ZSBpZ25vcmVkIGludmFsaWQgYmVhbiBwcm9wZXJ0eSIsIGN1c3RvbWVyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9hLmplbGx5IGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvYS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI3OWZjZi4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9hLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSI+Ci0KLSAgPGo6c2V0IHZhcj0iYSIgdmFsdWU9InRydWUiLz4KLQotICA8ajppbmNsdWRlIHVyaT0iYi5qZWxseSIvPgotCi08L2o6amVsbHk+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9iLmplbGx5IGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvYi5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgzMzJiMi4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9iLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSI+Ci0KLSAgICA8ajpzZXQgdmFyPSJiIiB2YWx1ZT0idHJ1ZSIvPgotICAgIAotICAgIDxqOmluY2x1ZGUgdXJpPSJjLmplbGx5Ii8+Ci0KLTwvajpqZWxseT4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL2MuamVsbHkgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9jLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjMxMWE5Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL2MuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIj4KLQotICAgIDxqOnNldCB2YXI9ImMiIHZhbHVlPSJ0cnVlIi8+Ci0KLTwvajpqZWxseT4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL2V4dGVuc2lvbi9Db3JlRXh0ZW5zaW9uVGFnTGlicmFyeS5qYXZhIGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvZXh0ZW5zaW9uL0NvcmVFeHRlbnNpb25UYWdMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOWUxNTguLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvZXh0ZW5zaW9uL0NvcmVFeHRlbnNpb25UYWdMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmUuQ29yZVRhZ0xpYnJhcnk7Ci0KLS8qKgotICogVGVzdCB0YWcgbGliIGZvciBleHRlbmRpbmcgY29yZQotICovCi1wdWJsaWMgY2xhc3MgQ29yZUV4dGVuc2lvblRhZ0xpYnJhcnkgZXh0ZW5kcyBDb3JlVGFnTGlicmFyeSB7Ci0KLSAgICBwdWJsaWMgQ29yZUV4dGVuc2lvblRhZ0xpYnJhcnkoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJ1c2VCZWFuWCIsIFVzZUJlYW5FeHRlbmRlZFRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJ1c2VCZWFuWFAiLCBVc2VCZWFuSWdub3JlQmFkUHJvcHMuY2xhc3MpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL2V4dGVuc2lvbi9Vc2VCZWFuRXh0ZW5kZWRUYWcuamF2YSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL2V4dGVuc2lvbi9Vc2VCZWFuRXh0ZW5kZWRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhN2UyOC4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9leHRlbnNpb24vVXNlQmVhbkV4dGVuZGVkVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmUuVXNlQmVhblRhZzsKLQotLyoqCi0gKiBUZXN0IHRhZyB0byBjaGVjayB0aGUgaWdub3JlZCBwcm9wZXJ0aWVzIHdvcmsgb2sKLSAqLwotcHVibGljIGNsYXNzIFVzZUJlYW5FeHRlbmRlZFRhZyBleHRlbmRzIFVzZUJlYW5UYWcgewotCi0gICAgLyoqCi0gICAgICogQHNlZSBVc2VCZWFuVGFnI1VzZUJlYW5UYWcoKQotICAgICAqLwotICAgIHB1YmxpYyBVc2VCZWFuRXh0ZW5kZWRUYWcoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGFkZElnbm9yZVByb3BlcnR5KCJuYW1lIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBVc2VCZWFuVGFnI1VzZUJlYW5UYWcoQ2xhc3MpCi0gICAgICovCi0gICAgcHVibGljIFVzZUJlYW5FeHRlbmRlZFRhZyhDbGFzcyBkZWZhdWx0Q2xhc3MpIHsKLSAgICAgICAgc3VwZXIoZGVmYXVsdENsYXNzKTsKLSAgICAgICAgYWRkSWdub3JlUHJvcGVydHkoIm5hbWUiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL2V4dGVuc2lvbi9Vc2VCZWFuSWdub3JlQmFkUHJvcHMuamF2YSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL2V4dGVuc2lvbi9Vc2VCZWFuSWdub3JlQmFkUHJvcHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU5ZGMwMS4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS9leHRlbnNpb24vVXNlQmVhbklnbm9yZUJhZFByb3BzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmNvcmUuVXNlQmVhblRhZzsKLQotLyoqCi0gKiBAYXV0aG9yIEhhbnMgR2lsZGUKLSAqLwotcHVibGljIGNsYXNzIFVzZUJlYW5JZ25vcmVCYWRQcm9wcyBleHRlbmRzIFVzZUJlYW5UYWcgewotICAgIHB1YmxpYyBVc2VCZWFuSWdub3JlQmFkUHJvcHMoKSB7Ci0gICAgICAgIHNldElnbm9yZVVua25vd25Qcm9wZXJ0aWVzKHRydWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL3Rlc3RCcmVha1RhZy5qZWxseSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL3Rlc3RCcmVha1RhZy5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNkYTQzYS4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS90ZXN0QnJlYWtUYWcuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IS0tDQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4NCi0gIA0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIA0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIA0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSI+DQotDQotICAgIDxqOnNldCB2YXI9InNpbXBsZVJlc3VsdCIgdmFsdWU9IiIvPg0KLSAgICA8ajpmb3JFYWNoIHZhcj0iY291bnRlciIgYmVnaW49IjEiIGVuZD0iMTAiPg0KLSAgICAgICA8ajpzZXQgdmFyPSJzaW1wbGVSZXN1bHQiIHZhbHVlPSIke3NpbXBsZVJlc3VsdH0ke2NvdW50ZXJ9Ii8+DQotICAgICAgIDxqOmlmIHRlc3Q9IiR7Y291bnRlcj09NX0iPg0KLSAgICAgICAgICA8ajpicmVhay8+DQotICAgICAgIDwvajppZj4NCi0gICAgPC9qOmZvckVhY2g+DQotICAgICAgDQotICAgIDxqOnNldCB2YXI9ImNvbmRpdGlvbmFsUmVzdWx0IiB2YWx1ZT0iIi8+DQotICAgIDxqOmZvckVhY2ggdmFyPSJjb3VudGVyIiBiZWdpbj0iMSIgZW5kPSIxMCI+DQotICAgICAgIDxqOnNldCB2YXI9ImNvbmRpdGlvbmFsUmVzdWx0IiB2YWx1ZT0iJHtjb25kaXRpb25hbFJlc3VsdH0ke2NvdW50ZXJ9Ii8+DQotICAgICAgIDxqOmJyZWFrIHRlc3Q9IiR7Y291bnRlcj09NX0iLz4NCi0gICAgPC9qOmZvckVhY2g+ICANCi0gICAgDQotICAgIDxqOnNldCB2YXI9InZhckJyZWFrc1Jlc3VsdCIgdmFsdWU9IiIvPg0KLSAgICA8ajpmb3JFYWNoIHZhcj0iY291bnRlciIgYmVnaW49IjEiIGVuZD0iMTAiPg0KLSAgICAgICA8ajpzZXQgdmFyPSJ2YXJCcmVha3NSZXN1bHQiIHZhbHVlPSIke3ZhckJyZWFrc1Jlc3VsdH0ke2NvdW50ZXJ9Ii8+DQotICAgICAgIDxqOmJyZWFrIHZhcj0idmFyQnJva2VuIiB0ZXN0PSIke2NvdW50ZXI9PTV9Ii8+DQotICAgIDwvajpmb3JFYWNoPiAgDQotDQotICAgIDxqOnNldCB2YXI9InZhck5vQnJlYWtzUmVzdWx0IiB2YWx1ZT0iIi8+DQotICAgIDxqOmZvckVhY2ggdmFyPSJjb3VudGVyIiBiZWdpbj0iMSIgZW5kPSIxMCI+DQotICAgICAgIDxqOnNldCB2YXI9InZhck5vQnJlYWtzUmVzdWx0IiB2YWx1ZT0iJHt2YXJOb0JyZWFrc1Jlc3VsdH0ke2NvdW50ZXJ9Ii8+DQotICAgICAgIDxqOmJyZWFrIHZhcj0idmFyTm90QnJva2VuIiB0ZXN0PSIke2NvdW50ZXI9PTExfSIvPg0KLSAgICA8L2o6Zm9yRWFjaD4gIA0KLSAgICANCi0gICAgDQotPC9qOmplbGx5PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL3Rlc3RDaG9vc2VUYWcuamVsbHkgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS90ZXN0Q2hvb3NlVGFnLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDExMTY3Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL3Rlc3RDaG9vc2VUYWcuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIj4KLSAgICA8ajpzZXQgdmFyPSJyZXN1bHQudHJ1ZSI+Ci0gICAgICA8ajpjaG9vc2U+Ci0gICAgICAgIDxqOndoZW4gdGVzdD0iJHsxID09IDF9Ij4KLSAgICAgICAgICBBCi0gICAgICAgIDwvajp3aGVuPgotICAgICAgICA8ajpvdGhlcndpc2U+Ci0gICAgICAgICAgQgotICAgICAgICA8L2o6b3RoZXJ3aXNlPgotICAgICAgICBDICAgICAgICAKLSAgICAgIDwvajpjaG9vc2U+Ci0gICAgPC9qOnNldD4KLSAgICAKLSAgICA8ajpzZXQgdmFyPSJyZXN1bHQuZmFsc2UiPgotICAgICAgPGo6Y2hvb3NlPgotICAgICAgICA8ajp3aGVuIHRlc3Q9IiR7MCA9PSAxfSI+Ci0gICAgICAgICAgQQotICAgICAgICA8L2o6d2hlbj4KLSAgICAgICAgPGo6b3RoZXJ3aXNlPgotICAgICAgICAgIEIKLSAgICAgICAgPC9qOm90aGVyd2lzZT4KLSAgICAgICAgQyAgICAgICAgCi0gICAgICA8L2o6Y2hvb3NlPgotICAgIDwvajpzZXQ+Ci0gICAgCi0gICAgCi08L2o6amVsbHk+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvdGVzdEZpbGVUYWcuamVsbHkgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS90ZXN0RmlsZVRhZy5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhiOGFlYS4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS90ZXN0RmlsZVRhZy5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiPgotICAgIDxqOmZpbGUgdmFyPSJ0ZXN0RmlsZVRhZyIgb3V0cHV0TW9kZT0iaHRtbCIgZXNjYXBlVGV4dD0iZmFsc2UiPgotICAgICAgPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotICAgICAgPC9odG1sPgotICAgIDwvajpmaWxlPgotPC9qOmplbGx5PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL3Rlc3RGb3JFYWNoVGFnLmplbGx5IGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvdGVzdEZvckVhY2hUYWcuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZjY4OTQuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvdGVzdEZvckVhY2hUYWcuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIj4KLSAgPGo6aWYgdGVzdD0iJHt0ZXN0TXlMaXN0fSI+Ci0gICAgPGo6c2V0IHZhcj0icmVzdWx0Lm9yZGVyZWQiPgotICAgICAgPGo6Zm9yRWFjaCB2YXI9Iml0ZW0iIAotICAgICAgICAgICAgICAgICBpdGVtcz0iJHtteUxpc3R9IiAKLSAgICAgICAgICAgICAgICAgdmFyU3RhdHVzPSJzdGF0dXMiCi0gICAgICAgICAgICAgICAgIGJlZ2luPSIyIgotICAgICAgICAgICAgICAgICBlbmQ9IjYiCi0gICAgICAgICAgICAgICAgIHN0ZXA9IjIiPgotICAgICAgICA8ajpjaG9vc2U+Ci0gICAgICAgICAgPGo6d2hlbiB0ZXN0PSIke3N0YXR1cy5maXJzdH0iPgotICAgICAgICAgICAgRklSU1RfCi0gICAgICAgICAgICAke3N0YXR1cy5iZWdpbn0KLSAgICAgICAgICAgICR7c3RhdHVzLmVuZH0KLSAgICAgICAgICAgICR7c3RhdHVzLnN0ZXB9XwotICAgICAgICAgIDwvajp3aGVuPgotICAgICAgICAgIDxqOndoZW4gdGVzdD0iJHtzdGF0dXMubGFzdH0iPgotICAgICAgICAgICAgTEFTVF8KLSAgICAgICAgICA8L2o6d2hlbj4KLSAgICAgICAgICA8ajpvdGhlcndpc2U+Ci0gICAgICAgICAgICBNSURETEVfCi0gICAgICAgICAgPC9qOm90aGVyd2lzZT4KLSAgICAgICAgPC9qOmNob29zZT4KLSAgICAgICAgPGo6aWYgdGVzdD0iJHtub3QgbXlMaXN0W3N0YXR1cy5pbmRleF0uZXF1YWxzKHN0YXR1cy5jdXJyZW50KX0iPgotICAgICAgICAgIEZBSUwKLSAgICAgICAgPC9qOmlmPgotICAgICAgICAke3N0YXR1cy5jb3VudH0KLSAgICAgICAgJHtzdGF0dXMuaW5kZXh9Ci0gICAgICAgICR7c3RhdHVzLmN1cnJlbnR9Ci0gICAgICAgIC8KLSAgICAgIDwvajpmb3JFYWNoPgotICAgIDwvajpzZXQ+Ci0gIDwvajppZj4KLSAgCi0gIDwhLS0gbmV4dCB0ZXN0IC0tPgotICA8ajppZiB0ZXN0PSIke3Rlc3ROdW1MaXN0fSI+Ci0gICAgPGo6c2V0IHZhcj0icmVzdWx0Lm9yZGVyZWQiPgotICAgICAgPGo6Zm9yRWFjaCB2YXI9Iml0ZW0iIAotICAgICAgICAgICAgICAgICB2YXJTdGF0dXM9InN0YXR1cyIKLSAgICAgICAgICAgICAgICAgYmVnaW49IjIiCi0gICAgICAgICAgICAgICAgIGVuZD0iNiIKLSAgICAgICAgICAgICAgICAgc3RlcD0iMiI+Ci0gICAgICAgIDxqOmNob29zZT4KLSAgICAgICAgICA8ajp3aGVuIHRlc3Q9IiR7c3RhdHVzLmZpcnN0fSI+Ci0gICAgICAgICAgICBGSVJTVF8KLSAgICAgICAgICAgICR7c3RhdHVzLmJlZ2lufQotICAgICAgICAgICAgJHtzdGF0dXMuZW5kfQotICAgICAgICAgICAgJHtzdGF0dXMuc3RlcH1fCi0gICAgICAgICAgPC9qOndoZW4+Ci0gICAgICAgICAgPGo6d2hlbiB0ZXN0PSIke3N0YXR1cy5sYXN0fSI+Ci0gICAgICAgICAgICBMQVNUXwotICAgICAgICAgIDwvajp3aGVuPgotICAgICAgICAgIDxqOm90aGVyd2lzZT4KLSAgICAgICAgICAgIE1JRERMRV8KLSAgICAgICAgICA8L2o6b3RoZXJ3aXNlPgotICAgICAgICA8L2o6Y2hvb3NlPgotICAgICAgICAke3N0YXR1cy5jb3VudH0KLSAgICAgICAgJHtzdGF0dXMuaW5kZXh9Ci0gICAgICAgICR7c3RhdHVzLmN1cnJlbnR9Ci0gICAgICAgIC8KLSAgICAgIDwvajpmb3JFYWNoPgotICAgIDwvajpzZXQ+Ci0gIDwvajppZj4KLTwvajpqZWxseT4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL3Rlc3RHZXRTdGF0aWNUYWcuamVsbHkgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS90ZXN0R2V0U3RhdGljVGFnLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWU2Mzg0Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL3Rlc3RHZXRTdGF0aWNUYWcuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIj4KLQotICAgIDxqOmlmIHRlc3Q9IiR7dGVzdC5JbnRlZ2VyLk1BWF9WQUxVRX0iPgotICAgICAgICA8ajpnZXRTdGF0aWMgdmFyPSJ2YWx1ZSIgY2xhc3NOYW1lPSJqYXZhLmxhbmcuSW50ZWdlciIKLSAgICAgICAgICAgICAgICAgICAgIGZpZWxkPSJNQVhfVkFMVUUiLz4KLSAgICA8L2o6aWY+Ci0KLSAgICA8ajppZiB0ZXN0PSIke3Rlc3QuSW52YWxpZEdldH0iPgotICAgICAgICA8ajpnZXRTdGF0aWMgdmFyPSJ2YWx1ZSIgY2xhc3NOYW1lPSJqYXZhLmxhbmcuSW50ZWdlciIKLSAgICAgICAgICAgICAgICAgICAgIGZpZWxkPSJGT09CQVIiLz4KLSAgICA8L2o6aWY+Ci0KLTwvajpqZWxseT4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL3Rlc3RJbnZva2VTdGF0aWNUYWcuamVsbHkgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS90ZXN0SW52b2tlU3RhdGljVGFnLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjMyNGMzLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL3Rlc3RJbnZva2VTdGF0aWNUYWcuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIj4KLQotICAgIDxqOmlmIHRlc3Q9IiR7dGVzdC5zaW1wbGVTeXN0ZW1JbnZva2V9Ij4KLSAgICAgICAgPGo6aW52b2tlU3RhdGljIG1ldGhvZD0iZ2V0UHJvcGVydHkiIGNsYXNzTmFtZT0iamF2YS5sYW5nLlN5c3RlbSIgdmFyPSJwcm9wZXJ0eU5hbWUiPgotICAgICAgICAgICAgPGo6YXJnIHZhbHVlPSIke3Byb3BlcnR5TmFtZX0iIC8+Ci0gICAgICAgIDwvajppbnZva2VTdGF0aWM+Ci0gICAgPC9qOmlmPgotICAgIAotICAgIDxqOmlmIHRlc3Q9IiR7dGVzdC5zeXN0ZW1JbnZva2V9Ij4KLSAgICAgICAgPGo6aW52b2tlU3RhdGljIG1ldGhvZD0ic2V0UHJvcGVydHkiIGNsYXNzTmFtZT0iamF2YS5sYW5nLlN5c3RlbSIgdmFyPSJyZXN1bHQiPgotICAgICAgICAgICAgPGo6YXJnIHZhbHVlPSIke3Byb3BlcnR5TmFtZX0iIC8+Ci0gICAgICAgICAgICA8ajphcmcgdmFsdWU9IiR7cHJvcGVydHlWYWx1ZX0iLz4KLSAgICAgICAgPC9qOmludm9rZVN0YXRpYz4KLSAgICA8L2o6aWY+Ci0KLSAgICA8ajppZiB0ZXN0PSIke3Rlc3QubWVzc2FnZUZvcm1hdEludm9rZX0iPgotICAgICAgICA8ajppbnZva2VTdGF0aWMgbWV0aG9kPSJmb3JtYXQiIGNsYXNzTmFtZT0iamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQiIHZhcj0ibWVzc2FnZSI+Ci0gICAgICAgICAgICA8ajphcmcgdmFsdWU9IiR7bWVzc2FnZX0iIC8+Ci0gICAgICAgICAgICA8ajphcmcgdmFsdWU9IiR7YXJnc30iIC8+Ci0gICAgICAgIDwvajppbnZva2VTdGF0aWM+Ci0gICAgPC9qOmlmPgotICAgIAotICAgIDxqOmlmIHRlc3Q9IiR7dGVzdC5pbnZva2VUaGF0VGhyb3dzRXhjZXB0aW9ufSI+Ci0gICAgICAgIDxqOnNldCB2YXI9ImV4Y2VwdGlvbk1lc3NhZ2UiIHZhbHVlPSJtZXRob2QgdGhyZXcgYW4gZXhjZXB0aW9uIi8+Ci0gICAgICAgIDxqOmNhdGNoIHZhcj0iamVsbHlFeGNlcHRpb24iPgotICAgICAgICAgICAgPGo6aW52b2tlU3RhdGljIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmNvcmUuRXhjZXB0aW9uQmVhbiIgbWV0aG9kPSJzdGF0aWNNZXRob2QiIGV4Y2VwdGlvblZhcj0iZXhjZXB0aW9uVGhyb3duIj4KLSAgICAgICAgICAgICAgICA8ajphcmcgdmFsdWU9IiR7ZXhjZXB0aW9uTWVzc2FnZX0iLz4KLSAgICAgICAgICAgIDwvajppbnZva2VTdGF0aWM+Ci0gICAgICAgIDwvajpjYXRjaD4KLSAgICA8L2o6aWY+Ci0gICAgPGo6aWYgdGVzdD0iJHt0ZXN0Lmludm9rZVRoYXREb2VzTm90SGFuZGxlRXhjZXB0aW9ufSI+Ci0gICAgICAgIDxqOnNldCB2YXI9ImV4Y2VwdGlvbk1lc3NhZ2UiIHZhbHVlPSJtZXRob2QgdGhyZXcgYW4gZXhjZXB0aW9uIi8+Ci0gICAgICAgIDxqOmNhdGNoIHZhcj0iamVsbHlFeGNlcHRpb24iPgotICAgICAgICAgICAgPGo6aW52b2tlU3RhdGljIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmNvcmUuRXhjZXB0aW9uQmVhbiIgbWV0aG9kPSJzdGF0aWNNZXRob2QiPgotICAgICAgICAgICAgICAgIDxqOmFyZyB2YWx1ZT0iJHtleGNlcHRpb25NZXNzYWdlfSIvPgotICAgICAgICAgICAgPC9qOmludm9rZVN0YXRpYz4KLSAgICAgICAgPC9qOmNhdGNoPgotICAgIDwvajppZj4KLSAgICAKLSAgICAKLTwvajpqZWxseT4KLQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvdGVzdEludm9rZVRhZy5qZWxseSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL3Rlc3RJbnZva2VUYWcuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzODg0N2EuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvdGVzdEludm9rZVRhZy5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiPgotCi0gICAgPGo6aWYgdGVzdD0iJHt0ZXN0LnNpbXBsZUludm9rZX0iPgotICAgICAgICA8ajpzZXQgdmFyPSJuYW1lYXJnIiB2YWx1ZT0iSmFuZSBEb2UiLz4KLSAgICAgICAgPGo6bmV3IHZhcj0iZm9vIiBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlLkN1c3RvbWVyIi8+Ci0gICAgICAgIDxqOmludm9rZSBtZXRob2Q9InNldE5hbWUiIG9uPSIke2Zvb30iPgotICAgICAgICAgICAgPGo6YXJnIHZhbHVlPSIke25hbWVhcmd9Ii8+Ci0gICAgICAgIDwvajppbnZva2U+Ci0gICAgICAgIDxqOmludm9rZSBtZXRob2Q9InNldENpdHkiIG9uPSIke2Zvb30iPgotICAgICAgICAgICAgPGo6YXJnIHZhbHVlPSJDaGljYWdvIi8+Ci0gICAgICAgIDwvajppbnZva2U+Ci0gICAgICAgIDxqOmludm9rZSBtZXRob2Q9ImFkZE9yZGVyIiBvbj0iJHtmb299Ij4KLSAgICAgICAgICAgIDxqOmFyZz48ajpuZXcgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuY29yZS5PcmRlciIvPjwvajphcmc+Ci0gICAgICAgIDwvajppbnZva2U+Ci0gICAgPC9qOmlmPgotCi0gICAgPGo6aWYgdGVzdD0iJHt0ZXN0Lmludm9rZVdpdGhWYXJ9Ij4KLSAgICAgICAgPGo6bmV3IHZhcj0ibGlzdCIgY2xhc3NOYW1lPSJqYXZhLnV0aWwuQXJyYXlMaXN0Ii8+Ci0gICAgICAgIDxqOmludm9rZSBvbj0iJHtsaXN0fSIgbWV0aG9kPSJhZGQiPjxqOmFyZyB2YWx1ZT0iT25lIi8+PC9qOmludm9rZT4KLSAgICAgICAgPGo6aW52b2tlIG9uPSIke2xpc3R9IiBtZXRob2Q9ImFkZCI+PGo6YXJnIHZhbHVlPSJUd28iLz48L2o6aW52b2tlPgotICAgICAgICA8ajppbnZva2Ugb249IiR7bGlzdH0iIG1ldGhvZD0iYWRkIj48ajphcmcgdmFsdWU9IlRocmVlIi8+PC9qOmludm9rZT4KLSAgICAgICAgPGo6aW52b2tlIG9uPSIke2xpc3R9IiBtZXRob2Q9InNpemUiIHZhcj0ic2l6ZSIvPgotICAgIDwvajppZj4KLQotICAgIDxqOmlmIHRlc3Q9IiR7dGVzdC5pbnZva2VXaXRoUmV0dXJuZWRWYWx1ZUFzQXJnfSI+Ci0gICAgICAgIDxqOm5ldyB2YXI9Imxpc3QiIGNsYXNzTmFtZT0iamF2YS51dGlsLkFycmF5TGlzdCIvPgotICAgICAgICA8ajppbnZva2Ugb249IiR7bGlzdH0iIG1ldGhvZD0iYWRkIj48ajphcmcgdmFsdWU9IkphbmUgRG9lIi8+PC9qOmludm9rZT4KLSAgICAgICAgPGo6aW52b2tlIG9uPSIke2xpc3R9IiBtZXRob2Q9ImFkZCI+PGo6YXJnIHZhbHVlPSJDaGljYWdvIi8+PC9qOmludm9rZT4KLSAgICAgICAgCi0gICAgICAgIDxqOm5ldyB2YXI9ImN1c3RvbWVyIiBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlLkN1c3RvbWVyIj4KLSAgICAgICAgICAgIDxqOmFyZz48ajppbnZva2Ugb249IiR7bGlzdH0iIG1ldGhvZD0iZ2V0Ij48ajphcmcgdHlwZT0iaW50IiB2YWx1ZT0iMCIvPjwvajppbnZva2U+PC9qOmFyZz4KLSAgICAgICAgICAgIDxqOmFyZz48ajppbnZva2Ugb249IiR7bGlzdH0iIG1ldGhvZD0iZ2V0Ij48ajphcmcgdHlwZT0iaW50IiB2YWx1ZT0iMSIvPjwvajppbnZva2U+PC9qOmFyZz4KLSAgICAgICAgPC9qOm5ldz4KLSAgICA8L2o6aWY+Ci0KLSAgICA8ajppZiB0ZXN0PSIke3Rlc3QuaW52b2tlV2l0aFJldHVybmVkVmFsdWVBc0FyZ0FuZFZhcn0iPgotICAgICAgICA8ajpuZXcgdmFyPSJsaXN0IiBjbGFzc05hbWU9ImphdmEudXRpbC5BcnJheUxpc3QiLz4KLSAgICAgICAgPGo6aW52b2tlIG9uPSIke2xpc3R9IiBtZXRob2Q9ImFkZCI+PGo6YXJnIHZhbHVlPSJKYW5lIERvZSIvPjwvajppbnZva2U+Ci0gICAgICAgIDxqOmludm9rZSBvbj0iJHtsaXN0fSIgbWV0aG9kPSJhZGQiPjxqOmFyZyB2YWx1ZT0iQ2hpY2FnbyIvPjwvajppbnZva2U+Ci0gICAgICAgIAotICAgICAgICA8ajpuZXcgdmFyPSJjdXN0b21lciIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuY29yZS5DdXN0b21lciI+Ci0gICAgICAgICAgICA8ajphcmc+PGo6aW52b2tlIG9uPSIke2xpc3R9IiBtZXRob2Q9ImdldCI+PGo6YXJnIHR5cGU9ImludCIgdmFsdWU9IjAiLz48L2o6aW52b2tlPjwvajphcmc+Ci0gICAgICAgICAgICA8ajphcmc+PGo6aW52b2tlIG9uPSIke2xpc3R9IiBtZXRob2Q9ImdldCIgdmFyPSJhcmd0d28iPjxqOmFyZyB0eXBlPSJpbnQiIHZhbHVlPSIxIi8+PC9qOmludm9rZT48L2o6YXJnPgotICAgICAgICA8L2o6bmV3PgotICAgIDwvajppZj4KLSAgICAKLSAgICA8ajppZiB0ZXN0PSIke3Rlc3QuaW52b2tlVGhhdFRocm93c0V4Y2VwdGlvbn0iPgotICAgICAgICA8ajpzZXQgdmFyPSJleGNlcHRpb25NZXNzYWdlIiB2YWx1ZT0ibWV0aG9kIHRocmV3IGFuIGV4Y2VwdGlvbiIvPgotICAgICAgICA8ajpuZXcgdmFyPSJleGNlcHRpb25CZWFuIiBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlLkV4Y2VwdGlvbkJlYW4iLz4KLSAgICAgICAgPGo6Y2F0Y2ggdmFyPSJqZWxseUV4Y2VwdGlvbiI+Ci0gICAgICAgICAgICA8ajppbnZva2Ugb249IiR7ZXhjZXB0aW9uQmVhbn0iIG1ldGhvZD0iaW5zdGFuY2VNZXRob2QiIGV4Y2VwdGlvblZhcj0iZXhjZXB0aW9uVGhyb3duIj4KLSAgICAgICAgICAgICAgICA8ajphcmcgdmFsdWU9IiR7ZXhjZXB0aW9uTWVzc2FnZX0iLz4KLSAgICAgICAgICAgIDwvajppbnZva2U+Ci0gICAgICAgIDwvajpjYXRjaD4KLSAgICA8L2o6aWY+Ci0gICAgPGo6aWYgdGVzdD0iJHt0ZXN0Lmludm9rZVRoYXREb2VzTm90SGFuZGxlRXhjZXB0aW9ufSI+Ci0gICAgICAgIDxqOnNldCB2YXI9ImV4Y2VwdGlvbk1lc3NhZ2UiIHZhbHVlPSJtZXRob2QgdGhyZXcgYW4gZXhjZXB0aW9uIi8+Ci0gICAgICAgIDxqOm5ldyB2YXI9ImV4Y2VwdGlvbkJlYW4iIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmNvcmUuRXhjZXB0aW9uQmVhbiIvPgotICAgICAgICA8ajpjYXRjaCB2YXI9ImplbGx5RXhjZXB0aW9uIj4KLSAgICAgICAgICAgIDxqOmludm9rZSBvbj0iJHtleGNlcHRpb25CZWFufSIgbWV0aG9kPSJpbnN0YW5jZU1ldGhvZCI+Ci0gICAgICAgICAgICAgICAgPGo6YXJnIHZhbHVlPSIke2V4Y2VwdGlvbk1lc3NhZ2V9Ii8+Ci0gICAgICAgICAgICA8L2o6aW52b2tlPgotICAgICAgICA8L2o6Y2F0Y2g+Ci0gICAgPC9qOmlmPgotCi08L2o6amVsbHk+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS90ZXN0TmV3VGFnLmplbGx5IGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvdGVzdE5ld1RhZy5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0MWUwMC4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvY29yZS90ZXN0TmV3VGFnLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSI+Ci0gICAgPGo6aWYgdGVzdD0iJHt0ZXN0LnNpbXBsZU5ld30iPgotICAgICAgICA8ajpuZXcgdmFyPSJmb28iIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmNvcmUuQ3VzdG9tZXIiLz4KLSAgICA8L2o6aWY+Ci0gICAgPGo6aWYgdGVzdD0iJHt0ZXN0Lm5ld1RoZW5PdmVyd3JpdGV9Ij4KLSAgICAgICAgPGo6bmV3IHZhcj0iZm9vIiBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlLkN1c3RvbWVyIi8+Ci0gICAgICAgIDxqOm5ldyB2YXI9ImZvbyIgY2xhc3NOYW1lPSJqYXZhLnV0aWwuRGF0ZSIvPgotICAgIDwvajppZj4KLSAgICA8ajppZiB0ZXN0PSIke3Rlc3QubmV3V2l0aExpdGVyYWxBcmd9Ij4KLSAgICAgICAgPGo6bmV3IHZhcj0iZm9vIiBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlLkN1c3RvbWVyIj4KLSAgICAgICAgICAgIDxqOmFyZyB2YWx1ZT0iSmFuZSBEb2UiLz4KLSAgICAgICAgPC9qOm5ldz4KLSAgICA8L2o6aWY+Ci0gICAgPGo6aWYgdGVzdD0iJHt0ZXN0Lm5ld1dpdGhUd29BcmdzfSI+Ci0gICAgICAgIDxqOm5ldyB2YXI9ImZvbyIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuY29yZS5DdXN0b21lciI+Ci0gICAgICAgICAgICA8ajphcmcgdmFsdWU9IkphbmUgRG9lIi8+Ci0gICAgICAgICAgICA8ajphcmcgdmFsdWU9IkNoaWNhZ28iLz4KLSAgICAgICAgPC9qOm5ldz4KLSAgICA8L2o6aWY+Ci0gICAgPGo6aWYgdGVzdD0iJHt0ZXN0Lm5ld1dpdGhFeHByZXNzaW9uQXJnfSI+Ci0gICAgICAgIDxqOnNldCB2YXI9Im5hbWVhcmciIHZhbHVlPSJKYW5lIERvZSIvPgotICAgICAgICA8ajpuZXcgdmFyPSJmb28iIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmNvcmUuQ3VzdG9tZXIiPgotICAgICAgICAgICAgPGo6YXJnIHZhbHVlPSIke25hbWVhcmd9Ii8+Ci0gICAgICAgIDwvajpuZXc+Ci0gICAgPC9qOmlmPgotICAgIDxqOmlmIHRlc3Q9IiR7dGVzdC5uZXdXaXRoTnVsbEFyZ30iPgotICAgICAgICA8ajpuZXcgdmFyPSJmb28iIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmNvcmUuQ3VzdG9tZXIiPgotICAgICAgICAgICAgPGo6YXJnIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgICAgICAgPC9qOm5ldz4KLSAgICA8L2o6aWY+Ci0gICAgPGo6aWYgdGVzdD0iJHt0ZXN0Lm5ld1dpdGhOZXdBcmd9Ij4KLSAgICAgICAgPGo6bmV3IHZhcj0iZm9vIiBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlLkN1c3RvbWVyIj4KLSAgICAgICAgICAgIDxqOmFyZyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8ajpuZXcgY2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gICAgICAgICAgICA8L2o6YXJnPgotICAgICAgICA8L2o6bmV3PgotICAgICAgICA8ajpuZXcgdmFyPSJiYXIiIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmNvcmUuQ3VzdG9tZXIiPgotICAgICAgICAgICAgPGo6YXJnIHZhbHVlPSJKYW5lIERvZSIvPgotICAgICAgICAgICAgPGo6YXJnIHZhbHVlPSJDaGljYWdvIi8+Ci0gICAgICAgICAgICA8ajphcmc+PGo6bmV3IGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmNvcmUuT3JkZXIiLz48L2o6YXJnPgotICAgICAgICA8L2o6bmV3PgotICAgICAgICA8ajpuZXcgdmFyPSJxdXgiIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmNvcmUuQ3VzdG9tZXIiPgotICAgICAgICAgICAgPGo6YXJnPgotICAgICAgICAgICAgICAgIDxqOm5ldyBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlLkN1c3RvbWVyIj4KLSAgICAgICAgICAgICAgICAgICAgPGo6YXJnIHZhbHVlPSJKYW5lIERvZSIvPgotICAgICAgICAgICAgICAgICAgICA8ajphcmcgdmFsdWU9IkNoaWNhZ28iLz4KLSAgICAgICAgICAgICAgICAgICAgPGo6YXJnPjxqOm5ldyBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlLk9yZGVyIi8+PC9qOmFyZz4KLSAgICAgICAgICAgICAgICA8L2o6bmV3PgotICAgICAgICAgICAgPC9qOmFyZz4KLSAgICAgICAgPC9qOm5ldz4KLSAgICA8L2o6aWY+Ci0gICAgPGo6aWYgdGVzdD0iJHt0ZXN0Lm5ld1dpdGhVc2VCZWFuQXJnfSI+Ci0gICAgICAgIDxqOm5ldyB2YXI9ImZvbyIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuY29yZS5DdXN0b21lciI+Ci0gICAgICAgICAgICA8ajphcmc+Ci0gICAgICAgICAgICAgICAgPGo6dXNlQmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmNvcmUuQ3VzdG9tZXIiIG5hbWU9IkphbmUgRG9lIiBjaXR5PSJDaGljYWdvIiBsb2NhdGlvbj0iTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDwvajphcmc+Ci0gICAgICAgIDwvajpuZXc+Ci0gICAgPC9qOmlmPgotPC9qOmplbGx5PgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvdGVzdFN3aXRjaFRhZy5qZWxseSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL3Rlc3RTd2l0Y2hUYWcuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNTVmMDYuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvdGVzdFN3aXRjaFRhZy5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiPgotICAgIDxqOnN3aXRjaCBvbj0iJHtzd2l0Y2gub24uYX0iPgotICAgICAgICA8ajpjYXNlIHZhbHVlPSJvbmUiIGZhbGxUaHJ1PSJ0cnVlIj4KLSAgICAgICAgICAgIDxqOnNldCB2YXI9ImEub25lIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICA8L2o6Y2FzZT4KLSAgICAgICAgPGo6Y2FzZSB2YWx1ZT0idHdvIj4KLSAgICAgICAgICAgIDxqOnNldCB2YXI9ImEudHdvIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICA8L2o6Y2FzZT4KLSAgICAgICAgPGo6Y2FzZSB2YWx1ZT0idGhyZWUiPgotICAgICAgICAgICAgPGo6c2V0IHZhcj0iYS50aHJlZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPC9qOmNhc2U+Ci0gICAgICAgIDxqOmNhc2UgdmFsdWU9IiR7bnVsbH0iPgotICAgICAgICAgICAgPGo6c2V0IHZhcj0iYS5udWxsIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICA8L2o6Y2FzZT4KLSAgICAgICAgPGo6ZGVmYXVsdD4KLSAgICAgICAgICAgIDxqOnNldCB2YXI9ImEuZGVmYXVsdCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPC9qOmRlZmF1bHQ+Ci0gICAgPC9qOnN3aXRjaD4KLSAgICAKLSAgICA8ajppZiB0ZXN0PSIke3N3aXRjaC53aXRob3V0Lm9ufSI+Ci0gICAgICAgIDxqOnN3aXRjaD4KLSAgICAgICAgICAgIDxqOmNhc2UgdmFsdWU9Im9uZSIgZmFsbFRocnU9InRydWUiLz4KLSAgICAgICAgICAgIDxqOmNhc2UgdmFsdWU9InR3byIvPgotICAgICAgICAgICAgPGo6Y2FzZSB2YWx1ZT0idGhyZWUiLz4KLSAgICAgICAgICAgIDxqOmNhc2UgdmFsdWU9IiR7bnVsbH0iLz4KLSAgICAgICAgICAgIDxqOmRlZmF1bHQvPgotICAgICAgICA8L2o6c3dpdGNoPgotICAgIDwvajppZj4KLQotICAgIDxqOmlmIHRlc3Q9IiR7Y2FzZS53aXRob3V0LnN3aXRjaH0iPgotICAgICAgICA8ajpjYXNlIHZhbHVlPSJ0aGlzIHRhZyBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uIi8+Ci0gICAgPC9qOmlmPgotICAgIAotICAgIDxqOmlmIHRlc3Q9IiR7ZGVmYXVsdC53aXRob3V0LnN3aXRjaH0iPgotICAgICAgICA8ajpkZWZhdWx0Lz4KLSAgICA8L2o6aWY+Ci0KLSAgICA8ajppZiB0ZXN0PSIke2Nhc2Uud2l0aG91dC52YWx1ZX0iPgotICAgICAgICA8ajpzd2l0Y2ggb249ImZvbyI+Ci0gICAgICAgICAgICA8ajpjYXNlPgotICAgICAgICAgICAgICAgIDwhLS0gdGhpcyBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uIChvciBldmVuIGJldHRlciwgZmFpbCBvbiB2YWxpZGF0aW9uKSAtLT4KLSAgICAgICAgICAgIDwvajpjYXNlPgotICAgICAgICA8L2o6c3dpdGNoPgotICAgIDwvajppZj4KLSAgICAKLSAgICA8ajppZiB0ZXN0PSIke211bHRpcGxlLmRlZmF1bHRzfSI+Ci0gICAgICAgIDxqOnN3aXRjaCBvbj0iZm9vIj4KLSAgICAgICAgICAgIDxqOmNhc2UgdmFsdWU9ImJhciI+Ci0gICAgICAgICAgICA8L2o6Y2FzZT4KLSAgICAgICAgICAgIDxqOmRlZmF1bHQ+Ci0gICAgICAgICAgICA8L2o6ZGVmYXVsdD4KLSAgICAgICAgICAgIDxqOmRlZmF1bHQ+Ci0gICAgICAgICAgICAgICAgPCEtLSB0aGlzIG9uZSBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uIChvciBldmVuIGJldHRlciwgZmFpbCBvbiB2YWxpZGF0aW9uKSAtLT4KLSAgICAgICAgICAgIDwvajpkZWZhdWx0PgotICAgICAgICA8L2o6c3dpdGNoPgotICAgIDwvajppZj4KLSAgICAKLSAgICA8ajppZiB0ZXN0PSIke2Nhc2UuYWZ0ZXIuZGVmYXVsdH0iPgotICAgICAgICA8ajpzd2l0Y2ggb249ImZvbyI+Ci0gICAgICAgICAgICA8ajpkZWZhdWx0PgotICAgICAgICAgICAgPC9qOmRlZmF1bHQ+Ci0gICAgICAgICAgICA8ajpjYXNlIHZhbHVlPSJiYXIiPgotICAgICAgICAgICAgICAgIDwhLS0gdGhpcyBvbmUgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbiAob3IgZXZlbiBiZXR0ZXIsIGZhaWwgb24gdmFsaWRhdGlvbikgLS0+Ci0gICAgICAgICAgICA8L2o6Y2FzZT4KLSAgICAgICAgPC9qOnN3aXRjaD4KLSAgICA8L2o6aWY+Ci0KLTwvajpqZWxseT4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9jb3JlL3Rlc3RVc2VCZWFuVGFnLmplbGx5IGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvdGVzdFVzZUJlYW5UYWcuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMGViYzYuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2NvcmUvdGVzdFVzZUJlYW5UYWcuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIgotICAgIHhtbG5zOmp4PSJqZWxseTpvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuY29yZS5leHRlbnNpb24uQ29yZUV4dGVuc2lvblRhZ0xpYnJhcnkiPgotICAgIAotICAgIDxqOmlmIHRlc3Q9IiR7dGVzdC5zaW1wbGV9Ij4KLSAgICAgICAgPGo6dXNlQmVhbiB2YXI9ImZvbyIgCi0gICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlLkN1c3RvbWVyIgotICAgICAgICAgIG5hbWU9InRlc3RpbmciCi0gICAgICAgICAgY2l0eT0ic3lkbmV5Ii8+Ci0gICAgPC9qOmlmPgotICAgIAotICAgIDxqOmlmIHRlc3Q9IiR7dGVzdC5leHRlbnNpb259Ij4KLSAgICAgICAgPGp4OnVzZUJlYW5YIHZhcj0iZm9vIiAKLSAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmNvcmUuQ3VzdG9tZXIiCi0gICAgICAgICAgbmFtZT0idGVzdGluZyIKLSAgICAgICAgICBjaXR5PSJzeWRuZXkiLz4KLSAgICA8L2o6aWY+Ci0gICAgCi0gICAgPGo6aWYgdGVzdD0iJHt0ZXN0LmJhZFByb3BlcnR5fSI+Ci0gICAgICAgIDxqOmNhdGNoIHZhcj0iZXgiPgotICAgICAgICAgICAgPGp4OnVzZUJlYW4gdmFyPSJmb28iIAotICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmNvcmUuQ3VzdG9tZXIiCi0gICAgICAgICAgICAgIG5hbWU9InRlc3RpbmciCi0gICAgICAgICAgICAgIGNpdHk9InN5ZG5leSIKLSAgICAgICAgICAgICAgZm9vPSJiYXIiLz4KLSAgICAgICAgPC9qOmNhdGNoPgotICAgIDwvajppZj4KLSAgICAKLSAgICA8ajppZiB0ZXN0PSIke3Rlc3QuYmFkUHJvcGVydHlJZ25vcmVkfSI+Ci0gICAgICAgIDxqeDp1c2VCZWFuWFAgdmFyPSJmb28iIAotICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlLkN1c3RvbWVyIgotICAgICAgICAgICAgbmFtZT0idGVzdGluZyIKLSAgICAgICAgICAgIGNpdHk9InN5ZG5leSIKLSAgICAgICAgICAgIGZvbz0iYmFyIi8+IAotICAgIDwvajppZj4KLSAgICAKLTwvajpqZWxseT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZHVtbXkueG1sIGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2R1bW15LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlNWI2Zi4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZHVtbXkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGR1bW15PgotICA8ZW50cnkgaWQ9IjEiPlRoaXMgaXMgc29tZSBzYW1wbGUgWE1MPC9lbnRyeT4KLSAgPGVudHJ5IGlkPSIyIj5BbmQgc29tZSBtb3JlIFhNTDwvZW50cnk+Ci0gIDxlbXB0eS8+Ci08L2R1bW15PiAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2V4YW1wbGUzLmplbGx5IGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2V4YW1wbGUzLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmYyMDgxLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9leGFtcGxlMy5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqZWxseSB4bWxucz0iamVsbHk6Y29yZSI+Ci0KLSAgPCEtLSBhIHJlYWxseSBzaWxseSB3YXkgdG8gZG8gdGhpcyBidXQgLS0+Ci0gIDwhLS0gdGhpcyBzaG91bGQgdGVzdCB0aGUgY2hvb3NlL3doZW4vb3RoZXJ3aXNlIHRhZ3MgLS0+Ci0gIDxmb3JFYWNoIHZhcj0iaXRlciIgaXRlbXM9IlN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkiPgotICAgIDxjaG9vc2U+Ci0gICAgICA8d2hlbiB0ZXN0PSdpdGVyLmtleS5lcXVhbHMoICJqYXZhLmhvbWUiICknPgotICAgICAgICBKYXZhIEhvbWUgPSA8ZXhwciB2YWx1ZT0iaXRlci52YWx1ZSIvPgotICAgICAgPC93aGVuPgotICAgICAgPHdoZW4gdGVzdD0naXRlci5rZXkuZXF1YWxzKCAiamF2YS52ZXJzaW9uIiApJz4KLSAgICAgICAgSmF2YSBWZXJzaW9uID0gPGV4cHIgdmFsdWU9Iml0ZXIudmFsdWUiLz4KLSAgICAgIDwvd2hlbj4KLSAgICAgIDxvdGhlcndpc2U+Ci0gICAgICAgIDxleHByIHZhbHVlPSJpdGVyLmtleSIvPiA9IDxleHByIHZhbHVlPSJpdGVyLnZhbHVlIi8+Ci0gICAgICA8L290aGVyd2lzZT4KLSAgICA8L2Nob29zZT4KLSAgPC9mb3JFYWNoPgotPC9qZWxseT4KLQotCi0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9leHByZXNzaW9uL1Rlc3REeW5hQmVhbnMuamF2YSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9leHByZXNzaW9uL1Rlc3REeW5hQmVhbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3YjY4Ni4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZXhwcmVzc2lvbi9UZXN0RHluYUJlYW5zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5CYXNpY0R5bmFDbGFzczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkR5bmFCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuRHluYUNsYXNzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuRHluYVByb3BlcnR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuZXhwcmVzc2lvbi5qZXhsLkpleGxFeHByZXNzaW9uRmFjdG9yeTsKLQotLyoqCi0gKiBUZXN0cyB0aGUgdXNlIG9mIEV4cHJlc3Npb24gcGFyc2luZwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS44ICQKLSAqLwotcHVibGljIGNsYXNzIFRlc3REeW5hQmVhbnMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgSmVsbHlDb250ZXh0IGNvbnRleHQgPSBuZXcgSmVsbHlDb250ZXh0KCk7Ci0gICAgcHJvdGVjdGVkIEV4cHJlc3Npb25GYWN0b3J5IGZhY3RvcnkgPSBuZXcgSmV4bEV4cHJlc3Npb25GYWN0b3J5KCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGVzdER5bmFCZWFucy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3REeW5hQmVhbnMoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RHluYUJlYW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIER5bmFDbGFzcyBkeW5hQ2xhc3MgPSBjcmVhdGVEeW5hQ2xhc3MoKTsKLSAgICAgICAgRHluYUJlYW4gZHluYUJlYW4gPSBkeW5hQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgZHluYUJlYW4uc2V0KCAic3RyaW5nUHJvcGVydHkiLCAiZm9vIiApOwotICAgICAgICBkeW5hQmVhbi5zZXQoICJpbnRQcm9wZXJ0eSIsIG5ldyBJbnRlZ2VyKDI0KSApOwotCi0gICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoImRiZWFuIiwgZHluYUJlYW4pOwotCi0gICAgICAgIGFzc2VydEV4cHJlc3Npb24oIiR7ZGJlYW4uc3RyaW5nUHJvcGVydHl9IiwgImZvbyIpOwotICAgICAgICBhc3NlcnRFeHByZXNzaW9uKCIke2RiZWFuLmludFByb3BlcnR5fSIsIG5ldyBJbnRlZ2VyKDI0KSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIER5bmFDbGFzcyBjcmVhdGVEeW5hQ2xhc3MoKSB7Ci0gICAgICAgIER5bmFQcm9wZXJ0eVtdIHByb3BlcnRpZXMgPSB7Ci0gICAgICAgICAgICBuZXcgRHluYVByb3BlcnR5KCJib29sZWFuUHJvcGVydHkiLCBCb29sZWFuLlRZUEUpLAotICAgICAgICAgICAgbmV3IER5bmFQcm9wZXJ0eSgiYm9vbGVhblNlY29uZCIsIEJvb2xlYW4uVFlQRSksCi0gICAgICAgICAgICBuZXcgRHluYVByb3BlcnR5KCJkb3VibGVQcm9wZXJ0eSIsIERvdWJsZS5UWVBFKSwKLSAgICAgICAgICAgIG5ldyBEeW5hUHJvcGVydHkoImZsb2F0UHJvcGVydHkiLCBGbG9hdC5UWVBFKSwKLSAgICAgICAgICAgIG5ldyBEeW5hUHJvcGVydHkoImludFByb3BlcnR5IiwgSW50ZWdlci5UWVBFKSwKLSAgICAgICAgICAgIG5ldyBEeW5hUHJvcGVydHkoImxpc3RJbmRleGVkIiwgTGlzdC5jbGFzcyksCi0gICAgICAgICAgICBuZXcgRHluYVByb3BlcnR5KCJsb25nUHJvcGVydHkiLCBMb25nLlRZUEUpLAotICAgICAgICAgICAgbmV3IER5bmFQcm9wZXJ0eSgibWFwcGVkUHJvcGVydHkiLCBNYXAuY2xhc3MpLAotICAgICAgICAgICAgbmV3IER5bmFQcm9wZXJ0eSgibWFwcGVkSW50UHJvcGVydHkiLCBNYXAuY2xhc3MpLAotICAgICAgICAgICAgbmV3IER5bmFQcm9wZXJ0eSgibnVsbFByb3BlcnR5IiwgU3RyaW5nLmNsYXNzKSwKLSAgICAgICAgICAgIG5ldyBEeW5hUHJvcGVydHkoInNob3J0UHJvcGVydHkiLCBTaG9ydC5UWVBFKSwKLSAgICAgICAgICAgIG5ldyBEeW5hUHJvcGVydHkoInN0cmluZ1Byb3BlcnR5IiwgU3RyaW5nLmNsYXNzKSwKLSAgICAgICAgfTsKLSAgICAgICAgcmV0dXJuIG5ldyBCYXNpY0R5bmFDbGFzcygiVGVzdER5bmFDbGFzcyIsIG51bGwsIHByb3BlcnRpZXMpOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0RXhwcmVzc2lvbihTdHJpbmcgZXhwcmVzc2lvblRleHQsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gQ29tcG9zaXRlRXhwcmVzc2lvbi5wYXJzZShleHByZXNzaW9uVGV4dCwgZmFjdG9yeSk7Ci0gICAgICAgIGFzc2VydFRydWUoICJDcmVhdGVkIGEgdmFsaWQgZXhwcmVzc2lvbiBmb3I6ICIgKyBleHByZXNzaW9uVGV4dCwgZXhwcmVzc2lvbiAhPSBudWxsICk7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGV4cHJlc3Npb24uZXZhbHVhdGUoY29udGV4dCk7Ci0gICAgICAgIC8vYXNzZXJ0RXF1YWxzKCAiRXhwcmVzc2lvbiBmb3I6ICIgKyBleHByZXNzaW9uVGV4dCArICIgaXM6ICIgKyBleHByZXNzaW9uLCBleHBlY3RlZFZhbHVlLCB2YWx1ZSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoICJXcm9uZyByZXN1bHQgZm9yIGV4cHJlc3Npb246ICIgKyBleHByZXNzaW9uVGV4dCwgZXhwZWN0ZWRWYWx1ZSwgdmFsdWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZXhwcmVzc2lvbi9UZXN0RXhwcmVzc2lvbnMuamF2YSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9leHByZXNzaW9uL1Rlc3RFeHByZXNzaW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzNlMDdkLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9leHByZXNzaW9uL1Rlc3RFeHByZXNzaW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uamV4bC5KZXhsRXhwcmVzc2lvbkZhY3Rvcnk7Ci0KLS8qKgotICogVGVzdHMgdGhlIHVzZSBvZiBFeHByZXNzaW9uIHBhcnNpbmcKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0RXhwcmVzc2lvbnMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgSmVsbHlDb250ZXh0IGNvbnRleHQgPSBuZXcgSmVsbHlDb250ZXh0KCk7Ci0gICAgcHJvdGVjdGVkIEV4cHJlc3Npb25GYWN0b3J5IGZhY3RvcnkgPSBuZXcgSmV4bEV4cHJlc3Npb25GYWN0b3J5KCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGVzdEV4cHJlc3Npb25zLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdEV4cHJlc3Npb25zKFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4cHJlc3NzaW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKCJ0b3BwaW5nIiwgImNoZWVzZSIpOwotICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKCJ0eXBlIiwgImRlZXBQYW4iKTsKLQotCi0gICAgICAgIGFzc2VydEV4cHJlc3Npb24oImZvbyIsICJmb28iKTsKLSAgICAgICAgYXNzZXJ0RXhwcmVzc2lvbigiJHt0b3BwaW5nfSIsICJjaGVlc2UiKTsKLSAgICAgICAgYXNzZXJ0RXhwcmVzc2lvbigic29tZSR7dG9wcGluZ30iLCAic29tZWNoZWVzZSIpOwotICAgICAgICBhc3NlcnRFeHByZXNzaW9uKCIgc29tZSAke3RvcHBpbmd9ICIsICIgc29tZSBjaGVlc2UgIik7Ci0gICAgICAgIGFzc2VydEV4cHJlc3Npb24oIiR7dG9wcGluZ315IiwgImNoZWVzZXkiKTsKLSAgICAgICAgYXNzZXJ0RXhwcmVzc2lvbigiQSAke3RvcHBpbmd9ICR7dHlwZX0gcGl6emEiLCAiQSBjaGVlc2UgZGVlcFBhbiBwaXp6YSIpOwotICAgICAgICBhc3NlcnRFeHByZXNzaW9uKCIke3RvcHBpbmd9LSR7dHlwZX0iLCAiY2hlZXNlLWRlZXBQYW4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW50RXhwcmVzc3Npb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoIm1hdmVuLmhvbWUuZm9vIiwgImNoZWVzZSIpOwotCi0gICAgICAgIGFzc2VydEV4cHJlc3Npb24oIiR7bWF2ZW4uaG9tZS5mb299IiwgImNoZWVzZSIpOwotICAgICAgICBhc3NlcnRFeHByZXNzaW9uKCIke21hdmVuLnNvbWUubWFkZXVwLm5hbWV9IiwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEV4cHJlc3Npb24oImNoZWVzZSAke21hdmVuLnNvbWUubWFkZXVwLm5hbWV9cGl6emEiLCAiY2hlZXNlIHBpenphIik7Ci0gICAgICAgIGFzc2VydEV4cHJlc3Npb24oImhhbSBhbmQgJHttYXZlbi5ob21lLmZvb30gcGl6emEiLCAiaGFtIGFuZCBjaGVlc2UgcGl6emEiKTsKLSAgICAgICAgYXNzZXJ0RXhwcmVzc2lvbigiJHttYXZlbi5ob21lLmZvby5sZW5ndGgoKX0iLCBuZXcgSW50ZWdlcig2KSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vdENvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSgiYSIsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoImIiLCBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSgiYyIsICJ0cnVlIik7Ci0gICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoImQiLCAiZmFsc2UiKTsKLQotICAgICAgICBhc3NlcnRFeHByZXNzaW9uKCIke2F9IiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgYXNzZXJ0RXhwcmVzc2lvbigiJHshYX0iLCBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgYXNzZXJ0RXhwcmVzc2lvbigiJHtifSIsIEJvb2xlYW4uRkFMU0UpOwotICAgICAgICBhc3NlcnRFeHByZXNzaW9uKCIkeyFifSIsIEJvb2xlYW4uVFJVRSk7Ci0KLSAgICAgICAgYXNzZXJ0RXhwcmVzc2lvbigiJHtjfSIsICJ0cnVlIik7Ci0gICAgICAgIGFzc2VydEV4cHJlc3Npb24oIiR7IWN9IiwgQm9vbGVhbi5GQUxTRSk7Ci0gICAgICAgIGFzc2VydEV4cHJlc3Npb24oIiR7ZH0iLCAiZmFsc2UiKTsKLSAgICAgICAgYXNzZXJ0RXhwcmVzc2lvbigiJHshZH0iLCBCb29sZWFuLlRSVUUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RDb25kaXRpb25zV2l0aERvdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKCJ4LmEiLCBCb29sZWFuLlRSVUUpOwotICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKCJ4LmIiLCBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSgieC5jIiwgInRydWUiKTsKLSAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSgieC5kIiwgImZhbHNlIik7Ci0KLSAgICAgICAgYXNzZXJ0RXhwcmVzc2lvbigiJHt4LmF9IiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgYXNzZXJ0RXhwcmVzc2lvbigiJHsheC5hfSIsIEJvb2xlYW4uRkFMU0UpOwotICAgICAgICBhc3NlcnRFeHByZXNzaW9uKCIke3guYn0iLCBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgYXNzZXJ0RXhwcmVzc2lvbigiJHsheC5ifSIsIEJvb2xlYW4uVFJVRSk7Ci0KLSAgICAgICAgYXNzZXJ0RXhwcmVzc2lvbigiJHt4LmN9IiwgInRydWUiKTsKLSAgICAgICAgYXNzZXJ0RXhwcmVzc2lvbigiJHsheC5jfSIsIEJvb2xlYW4uRkFMU0UpOwotICAgICAgICBhc3NlcnRFeHByZXNzaW9uKCIke3guZH0iLCAiZmFsc2UiKTsKLSAgICAgICAgYXNzZXJ0RXhwcmVzc2lvbigiJHsheC5kfSIsIEJvb2xlYW4uVFJVRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSgic29tZXRoaW5nLmJsYW5rIiwgIiIpOwotICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKCJzb21ldGhpbmcub2siLCAiY2hlZXNlIik7Ci0KLSAgICAgICAgYXNzZXJ0RXhwcmVzc2lvbigiJHtzb21ldGhpbmcuYmxhbmsubGVuZ3RoKCkgPT0gMH0iLCBCb29sZWFuLlRSVUUpOwotICAgICAgICBhc3NlcnRFeHByZXNzaW9uKCIke3NvbWV0aGluZy5ibGFuayA9PSAnJ30iLCBCb29sZWFuLlRSVUUpOwotICAgICAgICBhc3NlcnRFeHByZXNzaW9uKCIke3NvbWV0aGluZy5vayAhPSBudWxsfSIsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIGFzc2VydEV4cHJlc3Npb24oIiR7c29tZXRoaW5nLm9rICE9ICcnfSIsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIC8vIG51bGwgaXMgYSByZXNlcnZlZCB3b3JkCi0gICAgICAgIC8vYXNzZXJ0RXhwcmVzc2lvbigiJHtzb21ldGhpbmcubnVsbCAhPSAnJ30iLCBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgYXNzZXJ0RXhwcmVzc2lvbigiJHt1bmtub3duID09IG51bGx9IiwgQm9vbGVhbi5UUlVFKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRFeHByZXNzaW9uKFN0cmluZyBleHByZXNzaW9uVGV4dCwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBDb21wb3NpdGVFeHByZXNzaW9uLnBhcnNlKGV4cHJlc3Npb25UZXh0LCBmYWN0b3J5KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIkNyZWF0ZWQgYSB2YWxpZCBleHByZXNzaW9uIGZvcjogIiArIGV4cHJlc3Npb25UZXh0LCBleHByZXNzaW9uICE9IG51bGwgKTsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gZXhwcmVzc2lvbi5ldmFsdWF0ZShjb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiV3JvbmcgcmVzdWx0IGZvciBleHByZXNzaW9uOiAiICsgZXhwcmVzc2lvblRleHQsIGV4cGVjdGVkVmFsdWUsIHZhbHVlICk7Ci0KLSAgICAgICAgU3RyaW5nIHRleHQgPSBleHByZXNzaW9uLmdldEV4cHJlc3Npb25UZXh0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggIldyb25nIHRleHR1YWwgcmVwcmVzZW50YXRpb24gZm9yIGV4cHJlc3Npb24gdGV4dDogIiwgZXhwcmVzc2lvblRleHQsIHRleHQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9oZWxsb193b3JsZC5qZWxseSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9oZWxsb193b3JsZC5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMyMGNlYi4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaGVsbG9fd29ybGQuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIj4KLQotICBIZWxsbyBXb3JsZCEKLQotPC9qOmplbGx5PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL1Rlc3RUYWdMaWJyYXJ5UmVzb2x2ZXIuamF2YSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBsL1Rlc3RUYWdMaWJyYXJ5UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMzOGFkYy4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wbC9UZXN0VGFnTGlicmFyeVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5pbXBsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLS8qKiBUZXN0cyB0aGUgY29yZSB0YWdzCi0gICoKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjkgJAotICAqLwotcHVibGljIGNsYXNzIFRlc3RUYWdMaWJyYXJ5UmVzb2x2ZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGVzdFRhZ0xpYnJhcnlSZXNvbHZlci5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RUYWdMaWJyYXJ5UmVzb2x2ZXIoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEB0b2RvIHRlbXBvcmFyeSBkaXNibGVkIHRlc3QgY2FzZSB1bnRpbCBJIGNhbiBmaWd1cmUgb3V0IGhvdyB0byBnZXQKLSAgICAgICAgICogaXQgdG8gd29yayB3aXRoIGNvbW1vbnMtZGlzY292ZXJ5Ci0gICAgICAgICAqLwotLyoKLSAgICAgICAgVGFnTGlicmFyeSBsaWJyYXJ5ID0gcmVzb2x2ZXIucmVzb2x2ZVRhZ0xpYnJhcnkoImplbGx5OnRlc3QtbGlicmFyeSIgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiRm91bmQgYSB0YWcgbGlicmFyeSIsIGxpYnJhcnkgIT0gbnVsbCApOwotICAgICAgICBhc3NlcnRFcXVhbHMoICJUYWcgbGlicmFyeSBpcyBvZiB0aGUgY29ycmVjdCB0eXBlIiwgIm9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50ZXN0LmltcGwuRHVtbXlUYWdMaWJyYXJ5IiwgbGlicmFyeS5nZXRDbGFzcygpLmdldE5hbWUoKSApOwotKi8KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvaW1wb3J0MS5qZWxseSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBvcnQxLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTg0NTRiLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9pbXBvcnQxLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGplbGx5IHhtbG5zPSJqZWxseTpjb3JlIj4KLQotICA8c2V0IHZhcj0idGVzdDEiIHZhbHVlPSIke3BhcmVudFZhcn0iLz4KLSAgCi08L2plbGx5PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9vdXRwdXRCYWQuamVsbHkgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvb3V0cHV0QmFkLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGJmY2Y1Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9vdXRwdXRCYWQuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiPg0KLQk8aHRtbC8+DQotPC9qOmplbGx5PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9vdXRwdXREYXRhLmplbGx5IGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L291dHB1dERhdGEuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MjE2NTMuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L291dHB1dERhdGEuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIj48ajptdXRlPgotCTwhLS0gdGhpcyB0ZXN0IHNob3VsZCBvdXRwdXQgZXhhY3RseSB0aGUgdG9TdHJpbmcoKSBvZiBhIGxpc3Qgd2l0aCBvbmUgaXRlbSwgc3RyaW5nIC0tPgotCTxqOm5ldyB2YXI9Im8xIiBjbGFzc05hbWU9ImphdmEudXRpbC5MaW5rZWRMaXN0Ii8+Ci0JJHtvMS5hZGQoInN0cmluZyIpfQotCTwvajptdXRlPiR7bzF9PC9qOmplbGx5PgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L291dHB1dEdvb2QuamVsbHkgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvb3V0cHV0R29vZC5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ5ZjJhYi4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvb3V0cHV0R29vZC5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSI+DQotCTxodG1sLz54DQotPC9qOmplbGx5PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9ydW5fYWxsLmplbGx5IGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3J1bl9hbGwuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MjA4OTMuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3J1bl9hbGwuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiPgotCi0gIDwhLS0gdHJ5IGFuIGFic29sdXRlIHBhdGggLS0+Ci0gIDxqOmluY2x1ZGUgdXJpPSIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2hlbGxvX3dvcmxkLmplbGx5Ii8+Ci0gIAotCi0gICAKLSAgPCEtLSBub3cgbGV0cyB0cnkgcGFzcyBpbiBhIHZhcmlhYmxlIHRvIGEgY2hpbGQgc2NyaXB0IC0tPgotICA8ajpzZXQgdmFyPSJmb28iPmJhcjwvajpzZXQ+Ci0gIDxqOmluY2x1ZGUgdXJpPSJ0ZXN0RmluZFZhcmlhYmxlLmplbGx5Ii8+Ci0gIAotPC9qOmplbGx5PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9zaG93X2FyZ3MuamVsbHkgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvc2hvd19hcmdzLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDg4N2ZlLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9zaG93X2FyZ3MuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gZGlzcGxheXMgdGhlIGN1cnJlbnQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyAtLT4KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiPgotCi08YXJndW1lbnRzPgotICA8ajpmb3JFYWNoIHZhcj0iYXJnIiBpdGVtcz0iJHthcmdzfSIgYmVnaW49IjEiPgotICAgICAgPGFyZ3VtZW50PiR7YXJnfSI8L2FyZ3VtZW50PgotICA8L2o6Zm9yRWFjaD4KLTwvYXJndW1lbnRzPgotCi08L2o6amVsbHk+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Nob3dfcHJvcGVydGllcy5qZWxseSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9zaG93X3Byb3BlcnRpZXMuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NDE1N2IuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Nob3dfcHJvcGVydGllcy5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGo6amVsbHkgeG1sbnM6aj0iamVsbHk6Y29yZSI+Ci0KLTxodG1sPgotICA8Ym9keT4KLSAgICA8aDE+U3lzdGVtIHByb3BlcnRpZXM8L2gxPgotICAgIAotICAgIDx0YWJsZT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRoPk5hbWU8L3RoPgotICAgICAgICA8dGg+VmFsdWU8L3RoPgotICAgICAgPC90cj4KLQotICAgICAgPGo6Zm9yRWFjaCB2YXI9Iml0ZXIiIGl0ZW1zPSIke3N5c3RlbVNjb3BlfSI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQ+JHtpdGVyLmtleX08L3RkPgotICAgICAgICAgIDx0ZD4ke2l0ZXIudmFsdWV9PC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvajpmb3JFYWNoPgotICAgIDwvdGFibGU+Ci0KLSAgPC9ib2R5PgotCi08L2h0bWw+Ci0KLTwvajpqZWxseT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvc3VpdGUuamVsbHkgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvc3VpdGUuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZDUyZjEuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3N1aXRlLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHRlc3Q6c3VpdGUgCi0gICAgeG1sbnM6aj0iamVsbHk6Y29yZSIgCi0gICAgeG1sbnM6dGVzdD0iamVsbHk6anVuaXQiPgotCi0gIDx0ZXN0OmNhc2UgbmFtZT0idGVzdFNldEFuZFJlbW92ZSI+Ci0gICAgCi0gICAgICAgIDxqOnNldCB2YXI9IngiIHZhbHVlPSJhYmMiLz4KLSAgICAgICAgCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iYWJjIiBhY3R1YWw9IiR7eH0iLz4KLSAgICAgICAgCi0gICAgICAgIDxqOnJlbW92ZSB2YXI9IngiLz4KLSAgICAgICAgCi0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke3ggPT0gbnVsbH0iLz4KLSAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7ZW1wdHkgeH0iLz4KLSAgICAgICAgCi0gIDwvdGVzdDpjYXNlPgotCi0gIDx0ZXN0OmNhc2UgbmFtZT0idGVzdFNldFdpdGhEZWZhdWx0Ij4KLSAgICAKLSAgICAgICAgPGo6c2V0IHZhcj0iZm9vIiB2YWx1ZT0iYWJjIi8+Ci0gICAgICAgIDxqOnNldCB2YXI9IngiIHZhbHVlPSIke2RvZXNOb3RFeGlzdH0iIGRlZmF1bHRWYWx1ZT0iJHtmb299Ii8+Ci0gICAgICAgIAotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9ImFiYyIgYWN0dWFsPSIke3h9Ii8+Ci0KLSAgICAgICAgPGo6c2V0IHZhcj0iZG9lc05vdEV4aXN0IiB2YWx1ZT0iZGVmIi8+ICAgICAgICAKLSAgICAgICAgPGo6c2V0IHZhcj0ieCIgdmFsdWU9IiR7ZG9lc05vdEV4aXN0fSIgZGVmYXVsdFZhbHVlPSIke2Zvb30iLz4KLSAgICAgICAgCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iZGVmIiBhY3R1YWw9IiR7eH0iLz4KLSAgICAgICAgCi0gIDwvdGVzdDpjYXNlPgotCi0gIDx0ZXN0OmNhc2UgbmFtZT0idGVzdFNjb3BlIj4KLQotICAgICAgICA8ajpzZXQgdmFyPSJvdXRlciIgdmFsdWU9ImRlZiIvPgotCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iZGVmIiBhY3R1YWw9IiR7b3V0ZXJ9Ii8+Ci0gICAgICAgIAotICAgICAgICA8ajpzY29wZT4gICAgCi0gICAgICAgICAgICA8ajpzZXQgdmFyPSJ4IiB2YWx1ZT0iYWJjIi8+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iYWJjIiBhY3R1YWw9IiR7eH0iLz4KLSAgICAgICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iZGVmIiBhY3R1YWw9IiR7b3V0ZXJ9Ii8+Ci0gICAgICAgIDwvajpzY29wZT4gICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHt4ID09IG51bGx9Ii8+Ci0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2VtcHR5IHh9Ii8+Ci0gICAgICAgIAotICA8L3Rlc3Q6Y2FzZT4KLSAgICAgICAgCi0gIDx0ZXN0OmNhc2UgbmFtZT0idGVzdENob29zZSI+Ci0gICAgCi0gICAgICAgIDxqOnNldCB2YXI9IngiIHZhbHVlPSJhYmMiLz4KLSAgICAgICAgCi0gICAgICAgIDxqOmNob29zZT4KLSAgICAgICAgICA8ajp3aGVuIHRlc3Q9IiR7eCA9PSAnYWJjJ30iPgotICAgICAgICAgICAgdGhpcyBzaG91bGQgYWx3YXlzIHdvcmsKLSAgICAgICAgICA8L2o6d2hlbj4KLSAgICAgICAgICA8ajp3aGVuIHRlc3Q9IiR7eCA9PSAneHl6J30iPgotICAgICAgICAgICAgPGZhaWw+VGhpcyBzaG91bGQgbmV2ZXIgZmFpbDwvZmFpbD4KLSAgICAgICAgICA8L2o6d2hlbj4KLSAgICAgICAgICA8ajpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8ZmFpbD5UaGlzIHNob3VsZCBuZXZlciBmYWlsPC9mYWlsPgotICAgICAgICAgIDwvajpvdGhlcndpc2U+Ci0gICAgICAgIDwvajpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICA8ajpjaG9vc2U+Ci0gICAgICAgICAgPGo6d2hlbiB0ZXN0PSIke3ggPT0gJ3h5eid9Ij4KLSAgICAgICAgICAgIDxmYWlsPlRoaXMgc2hvdWxkIG5ldmVyIGZhaWw8L2ZhaWw+Ci0gICAgICAgICAgPC9qOndoZW4+Ci0gICAgICAgICAgPGo6d2hlbiB0ZXN0PSIke3ggPT0gJ2FiYyd9Ij4KLSAgICAgICAgICAgIHRoaXMgc2hvdWxkIGFsd2F5cyB3b3JrCi0gICAgICAgICAgPC9qOndoZW4+Ci0gICAgICAgICAgPGo6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPGZhaWw+VGhpcyBzaG91bGQgbmV2ZXIgZmFpbDwvZmFpbD4KLSAgICAgICAgICA8L2o6b3RoZXJ3aXNlPgotICAgICAgICA8L2o6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDxqOmNob29zZT4KLSAgICAgICAgICA8ajp3aGVuIHRlc3Q9IiR7eCA9PSAneHl6J30iPgotICAgICAgICAgICAgPGZhaWw+VGhpcyBzaG91bGQgbmV2ZXIgZmFpbDwvZmFpbD4KLSAgICAgICAgICA8L2o6d2hlbj4KLSAgICAgICAgICA8ajp3aGVuIHRlc3Q9IiR7eCA9PSAnenp6J30iPgotICAgICAgICAgICAgPGZhaWw+VGhpcyBzaG91bGQgbmV2ZXIgZmFpbDwvZmFpbD4KLSAgICAgICAgICA8L2o6d2hlbj4KLSAgICAgICAgICA8ajpvdGhlcndpc2U+Ci0gICAgICAgICAgICB0aGlzIHNob3VsZCBhbHdheXMgd29yawotICAgICAgICAgIDwvajpvdGhlcndpc2U+Ci0gICAgICAgIDwvajpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgCi0gIDwvdGVzdDpjYXNlPgotCi0KLSAgICA8dGVzdDpjYXNlIG5hbWU9InRlc3RJZiI+Ci0gICAgCi0gICAgICAgIDxqOnNldCB2YXI9IngiIHZhbHVlPSJhYmMiLz4KLSAgICAgICAgPGo6c2V0IHZhcj0id29ya2VkIiB2YWx1ZT0iZiIvPgotICAgICAgICAKLSAgICAgICAgPGo6aWYgdGVzdD0iJHt4ID09ICdhYmMnfSI+Ci0gICAgICAgICAgdGhpcyBzaG91bGQgYWx3YXlzIHdvcmsKLSAgICAgICAgICA8ajpzZXQgdmFyPSJ3b3JrZWQiIHZhbHVlPSJ0Ii8+Ci0gICAgICAgIDwvajppZj4KLSAgICAgICAgCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0idCIgYWN0dWFsPSIke3dvcmtlZH0iLz4KLSAgICAKLSAgICAgICAgPGo6aWYgdGVzdD0iJHt4ID09ICd6enonfSI+Ci0gICAgICAgICAgPGZhaWw+VGhpcyBzaG91bGQgbmV2ZXIgZmFpbDwvZmFpbD4KLSAgICAgICAgPC9qOmlmPgotICAgICAgICAgICAgICAgIAotICA8L3Rlc3Q6Y2FzZT4KLQotICAgIDx0ZXN0OmNhc2UgbmFtZT0idGVzdE5ld0FuZFNldFByb3BlcnRpZXMiPgotICAgICAgICA8ajpuZXcgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuY29yZS5DdXN0b21lciIgdmFyPSJjdXN0b21lciIvPgotICAgICAgICA8ajpzZXRQcm9wZXJ0aWVzIG9iamVjdD0iJHtjdXN0b21lcn0iIG5hbWU9IkphbWVzIiBjaXR5PSJMb25kb24iIC8+Ci0KLSAgICAgICAgQ3JlYXRlZCBhIG5ldyBiZWFuOiAke2N1c3RvbWVyfQotICAgICAgICAgICAgCi0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2N1c3RvbWVyICE9IG51bGx9Ij5DcmVhdGVkIGEgY3VzdG9tZXIgYmVhbjwvdGVzdDphc3NlcnQ+Ci0gICAgICAgIAotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgCi0gICAgICAgICAgICBleHBlY3RlZD0iSmFtZXMiIAotICAgICAgICAgICAgYWN0dWFsPSIke2N1c3RvbWVyLm5hbWV9Ii8+Ci0gICAgICAgICAgICAKLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIAotICAgICAgICAgICAgZXhwZWN0ZWQ9IkxvbmRvbiIgCi0gICAgICAgICAgICBhY3R1YWw9IiR7Y3VzdG9tZXIuY2l0eX0iLz4KLSAgICAgICAgICAgIAotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgCi0gICAgICAgICAgICBleHBlY3RlZD0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmNvcmUuQ3VzdG9tZXIiIAotICAgICAgICAgICAgYWN0dWFsPSIke2N1c3RvbWVyLmNsYXNzLm5hbWV9Ii8+Ci0gIDwvdGVzdDpjYXNlPgotCi0gICAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0VXNlQmVhbiI+Ci0gICAgICAgIDxqOnVzZUJlYW4gdmFyPSJjdXN0b21lciIgY2xhc3M9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlLkN1c3RvbWVyIiBuYW1lPSJKYW1lcyIgY2l0eT0iTG9uZG9uIiAvPgotCi0gICAgICAgIENyZWF0ZWQgYSBuZXcgYmVhbjogJHtjdXN0b21lcn0KLSAgICAgICAgICAgIAotICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtjdXN0b21lciAhPSBudWxsfSI+Q3JlYXRlZCBhIGN1c3RvbWVyIGJlYW48L3Rlc3Q6YXNzZXJ0PgotICAgICAgICAKLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIAotICAgICAgICAgICAgZXhwZWN0ZWQ9IkphbWVzIiAKLSAgICAgICAgICAgIGFjdHVhbD0iJHtjdXN0b21lci5uYW1lfSIvPgotICAgICAgICAgICAgCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyAKLSAgICAgICAgICAgIGV4cGVjdGVkPSJMb25kb24iIAotICAgICAgICAgICAgYWN0dWFsPSIke2N1c3RvbWVyLmNpdHl9Ii8+Ci0gICAgICAgICAgICAKLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIAotICAgICAgICAgICAgZXhwZWN0ZWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlLkN1c3RvbWVyIiAKLSAgICAgICAgICAgIGFjdHVhbD0iJHtjdXN0b21lci5jbGFzcy5uYW1lfSIvPgotICA8L3Rlc3Q6Y2FzZT4KLQotICAgIDx0ZXN0OmNhc2UgbmFtZT0idGVzdFVzZUJlYW5XaXRoU2V0UHJvcGVydGllcyI+Ci0gICAgICAgIDxqOnVzZUJlYW4gdmFyPSJjdXN0b21lciIgY2xhc3M9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlLkN1c3RvbWVyIiBuYW1lPSJKYW1lcyI+Ci0KLSAgICAgICAgICAgIDwhLS0gdHlwaWNhbGx5IHRoZSBmb2xsb3dpbmcgdGFnIG1pZ2h0IGJlIG5lc3RlZCBpbnNpZGUgc29tZSBjb25kaXRpb25hbCBsb2dpYyAtLT4KLSAgICAgICAgICAgIDxqOnNldFByb3BlcnRpZXMgbmFtZT0iQm9iIiBjaXR5PSJBdGxhbnRhIi8+Ci0gICAgICAgIDwvajp1c2VCZWFuPiAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBDcmVhdGVkIGEgbmV3IGJlYW46ICR7Y3VzdG9tZXJ9Ci0gICAgICAgICAgICAKLSAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7Y3VzdG9tZXIgIT0gbnVsbH0iPkNyZWF0ZWQgYSBjdXN0b21lciBiZWFuPC90ZXN0OmFzc2VydD4KLSAgICAgICAgCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyAKLSAgICAgICAgICAgIGV4cGVjdGVkPSJCb2IiIAotICAgICAgICAgICAgYWN0dWFsPSIke2N1c3RvbWVyLm5hbWV9Ii8+Ci0gICAgICAgICAgICAKLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIAotICAgICAgICAgICAgZXhwZWN0ZWQ9IkF0bGFudGEiIAotICAgICAgICAgICAgYWN0dWFsPSIke2N1c3RvbWVyLmNpdHl9Ii8+Ci0gICAgICAgICAgICAKLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIAotICAgICAgICAgICAgZXhwZWN0ZWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5jb3JlLkN1c3RvbWVyIiAKLSAgICAgICAgICAgIGFjdHVhbD0iJHtjdXN0b21lci5jbGFzcy5uYW1lfSIvPgotICA8L3Rlc3Q6Y2FzZT4KLQotICAgIDx0ZXN0OmNhc2UgbmFtZT0idGVzdFNldFdpdGhOb0VuY29kaW5nIj4KLSAgICAgICAgPGo6c2V0IHZhcj0iZm9vIiBlbmNvZGU9ImZhbHNlIj4KLSAgICAgICAgICAgIDxmb28geD0iMSI+aGVsbG88L2Zvbz4KLSAgICAgICAgPC9qOnNldD4KLQotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgCi0gICAgICAgICAgICBleHBlY3RlZD0nJmx0O2ZvbyB4PSIxIiZndDtoZWxsbyZsdDsvZm9vJmd0OycgCi0gICAgICAgICAgICBhY3R1YWw9IiR7Zm9vfSIvPgotICA8L3Rlc3Q6Y2FzZT4KLQotICAgIDx0ZXN0OmNhc2UgbmFtZT0idGVzdEZpbGVUb1ZhciI+Ci0gICAgICAgIDxqOmZpbGUgdmFyPSJmb28iIG9taXRYbWxEZWNsYXJhdGlvbj0idHJ1ZSI+Ci0gICAgICAgICAgICA8Zm9vIHg9IjEiPmhlbGxvPC9mb28+Ci0gICAgICAgIDwvajpmaWxlPgotCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyAKLSAgICAgICAgICAgIGV4cGVjdGVkPScmbHQ7Zm9vIHg9IjEiJmd0O2hlbGxvJmx0Oy9mb28mZ3Q7JyAKLSAgICAgICAgICAgIGFjdHVhbD0iJHtmb299Ii8+Ci0gIDwvdGVzdDpjYXNlPgotCi0KLSAgICA8IS0tIHdoaXRlc3BhY2UgdHJpbW1pbmcgdGVzdHMgLS0+Ci0gICAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0VHJpbSI+Ci0gICAgICAgIAotICAgICAgICA8ajpzZXQgdmFyPSJmb28iPgotICAgICAgICAgICAgPGo6Zm9yRWFjaCB2YXI9ImkiIGJlZ2luPSIxIiBlbmQ9IjMiIHRyaW09ImZhbHNlIj4gICR7aX0gPC9qOmZvckVhY2g+Ci0gICAgICAgIDwvajpzZXQ+Ci0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIAotICAgICAgICAgICAgZXhwZWN0ZWQ9IiAgMSAgIDIgICAzICIKLSAgICAgICAgICAgIGFjdHVhbD0iJHtmb299Ii8+Ci0gICAgICAgIAotICAgICAgICA8ajpzZXQgdmFyPSJmb28iPgotICAgICAgICAgICAgPGo6Zm9yRWFjaCB2YXI9ImkiIGJlZ2luPSIxIiBlbmQ9IjMiIHRyaW09InRydWUiPiAgJHtpfSA8L2o6Zm9yRWFjaD4KLSAgICAgICAgPC9qOnNldD4KLQotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgCi0gICAgICAgICAgICBleHBlY3RlZD0iMTIzIgotICAgICAgICAgICAgYWN0dWFsPSIke2Zvb30iLz4KLSAgICAgICAgCi0gICAgICAgIDxqOnNldCB2YXI9ImZvbyI+Ci0gICAgICAgICAgICA8ajpmb3JFYWNoIHZhcj0iaSIgYmVnaW49IjEiIGVuZD0iMyIgdHJpbT0idHJ1ZSI+ICBmb28gJHtpfSA8L2o6Zm9yRWFjaD4KLSAgICAgICAgPC9qOnNldD4KLQotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgCi0gICAgICAgICAgICBleHBlY3RlZD0iZm9vIDFmb28gMmZvbyAzIgotICAgICAgICAgICAgYWN0dWFsPSIke2Zvb30iLz4KLQotICAgICAgICA8ajpzZXQgdmFyPSJmb28iPgotICAgICAgICAgICAgPGo6Zm9yRWFjaCB2YXI9ImkiIGJlZ2luPSIxIiBlbmQ9IjMiIHRyaW09InRydWUiPiAgZm9vICR7aX0gYmFyIDwvajpmb3JFYWNoPgotICAgICAgICA8L2o6c2V0PgotCi0gICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyAKLSAgICAgICAgICAgIGV4cGVjdGVkPSJmb28gMSBiYXJmb28gMiBiYXJmb28gMyBiYXIiCi0gICAgICAgICAgICBhY3R1YWw9IiR7Zm9vfSIvPgotICA8L3Rlc3Q6Y2FzZT4KLSAgCi0gICAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0QnJlYWsiPgotICAgICAgICAKLSAgICAgICAgPGo6Zm9yRWFjaCB2YXI9ImkiIGJlZ2luPSIxIiBlbmQ9IjEwIj4KLSAgICAgICAgICAgIDxqOmlmIHRlc3Q9IiR7aT09NH0iPgotICAgICAgICAgICAgICAgIDxqOmJyZWFrLz4KLSAgICAgICAgICAgIDwvajppZj4KLSAgICAgICAgPC9qOmZvckVhY2g+Ci0KLSAgICAgICAgPHRlc3Q6YXNzZXJ0IHRlc3Q9IiR7aT09NH0iLz4gCi0KLSAgICAgICAgPGo6d2hpbGUgdGVzdD0iJHtpICE9IDEwfSI+Ci0gICAgICAgICAgICA8ajppZiB0ZXN0PSIke2k9PTZ9Ij4KLSAgICAgICAgICAgICAgICA8ajpicmVhay8+Ci0gICAgICAgICAgICA8L2o6aWY+Ci0gICAgICAgICAgICA8ajpzZXQgdmFyPSJpIiB2YWx1ZT0iJHtpKzF9Ii8+Ci0gICAgICAgIDwvajp3aGlsZT4KLQotICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtpPT02fSIvPiAKLSAgICAgICAgCi0gIDwvdGVzdDpjYXNlPgotICAKLSAgICA8dGVzdDpjYXNlIG5hbWU9InRlc3RCcmVha1dpdGhJZiI+Ci0gICAgICAgIAotICAgICAgICA8ajpmb3JFYWNoIHZhcj0iaSIgYmVnaW49IjEiIGVuZD0iMTAiPgotICAgICAgICAgICAgPGo6YnJlYWsgdGVzdD0iJHtpPT00fSIvPgotICAgICAgICA8L2o6Zm9yRWFjaD4KLQotICAgICAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHtpPT00fSIvPiAKLQotICAgICAgICA8ajp3aGlsZSB0ZXN0PSIke2kgIT0gMTB9Ij4KLSAgICAgICAgICAgIDxqOmJyZWFrIHRlc3Q9IiR7aT09Nn0iLz4KLSAgICAgICAgICAgIDxqOnNldCB2YXI9ImkiIHZhbHVlPSIke2krMX0iLz4KLSAgICAgICAgPC9qOndoaWxlPgotCi0gICAgICAgIDx0ZXN0OmFzc2VydCB0ZXN0PSIke2k9PTZ9Ii8+IAotICAgICAgICAKLSAgPC90ZXN0OmNhc2U+Ci0KLSAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0VmFyaWFibGVzV2l0aERvdHMiPgotICAgICAgICAKLSAgICAgICAgPGo6c2V0IHZhcj0icGFnZS5uYW1lIiB2YWx1ZT0iYSIvPgotICAgICAgICA8ajpzZXQgdmFyPSJwYWdlLmZvbyIgdmFsdWU9ImIiLz4KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9ImEiIGFjdHVhbD0iJHtwYWdlLm5hbWV9Ii8+IAotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9ImIiIGFjdHVhbD0iJHtwYWdlLmZvb30iLz4gCi0KLSAgICAgICAgPGo6c2V0IHZhcj0ib3V0ZXIiIHZhbHVlPSJkZWYiLz4KLQotICAgICAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9ImRlZiIgYWN0dWFsPSIke291dGVyfSIvPgotICAgICAgICAKLSAgICAgICAgPGo6c2NvcGU+ICAgIAotICAgICAgICAgICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSJhIiBhY3R1YWw9IiR7cGFnZS5uYW1lfSIvPiAKLSAgICAgICAgICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iYiIgYWN0dWFsPSIke3BhZ2UuZm9vfSIvPiAKLSAgICAgICAgPC9qOnNjb3BlPiAgICAgICAgICAgIAotICAgICAgICAKLSAgPC90ZXN0OmNhc2U+Ci0KLSAgPCEtLSB0ZXN0cyB0byBtYWtlIHN1cmUgaW1wb3J0IHdvcmtzIC0tPgotICA8dGVzdDpjYXNlIG5hbWU9InRlc3RJbXBvcnQiPgotCi0gICAgPGo6c2V0IHZhcj0icGFyZW50VmFyIiB2YWx1ZT0iMTIiIC8+Ci0gICAgCi0gICAgPCEtLSBpbXBvcnRlZCBzY3JpcHRzIGJ5IGRlZmF1bHQgZG8gbm90IGluaGVyaXQgcGFyZW50IHZhcnMsCi0gICAgICAgICBidXQgZXhwb3J0IHRvIHRoZW0gLS0+Ci0gICAgPGo6c2V0IHZhcj0idGVzdDEiIHZhbHVlPSJvcmlnaW5hbCIvPgotICAgIDxqOmltcG9ydCB1cmk9ImltcG9ydDEuamVsbHkiLz4KLSAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHt0ZXN0MSA9PSBudWxsfSIvPiAKLQotICAgIDwhLS0gaW5oZXJpdCBwYXJlbnQgdmFycywgYW5kIGV4cG9ydCB0byB0aGVtIC0tPgotICAgIDxqOnNldCB2YXI9InRlc3QxIiB2YWx1ZT0ib3JpZ2luYWwiLz4KLSAgICA8ajppbXBvcnQgdXJpPSJpbXBvcnQxLmplbGx5IiBpbmhlcml0PSJ0cnVlIi8+Ci0gICAgPHRlc3Q6YXNzZXJ0RXF1YWxzIGV4cGVjdGVkPSIxMiIgYWN0dWFsPSIke3Rlc3QxfSIvPiAKLQotICAgIDwhLS0gZXhwbGljaXRseSBkbyBub3QgaW5oZXJpdCBwYXJlbnQgdmFycywKLSAgICAgICAgIGJ1dCBleHBvcnQgdG8gdGhlbSAtLT4KLSAgICA8ajpzZXQgdmFyPSJ0ZXN0MSIgdmFsdWU9Im9yaWdpbmFsIi8+Ci0gICAgPGo6aW1wb3J0IHVyaT0iaW1wb3J0MS5qZWxseSIgaW5oZXJpdD0iZmFsc2UiLz4KLSAgICA8dGVzdDphc3NlcnQgdGVzdD0iJHt0ZXN0MSA9PSBudWxsfSIvPiAKLQotICA8L3Rlc3Q6Y2FzZT4KLQotICA8IS0tIHRlc3RzIHdoZXRoZXIgdGhlIG11dGUgdGFnIGluZGVlZCBvdXRwdXRzIG5vdGhpbmcgLS0+Ci0gIDx0ZXN0OmNhc2UgbmFtZT0idGVzdE11dGVUYWciPgotICAgIDxqOnNldCB2YXI9InNob3VsZEJlTm90aGluZyI+PGo6bXV0ZT5ibG9wPC9qOm11dGU+PC9qOnNldD4KLSAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IiIgYWN0dWFsPSIke3Nob3VsZEJlTm90aGluZ30iLz4KLSAgPC90ZXN0OmNhc2U+Ci0KLSAgPHRlc3Q6Y2FzZSBuYW1lPSJ0ZXN0Rm9yRWFjaFdpdGhTdHJpbmciPgotICAgIDxqOnNldCB2YXI9ImoiIHZhbHVlPSIiLz4KLSAgICAgICAgCi0gICAgPGo6Zm9yRWFjaCB2YXI9ImkiIGl0ZW1zPSJhLGIsYyI+Ci0gICAgICA8ajpzZXQgdmFyPSJqIiB2YWx1ZT0iJHtqfSR7aX0iLz4KLSAgICA8L2o6Zm9yRWFjaD4KLQotICAgIDx0ZXN0OmFzc2VydEVxdWFscyBleHBlY3RlZD0iYWJjIiBhY3R1YWw9IiR7an0iLz4KLSAgPC90ZXN0OmNhc2U+Ci0gIAotICA8IS0tIHRlc3RzIHRoZSBmaWxlIG91dHB1dCBwcm92aWRlZCBieSBqOmZpbGUgLS0+Ci0gIDx0ZXN0OmNhc2UgbmFtZT0idGVzdEZpbGVUYWciPgotICAgIDxqOmZpbGUgbmFtZT0idGFyZ2V0L3Rlc3RfaXNvLnhtbCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiIG9taXRYbWxEZWNsYXJhdGlvbj0idHJ1ZSI+Ci0gICAgICA8bD7DqSNcw7w8L2w+PC9qOmZpbGU+Ci0gICAgPCEtLSBob3cgdG8gY2hlY2sgcmVzdWx0IHdpdGhvdXQgeG1sLXVuaXQgPyAtLT4KLSAgICA8ajpuZXcgdmFyPSJmIiBjbGFzc05hbWU9ImphdmEuaW8uRmlsZSI+PGo6YXJnIHZhbHVlPSJ0YXJnZXQvdGVzdF9pc28ueG1sIi8+PC9qOm5ldz4KLSAgICA8ajpzZXQgdmFyPSJzaW5nbGVTaXplIiB2YWx1ZT0iJHtmLmxlbmd0aCgpfSIvPgotICAgIDwhLS0gdHJ5IG91dHB1dHRpbmcgYSBzZWNvbmQgdGltZSAtLT4KLSAgICA8ajpmaWxlIG5hbWU9InRhcmdldC90ZXN0X2lzby54bWwiIGVuY29kaW5nPSJJU08tODg1OS0xIiAKLSAgICAgICBvbWl0WG1sRGVjbGFyYXRpb249InRydWUiIGFwcGVuZD0idHJ1ZSI+Ci0gICAgICA8bD7DqSNcw7w8L2w+PC9qOmZpbGU+Ci0gICAgPGo6c2V0IHZhcj0iZG91YmxlU2l6ZSIgdmFsdWU9IiR7Zi5sZW5ndGgoKX0iLz4KLSAgICA8dGVzdDphc3NlcnRFcXVhbHMgZXhwZWN0ZWQ9IiR7c2luZ2xlU2l6ZSoyfSIgYWN0dWFsPSIke2RvdWJsZVNpemV9Ii8+Ci0gICAgPC90ZXN0OmNhc2U+Ci08L3Rlc3Q6c3VpdGU+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9Bc3NlcnRFcXVhbHNUYWcuamF2YSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0Fzc2VydEVxdWFsc1RhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGVjNGZhLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0Fzc2VydEVxdWFsc1RhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qdW5pdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkV4cHJlc3Npb247Ci0KLS8qKgotICogQ29tcGFyZXMgYW4gYWN0dWFsIG9iamVjdCBhZ2FpbnN0IGFuIGV4cGVjdGVkIG9iamVjdCBhbmQgaWYgdGhleSBhcmUgZGlmZmVyZW50Ci0gKiB0aGVuIHRoZSB0ZXN0IHdpbGwgZmFpbC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NlcnRFcXVhbHNUYWcgZXh0ZW5kcyBBc3NlcnRUYWdTdXBwb3J0IHsKLQotICAgIHByaXZhdGUgRXhwcmVzc2lvbiBhY3R1YWw7Ci0gICAgcHJpdmF0ZSBFeHByZXNzaW9uIGV4cGVjdGVkOwotCi0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBnZXRCb2R5VGV4dCgpOwotCi0gICAgICAgIE9iamVjdCBleHBlY3RlZFZhbHVlID0gZXhwZWN0ZWQuZXZhbHVhdGUoY29udGV4dCk7Ci0gICAgICAgIE9iamVjdCBhY3R1YWxWYWx1ZSA9IGFjdHVhbC5ldmFsdWF0ZShjb250ZXh0KTsKLQotICAgICAgICBpZiAoZXhwZWN0ZWRWYWx1ZSA9PSBudWxsICYmIGFjdHVhbFZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYWN0dWFsVmFsdWUgIT0gbnVsbCAmJiBleHBlY3RlZFZhbHVlLmVxdWFscyhhY3R1YWxWYWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBleHByZXNzaW9ucyA9ICJcbkV4cGVjdGVkIGV4cHJlc3Npb246ICIKLSAgICAgICAgICAgICsgZXhwZWN0ZWQuZ2V0RXhwcmVzc2lvblRleHQoKQotICAgICAgICAgICAgKyAiXG5BY3R1YWwgZXhwcmVzc2lvbjogIgotICAgICAgICAgICAgKyBhY3R1YWwuZ2V0RXhwcmVzc2lvblRleHQoKTsKLQotICAgICAgICBmYWlsTm90RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkVmFsdWUsIGFjdHVhbFZhbHVlLCBleHByZXNzaW9ucyk7Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYWN0dWFsIHZhbHVlIHdoaWNoIHdpbGwgYmUgY29tcGFyZWQgYWdhaW5zdCB0aGUKLSAgICAgKiBleHBlY3RlZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3R1YWwoRXhwcmVzc2lvbiBhY3R1YWwpIHsKLSAgICAgICAgdGhpcy5hY3R1YWwgPSBhY3R1YWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZXhwZWN0ZWQgdmFsdWUgdG8gYmUgdGVzdGVkIGFnYWluc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZChFeHByZXNzaW9uIGV4cGVjdGVkKSB7Ci0gICAgICAgIHRoaXMuZXhwZWN0ZWQgPSBleHBlY3RlZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9Bc3NlcnRUYWcuamF2YSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0Fzc2VydFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzVjNWY1Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0Fzc2VydFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qdW5pdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseVRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkV4cHJlc3Npb247Ci0KLWltcG9ydCBvcmcuamF4ZW4uSmF4ZW5FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmpheGVuLlhQYXRoOwotCi0vKioKLSAqIFBlcmZvcm1zIGFuIGFzc2VydGlvbiB0aGF0IGEgZ2l2ZW4gYm9vbGVhbiBleHByZXNzaW9uLCBvciBYUGF0aCBleHByZXNzaW9uIGlzCi0gKiB0cnVlLiBJZiB0aGUgZXhwcmVzc2lvbiByZXR1cm5zIGZhbHNlIHRoZW4gdGhpcyB0ZXN0IGZhaWxzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS42ICQKLSAqLwotcHVibGljIGNsYXNzIEFzc2VydFRhZyBleHRlbmRzIEFzc2VydFRhZ1N1cHBvcnQgewotCi0gICAgLyoqIFRoZSBleHByZXNzaW9uIHRvIGV2YWx1YXRlLiAqLwotICAgIHByaXZhdGUgRXhwcmVzc2lvbiB0ZXN0OwotCi0gICAgLyoqIFRoZSBYUGF0aCBleHByZXNzaW9uIHRvIGV2YWx1YXRlICovCi0gICAgcHJpdmF0ZSBYUGF0aCB4cGF0aDsKLQotICAgIHB1YmxpYyBBc3NlcnRUYWcoKSB7Ci0gICAgfQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0ZXN0ID09IG51bGwgJiYgeHBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oICJ0ZXN0IiApOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0ZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghIHRlc3QuZXZhbHVhdGVBc0Jvb2xlYW4oY29udGV4dCkpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCBnZXRCb2R5VGV4dCgpLCAiZXZhbHVhdGluZyB0ZXN0OiAiKyB0ZXN0LmdldEV4cHJlc3Npb25UZXh0KCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHhwYXRoQ29udGV4dCA9IGdldFhQYXRoQ29udGV4dCgpOwotICAgICAgICAgICAgICAgIGlmICghIHhwYXRoLmJvb2xlYW5WYWx1ZU9mKHhwYXRoQ29udGV4dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCggZ2V0Qm9keVRleHQoKSwgImV2YWx1YXRpbmcgeHBhdGg6ICIrIHhwYXRoICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSmF4ZW5FeGNlcHRpb24gYW5FeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmVsbHlUYWdFeGNlcHRpb24oIkVycm9yIGV2YWx1YXRpbmcgeHBhdGgiLCBhbkV4Y2VwdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYm9vbGVhbiBleHByZXNzaW9uIHRvIGV2YWx1YXRlLiBJZiB0aGlzIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlCi0gICAgICogdGhlbiB0aGUgdGVzdCBzdWNjZWVkcyBvdGhlcndpc2UgaWYgaXQgcmV0dXJucyBmYWxzZSB0aGVuIHRoZSB0ZXh0IHdpbGwKLSAgICAgKiBmYWlsIHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIHRhZyBiZWluZyB0aGUgZXJyb3IgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXN0KEV4cHJlc3Npb24gdGVzdCkgewotICAgICAgICB0aGlzLnRlc3QgPSB0ZXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGJvb2xlYW4gWFBhdGggZXhwcmVzc2lvbiB0byBldmFsdWF0ZS4gSWYgdGhpcyBleHByZXNzaW9uIHJldHVybnMgdHJ1ZQotICAgICAqIHRoZW4gdGhlIHRlc3Qgc3VjY2VlZHMgb3RoZXJ3aXNlIGlmIGl0IHJldHVybnMgZmFsc2UgdGhlbiB0aGUgdGV4dCB3aWxsCi0gICAgICogZmFpbCB3aXRoIHRoZSBjb250ZW50IG9mIHRoZSB0YWcgYmVpbmcgdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0WHBhdGgoWFBhdGggeHBhdGgpIHsKLSAgICAgICAgdGhpcy54cGF0aCA9IHhwYXRoOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0Fzc2VydFRhZ1N1cHBvcnQuamF2YSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0Fzc2VydFRhZ1N1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE5MDc1Mi4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9Bc3NlcnRUYWdTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmp1bml0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnhwYXRoLlhQYXRoVGFnU3VwcG9ydDsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBhbnkgYXNzZXJ0aW9uIHRhZyB3aGljaCBpcwotICogdXNlZnVsIGZvciBpbXBsZW1lbnRhdGlvbiBpbmhlcml0ZW5jZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNCAkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBc3NlcnRUYWdTdXBwb3J0IGV4dGVuZHMgWFBhdGhUYWdTdXBwb3J0IHsKLQotICAgIHB1YmxpYyBBc3NlcnRUYWdTdXBwb3J0KCkgewotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFByb2R1Y2VzIGEgZmFpbHVyZSBhc3NlcnRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZhaWwoU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBKZWxseUFzc2VydGlvbkZhaWxlZEVycm9yIHsKLSAgICAgICAgdGhyb3cgbmV3IEplbGx5QXNzZXJ0aW9uRmFpbGVkRXJyb3IobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvZHVjZXMgYSBmYWlsdXJlIGFzc2VydGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBhZGRlZCBkZXRhaWwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmFpbChTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGRldGFpbCkgdGhyb3dzIEplbGx5QXNzZXJ0aW9uRmFpbGVkRXJyb3IgewotICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsIHx8IG1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgZmFpbChkZXRhaWwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZmFpbChtZXNzYWdlICsgIi4gQXNzZXJ0aW9uIGZhaWxlZCB3aGlsZSAiICsgZGV0YWlsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2R1Y2VzIGEgZmFpbHVyZSBpZiB0aGUgYWN0dWFsIHZhbHVlIHdhcyBub3QgZXF1YWwgdG8gdGhlIGV4cGVjdGVkIHZhbHVlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmFpbE5vdEVxdWFscyhTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGV4cGVjdGVkLCBPYmplY3QgYWN0dWFsLCBTdHJpbmcgZXhwcmVzc2lvbnMpIHRocm93cyBKZWxseUFzc2VydGlvbkZhaWxlZEVycm9yIHsKLSAgICAgICAgU3RyaW5nIGZvcm1hdHRlZD0gIiI7Ci0gICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvcm1hdHRlZCA9IG1lc3NhZ2UgKyIgIjsKLSAgICAgICAgfQotICAgICAgICBmYWlsKGZvcm1hdHRlZCArICJleHBlY3RlZDpbIiArIGV4cGVjdGVkICsgIl0gYnV0IHdhczpbIiArIGFjdHVhbCArICJdIiArIGV4cHJlc3Npb25zKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0Fzc2VydFRocm93c1RhZy5qYXZhIGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvQXNzZXJ0VGhyb3dzVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZGYyMGIuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvQXNzZXJ0VGhyb3dzVGFnLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9DYXNlVGFnLmphdmEgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9DYXNlVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMTE2NmQuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvQ2FzZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHNpbmdsZSB0ZXN0IGNhc2UgaW4gYSB0ZXN0IHN1aXRlOyB0aGlzIHRhZyBpcyBhbmFsYWdvdXMgdG8KLSAqIEpVbml0J3MgVGVzdENhc2UgY2xhc3MuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjYgJAotICovCi1wdWJsaWMgY2xhc3MgQ2FzZVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCi0gICAgLy8gVGFnIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKGZpbmFsIFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotICAgICAgICBpZiAoIG5hbWUgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIG5hbWUgPSB0b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gIyMjIyB3ZSBuZWVkIHRvIHJlZGlyZWN0IHRoZSBvdXRwdXQgdG8gYSBUZXN0TGlzdGVuZXIKLSAgICAgICAgLy8gb3Igc29tZXRoaW5nPwotICAgICAgICBUZXN0Q2FzZSB0ZXN0Q2FzZSA9IG5ldyBUZXN0Q2FzZShuYW1lKSB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGNoaWxkIGNvbnRleHQgc28gdGhhdCBlYWNoIHRlc3QgY2FzZQotICAgICAgICAgICAgICAgIC8vIHdpbGwgaGF2ZSBpdHMgb3duIHZhcmlhYmxlIHNjb3BlcwotICAgICAgICAgICAgICAgIEplbGx5Q29udGV4dCBuZXdDb250ZXh0ID0gbmV3IEplbGx5Q29udGV4dCggY29udGV4dCApOwotCi0gICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBpbmhlcml0ZW5jZSBvZiB2YXJpYWJsZXMgYW5kIHRhZyBsaWJyYXJpZXMKLSAgICAgICAgICAgICAgICBuZXdDb250ZXh0LnNldEV4cG9ydExpYnJhcmllcyhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbmV3Q29udGV4dC5zZXRFeHBvcnQoZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgLy8gaW52b2tlIHRoZSB0ZXN0IGNhc2UKLSAgICAgICAgICAgICAgICBnZXRCb2R5KCkucnVuKG5ld0NvbnRleHQsIG91dHB1dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gbGV0cyBmaW5kIHRoZSB0ZXN0IHN1aXRlCi0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IGdldFN1aXRlKCk7Ci0gICAgICAgIGlmICggc3VpdGUgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKZWxseVRhZ0V4Y2VwdGlvbiggIkNvdWxkIG5vdCBmaW5kIGEgVGVzdFN1aXRlIHRvIGFkZCB0aGlzIHRlc3QgdG8uIFRoaXMgdGFnIHNob3VsZCBiZSBpbnNpZGUgYSA8dGVzdDpzdWl0ZT4gdGFnIiApOwotICAgICAgICB9Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QodGVzdENhc2UpOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhpcyB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogU3RyYXRlZ3kgbWV0aG9kIHRvIGZpbmQgdGhlIGNvcnJlbnQgVGVzdFN1aXRlIHRvIGFkZCBhIG5ldyBUZXN0IGNhc2UgdG8KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVGVzdFN1aXRlIGdldFN1aXRlKCkgewotICAgICAgICBTdWl0ZVRhZyB0YWcgPSAoU3VpdGVUYWcpIGZpbmRBbmNlc3RvcldpdGhDbGFzcyggU3VpdGVUYWcuY2xhc3MgKTsKLSAgICAgICAgaWYgKCB0YWcgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIHJldHVybiB0YWcuZ2V0U3VpdGUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFRlc3RTdWl0ZSkgY29udGV4dC5nZXRWYXJpYWJsZSggIm9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5qdW5pdC5zdWl0ZSIgKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0ZhaWxUYWcuamF2YSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0ZhaWxUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk1NWQyYS4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9GYWlsVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmp1bml0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci0KLS8qKgotICogVGhpcyB0YWcgY2F1c2VzIGEgZmFpbHVyZSBtZXNzYWdlLiBUaGUgbWVzc2FnZSBjYW4gZWl0aGVyCi0gKiBiZSBzcGVjaWZpZWQgaW4gdGhlIHRhZ3MgYm9keSBvciB2aWEgdGhlIG1lc3NhZ2UgYXR0cmlidXRlLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIEZhaWxUYWcgZXh0ZW5kcyBBc3NlcnRUYWdTdXBwb3J0IHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0KLSAgICBwdWJsaWMgRmFpbFRhZygpIHsKLSAgICB9Ci0KLSAgICAvLyBUYWcgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgdGhyb3dzIEplbGx5VGFnRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBnZXRNZXNzYWdlKCk7Ci0gICAgICAgIGlmICggbWVzc2FnZSA9PSBudWxsICkgewotICAgICAgICAgICAgbWVzc2FnZSA9IGdldEJvZHlUZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmFpbCggbWVzc2FnZSApOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGZhaWx1cmUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmYWlsdXJlIG1lc3NhZ2UuIElmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBzcGVjaWZpZWQgdGhlbiB0aGUKLSAgICAgKiBib2R5IG9mIHRoaXMgdGFnIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9KVW5pdFRhZ0xpYnJhcnkuamF2YSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0pVbml0VGFnTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWYyNDgzLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0pVbml0VGFnTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qdW5pdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdMaWJyYXJ5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmV4cHJlc3Npb24uRXhwcmVzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwuVGFnU2NyaXB0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5leHByZXNzaW9uLnhwYXRoLlhQYXRoRXhwcmVzc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKiogRGVzY3JpYmVzIHRoZSBUYWdsaWIuIFRoaXMgY2xhc3MgY291bGQgYmUgZ2VuZXJhdGVkIGJ5IFhEb2NsZXQKLSAgKgotICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNyAkCi0gICovCi1wdWJsaWMgY2xhc3MgSlVuaXRUYWdMaWJyYXJ5IGV4dGVuZHMgVGFnTGlicmFyeSB7Ci0KLSAgICAvKiogVGhlIExvZyB0byB3aGljaCBsb2dnaW5nIGNhbGxzIHdpbGwgYmUgbWFkZS4gKi8KLSAgICBwcml2YXRlIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKVW5pdFRhZ0xpYnJhcnkuY2xhc3MpOwotCi0gICAgcHVibGljIEpVbml0VGFnTGlicmFyeSgpIHsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImFzc2VydCIsIEFzc2VydFRhZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyVGFnKCJhc3NlcnRFcXVhbHMiLCBBc3NlcnRFcXVhbHNUYWcuY2xhc3MpOwotICAgICAgICByZWdpc3RlclRhZygiYXNzZXJ0VGhyb3dzIiwgQXNzZXJ0VGhyb3dzVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoImZhaWwiLCBGYWlsVGFnLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInJ1biIsIFJ1blRhZy5jbGFzcyApOwotICAgICAgICByZWdpc3RlclRhZygiY2FzZSIsIENhc2VUYWcuY2xhc3MgKTsKLSAgICAgICAgcmVnaXN0ZXJUYWcoInN1aXRlIiwgU3VpdGVUYWcuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhwcmVzc2lvbiBjcmVhdGVFeHByZXNzaW9uKAotICAgICAgICBFeHByZXNzaW9uRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICBUYWdTY3JpcHQgdGFnU2NyaXB0LAotICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSwKLSAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlKSB0aHJvd3MgSmVsbHlFeGNlcHRpb24gewotCi0gICAgICAgIC8vICMjIyMgbWF5IG5lZWQgdG8gaW5jbHVkZSBzb21lIG5hbWVzcGFjZSBVUkkgaW5mb3JtYXRpb24gaW4gdGhlIFhQYXRoIGluc3RhbmNlPwotCi0gICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscygieHBhdGgiKSkgewotICAgICAgICAgICAgaWYgKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoICJQYXJzaW5nIFhQYXRoIGV4cHJlc3Npb246ICIgKyBhdHRyaWJ1dGVWYWx1ZSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBYUGF0aCB4cGF0aCA9IG5ldyBEb200alhQYXRoKGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgIEV4cHJlc3Npb24geHBhdGhFeHByID0gc3VwZXIuY3JlYXRlRXhwcmVzc2lvbiggZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnU2NyaXB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSApOwotCi0gICAgICAgICAgICByZXR1cm4gbmV3IFhQYXRoRXhwcmVzc2lvbihhdHRyaWJ1dGVWYWx1ZSwgeHBhdGhFeHByLCB0YWdTY3JpcHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd2lsbCB1c2UgdGhlIGRlZmF1bHQgZXhwcmVzc2lvbiBpbnN0ZWFkCi0gICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVFeHByZXNzaW9uKGZhY3RvcnksIHRhZ1NjcmlwdCwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0plbGx5QXNzZXJ0aW9uRmFpbGVkRXJyb3IuamF2YSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0plbGx5QXNzZXJ0aW9uRmFpbGVkRXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhkODc5Ny4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9KZWxseUFzc2VydGlvbkZhaWxlZEVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmp1bml0OwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkxvY2F0aW9uQXdhcmU7Ci0KLS8qKgotICogPHA+PGNvZGU+SmVsbHlBc3NlcnRpb25GYWlsZWRFcnJvcjwvY29kZT4gaXMKLSAqIGEgSlVuaXQgQXNzZXJ0aW9uRmFpbGVkRXJyb3Igd2hpY2ggaXMgTG9jYXRpb25Bd2FyZSBzbyB0aGF0IGl0IGNhbiBpbmNsdWRlCi0gKiBkZXRhaWxzIG9mIHdoZXJlIGluIHRoZSBKZWxseVVuaXQgdGVzdCBjYXNlIHRoYXQgdGhlIGZhaWx1cmUgb2NjdXJyZWQuPC9wPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKLSAqLwotCi1wdWJsaWMgY2xhc3MgSmVsbHlBc3NlcnRpb25GYWlsZWRFcnJvciBleHRlbmRzIEFzc2VydGlvbkZhaWxlZEVycm9yIGltcGxlbWVudHMgTG9jYXRpb25Bd2FyZSB7Ci0KLSAgICAvKiogdGhlIHVuZGVybHlpbmcgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbiAqLwotICAgIHByaXZhdGUgVGhyb3dhYmxlIGNhdXNlOwotCi0gICAgLyoqIHRoZSBKZWxseSBmaWxlIHdoaWNoIGNhdXNlZCB0aGUgcHJvYmxlbSAqLwotICAgIHByaXZhdGUgU3RyaW5nIGZpbGVOYW1lOwotCi0gICAgLyoqIHRoZSB0YWcgbmFtZSB3aGljaCBjYXVzZWQgdGhlIHByb2JsZW0gKi8KLSAgICBwcml2YXRlIFN0cmluZyBlbGVtZW50TmFtZTsKLQotICAgIC8qKiB0aGUgbGluZSBudW1iZXIgaW4gdGhlIHNjcmlwdCBvZiB0aGUgZXJyb3IgKi8KLSAgICBwcml2YXRlIGludCBsaW5lTnVtYmVyID0gLTE7Ci0KLSAgICAvKiogdGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIHNjcmlwdCBvZiB0aGUgZXJyb3IgKi8KLSAgICBwcml2YXRlIGludCBjb2x1bW5OdW1iZXIgPSAtMTsKLQotICAgIHB1YmxpYyBKZWxseUFzc2VydGlvbkZhaWxlZEVycm9yKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBKZWxseUFzc2VydGlvbkZhaWxlZEVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBKZWxseUFzc2VydGlvbkZhaWxlZEVycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgICAgIHRoaXMuY2F1c2UgPSBjYXVzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmVsbHlBc3NlcnRpb25GYWlsZWRFcnJvcihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgdGhpcy5jYXVzZSA9IGNhdXNlOwotICAgIH0KLQotICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0Q2F1c2UoKSB7Ci0gICAgICAgIHJldHVybiBjYXVzZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSB0YWcKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiBsaW5lTnVtYmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSB0YWcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMaW5lTnVtYmVyKGludCBsaW5lTnVtYmVyKSB7Ci0gICAgICAgIHRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgY29sdW1uIG51bWJlciBvZiB0aGUgdGFnCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiBjb2x1bW5OdW1iZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29sdW1uIG51bWJlciBvZiB0aGUgdGFnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29sdW1uTnVtYmVyKGludCBjb2x1bW5OdW1iZXIpIHsKLSAgICAgICAgdGhpcy5jb2x1bW5OdW1iZXIgPSBjb2x1bW5OdW1iZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgSmVsbHkgZmlsZSB3aGljaCBjYXVzZWQgdGhlIHByb2JsZW0KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gZmlsZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgSmVsbHkgZmlsZSB3aGljaCBjYXVzZWQgdGhlIHByb2JsZW0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHsKLSAgICAgICAgdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudCBuYW1lIHdoaWNoIGNhdXNlZCB0aGUgcHJvYmxlbQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBlbGVtZW50IG5hbWUgd2hpY2ggY2F1c2VkIHRoZSBwcm9ibGVtCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudE5hbWUoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0gICAgICAgIHRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKSArICIgRmlsZTogIiArIGZpbGVOYW1lICsgIiBBdCB0YWcgPCIgKyBlbGVtZW50TmFtZSArICI+OiBsaW5lOiAiCi0gICAgICAgICAgICArIGxpbmVOdW1iZXIgKyAiIGNvbHVtbjogIiArIGNvbHVtbk51bWJlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlYXNvbigpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKTsKLSAgICB9Ci0KLSAgICAvLyAjIyMjIG92ZXJsb2FkIHRoZSBwcmludFN0YWNrVHJhY2UgbWV0aG9kcy4uLgotICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFdyaXRlciBzKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAocykgewotICAgICAgICAgICAgc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotICAgICAgICAgICAgaWYgIChjYXVzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcy5wcmludGxuKCJSb290IGNhdXNlIik7Ci0gICAgICAgICAgICAgICAgY2F1c2UucHJpbnRTdGFja1RyYWNlKHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIHMpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChzKSB7Ci0gICAgICAgICAgICBzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7Ci0gICAgICAgICAgICBpZiAgKGNhdXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzLnByaW50bG4oIlJvb3QgY2F1c2UiKTsKLSAgICAgICAgICAgICAgICBjYXVzZS5wcmludFN0YWNrVHJhY2Uocyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7Ci0gICAgICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSb290IGNhdXNlIik7Ci0gICAgICAgICAgICBjYXVzZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0plbGx5VGVzdFN1aXRlLmphdmEgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9KZWxseVRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzhjYTYzLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0plbGx5VGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmp1bml0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBjcmVhdGluZyBhIFRlc3RTdWl0ZSB2aWEgYSBKZWxseSBzY3JpcHQuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjQgJAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmVsbHlUZXN0U3VpdGUgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEplbGx5VGVzdFN1aXRlLmNsYXNzKTsKLQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZCB0byBjcmVhdGUgYSB0ZXN0IHN1aXRlIGZyb20gYSBmaWxlIG5hbWUgb24gdGhlIGNsYXNzIHBhdGgKLSAgICAgKiBpbiB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gY2xhc3MuCi0gICAgICogRm9yIGV4YW1wbGUgYSB0ZXN0IGNvdWxkIGNhbGwKLSAgICAgKiA8Y29kZT4KLSAgICAgKiBjcmVhdGVUZXN0U3VpdGUoIEZvby5jbGFzcywgInN1aXRlLmplbGx5IiApOwotICAgICAqIDwvY29kZT4KLSAgICAgKiB3aGljaCB3b3VsZCBsb2FhZCB0aGUgJ3N1aXRlLmplbGx5IHNjcmlwdCBmcm9tIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlIEZvbwotICAgICAqIGNsYXNzIG9uIHRoZSBjbGFzc3BhdGguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdENsYXNzIGlzIHRoZSB0ZXN0IGNsYXNzIHVzZWQgdG8gbG9hZCB0aGUgc2NyaXB0IHZpYSB0aGUgY2xhc3NwYXRoCi0gICAgICogQHBhcmFtIHNjcmlwdCBpcyB0aGUgbmFtZSBvZiB0aGUgc2NyaXB0LCB3aGljaCBpcyB0eXBpY2FsbHkganVzdCBhIG5hbWUsIG5vIGRpcmVjdG9yeS4KLSAgICAgKiBAcmV0dXJuIGEgbmV3bHkgY3JlYXRlZCBUZXN0U3VpdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBjcmVhdGVUZXN0U3VpdGUoQ2xhc3MgdGVzdENsYXNzLCBTdHJpbmcgc2NyaXB0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVVJMIHVybCA9IHRlc3RDbGFzcy5nZXRSZXNvdXJjZShzY3JpcHQpOwotICAgICAgICBpZiAoIHVybCA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgSmVsbHkgc2NyaXB0OiAiICsgc2NyaXB0Ci0gICAgICAgICAgICAgICAgKyAiIGluIHBhY2thZ2Ugb2YgY2xhc3M6ICIgKyB0ZXN0Q2xhc3MuZ2V0TmFtZSgpCi0gICAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjcmVhdGVUZXN0U3VpdGUoIHVybCApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdG8gY3JlYXRlIGEgdGVzdCBzdWl0ZSBmcm9tIHRoZSBnaXZlbiBKZWxseSBzY3JpcHQKLSAgICAgKgotICAgICAqIEBwYXJhbSBzY3JpcHQgaXMgdGhlIFVSTCB0byB0aGUgc2NyaXB0IHdoaWNoIHNob3VsZCBjcmVhdGUgYSBUZXN0U3VpdGUKLSAgICAgKiBAcmV0dXJuIGEgbmV3bHkgY3JlYXRlZCBUZXN0U3VpdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBjcmVhdGVUZXN0U3VpdGUoVVJMIHNjcmlwdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEplbGx5Q29udGV4dCBjb250ZXh0ID0gbmV3IEplbGx5Q29udGV4dChzY3JpcHQpOwotICAgICAgICBYTUxPdXRwdXQgb3V0cHV0ID0gWE1MT3V0cHV0LmNyZWF0ZVhNTE91dHB1dChTeXN0ZW0ub3V0KTsKLSAgICAgICAgY29udGV4dCA9IGNvbnRleHQucnVuU2NyaXB0KHNjcmlwdCwgb3V0cHV0KTsKLSAgICAgICAgVGVzdFN1aXRlIGFuc3dlciA9IChUZXN0U3VpdGUpIGNvbnRleHQuZ2V0VmFyaWFibGUoIm9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5qdW5pdC5zdWl0ZSIpOwotICAgICAgICBpZiAoIGFuc3dlciA9PSBudWxsICkgewotICAgICAgICAgICAgbG9nLndhcm4oICJDb3VsZCBub3QgZmluZCBhIFRlc3RTdWl0ZSBjcmVhdGVkIGJ5IEplbGx5IGZvciB0aGUgc2NyaXB0OiIgKyBzY3JpcHQgKTsKLSAgICAgICAgICAgIC8vIHJldHVybiBhbiBlbXB0eSB0ZXN0IHN1aXRlCi0gICAgICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbnN3ZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvUnVuVGFnLmphdmEgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9SdW5UYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMwMjE1NC4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9SdW5UYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50YWdzLmp1bml0OwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdExpc3RlbmVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5NaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGw7Ci0KLS8qKgotICogVGhpcyB0YWcgd2lsbCBydW4gdGhlIGdpdmVuIFRlc3Qgd2hpY2ggY291bGQgYmUgYW4gaW5kaXZpZHVhbCBUZXN0Q2FzZSBvciBhIFRlc3RTdWl0ZS4KLSAqIFRoZSBUZXN0UmVzdWx0IGNhbiBiZSBzcGVjaWZpZWQgdG8gY2FwdHVyZSB0aGUgb3V0cHV0LCBvdGhlcndpc2UgdGhlIHJlc3VsdHMgYXJlIG91dHB1dAotICogYXMgWE1MIHNvIHRoYXQgdGhleSBjYW4gYmUgZm9ybWF0dGVkIGluIHNvbWUgY3VzdG9tIG1hbm5lci4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5UYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhSdW5UYWcuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBUZXN0IHRlc3Q7Ci0gICAgcHJpdmF0ZSBUZXN0UmVzdWx0IHJlc3VsdDsKLSAgICBwcml2YXRlIFRlc3RMaXN0ZW5lciBsaXN0ZW5lcjsKLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBUZXN0IHRlc3QgPSBnZXRUZXN0KCk7Ci0gICAgICAgIGlmICggdGVzdCA9PSBudWxsICkgewotICAgICAgICAgICAgdGVzdCA9IChUZXN0KSBjb250ZXh0LmdldFZhcmlhYmxlKCJvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuanVuaXQuc3VpdGUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIHRlc3QgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCAidGVzdCIgKTsKLSAgICAgICAgfQotICAgICAgICBUZXN0UmVzdWx0IHJlc3VsdCA9IGdldFJlc3VsdCgpOwotICAgICAgICBpZiAoIHJlc3VsdCA9PSBudWxsICkgewotICAgICAgICAgICAgcmVzdWx0ID0gY3JlYXRlUmVzdWx0KG91dHB1dCk7Ci0gICAgICAgIH0KLSAgICAgICAgVGVzdExpc3RlbmVyIGxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoKTsKLSAgICAgICAgaWYgKCBsaXN0ZW5lciA9PSBudWxsICkgewotICAgICAgICAgICAgbGlzdGVuZXIgPSBjcmVhdGVUZXN0TGlzdGVuZXIob3V0cHV0KTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICB0ZXN0LnJ1bihyZXN1bHQpOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFRlc3RSZXN1bHQgdXNlZCB0byBjYXB0dXJlIHRoZSBvdXRwdXQgb2YgdGhlIHRlc3QuCi0gICAgICogQHJldHVybiBUZXN0UmVzdWx0Ci0gICAgICovCi0gICAgcHVibGljIFRlc3RSZXN1bHQgZ2V0UmVzdWx0KCkgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFRlc3QgdG8gYmUgcmFuLgotICAgICAqIEByZXR1cm4gVGVzdAotICAgICAqLwotICAgIHB1YmxpYyBUZXN0IGdldFRlc3QoKSB7Ci0gICAgICAgIHJldHVybiB0ZXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEpVbml0IFRlc3RSZXN1bHQgdXNlZCB0byBjYXB0dXJlIHRoZSByZXN1bHRzIG9mIHRoZSB0c3QKLSAgICAgKiBAcGFyYW0gcmVzdWx0IFRoZSBUZXN0UmVzdWx0IHRvIHVzZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlc3VsdChUZXN0UmVzdWx0IHJlc3VsdCkgewotICAgICAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBKVW5pdCBUZXN0IHRvIHJ1biB3aGljaCBjb3VsZCBiZSBhbiBpbmRpdmlkdWFsIHRlc3Qgb3IgYSBUZXN0U3VpdGUKLSAgICAgKiBAcGFyYW0gdGVzdCBUaGUgdGVzdCB0byBydW4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXN0KFRlc3QgdGVzdCkgewotICAgICAgICB0aGlzLnRlc3QgPSB0ZXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3RlbmVyLgotICAgICAqIEByZXR1cm4gVGVzdExpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIFRlc3RMaXN0ZW5lciBnZXRMaXN0ZW5lcigpIHsKLSAgICAgICAgcmV0dXJuIGxpc3RlbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIFRlc3RMaXN0ZW5lci50byBiZSB1c2VkIHRvIGZvcm1hdCB0aGUgb3V0cHV0IG9mIHJ1bm5pbmcgdGhlIHVuaXQgdGVzdCBjYXNlcwotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGlzdGVuZXIoVGVzdExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0KLQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFRlc3RSZXN1bHQgdG8gY2FwdHVyZSB0aGUgb3V0cHV0IG9mCi0gICAgICogdGhlIHRlc3QgY2FzZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVGVzdFJlc3VsdCBjcmVhdGVSZXN1bHQoWE1MT3V0cHV0IG91dHB1dCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RSZXN1bHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgVGVzdExpc3RlbmVyIHRvIGNhcHR1cmUgdGhlIG91dHB1dCBvZgotICAgICAqIHRoZSB0ZXN0IGNhc2VzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRlc3RMaXN0ZW5lciBjcmVhdGVUZXN0TGlzdGVuZXIoZmluYWwgWE1MT3V0cHV0IG91dHB1dCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc3RhcnRFbGVtZW50KCJlcnJvciIpOwotCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dC5zdGFydEVsZW1lbnQoIm1lc3NhZ2UiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmVuZEVsZW1lbnQoIm1lc3NhZ2UiKTsKLQotICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc3RhcnRFbGVtZW50KCJzdGFjayIpOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoIHN0YWNrVHJhY2VUb1N0cmluZyh0KSApOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZW5kRWxlbWVudCgic3RhY2siKTsKLQotICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZW5kRWxlbWVudCgiZXJyb3IiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVNBWEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZEZhaWx1cmUoVGVzdCB0ZXN0LCBBc3NlcnRpb25GYWlsZWRFcnJvciB0KSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnN0YXJ0RWxlbWVudCgiZmFpbHVyZSIpOwotCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dC5zdGFydEVsZW1lbnQoIm1lc3NhZ2UiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmVuZEVsZW1lbnQoIm1lc3NhZ2UiKTsKLQotICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc3RhcnRFbGVtZW50KCJzdGFjayIpOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoIHN0YWNrVHJhY2VUb1N0cmluZyh0KSApOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZW5kRWxlbWVudCgic3RhY2siKTsKLQotICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZW5kRWxlbWVudCgiZmFpbHVyZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU0FYRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZW5kVGVzdChUZXN0IHRlc3QpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZW5kRWxlbWVudCgidGVzdCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU0FYRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc3RhcnRUZXN0KFRlc3QgdGVzdCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdGVzdC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzSW1wbCBhdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKCIiLCAibmFtZSIsICJuYW1lIiwgIkNEQVRBIiwgbmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnN0YXJ0RWxlbWVudCgidGVzdCIsIGF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU0FYRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdGFjayB0cmFjZSBhcyBhIFN0cmluZwotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgc3RhY2tUcmFjZVRvU3RyaW5nKFRocm93YWJsZSB0KSB7Ci0gICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIHQucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcih3cml0ZXIpKTsKLSAgICAgICAgcmV0dXJuIHdyaXRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgU0FYIEV4Y2VwdGlvbnMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTQVhFeGNlcHRpb24oU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgbG9nLmVycm9yKCAiQ2F1Z2h0OiAiICsgZSwgZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L1N1aXRlVGFnLmphdmEgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9TdWl0ZVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzA3Yzk0Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L1N1aXRlVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBUZXN0Q2FzZXMuLiBUaGlzIHRhZyBpcyBhbmFsYWdvdXMgdG8KLSAqIEpVbml0J3MgVGVzdFN1aXRlIGNsYXNzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKLSAqLwotcHVibGljIGNsYXNzIFN1aXRlVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0KLSAgICAvKiogdGhlIHRlc3Qgc3VpdGUgdGhpcyB0YWcgY3JlYXRlZCAqLwotICAgIHByaXZhdGUgVGVzdFN1aXRlIHN1aXRlOwotCi0gICAgLyoqIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBvZiB0aGUgdGVzdCBzdWl0ZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIHZhcjsKLQotICAgIC8qKiB0aGUgbmFtZSBvZiB0aGUgdGVzdCBzdWl0ZSB0byBjcmVhdGUgKi8KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgcHVibGljIFN1aXRlVGFnKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBuZXcgVGVzdCB0byB0aGlzIHN1aXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVGVzdChUZXN0IHRlc3QpIHsKLSAgICAgICAgZ2V0U3VpdGUoKS5hZGRUZXN0KHRlc3QpOwotICAgIH0KLQotICAgIC8vIFRhZyBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBkb1RhZyhYTUxPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24gewotICAgICAgICBzdWl0ZSA9IGNyZWF0ZVN1aXRlKCk7Ci0KLSAgICAgICAgVGVzdFN1aXRlIHBhcmVudCA9IChUZXN0U3VpdGUpIGNvbnRleHQuZ2V0VmFyaWFibGUoIm9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5qdW5pdC5zdWl0ZSIpOwotICAgICAgICBpZiAoIHBhcmVudCA9PSBudWxsICkgewotICAgICAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZSgib3JnLmFwYWNoZS5jb21tb25zLmplbGx5Lmp1bml0LnN1aXRlIiwgc3VpdGUgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHBhcmVudC5hZGRUZXN0KCBzdWl0ZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotCi0gICAgICAgIGlmICggdmFyICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKHZhciwgc3VpdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBUZXN0U3VpdGUgZ2V0U3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IHN1aXRlIHdoaWNoaSBpcyBleHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0gICAgICAgIHRoaXMudmFyID0gdmFyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB0ZXN0IHN1aXRlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgdGVzdCBzdWl0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgVGVzdFN1aXRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRlc3RTdWl0ZSBjcmVhdGVTdWl0ZSgpIHsKLSAgICAgICAgaWYgKCBuYW1lID09IG51bGwgKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUobmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9wYWNrYWdlLmh0bWwgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9qdW5pdC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMTk3NjguLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxodG1sPgotPGhlYWQ+Ci08L2hlYWQ+Ci08Ym9keT4KLQotICA8cD5BIGNvbGxlY3Rpb24gb2YgPGEgaHJlZj0iaHR0cDovL3d3dy5qdW5pdC5vcmciPkpVbml0PC9hPiB0YWdzIGZvciAKLSAgCXBlcmZvcm1pbmcgdW5pdCB0ZXN0cyB3cml0dGVuIGluIEplbGx5IHNjcmlwdC4KLSAgPC9wPgotICAKLSAgPHA+Ci0gICAgVGhlICZsdDtzdWl0ZSZndDsgdGFnIGFsbG93cyBhIHRlc3Qgc3VpdGUgdG8gYmUgY3JlYXRlZCBhbmQgdGhlbiB0ZXN0IGNhc2VzIGNhbiBlaXRoZXIgCi0gICAgYmUgaW5kaXZpZHVhbGx5IHJhbiBvciB0aGUgd2hvbGUgc3VpdGUgcmFuLgotICA8L3A+Ci0gIDxwPgotICAgIFRoZSAmbHQ7Y2FzZSZndDsgdGFnIGFsbG93cyBhIHNpbmdsZSB0ZXN0IGNhc2UgdG8gYmUgY3JlYXRlZCBhcyBwYXJ0IG9mIGEgc3VpdGUuCi0gIDwvcD4KLSAgPHA+Ci0gICAgVGhlICZsdDtydW4mZ3Q7IHRhZyBjYW4gYmUgdXNlZCB0byBydW4gYSBnaXZlbiBUZXN0LCBUZXN0Q2FzZSBvciBUZXN0U3VpdGUKLSAgPC9wPgotICAKLSAgPHA+VGhlcmUgaXMgYW4gZXhhbXBsZSBvZiB0aGVzZSB0YWdzIGluIGFjdGlvbiAKLQk8YSBocmVmPSJodHRwOi8vY3ZzLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvamFrYXJ0YS1jb21tb25zL2plbGx5L2plbGx5LXRhZ3MvanVuaXQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvanVuaXQvc3VpdGUuamVsbHk/cmV2PUhFQUQmY29udGVudC10eXBlPXRleHQvdm5kLnZpZXdjdnMtbWFya3VwIj5oZXJlPC9hPgotICA8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdC9pbXBsL0R1bW15VGFnLmphdmEgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdC9pbXBsL0R1bW15VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNmQ1NjYuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rlc3QvaW1wbC9EdW1teVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGVzdC5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5VGFnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWdTdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnV0aWwuQ2xhc3NMb2FkZXJVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBTaW1wbGUgVGVzdCBUYWcKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzp2aW5heWNAYXBhY2hlLm9yZyI+VmluYXkgQ2hhbmRyYW48L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEdW1teVRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgewotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhEdW1teVRhZy5jbGFzcyk7Ci0gICAgLyoqIEEgdGVzdCBjbGFzcyB0byBiZSBsb2FkZWQgYnkgdGhlIFRhZyovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbV9jbGFzc1RvQmVMb2FkZWQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5UYWcjZG9UYWcoWE1MT3V0cHV0KQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuY29yZS5KZWxseVRhZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBKZWxseVRhZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiKioqKioqKipFeGVjdXRpbmcgRHVtbXlUYWcgQm9keSoqKioqKioqKiIpOwotICAgICAgICBpZiAobV9jbGFzc1RvQmVMb2FkZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzTG9hZGVyVXRpbHMubG9hZENsYXNzKG1fY2xhc3NUb0JlTG9hZGVkLCBnZXRDbGFzcygpKTsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2xhc3NbIiArIG1fY2xhc3NUb0JlTG9hZGVkICsgIl0gRk9VTkQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIkNsYXNzWyIgKyBtX2NsYXNzVG9CZUxvYWRlZCArICJdIE5PVCBGT1VORCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgaW52b2tlQm9keShvdXRwdXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgVGVzdCBWYXJpYWJsZShVc2VkIGZvciB0ZXN0aW5nIHRoZSBUYWdMaWJyYXJ5Q2xhc3Nsb2FkZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9hZENsYXNzKFN0cmluZyBleHRyYUNsYXNzKSB7Ci0gICAgICAgIG1fY2xhc3NUb0JlTG9hZGVkID0gZXh0cmFDbGFzczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0L2ltcGwvRHVtbXlUYWdMaWJyYXJ5LmphdmEgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdC9pbXBsL0R1bW15VGFnTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGM0OTg5Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0L2ltcGwvRHVtbXlUYWdMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50ZXN0LmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuVGFnTGlicmFyeTsKLQotLyoqCi0gKiBUZXN0IHRhZ2xpYnJhcnkKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzp2aW5heWNAYXBhY2hlLm9yZyI+VmluYXkgQ2hhbmRyYW48L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEdW1teVRhZ0xpYnJhcnkgZXh0ZW5kcyBUYWdMaWJyYXJ5IHsKLSAgICBwdWJsaWMgRHVtbXlUYWdMaWJyYXJ5KCkgewotICAgICAgICByZWdpc3RlclRhZygiZHVtbXkiLCBEdW1teVRhZy5jbGFzcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdC9pbXBsL1Rlc3RFbWJlZGRlZC5qYXZhIGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rlc3QvaW1wbC9UZXN0RW1iZWRkZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQwZjMyZi4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdC9pbXBsL1Rlc3RFbWJlZGRlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRlc3QuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuaW1wbC5FbWJlZGRlZDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLyoqCi0gKiAgVW5pdCBjYXNlICBvZiBFbWJlZGRlZAotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnZpbmF5Y0BhcGFjaGUub3JnIj5WaW5heSBDaGFuZHJhbjwvYT4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RFbWJlZGRlZCBleHRlbmRzIFRlc3RDYXNlCi17Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICAgIHsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3RFbWJlZGRlZC5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RFbWJlZGRlZChTdHJpbmcgdGVzdE5hbWUpCi0gICAgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIHRlc3QgU2NyaXB0IGlucHV0IGFzIGEgamF2YS5sYW5nLlN0cmluZyBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQXNTY3JpcHQoKQotICAgIHsKLSAgICAgICAgRW1iZWRkZWQgZW1iZWRkZWQgPSBuZXcgRW1iZWRkZWQoKTsKLSAgICAgICAgU3RyaW5nIGplbGx5U2NyaXB0ID0KLSAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PiIKLSAgICAgICAgICAgICAgICArICIgPGo6amVsbHkgeG1sbnM6aj1cImplbGx5OmNvcmVcIj4iCi0gICAgICAgICAgICAgICAgKyAiamVsbHktdGVzdC1jYXNlIgotICAgICAgICAgICAgICAgICsgIiA8L2o6amVsbHk+IjsKLSAgICAgICAgZW1iZWRkZWQuc2V0U2NyaXB0KGplbGx5U2NyaXB0KTsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIGVtYmVkZGVkLnNldE91dHB1dFN0cmVhbShiYW9zKTsKLSAgICAgICAgYm9vbGVhbiBzdGF0dXMgPSBlbWJlZGRlZC5leGVjdXRlKCk7Ci0gICAgICAgIC8vZXhlY3V0ZWQgcHJvcGVybHkgd2l0aG91dCBzY3JpcHQgZXJyb3JzCi0gICAgICAgIGFzc2VydEVxdWFscyhzdGF0dXMsIHRydWUpOwotICAgICAgICAvL2NoZWNrIHRoYXQgdGhlIG91dHB1dCAgY29uZmlybXMgdGhlIGV4ZXBlY3RlZAotICAgICAgICBhc3NlcnRFcXVhbHMoImplbGx5LXRlc3QtY2FzZSIsIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpKSk7Ci0gICAgICAgIC8vdGVzdCBnZW5lcmF0aW9uIG9mIGVycm9yCi0gICAgICAgIGVtYmVkZGVkLnNldFNjcmlwdChqZWxseVNjcmlwdCArICJvYm5veGlvdXMtcGFydCIpOwotICAgICAgICBzdGF0dXMgPSBlbWJlZGRlZC5leGVjdXRlKCk7Ci0gICAgICAgIC8vdGVzdCBmYWlsdXJlIG9mIGV4ZWN1dGlvbgotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXR1cyk7Ci0gICAgICAgIC8vQXNzZXJ0aW5nIHRoZSBwYXJzZXIgZ2VuZXJhdGVkIGEgZXJyb3JNc2cKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbWJlZGRlZC5nZXRFcnJvck1zZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgdGVzdCBTY3JpcHQgaW5wdXQgYXMgYSBJbnB1dFN0cmVhbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnB1dFN0cmVhbUFzU2NyaXB0KCkKLSAgICB7Ci0gICAgICAgIEVtYmVkZGVkIGVtYmVkZGVkID0gbmV3IEVtYmVkZGVkKCk7Ci0gICAgICAgIFN0cmluZyBqZWxseVNjcmlwdCA9Ci0gICAgICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz4iCi0gICAgICAgICAgICAgICAgKyAiIDxqOmplbGx5IHhtbG5zOmo9XCJqZWxseTpjb3JlXCI+IgotICAgICAgICAgICAgICAgICsgImplbGx5LXRlc3QtY2FzZSIKLSAgICAgICAgICAgICAgICArICIgPC9qOmplbGx5PiI7Ci0gICAgICAgIGVtYmVkZGVkLnNldFNjcmlwdChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oamVsbHlTY3JpcHQuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgZW1iZWRkZWQuc2V0T3V0cHV0U3RyZWFtKGJhb3MpOwotICAgICAgICBib29sZWFuIHN0YXR1cyA9IGVtYmVkZGVkLmV4ZWN1dGUoKTsKLSAgICAgICAgLy9leGVjdXRlZCBwcm9wZXJseSB3aXRob3V0IHNjcmlwdCBlcnJvcnMKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHN0YXR1cywgdHJ1ZSk7Ci0gICAgICAgIC8vY2hlY2sgdGhhdCB0aGUgb3V0cHV0IGNvbmZpcm1zIHRoZSBleHBlY3RlZAotICAgICAgICBhc3NlcnRFcXVhbHMoImplbGx5LXRlc3QtY2FzZSIsIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3Qgc2ltcGxlICdyYXcnIGV4ZWN1dGlvbiBvZiBhIHN0cmluZy4gU2VlIEpFTExZLTE4OS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmF3RXhlY3V0ZUFzU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPQotICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+IgotICAgICAgICAgICAgICAgICsgIiA8ajpqZWxseSB4bWxuczpqPVwiamVsbHk6Y29yZVwiPiIKLSAgICAgICAgICAgICAgICArICJqZWxseS10ZXN0LWNhc2UiCi0gICAgICAgICAgICAgICAgKyAiIDwvajpqZWxseT4iOwotICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgWE1MT3V0cHV0IHhtbE91dHB1dCA9IFhNTE91dHB1dC5jcmVhdGVYTUxPdXRwdXQob3V0cHV0KTsKLSAgICAgICBJbnB1dFNvdXJjZSBzY3JpcHQgPSBuZXcgSW5wdXRTb3VyY2UoIG5ldyBTdHJpbmdSZWFkZXIobWVzc2FnZS50b1N0cmluZygpKSApOwotICAgICAgIEplbGx5Q29udGV4dCBjb250ZXh0ID0gbmV3IEplbGx5Q29udGV4dCgpOwotICAgICAgIGNvbnRleHQucnVuU2NyaXB0KCBzY3JpcHQsIHhtbE91dHB1dCk7Ci0gICAgICAgb3V0cHV0LmNsb3NlKCk7Ci0gICAgICAgLy9jaGVjayB0aGF0IHRoZSBvdXRwdXQgY29uZmlybXMgdGhlIGV4cGVjdGVkCi0gICAgICAgYXNzZXJ0RXF1YWxzKCJqZWxseS10ZXN0LWNhc2UiLCBuZXcgU3RyaW5nKG91dHB1dC50b0J5dGVBcnJheSgpKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rlc3QveG1sL1Rlc3RDRGF0YS5qYXZhIGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rlc3QveG1sL1Rlc3RDRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2JmYmViLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0L3htbC9UZXN0Q0RhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRlc3QueG1sOwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuU2NyaXB0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5YTUxPdXRwdXQ7Ci1pbXBvcnQgb3JnLmRvbTRqLmlvLk91dHB1dEZvcm1hdDsKLWltcG9ydCBvcmcuZG9tNGouaW8uWE1MV3JpdGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxhZ3JhbmdlCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVGVzdENEYXRhIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIFRlc3RDRGF0YShTdHJpbmcgYXJnKSB7Ci0gICAgICAgIHN1cGVyKGFyZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ0RBVEEgc2VjdGlvbnMgc2hvdWxkIGJlIHJldGFpbmVkIGluIHRoZSBvdXRwdXQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDRGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBKZWxseSBqZWxseSA9IG5ldyBKZWxseSgpOwotICAgICAgICBqZWxseS5zZXRTY3JpcHQoImZpbGU6c3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rlc3QveG1sL3Rlc3RDRGF0YS5qZWxseSIpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gamVsbHkuY29tcGlsZVNjcmlwdCgpOwotICAgICAgICBKZWxseUNvbnRleHQgY29udGV4dCA9IG5ldyBKZWxseUNvbnRleHQoKTsKLSAgICAgICAgc2NyaXB0LnJ1bihjb250ZXh0LCBYTUxPdXRwdXQuY3JlYXRlRHVtbXlYTUxPdXRwdXQoKSk7Ci0KLSAgICAgICAgU3RyaW5nIG91dHB1dCA9IChTdHJpbmcpIGNvbnRleHQuZ2V0VmFyaWFibGUoImZvbyIpOwotICAgICAgICBhc3NlcnRUcnVlKCInZm9vJyBpcyBub3QgbnVsbCIsIG91dHB1dCAhPSBudWxsKTsKLQotICAgICAgICBTdHJpbmcgZ29sZGVuID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIjsKLSAgICAgICAgZ29sZGVuICs9ICI8IURPQ1RZUEUgZm9vIFtcbiI7Ci0gICAgICAgIGdvbGRlbiArPSAiICA8IUVMRU1FTlQgZm9vICgjUENEQVRBKT5cbiI7Ci0gICAgICAgIGdvbGRlbiArPSAiXT48Zm9vPjwvZm9vPiI7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvdXRwdXQgc2hvdWxkIGNvbnRhaW4gdGhlIENEQVRBIHNlY3Rpb24iLCBnb2xkZW4sIG91dHB1dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERvbTRKQ0RhdGEoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgT3V0cHV0Rm9ybWF0IGZvcm1hdCA9IG5ldyBPdXRwdXRGb3JtYXQoKTsKLSAgICAgICAgZmluYWwgWE1MV3JpdGVyIHhtbFdyaXRlciA9IG5ldyBYTUxXcml0ZXIod3JpdGVyLCBmb3JtYXQpOwotICAgICAgICB4bWxXcml0ZXIuc2V0RXNjYXBlVGV4dChmYWxzZSk7Ci0KLSAgICAgICAgWE1MT3V0cHV0IG91dHB1dCA9IG5ldyBYTUxPdXRwdXQoeG1sV3JpdGVyLCB4bWxXcml0ZXIpOwotCi0gICAgICAgIFN0cmluZyBkZWNsID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIjsKLSAgICAgICAgU3RyaW5nIGdvbGRlbiA9ICI8IURPQ1RZUEUgZm9vIFtcbiI7Ci0gICAgICAgIGdvbGRlbiArPSAiICA8IUVMRU1FTlQgZm9vICgjUENEQVRBKT5cbiI7Ci0gICAgICAgIGdvbGRlbiArPSAiXT48Zm9vPjwvZm9vPiI7Ci0KLSAgICAgICAgb3V0cHV0LnN0YXJ0RG9jdW1lbnQoKTsKLSAgICAgICAgb3V0cHV0LndyaXRlKGdvbGRlbik7Ci0gICAgICAgIG91dHB1dC5lbmREb2N1bWVudCgpOwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIm91dHB1dCB3YXM6ICciICsgd3JpdGVyLnRvU3RyaW5nKCkgKyInIik7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiZ29sZGVuIGlzIDogJyIgKyBnb2xkZW4gKyInIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygib3V0cHV0IHNob3VsZCBjb250YWluIHRoZSBDREFUQSBzZWN0aW9uIiwKLSAgICAgICAgICAgICAgICBkZWNsICsgZ29sZGVuLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdC94bWwvVGVzdERlZmF1bHROYW1lc3BhY2VGaWx0ZXIuamF2YSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0L3htbC9UZXN0RGVmYXVsdE5hbWVzcGFjZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGViYjNlLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0L3htbC9UZXN0RGVmYXVsdE5hbWVzcGFjZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGVzdC54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5TY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyB0byBydW4gamVsbHkgdGVzdCBjYXNlcyBhcyBwYXJ0IG9mIEFudCdzIEpVbml0IHRlc3RzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjYgJAotICovCi1wdWJsaWMgY2xhc3MgVGVzdERlZmF1bHROYW1lc3BhY2VGaWx0ZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBKZWxseSBqZWxseSA9IG51bGw7Ci0gICAgSmVsbHlDb250ZXh0IGNvbnRleHQgPSBudWxsOwotICAgIFhNTE91dHB1dCB4bWxPdXRwdXQgPSBudWxsOwotCi0gICAgcHVibGljIFRlc3REZWZhdWx0TmFtZXNwYWNlRmlsdGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3REZWZhdWx0TmFtZXNwYWNlRmlsdGVyLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjb250ZXh0ID0gbmV3IEplbGx5Q29udGV4dCgpOwotICAgICAgICB4bWxPdXRwdXQgPSBYTUxPdXRwdXQuY3JlYXRlWE1MT3V0cHV0KG5ldyBTdHJpbmdXcml0ZXIoKSk7Ci0KLSAgICAgICAgamVsbHkgPSBuZXcgSmVsbHkoKTsKLQotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gIm5zRmlsdGVyVGVzdC5qZWxseSI7Ci0gICAgICAgIFVSTCB1cmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2Uoc2NyaXB0KTsKLSAgICAgICAgaWYgKCB1cmwgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBmaW5kIEplbGx5IHNjcmlwdDogIiArIHNjcmlwdAotICAgICAgICAgICAgICAgICsgIiBpbiBwYWNrYWdlIG9mIGNsYXNzOiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICAgICAgKTsKLSAgICAgICAgfQotICAgICAgICBqZWxseS5zZXRVcmwodXJsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZXNwYWNlRGVmaW5lZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBqZWxseS5zZXREZWZhdWx0TmFtZXNwYWNlVVJJKCJqZWxseTpjb3JlIik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBqZWxseS5jb21waWxlU2NyaXB0KCk7Ci0gICAgICAgIHNjcmlwdC5ydW4oY29udGV4dCx4bWxPdXRwdXQpOwotICAgICAgICBhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBzZXQgJ3VzZWREZWZhdWx0TmFtZXNwYWNlJyB2YXJpYWJsZSIsCi0gICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRWYXJpYWJsZSgidXNlZERlZmF1bHROYW1lc3BhY2UiKSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZXNwYWNlTm90RGVmaW5lZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gamVsbHkuY29tcGlsZVNjcmlwdCgpOwotICAgICAgICBzY3JpcHQucnVuKGNvbnRleHQseG1sT3V0cHV0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgic2hvdWxkIG5vdCBoYXZlIHNldCAndXNlZERlZmF1bHROYW1lc3BhY2UnIHZhcmlhYmxlIiwKLSAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFZhcmlhYmxlKCJ1c2VkRGVmYXVsdE5hbWVzcGFjZSIpID09IG51bGwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0L3htbC9UZXN0RHVtbXlYTUxPdXRwdXQuamF2YSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0L3htbC9UZXN0RHVtbXlYTUxPdXRwdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ5ODc5Zi4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdC94bWwvVGVzdER1bW15WE1MT3V0cHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50ZXN0LnhtbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlNjcmlwdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKioKLSAqIENvbmZpcm0gdGhhdCA8aT5YTUxPdXRwdXQuY3JlYXRlRHVtbXlYTUxPdXRwdXQoKTwvaT4KLSAqIGRvZXNuJ3QgZG8gYW55dGhpbmcgZnVua3kuCi0gKgotICogQGF1dGhvciBNb3JnYW4gRGVsYWdyYW5nZQotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjcgJAotICovCi1wdWJsaWMgY2xhc3MgVGVzdER1bW15WE1MT3V0cHV0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgSmVsbHkgamVsbHkgPSBudWxsOwotICAgIEplbGx5Q29udGV4dCBjb250ZXh0ID0gbnVsbDsKLSAgICBYTUxPdXRwdXQgeG1sT3V0cHV0ID0gbnVsbDsKLQotICAgIHB1YmxpYyBUZXN0RHVtbXlYTUxPdXRwdXQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0U3VpdGUgc3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGVzdER1bW15WE1MT3V0cHV0LmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcChTdHJpbmcgc2NyaXB0TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IG5ldyBKZWxseUNvbnRleHQoKTsKLSAgICAgICAgdGhpcy54bWxPdXRwdXQgPSBYTUxPdXRwdXQuY3JlYXRlRHVtbXlYTUxPdXRwdXQoKTsKLQotICAgICAgICB0aGlzLmplbGx5ID0gbmV3IEplbGx5KCk7Ci0KLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9IHNjcmlwdE5hbWU7Ci0gICAgICAgIFVSTCB1cmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2Uoc2NyaXB0KTsKLSAgICAgICAgaWYgKCB1cmwgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBmaW5kIEplbGx5IHNjcmlwdDogIiArIHNjcmlwdAotICAgICAgICAgICAgICAgICsgIiBpbiBwYWNrYWdlIG9mIGNsYXNzOiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICAgICAgKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmplbGx5LnNldFVybCh1cmwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REdW1teVhNTE91dHB1dCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyB3aXRob3V0IHZhbGlkYXRpb24KLSAgICAgICAgc2V0VXAoInByb2R1Y2VzT3V0cHV0LmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSB0aGlzLmplbGx5LmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgc2NyaXB0LnJ1bih0aGlzLmNvbnRleHQsdGhpcy54bWxPdXRwdXQpOwotICAgICAgICBhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBzZXQgJ2ZvbycgdmFyaWFibGUgdG8gJ2JhciciLAotICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5nZXRWYXJpYWJsZSgiZm9vIikuZXF1YWxzKCJiYXIiKSk7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0L3htbC9UZXN0Tm9uZXhpc3RlbnRUYWdzLmphdmEgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdC94bWwvVGVzdE5vbmV4aXN0ZW50VGFncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2JmMjQyLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0L3htbC9UZXN0Tm9uZXhpc3RlbnRUYWdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRlc3QueG1sOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuSmVsbHlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlNjcmlwdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwotCi0vKioKLSAqIEEgdGVzdCB0byBjb25maXJtIHRoYXQgSmVsbHkgc2NyaXB0cyBmYWlsIHRvIHBhcnNlIGlmIHRoZXkgZGVjbGFyZSB0YWdzCi0gKiB0aGF0IGRvIG5vdCBleGlzdAotICoKLSAqIEBhdXRob3IgTW9yZ2FuIERlbGFncmFuZ2UKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS42ICQKLSAqLwotcHVibGljIGNsYXNzIFRlc3ROb25leGlzdGVudFRhZ3MgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgIEplbGx5IGplbGx5ID0gbnVsbDsKLSAgICBKZWxseUNvbnRleHQgY29udGV4dCA9IG51bGw7Ci0gICAgWE1MT3V0cHV0IHhtbE91dHB1dCA9IG51bGw7Ci0KLSAgICBwdWJsaWMgVGVzdE5vbmV4aXN0ZW50VGFncyhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShUZXN0Tm9uZXhpc3RlbnRUYWdzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcChTdHJpbmcgc2NyaXB0TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNvbnRleHQgPSBuZXcgSmVsbHlDb250ZXh0KCk7Ci0gICAgICAgIHhtbE91dHB1dCA9IFhNTE91dHB1dC5jcmVhdGVEdW1teVhNTE91dHB1dCgpOwotCi0gICAgICAgIGplbGx5ID0gbmV3IEplbGx5KCk7Ci0KLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9IHNjcmlwdE5hbWU7Ci0gICAgICAgIFVSTCB1cmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2Uoc2NyaXB0KTsKLSAgICAgICAgaWYgKCB1cmwgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBmaW5kIEplbGx5IHNjcmlwdDogIiArIHNjcmlwdAotICAgICAgICAgICAgICAgICsgIiBpbiBwYWNrYWdlIG9mIGNsYXNzOiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICAgICAgKTsKLSAgICAgICAgfQotICAgICAgICBqZWxseS5zZXRVcmwodXJsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIHNjcmlwdCBzaG91bGQgZmFpbCB0byBwYXJzZSBpZiBpdCBkZWNsYXJlcyB0YWdzIHRoYXQgZG9uJ3QgZXhpc3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5vbmV4aXN0ZW50VGFncygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRVcCgibm9uZXhpc3RlbnRUYWdzMS5qZWxseSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2NyaXB0IHNjcmlwdCA9IGplbGx5LmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgICAgIGZhaWwoIlNjcmlwdHMgc2hvdWxkIHRocm93IEplbGx5RXhjZXB0aW9uIHdoZW4gaXQgZGVjbGFyZXMgYSBub25leGlzdGVudCB0YWcuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEplbGx5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rlc3QveG1sL1Rlc3RYTUxQYXJzZXJDYWNoZS5qYXZhIGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rlc3QveG1sL1Rlc3RYTUxQYXJzZXJDYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmUxNWMyLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0L3htbC9UZXN0WE1MUGFyc2VyQ2FjaGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50ZXN0LnhtbDsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5TY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqCi0gKiBBIHRlc3QgdG8gY29uZmlybSB0aGF0IGludmFsaWQgZG9jdW1lbnRzIGFyZQotICogcmVqZWN0IGlmZiBqZWxseS5zZXRWYWxpZGF0ZVhNTCh0cnVlKQotICoKLSAqIEBhdXRob3IgTW9yZ2FuIERlbGFncmFuZ2UKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS45ICQKLSAqLwotcHVibGljIGNsYXNzIFRlc3RYTUxQYXJzZXJDYWNoZSBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIEplbGx5IGplbGx5ID0gbnVsbDsKLSAgICBKZWxseUNvbnRleHQgY29udGV4dCA9IG51bGw7Ci0gICAgWE1MT3V0cHV0IHhtbE91dHB1dCA9IG51bGw7Ci0KLSAgICBwdWJsaWMgVGVzdFhNTFBhcnNlckNhY2hlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3RYTUxQYXJzZXJDYWNoZS5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoU3RyaW5nIHNjcmlwdE5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjb250ZXh0ID0gbmV3IEplbGx5Q29udGV4dCgpOwotICAgICAgICB4bWxPdXRwdXQgPSBYTUxPdXRwdXQuY3JlYXRlWE1MT3V0cHV0KG5ldyBTdHJpbmdXcml0ZXIoKSk7Ci0KLSAgICAgICAgamVsbHkgPSBuZXcgSmVsbHkoKTsKLQotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gc2NyaXB0TmFtZTsKLSAgICAgICAgVVJMIHVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZShzY3JpcHQpOwotICAgICAgICBpZiAoIHVybCA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgSmVsbHkgc2NyaXB0OiAiICsgc2NyaXB0Ci0gICAgICAgICAgICAgICAgKyAiIGluIHBhY2thZ2Ugb2YgY2xhc3M6ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgICAgIGplbGx5LnNldFVybCh1cmwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZXJDYWNoZTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gd2l0aG91dCB2YWxpZGF0aW9uLCBzaG91bGQKLSAgICAgICAgLy8gbm90IGZhaWwgYmVjYXVzZSB2YWxpZGF0aW9uIGlzIGRpc2FibGVkCi0gICAgICAgIHNldFVwKCJpbnZhbGlkU2NyaXB0MS5qZWxseSIpOwotICAgICAgICBqZWxseS5zZXRWYWxpZGF0ZVhNTChmYWxzZSk7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBqZWxseS5jb21waWxlU2NyaXB0KCk7Ci0gICAgICAgIHNjcmlwdC5ydW4oY29udGV4dCx4bWxPdXRwdXQpOwotICAgICAgICBhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBzZXQgJ2ZvbycgdmFyaWFibGUgdG8gJ2JhciciLAotICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0VmFyaWFibGUoImZvbyIpLmVxdWFscygiYmFyIikpOwotCi0gICAgICAgIC8vIGlmIEkgZW5hYmxlIHhtbCB2YWxpZGF0aW9uLCB0aGUgc2NyaXB0IHNob3VsZCBmYWlsCi0gICAgICAgIC8vIGRlc3BpdGUgdGhlIGNhY2hlCi0gICAgICAgIGplbGx5LnNldFZhbGlkYXRlWE1MKHRydWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2NyaXB0ID0gamVsbHkuY29tcGlsZVNjcmlwdCgpOwotICAgICAgICAgICAgZmFpbCgiSW52YWxpZCBzY3JpcHRzIHNob3VsZCB0aHJvdyBKZWxseUV4Y2VwdGlvbiBvbiBwYXJzZSwgZGVzcGl0ZSB0aGUgY2FjaGUiKTsKLSAgICAgICAgfSBjYXRjaCAoSmVsbHlFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcnNlckNhY2hlMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBubyBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICBzZXRVcCgibnNGaWx0ZXJUZXN0LmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBqZWxseS5jb21waWxlU2NyaXB0KCk7Ci0gICAgICAgIHNjcmlwdC5ydW4oY29udGV4dCx4bWxPdXRwdXQpOwotICAgICAgICBhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBubyB2YXIgd2hlbiBkZWZhdWx0IG5hbXNwYWNlIGlzIG5vdCBzZXQiLAotICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0VmFyaWFibGUoInVzZWREZWZhdWx0TmFtZXNwYWNlIikgPT0gbnVsbCk7Ci0KLSAgICAgICAgLy8gbm93IHdlIGhhdmUgYSBkZWZhdWx0IG5hbWVzcGFjZSwgc28gd2UKLSAgICAgICAgLy8gc2hvdWxkIHNlZSBhIHZhcmlhYmxlLCBkZXNwaXRlIHRoZSBYTUxQYXJzZXIgY2FjaGUKLSAgICAgICAgamVsbHkuc2V0RGVmYXVsdE5hbWVzcGFjZVVSSSgiamVsbHk6Y29yZSIpOwotICAgICAgICBzY3JpcHQgPSBqZWxseS5jb21waWxlU2NyaXB0KCk7Ci0gICAgICAgIHNjcmlwdC5ydW4oY29udGV4dCx4bWxPdXRwdXQpOwotICAgICAgICBhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSB2YXIgd2hlbiBkZWZhdWx0IG5hbXNwYWNlIGlzIHNldCIsCi0gICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRWYXJpYWJsZSgidXNlZERlZmF1bHROYW1lc3BhY2UiKS5lcXVhbHMoInRydWUiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rlc3QveG1sL1Rlc3RYTUxWYWxpZGF0aW9uLmphdmEgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdC94bWwvVGVzdFhNTFZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMzODQyOC4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdC94bWwvVGVzdFhNTFZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS50ZXN0LnhtbDsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5KZWxseUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5TY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlhNTE91dHB1dDsKLQotLyoqCi0gKiBBIHRlc3QgdG8gY29uZmlybSB0aGF0IGludmFsaWQgZG9jdW1lbnRzIGFyZQotICogcmVqZWN0IGlmZiBqZWxseS5zZXRWYWxpZGF0ZVhNTCh0cnVlKQotICoKLSAqIEBhdXRob3IgTW9yZ2FuIERlbGFncmFuZ2UKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS45ICQKLSAqLwotcHVibGljIGNsYXNzIFRlc3RYTUxWYWxpZGF0aW9uIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgSmVsbHkgamVsbHkgPSBudWxsOwotICAgIEplbGx5Q29udGV4dCBjb250ZXh0ID0gbnVsbDsKLSAgICBYTUxPdXRwdXQgeG1sT3V0cHV0ID0gbnVsbDsKLQotICAgIHB1YmxpYyBUZXN0WE1MVmFsaWRhdGlvbihTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShUZXN0WE1MVmFsaWRhdGlvbi5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoU3RyaW5nIHNjcmlwdE5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjb250ZXh0ID0gbmV3IEplbGx5Q29udGV4dCgpOwotICAgICAgICB4bWxPdXRwdXQgPSBYTUxPdXRwdXQuY3JlYXRlWE1MT3V0cHV0KG5ldyBTdHJpbmdXcml0ZXIoKSk7Ci0KLSAgICAgICAgamVsbHkgPSBuZXcgSmVsbHkoKTsKLQotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gc2NyaXB0TmFtZTsKLSAgICAgICAgVVJMIHVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZShzY3JpcHQpOwotICAgICAgICBpZiAoIHVybCA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgSmVsbHkgc2NyaXB0OiAiICsgc2NyaXB0Ci0gICAgICAgICAgICAgICAgKyAiIGluIHBhY2thZ2Ugb2YgY2xhc3M6ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgICAgIGplbGx5LnNldFVybCh1cmwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkWE1MMU5vVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyB3aXRob3V0IHZhbGlkYXRpb24KLSAgICAgICAgc2V0VXAoImludmFsaWRTY3JpcHQxLmplbGx5Iik7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBqZWxseS5jb21waWxlU2NyaXB0KCk7Ci0gICAgICAgIHNjcmlwdC5ydW4oY29udGV4dCx4bWxPdXRwdXQpOwotICAgICAgICBhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBzZXQgJ2ZvbycgdmFyaWFibGUgdG8gJ2JhciciLAotICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0VmFyaWFibGUoImZvbyIpLmVxdWFscygiYmFyIikpOwotCi0gICAgICAgIC8vIGRvIGl0IGFnYWluLCBleHBsaWNpdGx5IHNldHRpbmcgdGhlIHZhbGlkYXRlWE1MIHZhcmlhYmxlCi0gICAgICAgIHNldFVwKCJpbnZhbGlkU2NyaXB0MS5qZWxseSIpOwotICAgICAgICBqZWxseS5zZXRWYWxpZGF0ZVhNTChmYWxzZSk7Ci0gICAgICAgIHNjcmlwdCA9IGplbGx5LmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgc2NyaXB0LnJ1bihjb250ZXh0LHhtbE91dHB1dCk7Ci0gICAgICAgIGFzc2VydFRydWUoInNob3VsZCBoYXZlIHNldCAnZm9vJyB2YXJpYWJsZSB0byAnYmFyJyIsCi0gICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRWYXJpYWJsZSgiZm9vIikuZXF1YWxzKCJiYXIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRYTUwxVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyB3aXRoIHZhbGlkYXRpb24KLSAgICAgICAgc2V0VXAoImludmFsaWRTY3JpcHQxLmplbGx5Iik7Ci0gICAgICAgIGplbGx5LnNldFZhbGlkYXRlWE1MKHRydWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2NyaXB0IHNjcmlwdCA9IGplbGx5LmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgICAgIGZhaWwoIkludmFsaWQgc2NyaXB0cyBzaG91bGQgdGhyb3cgSmVsbHlFeGNlcHRpb24gb24gcGFyc2UiKTsKLSAgICAgICAgfSBjYXRjaCAoSmVsbHlFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkWE1MMVZhbGlkYXRpb24oKXRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyB3aXRoIHZhbGlkYXRpb24KLSAgICAgICAgc2V0VXAoInZhbGlkU2NyaXB0MS5qZWxseSIpOwotICAgICAgICBqZWxseS5zZXRWYWxpZGF0ZVhNTCh0cnVlKTsKLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IGplbGx5LmNvbXBpbGVTY3JpcHQoKTsKLSAgICAgICAgc2NyaXB0LnJ1bihjb250ZXh0LHhtbE91dHB1dCk7Ci0gICAgICAgIGFzc2VydFRydWUoInNob3VsZCBoYXZlIHNldCAnZm9vJyB2YXJpYWJsZSB0byAnYmFyJyIsCi0gICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRWYXJpYWJsZSgiZm9vIikuZXF1YWxzKCJiYXIiKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdC94bWwvaW52YWxpZFNjcmlwdDEuamVsbHkgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdC94bWwvaW52YWxpZFNjcmlwdDEuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NTA5ZWIuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rlc3QveG1sL2ludmFsaWRTY3JpcHQxLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgajpqZWxseSBbCi0KLSAgPCEtLSBkb2N1bWVudCBpcyBub3QgdmFsaWQgLS0+Ci0gIDwhRUxFTUVOVCBqOmplbGx5IChqOnNldCk+Ci0gIDwhQVRUTElTVCBqOmplbGx5IHhtbG5zOmogQ0RBVEEgJ2plbGx5OmNvcmUnPgotICAKLSAgPCFFTEVNRU5UIGo6c2V0IEVNUFRZPgotICA8IUFUVExJU1QgajpzZXQgdmFyaWNvc2UgICBDREFUQSAjUkVRVUlSRUQKLSAgICAgICAgICAgICAgICAgIHZhbHVlIENEQVRBICNSRVFVSVJFRD4KLQotXT4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseSAKLSAgICB4bWxuczpqPSJqZWxseTpjb3JlIj4KLSAgCi0gIDxqOnNldCB2YXI9ImZvbyIgdmFsdWU9ImJhciIvPgotICAKLTwvajpqZWxseT4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0L3htbC9ub25leGlzdGVudFRhZ3MxLmplbGx5IGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rlc3QveG1sL25vbmV4aXN0ZW50VGFnczEuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNjRmNzIuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rlc3QveG1sL25vbmV4aXN0ZW50VGFnczEuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseSAKLSAgICB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxuczp4PSJqZWxseTp4bWwiPgotICAKLSAgPGo6c2V0IHZhcj0iZm9vIiB2YWx1ZT0iYmFyIi8+Ci0gIAotICA8IS0tIHNob3VsZCBmYWlsLCBiZWNhdXNlIHhtbCB0YWdzIGFyZSBub3QgaW4gdGhlIGNsYXNzcGF0aCAtLT4KLSAgPHg6cGFyc2UgdmFyPSJmb28iIHhtbD0ibm9uZXhpc3RlbnRUYWdzMS5qZWxseSIvPgotICAKLTwvajpqZWxseT4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0L3htbC9uc0ZpbHRlclRlc3QuamVsbHkgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdC94bWwvbnNGaWx0ZXJUZXN0LmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGYwZDBjLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0L3htbC9uc0ZpbHRlclRlc3QuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseSAKLSAgICB4bWxuczpqPSJqZWxseTpjb3JlIj4KLSAgCi0gIDxzZXQgdmFyPSJmb28iIHZhbHVlPSJiYXIiLz4KLSAgCi0gIDxqOmlmIHRlc3Q9IiR7Zm9vICE9IG51bGx9Ij4KLSAgICAgIDxqOnNldCB2YXI9InVzZWREZWZhdWx0TmFtZXNwYWNlIj50cnVlPC9qOnNldD4KLSAgPC9qOmlmPiAgICAgICAgICAgIAotCi08L2o6amVsbHk+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdC94bWwvcHJvZHVjZXNPdXRwdXQuamVsbHkgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdC94bWwvcHJvZHVjZXNPdXRwdXQuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZTNiOTUuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rlc3QveG1sL3Byb2R1Y2VzT3V0cHV0LmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgajpqZWxseSBbCi0KLSAgPCEtLSBkb2N1bWVudCBpcyB2YWxpZCAtLT4KLSAgPCFFTEVNRU5UIGo6amVsbHkgKGo6c2V0KT4KLSAgPCFBVFRMSVNUIGo6amVsbHkgeG1sbnM6aiBDREFUQSAnamVsbHk6Y29yZSc+Ci0gIAotICA8IUVMRU1FTlQgajpzZXQgRU1QVFk+Ci0gIDwhQVRUTElTVCBqOnNldCB2YXIgICBDREFUQSAjUkVRVUlSRUQKLSAgICAgICAgICAgICAgICAgIHZhbHVlIENEQVRBICNSRVFVSVJFRD4KLQotXT4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ajpqZWxseSAKLSAgICB4bWxuczpqPSJqZWxseTpjb3JlIj4KLSAgICAgICAgCi0gIDxpZ25vcmVUaGlzT3V0cHV0Lz4KLSAgCi0gIDxqOnNldCB2YXI9ImZvbyIgdmFsdWU9ImJhciIvPgotICAKLTwvajpqZWxseT4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0L3htbC90ZXN0Q0RhdGEuamVsbHkgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdC94bWwvdGVzdENEYXRhLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDAxZWJiLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0L3htbC90ZXN0Q0RhdGEuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxqOmZpbGUgeG1sbnM6aj0iamVsbHk6Y29yZSIgdmFyPSJmb28iIGVzY2FwZVRleHQ9ImZhbHNlIj4KLSAgICAKLTwhW0NEQVRBWwotPCFET0NUWVBFIGZvbyBbCi0gIDwhRUxFTUVOVCBmb28gKCNQQ0RBVEEpPgotXT4KLV1dPgotCi08Zm9vLz4KLSAgICAKLTwvajpmaWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0L3htbC92YWxpZFNjcmlwdDEuamVsbHkgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdC94bWwvdmFsaWRTY3JpcHQxLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDE5NGM3Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0L3htbC92YWxpZFNjcmlwdDEuamVsbHkKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBqOmplbGx5IFsKLQotICA8IS0tIGRvY3VtZW50IGlzIHZhbGlkIC0tPgotICA8IUVMRU1FTlQgajpqZWxseSAoajpzZXQpPgotICA8IUFUVExJU1QgajpqZWxseSB4bWxuczpqIENEQVRBICdqZWxseTpjb3JlJz4KLSAgCi0gIDwhRUxFTUVOVCBqOnNldCBFTVBUWT4KLSAgPCFBVFRMSVNUIGo6c2V0IHZhciAgIENEQVRBICNSRVFVSVJFRAotICAgICAgICAgICAgICAgICAgdmFsdWUgQ0RBVEEgI1JFUVVJUkVEPgotCi1dPgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqOmplbGx5IAotICAgIHhtbG5zOmo9ImplbGx5OmNvcmUiPgotICAKLSAgPGo6c2V0IHZhcj0iZm9vIiB2YWx1ZT0iYmFyIi8+Ci0gIAotPC9qOmplbGx5PgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rlc3RDbWRMaW5lT3B0aW9ucy5qZWxseSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0Q21kTGluZU9wdGlvbnMuamVsbHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NDU0YjkuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rlc3RDbWRMaW5lT3B0aW9ucy5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxqZWxseSB4bWxucz0iamVsbHk6Y29yZSIgPgotLWEgb3B0aW9uID0gJHtjb21tYW5kTGluZS5nZXRPcHRpb25WYWx1ZSgiYSIpfQotLWIgb3B0aW9uID0gJHtjb21tYW5kTGluZS5nZXRPcHRpb25WYWx1ZSgiYiIpfQotLWMgb3B0aW9uID0gJHtjb21tYW5kTGluZS5nZXRPcHRpb25WYWx1ZSgiYyIpfQotLXRlc3RzeXNwcm9wID0gJHtzeXN0ZW1TY29wZVsndGVzdHN5c3Byb3AnXX0KLTwvamVsbHk+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rlc3RGaW5kVmFyaWFibGUuamVsbHkgYi9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdEZpbmRWYXJpYWJsZS5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE1OGNlYS4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdEZpbmRWYXJpYWJsZS5qZWxseQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiPgotICA8ajppZiB0ZXN0PScke2NvbnRleHQuZmluZFZhcmlhYmxlKCJmb28iKSAhPSAiYmFyIn0nPgotICAgICAgPGZhaWw+VGhlIHZhbHVlIG9mIGZvbyBpbiBhIHBhcmVudCBzY29wZSBkb2VzIG5vdCBlcXVhbCB0byAnYmFyJzwvZmFpbD4KLSAgPC9qOmlmPgotICAKLSAgVGhlIHZhbHVlIG9mIGZvbyBpcyA8ajpleHByIHZhbHVlPScke2NvbnRleHQuZmluZFZhcmlhYmxlKCJmb28iKX0nLz4KLTwvajpqZWxseT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdFN0YXRpYy5qZWxseSBiL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0U3RhdGljLmplbGx5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2M3MWMyLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90ZXN0U3RhdGljLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGo6amVsbHkgdHJpbT0iZmFsc2UiIHhtbG5zOmo9ImplbGx5OmNvcmUiPgotICA8eDpmb28geG1sbnM6eD0iaHR0cDovL3d3dy5hY21lLmNvbS9mb28iPgotICAgICAgPGEgY2hlZXNlPSJjaGVkZGFyIi8+Ci0gICAgPHk6YmFyIHhtbG5zOnk9InNvbWV0aGluZyI+Ci0gICAgICA8eDp0b3BwaW5nIHk6dHlwZT0iaGFtIi8+Ci0gICAgPC95OmJhcj4KLSAgPC94OmZvbz4gICAgICAgICAgICAgICAgICAgICAgICAgIAotPC9qOmplbGx5PgotCi0KLQotCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdF9hcmdzLmplbGx5IGIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3Rlc3RfYXJncy5qZWxseQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ1ZjFmNi4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGVzdF9hcmdzLmplbGx5CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tIGRpc3BsYXlzIHRoZSBjdXJyZW50IGNvbW1hbmQgbGluZSBhcmd1bWVudHMgLS0+Ci0KLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiPgotCi0gIDxqOmZvckVhY2ggdmFyPSJhcmciIGl0ZW1zPSIke2FyZ3N9Ij4KLSAgICAgIDwhLS0gdXNlIHRoZSA8d2hpdGVzcGFjZT4gdGFnIHRvIGhhdmUgY2FyZWZ1bCBjb250cm9sIG92ZXIgd2hpdGVzcGFjZSAtLT4KLSAgICAgIDxqOndoaXRlc3BhY2U+PGo6ZXhwciB2YWx1ZT0iJHthcmd9Ii8+IDwvajp3aGl0ZXNwYWNlPgotICA8L2o6Zm9yRWFjaD4KLSAgCi08L2o6amVsbHk+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvc2ltcGxlbG9nLnByb3BlcnRpZXMgYi9zcmMvdGVzdC9zaW1wbGVsb2cucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNiYTUwMS4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9zaW1wbGVsb2cucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jIAotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIHVuY29tbWVudCB0aGVzZSBsaW5lcyB0byB0dXJuIG9uIGRlYnVnZ2luZwotCi0jb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuc2ltcGxlbG9nLmRlZmF1bHRsb2cgPSBpbmZvCi0jb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuc2ltcGxlbG9nLmxvZy5vcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkgPSBkZWJ1ZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hkb2NzLy5jdnNpZ25vcmUgYi94ZG9jcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjYxMzFiLi4wMDAwMDAwCi0tLSBhL3hkb2NzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zdHlsZXNoZWV0cwpkaWZmIC0tZ2l0IGEveGRvY3MvY2hhbmdlcy54bWwgYi94ZG9jcy9jaGFuZ2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZiZDYzMS4uMDAwMDAwMAotLS0gYS94ZG9jcy9jaGFuZ2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0gLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkNoYW5nZXM8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+ZElvbiBHaWxsYXJkPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLSAgPGJvZHk+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4wLVJDMiIgZGF0ZT0iaW4gQ1ZTIj4KLSAgICAgIDxhY3Rpb24gZGV2PSJwb2x4IiB0eXBlPSJmaXgiIGlzc3VlPSJKRUxMWS04NSI+UmVtb3ZlZCBpbnN0YW5jZS1iYXNlZCBUaHJlYWRMb2NhbCBzdWJzdGl0dXRpbmcgYSBKZWxseUNvbnRleHQtYmFzZWQgdGFnLWNhY2hpbmcuPC9hY3Rpb24+Ci0gICAgICA8YWN0aW9uIGRldj0icG9seCIgdHlwZT0iYWRkIiBpc3N1ZT0iSkVMTFktMTQ1Ij5qZWxseSAtaCBvciAtLWhlbHAgcmVzcG9uZHMgYSBoZWxwIGFuZCBqZWxseSAtdiBvciAtLXZlcnNpb24gcmVzcG9uZHMgdGhlIHZlcnNpb24uPC9hY3Rpb24+Ci0gICAgICA8L3JlbGVhc2U+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4wLVJDMSIgZGF0ZT0iMjAwNC0xMS0yMiI+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0iZml4IiBpc3N1ZT0iSkVMTFktMTQ4IiBkdWUtdG89IkhhbnMgR2lsZGUiPkh1Z2UgbWVtb3J5IGxlYWsgcmVzdWx0aW5nIGZyb20gdGhlIHVzZSBvZiBUaHJlYWRMb2NhbC48L2FjdGlvbj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJmaXgiIGlzc3VlPSJKRUxMWS0xMzgiPkNoYXJhY3RlciBkYXRhIGlzIGZsdXNoZWQgYnkgWE1MT3VwdXQgd2hpbGUgWE1MIGRhdGEgaXNuJ3QuPC9hY3Rpb24+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0idXBkYXRlIj5Nb3ZlIHRvIGJlYW51dGlscyAxLjcuMC48L2FjdGlvbj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJmaXgiIGlzc3VlPSJKRUxMWS00NSI+U2NyaXB0cyBzZXQgdGhlIGNvbnRleHQgVVJMIHdoZW4gZXhlY3V0aW5nIHNvIHRoYXQgcmVzb3VyY2VzIGFyZSBmb3VuZCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBzY3JpcHQuPC9hY3Rpb24+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0iYWRkIiBpc3N1ZT0iSkVMTFktNDkiPkFkZCBSZWdleHAgdGFnbGliPC9hY3Rpb24+Ci0gICAgPC9yZWxlYXNlPgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMC1iZXRhLTQiIGRhdGU9IjIwMDQtMDktMDkiPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImFkZCIgaXNzdWU9IkpFTExZLTEzNCI+SGFuZGxlIEpWTXMgdGhhdCByZXR1cm4gbnVsbCBmb3IgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpPC9hY3Rpb24+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0iZml4IiBpc3N1ZT0iSkVMTFktNjYiIGR1ZS10bz0iS251dCBXYW5uaGVkZW4iPkRlZmF1bHQgWE1MT3V0cHV0IHRvIG5vdCBlc2NhcGUgWE1MPC9hY3Rpb24+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0iZml4IiBpc3N1ZT0iSkVMTFktODciPmplbGx5IGNhbid0IHJlc29sdmUgdmFycyB3aXRoIGRvdHMgKC4pIGluIHRoZSBuYW1lLCBpbiBmdW5jdGlvbiBjYWxsczwvYWN0aW9uPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImZpeCI+U291cmNlIGNvbXBpbGVzIHdpdGggSkRLIDEuNTwvYWN0aW9uPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImZpeCIgaXNzdWU9IkpFTExZLTI1Ij5ObyBleGNlcHRpb25zIHNpbGVudGx5IHN3YWxsb3dlZDwvYWN0aW9uPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImZpeCIgaXNzdWU9IkpFTExZLTQ3Ij5BdHRyaWJ1dGUgY29ycnVwdGlvbiB3aGVuIGRlYWxpbmcgd2l0aCBjb252ZXJ0aW5nIGF0dHJpYnV0ZXMgdGhhdCBpbmNsdWRlIG5hbWVzcGFjZXM8L2FjdGlvbj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJmaXgiIGlzc3VlPSJKRUxMWS0xMDMiIGR1ZS10bz0iUmFscGggQXBlbCI+V2luZG93cyBwYXRoIGluIGJ1aWxkLnhtbDwvYWN0aW9uPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImZpeCIgaXNzdWU9IkpFTExZLTcxIiBkdWUtdG89IkRhdmlkIEVyaWMgUHVnaCI+TWVudGlvbiBzd2luZyBkaXJlY3RvcnkgaW4gZG9jczwvYWN0aW9uPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImZpeCIgaXNzdWU9IkpFTExZLTk4IiBkdWUtdG89IkpvZXJnIFNjaGFpYmxlIj5UaGUgIml0ZW1zIiBhdHRyaWJ1dGUgb2YgYSAiZm9yRWFjaCIgdGFnIGNhbiBjb250YWluIGEgY29tbWEtc2VwYXJhdGVkIFN0cmluZzwvYWN0aW9uPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImZpeCIgaXNzdWU9IkpFTExZLTEyMCI+QWxsb3cgdXNlQmVhbiBzdWJjbGFzc2VzIHRvIGlnbm9yZSBjZXJ0YWluIHByb3BlcnRpZXMgYW5kIGlnbm9yZSBiYWQgcHJvcGVydGllczwvYWN0aW9uPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImZpeCIgaXNzdWU9IkpFTExZLTU4Ij5Eb2N1bWVudGF0aW9uIGZpeGVzIGZvciBJbnZva2UgYW5kIEZvckVhY2g8L2FjdGlvbj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJmaXgiIGlzc3VlPSJKRUxMWS0yOCIgZHVlLXRvPSJIYW5zIEdpbGRlIj5CYWQgZW50aXR5IHByb2Nlc3Npbmc8L2FjdGlvbj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJmaXgiIGlzc3VlPSJKRUxMWS03MyIgZHVlLXRvPSJTY290dCBIb3dsZXR0Ij5DYW4ndCBzZXQgaW5oZXJpdCBvciBleHBvcnQgdG8gZmFsc2UgZm9yIEluY2x1ZGUgdGFnPC9hY3Rpb24+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0iYWRkIiBpc3N1ZT0iSkVMTFktMTA4IiBkdWUtdG89Ik1hYXJ0ZW4gQ29lbmUiPlJ1biBhIHNjcmlwdCBmcm9tIGFuIGlucHV0IHNvdXJjZTwvYWN0aW9uPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImFkZCIgaXNzdWU9IkpFTExZLTExMyIgZHVlLXRvPSJHYXJ5IEZyYW5rbGluIj5UaHJlYWQgc2FmZXR5IG9mIHRhZyBzdXBwb3J0PC9hY3Rpb24+Ci0gICAgICA8YWN0aW9uIGRldj0iZGlvbiIgdHlwZT0iYWRkIiBpc3N1ZT0iSkVMTFktMTE1IiBkdWUtdG89IkZlbGlwZSBMZW1lIj5BZGQgdmFyIHRvIGJyZWFrIHRhZzwvYWN0aW9uPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9ImFkZCIgaXNzdWU9IkpFTExZLTExNiIgZHVlLXRvPSJGZWxpcGUgTGVtZSI+QWRkIGV4Y2VwdGlvblZhciB0byBpbnZva2UgYW5kIGludm9rZVN0YXRpYzwvYWN0aW9uPgotICAgICAgPGFjdGlvbiBkZXY9ImRpb24iIHR5cGU9InJlbW92ZSIgaXNzdWU9IkpFTExZLTg1Ij5CYWNrIG91dCBwYXRjaCBhcyBpdCBicmVha3MgZGVmaW5lIHRhZ2xpYnM8L2FjdGlvbj4KLSAgICAgIDxhY3Rpb24gZGV2PSJkaW9uIiB0eXBlPSJmaXgiIGlzc3VlPSJKRUxMWS0xMTciIGR1ZS10bz0iRGVubmlzIEx1bmRiZXJnIj5SZW1vdmUgc2FuZGJveCBhbmQgZml4IHNvbWUgZGVwZW5kZW5jaWVzIHRvIHVzZSBncm91cElkL2FydGlmYWN0SWQ8L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS94ZG9jcy9mYXEueG1sIGIveGRvY3MvZmFxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVjNWFlZC4uMDAwMDAwMAotLS0gYS94ZG9jcy9mYXEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxkb2N1bWVudD4KLQotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+SmVsbHkgRkFRPC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotCi0gIDxzZWN0aW9uIG5hbWU9IkZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zIj4KLSAgICA8cD4KLSAgICAgIFRoaXMgZG9jdW1lbnQgYXR0ZW1wdHMgdG8gYW5zd2VyIHNvbWUgb2YgdGhlIG1vcmUgZnJlcXVlbnRseSBhc2tlZAotICAgICAgcXVlc3Rpb25zIHJlZ2FyZGluZyB2YXJpb3VzIGFzcGVjdHMgb2YgSmVsbHkuICBUaGVzZSBxdWVzdGlvbnMgYXJlCi0gICAgICB0eXBpY2FsbHkgYXNrZWQgb3ZlciBhbmQgb3ZlciBhZ2FpbiBvbiB0aGUgbWFpbGluZyBsaXN0cywgYXMgYQotICAgICAgY291cnRlc3kgdG8gdGhlIGRldmVsb3BlcnMsIHdlIGFzayB0aGF0IHlvdSByZWFkIHRoaXMgZG9jdW1lbnQKLSAgICAgIGJlZm9yZSBwb3N0aW5nIHRvIHRoZSBtYWlsaW5nIGxpc3RzLgotICAgIDwvcD4KLSAgICA8cD48c3Ryb25nPkdlbmVyYWw8L3N0cm9uZz48L3A+Ci0gICAgPG9sPgotICAgICAgPGxpPgotICAgICAgICA8YSBocmVmPSIjd2hhdC1pcy1qZWxseSI+Ci0gICAgICAgICAgV2hhdCBpcyBKZWxseT8KLSAgICAgICAgPC9hPgotICAgICAgPC9saT4KLSAgICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0iI3doeS1jYWxsZWQtamVsbHkiPgotICAgICAgICAgIFdoeSBpcyB0aGlzIGNhbGxlZCBKZWxseT8KLSAgICAgICAgPC9hPgotICAgICAgPC9saT4KLSAgICA8L29sPgotICAgIDxwPjxzdHJvbmc+VXNpbmcgSmVsbHk8L3N0cm9uZz48L3A+Ci0gICAgPG9sPgotICAgICAgPGxpPgotICAgICAgICA8YSBocmVmPSIjY2FsbGluZy1qZWxseSI+Ci0gICAgICAgICAgSG93IGRvIEkgY2FsbCBKZWxseSBmcm9tIEphdmEgY29kZT8KLSAgICAgICAgPC9hPgotICAgICAgPC9saT4KLSAgICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0iI2NvbW1hbmQtbGluZSI+Ci0gICAgICAgICAgSG93IGRvIEkgaW52b2tlIEplbGx5IGZyb20gdGhlIGNvbW1hbmQgbGluZT8KLSAgICAgICAgPC9hPgotICAgICAgPC9saT4KLSAgICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0iI2ludm9rZS1hbnQiPgotICAgICAgICAgIEhvdyBkbyBJIGludm9rZSBKZWxseSBmcm9tIGluc2lkZSBBbnQ/Ci0gICAgICAgIDwvYT4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgIDxhIGhyZWY9IiNpbnZva2UtbWF2ZW4iPgotICAgICAgICAgIEhvdyBkbyBJIGludm9rZSBKZWxseSBmcm9tIGluc2lkZSBNYXZlbj8KLSAgICAgICAgPC9hPgotICAgICAgPC9saT4KLSAgICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0iI2FkZGluZy10YWdsaWJzIj4KLSAgICAgICAgICBIb3cgZG8gSSBhZGQgbXkgb3duIHRhZyBsaWJyYXJpZXMgdG8gSmVsbHk/Ci0gICAgICAgIDwvYT4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgIDxhIGhyZWY9IiN0YWctYXR0cmlidXRlcyI+Ci0gICAgICAgICAgSG93IGRvIEkgdXNlIGV4cHJlc3Npb25zIGFuZCB0YWcgYXR0cmlidXRlcz8KLSAgICAgICAgPC9hPgotICAgICAgPC9saT4KLSAgICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0iI2NkYXRhIj4KLSAgICAgICAgICBIb3cgZG8gSmVsbHkgc2NyaXB0cyBoYW5kbGUgQ0RBVEEgc2VjdGlvbnM/Ci0gICAgICAgIDwvYT4KLSAgICAgIDwvbGk+Ci0gICAgPC9vbD4KLSAgICA8cD48c3Ryb25nPkJ1aWxkaW5nIEplbGx5PC9zdHJvbmc+PC9wPgotICAgIDxvbD4KLSAgICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0iI2hvdy10by1idWlsZCI+Ci0gICAgICAgICAgSG93IGRvIEkgYnVpbGQgSmVsbHk/Ci0gICAgICAgIDwvYT4KLSAgICAgIDwvbGk+Ci0gICAgPC9vbD4KLQotICAgIDxzZWN0aW9uIG5hbWU9IkdlbmVyYWwiPgotICAgICAgPGRsPgotICAgICAgICA8ZHQ+Ci0gICAgICAgICAgPGEgbmFtZT0id2hhdC1pcy1qZWxseSI+Ci0gICAgICAgICAgICBXaGF0IGlzIEplbGx5PwotICAgICAgICAgIDwvYT4KLSAgICAgICAgPC9kdD4KLSAgICAgICAgPGRkPgotICAgICAgICAgIEplbGx5IGlzIGFuIG9wZW4gYW5kIGN1c3RvbWl6YWJsZSBYTUwgcHJvY2Vzc2luZyBlbmdpbmUuCi0gICAgICAgICAgUGxlYXNlIHNlZSB0aGUgPGEgaHJlZj0iaW5kZXguaHRtbCI+SG9tZSBwYWdlPC9hPiBhbmQgPGEKLSAgICAgICAgICBocmVmPSJvdmVydmlldy5odG1sIj5PdmVydmlldzwvYT4gZG9jdW1lbnRzIGZvciBtb3JlIGRldGFpbC4KLSAgICAgICAgPC9kZD4KLSAgICAgIDwvZGw+Ci0KLSAgICAgIDxkbD4KLSAgICAgICAgPGR0PgotICAgICAgICAgIDxhIG5hbWU9IndoeS1jYWxsZWQtamVsbHkiPgotICAgICAgICAgICAgV2h5IGlzIHRoaXMgY2FsbGVkIEplbGx5PwotICAgICAgICAgIDwvYT4KLSAgICAgICAgPC9kdD4KLSAgICAgICAgPGRkPgotICAgICAgICAgIFRoZSBuYW1lIHN0YXJ0ZWQgb3V0IGFzICdKZWxlJyBhcyBpbiBKYXZhIEVMRW1lbnRzIGJ1dCB0aGVuIEkgdGhvdWdodCBKZWxseSB3YXMgYSBuaWNlciBzcGVsbGluZyA6LSkuCi0gICAgICAgICAgVGhlIGJhc2ljIGlkZWEgYmVoaW5kIEplbGx5IHRoYXQgSmF2YSBjb2RlIGlzIGJvdW5kIG9uIHRvIFhNTCBlbGVtZW50cy4KLSAgICAgICAgPC9kZD4KLSAgICAgICAgPGRkPgotICAgICAgICAgIEFsc28gSmVsbHkgKGluIEJyaXRpc2ggb3IgSmVsbG8gaW4gQW1lcmljYW4pIGNhbiBiZSBtb2xkZWQgdG8gZml0IGFueSBzaGFwZSByZXF1aXJlZCB3aGljaCBraW5kYSBmaXRzCi0gICAgICAgICAgd2l0aCBKZWxseSdzIG1haW4gYWltIHRvIGJlIGEgZmxleGlibGUgSmF2YSBhbmQgWE1MIGJhc2VkIHNjcmlwdGluZyBlbmdpbmUgdGhhdCBjYW4gZG8gYW55dGhpbmcuCi0gICAgICAgIDwvZGQ+Ci0gICAgICAgIDxkZD4KLSAgICAgICAgICBUaGVyZSBhcmUgbWFueSBkaWZmZXJlbnQgc3BlY2lmaWMgZnJhbWV3b3JrcyB0aGF0IHRha2UgYW4gWE1MIGRvY3VtZW50LCBiaW5kIGl0IHRvIHNvbWUga2luZCBvZiBiZWFuIG9yIG9iamVjdAotICAgICAgICAgIGFuZCB0aGVuIGV2YWx1YXRlIGl0IGluIHNvbWUga2luZCBvZiBzY3JpcHQgb3IgcHJvY2Vzcywgc28gSmVsbHkgd2FzIGFuIGF0dGVtcHQgYXQgYSBnZW5lcmljIGVuZ2luZQotICAgICAgICAgIHVzaW5nIGlkZWFzIGZyb20gSlNQLCBKU1RMLCBWZWxvY2l0eSwgQ29jb29uIGFuZCBBbnQuCi0gICAgICAgIDwvZGQ+Ci0gICAgICA8L2RsPgotCi0KLSAgICA8L3NlY3Rpb24+Ci0gICAgPHNlY3Rpb24gbmFtZT0iVXNpbmcgSmVsbHkiPgotICAgICAgPGRsPgotICAgICAgICA8ZHQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9ImNhbGxpbmctamVsbHkiPgotICAgICAgICAgICAgICAgICAgICAgICAgSG93IGRvIEkgY2FsbCBKZWxseSBmcm9tIEphdmEgY29kZT8KLSAgICAgICAgICAgICAgICAgICAgPC9hPgotICAgICAgICA8L2R0PgotICAgICAgICA8ZGQ+Ci0gICAgICAgICAgICBUcnkgdGhlIGZvbGxvd2luZyBjb2RlLiBOb3RlIHRoYXQgdGhlIHJ1blNjcmlwdCgpIG1ldGhvZCBiZWxvdyBpcyBvdmVybG9hZGVkIGFuZCBjYW4gdGFrZSBhIEZpbGUsIFVSTCBldGMuCi08Y29kZT4KLTxzb3VyY2U+Ci0vLyBwYXNzIHRoZSBvdXRwdXQgb2YgdGhlIHNjcmlwdCBzb21ld2hlcmUKLVdyaXRlciBzb21lV3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoICJvdXRwdXQueG1sIiApOwotWE1MT3V0cHV0IG91dHB1dCA9IFhNTE91dHB1dC5jcmVhdGVYTUxPdXRwdXQoIHNvbWVXcml0ZXIgKTsKLQotLy8gbm93IHJ1biBhIHNjcmlwdCB1c2luZyBhIFVSTAotSmVsbHlDb250ZXh0IGNvbnRleHQgPSBuZXcgSmVsbHlDb250ZXh0KCk7Ci1jb250ZXh0LnJ1blNjcmlwdCggImZvby5qZWxseSIsIG91dHB1dCApOzwvc291cmNlPgotPC9jb2RlPgotICAgICAgICA8L2RkPgotICAgICAgPC9kbD4KLQotICAgICAgPGRsPgotICAgICAgICA8ZHQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9ImNvbW1hbmQtbGluZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBIb3cgZG8gSSBpbnZva2UgSmVsbHkgZnJvbSB0aGUgY29tbWFuZCBsaW5lPwotICAgICAgICAgICAgICAgICAgICA8L2E+Ci0gICAgICAgIDwvZHQ+Ci0gICAgICAgIDxkZD4KLSAgICAgICAgICAgIFdoZW4geW91IGJ1aWxkIGEgYmluYXJ5IGRpc2l0cmlidXRpb24gb2YgSmVsbHksIAotICAgICAgICAgICAgdGhlcmUgaXMgYSBqZWxseSBzY3JpcHQgd2hpY2ggd29ya3Mgb24gV2luZG93cyBhbmQgVW5peGVzIHRvIHJ1biBKZWxseS4KLSAgICAgICAgICAgIFlvdSBjYW4gY3JlYXRlIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiBKZWxseSB2aWEKLSAgICAgICAgICAgIDxjb2RlPgotICAgICAgICAgICAgICAgIG1hdmVuIGRpc3QKLSAgICAgICAgICAgIDwvY29kZT4KLSAgICAgICAgPC9kZD4KLSAgICAgICAgPGRkPgotICAgICAgICAgICAgQWxsIHlvdSByZWFsbHkgbmVlZCB0byBkbyBpcyB0byBpbnZva2UgdGhlIAotICAgICAgICAgICAgPGk+b3JnLmFwYWNoZS5jb21tb25zLmplbGx5LkplbGx5PC9pPiBjbGFzcyBmcm9tIHRoZSBjb21tYW5kIGxpbmUKLSAgICAgICAgICAgIHdpdGggYSBjb3JyZWN0IGNsYXNzcGF0aC4KLSAgICAgICAgPC9kZD4KLSAgICAgIDwvZGw+Ci0gICAgICA8ZGw+Ci0gICAgICAgIDxkdD4KLSAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iaW52b2tlLWFudCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBIb3cgZG8gSSBpbnZva2UgSmVsbHkgZnJvbSBpbnNpZGUgQW50PwotICAgICAgICAgICAgICAgICAgICA8L2E+Ci0gICAgICAgIDwvZHQ+Ci0gICAgICAgIDxkZD4KLSAgICAgICAgICAgIFRoZXJlIGlzIGFuIEFudCB0YXNrIHRoYXQgY29tZXMgd2l0aCB0aGUgQW50IGxpYnJhcnkgY2FsbGVkCi0gICAgICAgICAgICA8aT5vcmcuYXBhY2hlLmNvbW1vbnMudGFzay5KZWxseVRhc2s8L2k+IHdoaWNoIGNhbiBiZSB0YXNrZGVmJ2QgaW4gYW55IEFudCBzY3JpcHQuCi0gICAgICAgIDwvZGQ+Ci0gICAgICA8L2RsPgotCi0gICAgICA8ZGw+Ci0gICAgICAgIDxkdD4KLSAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iaW52b2tlLW1hdmVuIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIEhvdyBkbyBJIGludm9rZSBKZWxseSBmcm9tIGluc2lkZSBNYXZlbj8KLSAgICAgICAgICAgICAgICAgICAgPC9hPgotICAgICAgICA8L2R0PgotICAgICAgICA8ZGQ+Ci0gICAgICAgICAgICBNYXZlbidzIG1hdmVuLnhtbCBmaWxlIGlzIGFjdHVhbGx5IGEgSmVsbHkgc2NyaXB0OyBzbyB5b3UgY2FuIGluY2x1ZGUgYW55IEplbGx5IHNjcmlwdAotICAgICAgICAgICAgaW5zaWRlIGFueSBvZiB0aGUgTWF2ZW4gZ29hbHMuIFNvIGlmIHlvdSB3YW50IHRvIGV4ZWN1dGUgYSBzcGVjaWZpYyBKZWxseSBzY3JpcHQgeW91IGNhbgotICAgICAgICAgICAganVzdCAmbHQ7ajppbmNsdWRlIHVyaT0iZm9vLmplbGx5IiAmZ3Q7IGl0IGluc2lkZSB0aGUgbWF2ZW4ueG1sLgotICAgICAgICA8L2RkPgotICAgICAgPC9kbD4KLQotICAgICAgPGRsPgotICAgICAgICA8ZHQ+Ci0gICAgICAgICAgPGEgbmFtZT0iYWRkaW5nLXRhZ2xpYnMiPgotICAgICAgICAgICAgSG93IGRvIEkgYWRkIG15IG93biB0YWcgbGlicmFyaWVzIHRvIEplbGx5PwotICAgICAgICAgIDwvYT4KLSAgICAgICAgPC9kdD4KLSAgICAgICAgPGRkPgotICAgICAgICAgIEZpcnN0bHkgeW91IG5lZWQgdG8gY3JlYXRlIG9uZSBvciBtb3JlIHRhZ3MsIGJ5IGRlcml2aW5nIGZyb20gVGFnU3VwcG9ydC4KLSAgICAgICAgICBUaGVuIGNyZWF0ZSBhIFRhZ0xpYnJhcnkgY2xhc3MgZm9yIHlvdXIgdGFnczsgdHlwaWNhbGx5IGFsbCB0aGlzIGRvZXMKLSAgICAgICAgICBpcyByZWdpc3RlciBhbGwgdGhlIHRhZ3MgaW4geW91ciB0YWcgbGlicmFyeSBhbmQgZ2l2ZSB0aGVtIG5hbWVzLgotICAgICAgICAgIFRoZW4geW91IGNhbiB1c2UgeW91ciBuZXcgdGFnIGxpYnJhcnkgYnkgc3BlY2lmeWluZyB0aGUgY2xhc3NuYW1lIGluCi0gICAgICAgICAgYSBuYW1lc3BhY2UgVVJJLiBGb3IgZXhhbXBsZQotICAgICAgICA8L2RkPgotICAgICAgICA8ZGQ+Ci08Y29kZT4KLTxzb3VyY2U+Ci0mbHQ7ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxuczpmb289ImplbGx5OmNvbS5hY21lLnNvbWV0aGluZy5NeVRhZ0xpYnJhcnkiJmd0OwotCi0gICZsdDtmb286YmFyIHg9IjEyJmd0OwotICAgIHNvbWV0aGluZyBnb2VzIGhlcmUKLSAgJmx0Oy9mb286YmFyJmd0OwotCi0mbHQ7L2o6amVsbHkmZ3Q7Ci08L3NvdXJjZT4KLTwvY29kZT4KLSAgICAgICAgPC9kZD4KLSAgICAgICAgPGRkPgotICAgICAgICAgIEdvaW5nIGZvcndhcmQgd2UgaG9wZSB0byBwcm92aWRlIGFuIGFsaWFzIG1lY2hhbmlzbSB1c2luZyB0aGUgamFyLWV4dGVuc2lvbgotICAgICAgICAgIG1lY2hhbmlzbSB1c2VkIGJ5IEpBWFAgc28gdGhhdCBhIGZpbGUgY291bGQgYmUgcGxhY2VkIG9uIHRoZSBjbGFzc3BhdGgKLSAgICAgICAgICBjYWxsZWQgPGNvZGU+TUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmZvbzwvY29kZT4gd2hpY2gKLSAgICAgICAgICB3b3VsZCBjb250YWluIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSB0YWcgbGlicmFyeSAoY29tLmFjbWUuc29tZXRoaW5nLk15VGFnTGlicmFyeSkKLSAgICAgICAgICB0aGVuIHlvdSBjb3VsZCB1c2UgaXQgYXMgZm9sbG93cywgd2hpY2ggd291bGQgYXZvaWQgdXNpbmcgdGhlIGNsYXNzIG5hbWUgaW4geW91ciBzY3JpcHRzLgotICAgICAgICA8L2RkPgotICAgICAgICA8ZGQ+Ci08Y29kZT4KLTxzb3VyY2U+Ci0mbHQ7ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxuczpmb289ImplbGx5OmZvbyImZ3Q7Ci0KLSAgJmx0O2ZvbzpiYXIgeD0iMTImZ3Q7Ci0gICAgc29tZXRoaW5nIGdvZXMgaGVyZQotICAmbHQ7L2ZvbzpiYXImZ3Q7Ci0KLSZsdDsvajpqZWxseSZndDsKLTwvc291cmNlPgotPC9jb2RlPgotICAgICAgICA8L2RkPgotICAgICAgPC9kbD4KLQotICAgICAgPGRsPgotICAgICAgICA8ZHQ+Ci0gICAgICAgICAgPGEgbmFtZT0idGFnLWF0dHJpYnV0ZXMiPgotICAgICAgICAgICAgSG93IGRvIEkgdXNlIGV4cHJlc3Npb25zIGFuZCB0YWcgYXR0cmlidXRlcz8KLSAgICAgICAgICA8L2E+Ci0gICAgICAgIDwvZHQ+Ci0gICAgICAgIDxkZD4KLSAgICAgICAgICBKZWxseSB1c2VzIGludHJvc3BlY3Rpb24gdG8gc2V0IHRoZSBwcm9wZXJ0aWVzIG9uIGEgVGFnIGZyb20gdGhlIFhNTCBhdHRyaWJ1dGUKLSAgICAgICAgICB2YWx1ZXMuIElmIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaW4gWE1MIHVzZXMgYW4gZXhwcmVzc2lvbiwgaXQgd2lsbCBiZSBldmFsdWF0ZWQKLSAgICAgICAgICBhbmQgdGhlIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbiB3aWxsIGJlIHBhc3NlZCBpbnRvIHlvdXIgVGFnJ3Mgc2V0dGVyIG1ldGhvZC4KLSAgICAgICAgICBGb3IgZXhhbXBsZSBpZiB5b3UgaGFkIHRoZSBmb2xsb3dpbmcgVGFnLi4uCi0gICAgICAgIDwvZGQ+Ci0gICAgICAgIDxkZD4KLTxjb2RlPgotPHNvdXJjZT4KLXB1YmxpYyBjbGFzcyBGb29UYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKLSAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLSAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotCi0KLSAgLgotfTwvc291cmNlPgotPC9jb2RlPgotICAgICAgICAgICAgICAgIDwvZGQ+Ci0gICAgICAgIDxkZD4KLSAgICAgICAgVGhlbiBpZiB5b3Ugd2VyZSB0byB1c2UgaXQgbGlrZSB0aGlzLi4uCi08Y29kZT4KLTxzb3VyY2U+Ci0gICZsdDtteTpmb28gdmFsdWU9IiR7Y3VzdG9tZXIuZnVsbE5hbWV9Ii8mZ3Q7Ci08L3NvdXJjZT4KLTwvY29kZT4KLSAgICAgICAgVGhlbiB0aGlzIHdvdWxkIGJlIGVxdWl2YWxlbnQgaW4gcHNldWRvY29kZSB0bwotPGNvZGU+Ci08c291cmNlPgotRm9vVGFnIHRhZyA9IEZvb1RhZygpOwotLi4uCi10YWcuc2V0VmFsdWUoICgoQ3VzdG9tZXIpIGNvbnRleHQuZ2V0VmFyaWFibGUoImN1c3RvbWVyIikpLmdldEZ1bGxOYW1lKCkgKTsKLS4uLgotdGFnLmRvVGFnKG91dHB1dCk7Ci08L3NvdXJjZT4KLTwvY29kZT4KLSAgICAgICAgICAgICA8L2RkPgotICAgICAgICA8ZGQ+Ci0gICAgICAgICAgICBJZiBldmVyIHlvdSBmaW5kIHRoYXQgeW91ciBUYWcncyBiZWFuIHByb3BlcnR5IGlzIG5vdCBiZWluZyBzZXQgaXQgY291bGQgYmUgdGhhdCB5b3VyIFRhZyBpcwotICAgICAgICAgICAgbm90IHByb3Blcmx5IGZvbGxvd2luZyB0aGUgYmVhbiBpbnRyb3NwZWN0aW9uIG5hbWluZyBjb252ZW50aW9ucy4KLSAgICAgICAgICAgIEZvciBleGFtcGxlIGRvIHlvdSBoYXZlIGEgbWV0aG9kIGNhbGxlZCBnZXRWYWx1ZSgpIG9yIGlzVmFsdWUoKSB3aXRoIHRoZSB3cm9uZyByZXR1cm4gdHlwZT8KLSAgICAgICAgICAgIChJbiB0aGlzIGRpc2N1c3Npb24gc3Vic3RpdHV0ZSAndmFsdWUnIGZvciB0aGUgbmFtZSBvZiB5b3VyIG93biBwcm9wZXJ0eSwgaXQgZG9lc24ndCBoYXZlIHRvIGJlIGNhbGxlZCAndmFsdWUnIDopLgotICAgICAgICAgICAgRm9yIG1vcmUgZGV0YWlscyBvZiB0aGUgaW50cm9zcGVjdGlvbiBydWxlcywgcGxlYXNlIGNoZWNrb3V0IHRoZSBKYXZhIEJlYW4gc3BlY2lmaWNhdGlvbi4KLSAgICAgICAgICAgICA8L2RkPgotICAgICAgICA8ZGQ+Ci0gICAgICAgICAgSXQgY291bGQgYmUgdGhhdCB5b3Ugd2FudCB0byBjb2VyY2UgdGhlIHZhbHVlIG9mIGFuIGV4cHJlc3Npb24gdG8gc29tZSBzcGVjaWFsIHR5cGUuCi0gICAgICAgICAgRm9yIGV4YW1wbGUgaWYgeW91IHdhbnQgdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gYXMgYW4gSXRlcmF0b3IgeW91IGNhbiB1c2UgYSBwcm9wZXJ0eQotICAgICAgICAgIG9uIHlvdXIgVGFnIG9mIHR5cGUgRXhwcmVzc2lvbiBzbyB0aGF0IGluIHlvdXIgVGFnIHlvdSBjYW4gdXNlIHRoZSBFeHByZXNzaW9uLmV2YWx1YXRlQXNJdGVyYXRvcigpCi0gICAgICAgICAgbWV0aG9kLiBUaGlzIGlzIGhvdyB0aGUgJmx0O3g6Zm9yRWFjaCZndDsgdGFnIGN1cnJlbnRseSBpcyBpbXBsZW1lbnRlZCBmb3IgZXhhbXBsZS4KLTxzb3VyY2U+Ci1wdWJsaWMgY2xhc3MgRm9vVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7Ci0gIHByaXZhdGUgRXhwcmVzc2lvbiB2YWx1ZTsKLQotICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShFeHByZXNzaW9uIHZhbHVlKSB7Ci0gICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkgewotICAgIEl0ZXJhdG9yIGl0ZXIgPSBleHByZXNzaW9uLmV2YWx1YXRlQXNJdGVyYXRvcigpOwotICAgICAgICAgICAgLi4uCi0gIH0KLX08L3NvdXJjZT4KLSAgICAgICAgPC9kZD4KLSAgICAgIDwvZGw+Ci0gICAgICAgICAgICA8ZGw+Ci0gICAgICAgIDxkdD4KLSAgICAgICAgICA8YSBuYW1lPSJjZGF0YSI+Ci0gICAgICAgICAgICBIb3cgZG8gSmVsbHkgc2NyaXB0cyBoYW5kbGUgQ0RBVEEgc2VjdGlvbnM/Ci0gICAgICAgICAgPC9hPgotICAgICAgICA8L2R0PgotICAgICAgICA8ZGQ+Ci0gICAgICAgICAgSmVsbHkgb3V0cHV0cyB0aGUgPGk+Y29udGVudDwvaT4gb2YgYSBDREFUQSBzZWN0aW9uIGRpcmVjdGx5LiAgWW91IGNhbiB1c2UgQ0RBVEEgc2VjdGlvbnMKLSAgICAgICAgICB0byBjcmVhdGUgb3V0cHV0IHRoYXQgb3RoZXJ3aXNlIGNhbm5vdCBiZSBkZXNjcmliZWQgaW4gWE1MLiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlCi0gICAgICAgICAgYSBDREFUQSBzZWN0aW9uIHRvIGNyZWF0ZSBhIERURC4gIFRoZSBmb2xsb3dpbmcgSmVsbHkgc2NyaXB0OgotICAgICAgICA8L2RkPgotICAgICAgICAgICAgICAgIDxkZD4KLQotPHNvdXJjZT4KLSZsdDs/eG1sIHZlcnNpb249IjEuMCI/PgotCi0mbHQ7ajpmaWxlIHhtbG5zOmo9ImplbGx5OmNvcmUiIHZhcj0iZm9vIiBlc2NhcGVUZXh0PSJmYWxzZSI+Ci0gICAgCi0gICAgJmx0OyFbQ0RBVEFbCi0gICAgICAgICZsdDshRE9DVFlQRSBmb28gWwotICAgICAgICAgICAgJmx0OyFFTEVNRU5UIGZvbyAoI1BDREFUQSk+Ci0gICAgICAgIF0+Ci0gICAgXV0mZ3Q7Ci0gICAgCi0gICAgJmx0O2Zvby8+Ci0gICAgCi0mbHQ7L2o6ZmlsZT4KLTwvc291cmNlPgotPC9kZD4KLTxkZD4KLSAgIHdpbGwgcHJvZHVjZSB0aGlzIG91dHB1dDoKLSAgICAgICAgPC9kZD4KLTxkZD4KLTxzb3VyY2U+Ci0mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotJmx0OyFET0NUWVBFIGZvbyBbCi0gICAgJmx0OyFFTEVNRU5UIGZvbyAoI1BDREFUQSk+Ci1dPgotCi0mbHQ7Zm9vLz4KLTwvc291cmNlPgotPC9kZD4KLSAgICAgIDwvZGw+Ci0gICAgPC9zZWN0aW9uPgotICAgIDxzZWN0aW9uIG5hbWU9IkJ1aWxkaW5nIEplbGx5Ij4KLSAgICAgIDxkbD4KLSAgICAgICAgPGR0PgotICAgICAgICAgIDxhIG5hbWU9Imhvdy10by1idWlsZCI+Ci0gICAgICAgICAgICBIb3cgZG8gSSBidWlsZCBKZWxseT8KLSAgICAgICAgICA8L2E+Ci0gICAgICAgIDwvZHQ+Ci0gICAgICAgIDxkZD4KLSAgICAgICAgICBKZWxseSB1c2VzIE1hdmVuIGZvciBpdHMgYnVpbGQgc3lzdGVtLiBTbyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gYnVpbGQgSmVsbHkganVzdCBsaWtlCi0gICAgICAgICAgYW55IG90aGVyIE1hdmVuIGVuYWJsZWQgcHJvamVjdC4gUGxlYXNlIHNlZSB0aGUKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9zdGFydC9pbmRleC5odG1sIj5NYXZlbjwvYT4KLSAgICAgICAgICBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgotICAgICAgICA8L2RkPgotICAgICAgPC9kbD4KLSAgICA8L3NlY3Rpb24+Ci0gIDwvc2VjdGlvbj4KLTwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS94ZG9jcy9nZXR0aW5nc3RhcnRlZC54bWwgYi94ZG9jcy9nZXR0aW5nc3RhcnRlZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5M2Y1YjkuLjAwMDAwMDAKLS0tIGEveGRvY3MvZ2V0dGluZ3N0YXJ0ZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotCi0gPHByb3BlcnRpZXM+Ci0gIDx0aXRsZT5HZXR0aW5nIFN0YXJ0ZWQ8L3RpdGxlPgotICA8YXV0aG9yIGVtYWlsPSJqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2F1dGhvcj4KLSA8L3Byb3BlcnRpZXM+Ci0KLTxib2R5PgotCi08c2VjdGlvbiBuYW1lPSJHZXR0aW5nIFN0YXJ0ZWQiPgotCi0KLTxwPgotVGhlIGVhc2llc3Qgd2F5IHRvIGdldCBzdGFydGVkIHdpdGggSmVsbHkgaXMgdG8gdHJ5IG91dCB0aGUgPGEgaHJlZj0idHV0b3JpYWwuaHRtbCI+dHV0b3JpYWxzPC9hPi4gICAgCi1CZWZvcmUgeW91IHRyeSBvdXQgYW55IG9mIHRoZSB0dXRvcmlhbHMsIHlvdSdsbCBuZWVkIHRvIGluc3RhbGwgTWF2ZW4gZmlyc3QuCi1Gb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byBpbnN0YWxsIE1hdmVuIHBsZWFzZSByZWZlciB0byB0aGUgCi08YSBocmVmPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy8iPk1hdmVuIGRvY3VtZW50YXRpb248L2E+Ci08L3A+Ci0KLTxwPgotSGVyZSdzIGEgYnJpZWYgb3ZlcnZpZXcgb2Ygd2hhdCB5b3UgbmVlZCB0byBkby4gCi0KLTx1bD4KLTxsaT4KLURvd25sb2FkIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiBNYXZlbi4KLTwvbGk+Ci08bGk+Ci1TZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIE1BVkVOX0hPTUUgdG8gcG9pbnQgdG8gd2hlcmUgeW91IGluc3RhbGxlZCBNYXZlbgotPC9saT4KLTxsaT4KLUNoYW5nZSB5b3VyIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgc28gdGhhdCBpdCBwb2ludHMgdG8gTUFWRU5fSE9NRS9iaW4KLTwvbGk+Ci08bGk+Ci1HZXQgYSBzb3VyY2UgZGlzdHJpYnV0aW9uIG9mIEplbGx5LiAKLVRoZSBlYXNpZXN0IHdheSB0byBkbyB0aGlzIGlzICh1bnRpbCB3ZSBoYXZlIG5pZ2h0bHkgYnVpbGRzIHdvcmtpbmcpIGlzIHRvIGdyYWIgYSBDVlMgY2hlY2tvdXQuCi1KZWxseSBjdXJyZW50bHkgcmVzaWRlcyBpbiB0aGUgamVsbHkgZGlyZWN0b3J5IGluc2lkZSBqYWthcnRhLWNvbW1vbnMuCi1UaGVyZSBhcmUgaW5zdHJ1Y3Rpb25zIG9uIHBlcmZvcm1pbmcgQ1ZTIGNoZWNrb3V0cyAKLTxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvc2l0ZS9jdnNpbmRleC5odG1sIj5oZXJlPC9hPgotPC9saT4KLTwvdWw+Ci08L3A+Ci0KLTxwPgotVG8gdmVyaWZ5IHRoYXQgeW91ciBNYXZlbiBpbnN0YWxsYXRpb24gaXMgd29ya2luZywgY2hhbmdlIGRpcmVjdG9yeSBpbnRvIHlvdXIgPGk+amVsbHk8L2k+IGRpcmVjdG9yeSAKLXdoaWNoIHNob3VsZCBjb250YWluIGEgPGk+cHJvamVjdC54bWw8L2k+IGZpbGUgcmVxdWlyZWQgYnkgTWF2ZW4uIFRoZW4gdHlwZQotPC9wPgotCi08c291cmNlPm1hdmVuIGphcjwvc291cmNlPgotCi08cD4KLVRoaXMgc2hvdWxkIGRvd25sb2FkIGFsbCB0aGUgcmVxdWlyZWQgamFycyByZXF1aXJlZCB0byBidWlsZCBhbmQgcnVuIHRoZSBjb3JlIGplbGx5LAotY29tcGlsZSBhbGwgdGhlIGNvZGUgYW5kIGJ1aWxkIGFuZCBydW4gdGhlIHVuaXQgdGVzdCBjYXNlcy4gCi08L3A+Ci0KLTwvc2VjdGlvbj4KLQotPHNlY3Rpb24gbmFtZT0iVGFnLWxpYnJhcmllcyI+Ci08cD4gCi0gIFlvdXIgbmV4dCB0YXNrIGlzIHRvIGNob29zZSB0aGUgdGFnLWxpYnJhcmllcyB5b3UgYXJlIGludGVyZXN0ZWQgdG8gYW5kIHRvCi0gIGJ1aWxkIHRoZW0uIEZvciBhbGwgb2YgdGhlbSwgeW91IGNhbiBidWlsZCB1c2luZyA8Y29kZT5tYXZlbiBqYXI8L2NvZGU+LgotICA8L3A+Ci08cD4KLSAgQmV3YXJlIHRoYXQgc29tZSB0YWctbGlicmFyaWVzIGhhdmUgZGVwZW5kZW5jaWVzIHRoYXQgY2Fubm90IGJlIGRpc3RyaWJ1dGVkCi0gIGJ5IHRoZSBtYXZlbiByZXBvc2l0b3J5IGRpc3RyaWJ1dGlvbiBmb3IgbGljZW5zZSByZWFzb25zLiBUaGUgdGFnLWxpYnJhcmllcwotICAgIDxhIGhyZWY9ImxpYnMvZW1haWwvaW5kZXguaHRtbCI+ZW1haWw8L2E+LAotICAgIDxhIGhyZWY9ImxpYnMvc29hcC9pbmRleC5odG1sIj48L2E+LCBhbmQKLSAgICA8YSBocmVmPSJsaWJzL2pldHR5L2luZGV4Lmh0bWwiPjwvYT4KLSAgYXJlIGtub3duIHRvIHJlcXVpcmUgc3VjaC4KLSAgUGxlYXNlIGJyb3dzZSB0byB0aGVpciBkZXBlbmRlbmN5LWxpc3QgaW4gb3JkZXIgdG8gZG93bmxvYWQgdGhlCi0gIG5hbWVkIGphcnMsIHJlbmFtZS10aGVtLCBhbmQgcHV0IHRoZW0gYXQgdGhlIGFwcHJvcHJpYXRlIHBsYWNlCi0gIGluIHRoZSBtYXZlbiByZXBvc2l0b3J5LiAoeW91IGNvdWxkIGFsc28gZGVsZXRlIHRoZXNlIGRpcmVjdG9yaWVzKQotICA8L3A+Ci0gIDxwPgotICAgIE9uY2UgYWxsIGRlcGVuZGVuY2llcyBhcmUgaG9ub3VyZWQsIHlvdSBjYW4gYWxzbyBidWlsZCBpdCBhbGwgdXNpbmcKLSAgICA8Y29kZT5tYXZlbiBkaXN0PC9jb2RlPiwgaG93ZXZlciwgbWF2ZW4gbWF5IGJlY29tZSBvdXQgb2YgcmVzb3VyY2VzOwotICAgIGNoYW5naW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBNQVZFTl9PUFRTIChlLmcuIHRvIC1YbXg3NjhtLi4uKSBtaWdodCBoZWxwLgotICAgIDwvcD4KLTxwPgotT25jZSB5b3UndmUgZ290IHRoaXMgZmFyLCBpdCBtaWdodCBiZSB0aW1lIHRvIHRyeSBvdXQgb25lIG9mIHRoZSA8YSBocmVmPSJ0dXRvcmlhbC5odG1sIj50dXRvcmlhbHM8L2E+ICAgIAotPC9wPgotPC9zZWN0aW9uPgotCi0KLTwvYm9keT4KLQotPC9kb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ZG9jcy9pbWFnZXMvbG9nby5naWYgYi94ZG9jcy9pbWFnZXMvbG9nby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YjY3ZTQuLjAwMDAwMDAKLS0tIGEveGRvY3MvaW1hZ2VzL2xvZ28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveGRvY3MvaW1hZ2VzL2xvZ28uanBnIGIveGRvY3MvaW1hZ2VzL2xvZ28uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTdhNzBhLi4wMDAwMDAwCi0tLSBhL3hkb2NzL2ltYWdlcy9sb2dvLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hkb2NzL2luZGV4LnhtbCBiL3hkb2NzL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlMjU3OS4uMDAwMDAwMAotLS0gYS94ZG9jcy9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZG9jdW1lbnQ+Ci0KLSA8cHJvcGVydGllcz4KLSAgPHRpdGxlPkplbGx5IDogRXhlY3V0YWJsZSBYTUw8L3RpdGxlPgotICA8YXV0aG9yIGVtYWlsPSJqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2F1dGhvcj4KLSA8L3Byb3BlcnRpZXM+Ci0KLTxib2R5PgotCi08c2VjdGlvbiBuYW1lPSJKZWxseSA6IEV4ZWN1dGFibGUgWE1MIj4KLQotPHA+PGVtPkplbGx5PC9lbT4gaXMgYSB0b29sIGZvciB0dXJuaW5nIFhNTCBpbnRvIGV4ZWN1dGFibGUgY29kZS4KLVNvIEplbGx5IGlzIGEgSmF2YSBhbmQgWE1MIGJhc2VkIHNjcmlwdGluZyBhbmQgcHJvY2Vzc2luZyBlbmdpbmUuIAotSmVsbHkgY2FuIGJlIHVzZWQgYXMgYSBtb3JlIGZsZXhpYmxlIGFuZCBwb3dlcmZ1bCBmcm9udCBlbmQgCi10byA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2FudC8iPkFudDwvYT4gCi1zdWNoIGFzIGluIHRoZSA8YSBocmVmPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy8iPk1hdmVuPC9hPgotcHJvamVjdCwgYXMgYSB0ZXN0aW5nIGZyYW1ld29yayBzdWNoIGFzIDxhIGhyZWY9ImplbGx5dW5pdC5odG1sIj5KZWxseVVuaXQ8L2E+LCAKLWluIGFuIGludGVyZ3JhdGlvbiBvciB3b3JrZmxvdwotc3lzdGVtIHN1Y2ggYXMgPGEgaHJlZj0iaHR0cDovL3dlcmtmbG93Lndlcmtlbi5jb20vIj53ZXJrZmxvdzwvYT4gCi1vciBhcyBhIHBhZ2UgdGVtcGxhdGluZyBzeXN0ZW0gaW5zaWRlIGVuZ2luZXMgbGlrZSAKLTxhIGhyZWY9Imh0dHA6Ly9jb2Nvb24uYXBhY2hlLm9yZy8iPkNvY29vbjwvYT4uCi08L3A+Ci0KLTxwPgotSmVsbHkgYm9ycm93cyBtYW55IGdvb2QgaWRlYXMgZnJvbSBib3RoIEpTUCBjdXN0b20gdGFncywgVmVsb2NpdHksIENvY29vbiwgQW50LiAKLUplbGx5IGNhbiBiZSB1c2VkIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgaW5zaWRlIEFudCBhbmQgCi1NYXZlbiBvciBpbnNpZGUgYSBTZXJ2bGV0LCBXZWIgU2VydmljZSwgSk1TIE1lc3NhZ2VMaXN0ZW5lciBvciBlbWJlZGRlZCBkaXJlY3RseSBpbnRvIHlvdXIgc29mdHdhcmUuIAotPC9wPgotCi08cD4KLUplbGx5IGhhcyBuYXRpdmUgc3VwcG9ydCBmb3IgYSBWZWxvY2l0eS1saWtlIGV4cHJlc3Npb24gbGFuZ3VhZ2UgY2FsbGVkCi08YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvamV4bC8iPkpleGw8L2E+IAotd2hpY2ggaXMgYSBzdXBlcnNldCBvZiB0aGUgSlNQLCBKU1RMIGFuZCBKU0YgZXhwcmVzc2lvbiBsYW5ndWFnZXMKLWFzICB3ZWxsIGFzIHN1cHBvcnQgZm9yIG90aGVyIHBsdWdnYWJsZSBleHByZXNzaW9uIGxhbmd1YWdlcyBsaWtlIFhQYXRoIHZpYSAKLTxhIGhyZWY9Imh0dHA6Ly9qYXhlbi5vcmciPkpheGVuPC9hPiwgSmF2YVNjcmlwdCwgYmVhbnNoZWxsIGFuZCBKeXRob24uCi08L3A+Ci0KLTxwPgotSmVsbHkgaXMgY29tcGxldGVseSBleHRlbmRhYmxlIHZpYSBjdXN0b20gdGFncyBpbiBhIHNpbWlsYXIgd2F5IHRvIEpTUCBjdXN0b20gdGFncyBvciBBbnQgdGFza3MuCi1UaG91Z2ggSmVsbHkgaXMgcmVhbGx5IHNpbXBsZSBhbmQgaGFzIG5vIGRlcGVuZGVuY2llcyBlaXRoZXIgU2VydmxldHMgb3IgSlNQLgotU28geW91IGNvdWxkIHRoaW5rIG9mIEplbGx5IGFzIHNpbWlsYXIgdG8gYW4gWE1MLWl6ZWQgVmVsb2NpdHkgd2hlcmUgdGhlIGRpcmVjdGl2ZXMgYXJlIFhNTCB0YWdzLgotT3IgeW91IGNvdWxkIHRoaW5rIG9mIEplbGx5IGFzIGEgbW9yZSBmbGV4aWJsZSBlbmdpbmUgZm9yIHByb2Nlc3NpbmcgQW50IHRhc2tzIHdpdGggYmV0dGVyIGV4cHJlc3Npb24sIAotbG9naWMgYW5kIGxvb3Bpbmcgc3VwcG9ydC4KLTwvcD4KLQotPHA+Ci1KZWxseSBpcyBhbHNvIGJhc2VkIG9uIGFuIFhNTCBwaXBlbGluZSBhcmNoaXRlY3R1cmUsIGxpa2UgQ29jb29uLCBzbyB0aGF0IGl0IGlzIGlkZWFsIGZvciBwcm9jZXNzaW5nIFhNTCwKLXNjcmlwdGluZyB3ZWIgc2VydmljZXMsIGdlbmVyYXRpbmcgZHluYW1pYyB3ZWIgY29udGVudCBvciBiZWluZyBwYXJ0IG9mIGEgY29udGVudCBnZW5lcmF0aW9uIAotc3lzdGVtIHN1Y2ggYXMgQ29jb29uLgotPC9wPgotCi08L3NlY3Rpb24+Ci0KLQotPHNlY3Rpb24gbmFtZT0iSG93IGl0IHdvcmtzIj4KLQotPHA+QSBKZWxseSBzY3JpcHQgaXMgYW4gWE1MIGRvY3VtZW50IHdoaWNoIGdldHMgcGFyc2VkIGludG8gYSBTY3JpcHQuIFRoZSBzY3JpcHQgY2FuIHRoZW4gYmUgcmFuIHRvIHByb2R1Y2UKLWR5bmFtaWMgWE1MIGV2ZW50cyB3aGljaCBjYW4gdGhlbiBiZSB0dXJuZWQgaW50byB0ZXh0LCBYTUwsIEhUTUwgZXRjLgotPC9wPgotIAotPHA+Ci1SYXRoZXIgbGlrZSBWZWxvY2l0eSwgdGhlIFhNTCBjYW4gY29udGFpbiBleHByZXNzaW9ucyB0byBtYWtlIHRoZSBvdXRwdXQgZHluYW1pYyBhbmQgY2FuIHdvcmsgd2l0aCBhIHZhcmlhYmxlIAotY29udGV4dC4KLTwvcD4gCi0KLQotPHNvdXJjZT4KLSZsdDtkb2N1bWVudCB0aW1lPSIke25vd30iJmd0OwotICBXZWxjb21lICR7dXNlci5uYW1lfSB0byBKZWxseSEKLSZsdDsvZG9jdW1lbnQmZ3Q7Ci08L3NvdXJjZT4KLQotCi08cD4gCi1YTUwgZWxlbWVudHMgY2FuIGJlIGJvdW5kIHRvIHNvbWUgSmF2YSBjb2RlIHRvIGltcGxlbWVudCBzb21lIGtpbmQgb2YgZHluYW1pYyBwcm9jZXNzaW5nLgotVGhlIGRlZmF1bHQgd2F5IHRvIGRvIHRoaXMgaXMgdG8gaW1wbGVtZW50IEplbGx5IDxpPlRhZ3M8L2k+IHdoaWNoIGFyZSBKYXZhIEJlYW5zIHdoaWNoIGFsc28gaW1wbGVtZW50IEplbGx5J3MgCi08YSBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9UYWcuaHRtbCI+VGFnPC9hPiBpbnRlcmZhY2UuIAotPC9wPgotCi08cD4KLVdoZW4gYSBKZWxseSBzY3JpcHQgaXMgcnVuLCB0aGUgcHJvcGVydGllcyBvZiB0aGUgSmVsbHkgQmVhbiBhcmUgY29uZmlndXJlZCB1c2luZyB0aGUgWE1MIGF0dHJpYnV0ZXMuCi1UaGVuIHRoZSB0YWcgaXMgcnVuIGJ5IGNhbGxpbmcgaXRzIDxpPmRvVGFnKCk8L2k+IG1ldGhvZC4gCi1UaGUgVGFnIGNhbiB0aGVuIHBlcmZvcm0gc29tZSBwcm9jZXNzaW5nIGFuZCBpbnZva2UgaXRzIGJvZHkgKHRoZSBjb250ZW50cyBvZiB0aGUgWE1MIGVsZW1lbnQpIAotaWYgaXQgd2lzaGVzLCBob3dldmVyIG1hbnkgdGltZXMgaXQgd2FudHMuIFNvIEplbGx5IFRhZ3MgYXJlIHZlcnkgbGlrZSBKU1AgY3VzdG9tIHRhZ3MgYW5kIGFuYWxvZ291cyAKLXRvIDxpPmRpcmVjdGl2ZXM8L2k+IGluIFZlbG9jaXR5Li4KLTwvcD4KLQotPHA+Ci1UaGVyZSBpcyBhbiBBbnQgVGFnIExpYnJhcnkgd2hpY2ggYWxsb3dzIGFsbCBBbnQgdGFza3MgdG8gYmUgdXNlZCBpbnNpZGUgYSBKZWxseSBzY3JpcHQuCi08L3A+Ci0KLTxwPgotQWxzbyBKZWxseSBUYWdzIGNhbiBiZSBkZWZpbmVkIGF0IHJ1bnRpbWUgaW4gZHluYW1pYyBKZWxseSBzY3JpcHQgdXNpbmcgdGhlIAotPGEgaHJlZj0ibGlicy9kZWZpbmUvdGFncy5odG1sIj5kZWZpbmU8L2E+IHRhZyAKLWxpYnJhcnkgc28gdGhhdCBzaW1wbGUgeWV0IHBvd2VyZnVsIG1hY3JvcyBjYW4gYmUgbWFkZSB2ZXJ5IGVhc2lseSB1c2luZyBqdXN0IEplbGx5IHNjcmlwdC4KLTwvcD4KLQotPHA+Ci08aT5KZWxseSBCZWFuczwvaT4gY2FuIGJlIGNyZWF0ZWQgd2l0aCB0aGUgZGVmaW5lIHRhZyBsaWJyYXJ5LiBBIEplbGx5IEJlYW4gaXMgd2hlcmUgYSByZWd1bGFyIAotSmF2YSBCZWFuIGNhbiBiZSBib3VuZCB0byBhIEplbGx5IHRhZy4gSWYgdGhlIGJlYW4gaW1wbGVtZW50cyB0aGUgUnVubmFibGUgaW50ZXJmYWNlIG9yIGhhcyBzb21lIGtpbmQKLW9mIGludm9rYWJsZSBtZXRob2QsIGxpa2UgcnVuKCksIGludm9rZSgpIG9yIGV4ZWN1dGUoKSB0aGVuIHRoZSBiZWFuIHdpbGwgYWxzbyBiZSBpbnZva2VkIGJ5IHRoZSB0YWcuCi08L3A+Ci0KLTxwPgotRm9yIGV4YW1wbGUgaW1hZ2luZSBpZiB5b3UgaGFkIHdyaXR0ZW4gdGhlIGZvbGxvd2luZyBiZWFuCi08L3A+Ci0KLTxzb3VyY2U+Ci1wdWJsaWMgY2xhc3MgTXlUYXNrIHsKLQotICAgIC8vICdkb0l0JyBtZXRob2QgdGhhdCBkb2VzIHNvbWUgZnVuY3Rpb24vdGFzay4uLgotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBTb21lRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZG8gc29tZXRoaW5nLi4uCi0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcywgY2FuIGJlIGFueSB0eXBlCi0gICAgcHVibGljIHZvaWQgc2V0WChpbnQgeCkgewotICAgICAgICB0aGlzLnggPSB4OwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRZKFN0cmluZyB5KSB7Ci0gICAgICAgIHRoaXMueSA9IHk7Ci0gICAgfQotfQotPC9zb3VyY2U+Ci0KLTxwPgotVGhlbiB5b3UgY2FuIHVzZSB0aGlzIGJlYW4gaW4gYSBzY3JpcHQgYnkgZGVmaW5pbmcgYSBuZXcgdGFnIGxpYnJhcnkgYW5kCi10aGVuIHVzaW5nIHRoZSBuZXcgdGFnIGFzIGZvbGxvd3MuLi4KLTwvcD4KLQotPHNvdXJjZT4KLSZsdDtqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiIHhtbG5zOmRlZmluZT0iamVsbHk6ZGVmaW5lIiB4bWxuczpteT0ibXlUYWdMaWIiJmd0OwotCi0gICZsdDtkZWZpbmU6dGFnbGliIHVyaT0ibXlUYWdMaWIiJmd0OwotICAgICZsdDtkZWZpbmU6amVsbHliZWFuIG5hbWU9ImZvbyIgY2xhc3NOYW1lPSJNeVRhc2siLyZndDsKLSAgJmx0Oy9kZWZpbmU6dGFnbGliJmd0OwotCi0gIE5vdyBsZXRzIHVzZSB0aGUgbmV3IHRhZwotICAKLSAgJmx0O215OmZvbyB4PSIyIiB5PSJjaGVlc2UiLyZndDsKLQotJmx0Oy9qOmplbGx5Jmd0OwotPC9zb3VyY2U+Ci0KLTxwPgotVGhpcyBtZWNoYW5pc20gaXMga2luZGEgc2ltaWxhciB0byB1c2luZyBhICZsdDt0YXNrZGVmJmd0OyBpbiBBbnQgZXhjZXB0IHRoYXQgdGhlCi1iZWFuIGNhbiBiZSBhbnl0aGluZywgaXQgZG9lc24ndCBuZWVkIHRvIGRlcml2ZSBmcm9tIEFudCdzIFRhc2sgLSBpdCBjYW4gYmUKLWFueSBqYXZhIG9iamVjdCB3aXRoIHNvbWUga2luZCBvZiAnZG9JdCcgbWV0aG9kIHdoaWNoIHRha2VzIG5vIGFyZ3VtZW50cy4KLUluZGVlZCB0aGUgbWV0aG9kIG5hbWUgY2FuIGJlIHNldCB2aWEgJmx0O2RlZmluZTpqZWxseWJlYW4gbWV0aG9kPSJkb0l0Ii8mZ3Q7Ci08L3A+Ci0KLQotCi08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uIG5hbWU9IkpTVEwiPgotPHA+Ci08YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pzcC9qc3RsLyI+SlNUTDwvYT4gCi1pcyB0aGUgSlNQIFN0YW5kYXJkIFRhZyBMaWJyYXJ5IHdoaWNoIGlzIHN0YW5kYXJkaXplZCB0aHJvdWdoIHRoZSBKQ1AgcHJvY2Vzcy4KLTwvcD4KLQotPHA+Ci1KZWxseSBpbXBsZW1lbnRzIGEgY29sbGVjdGlvbiBvZiBKU1RMIHRhZ3MgdG8gcGVyZm9ybSBjb3JlIGZlYXR1cmVzIGxpa2UgCi1leHByZXNzaW9uIGV2YWx1YXRpb24sIGNvbmRpdGlvbmFsIGJyYW5jaGluZyBhbmQgbG9vcGluZywgYXMgd2VsbCB0aGUgcHJvY2Vzc2luZyBvZiBiZWFucywgWE1MLCBYUGF0aCBhbmQgU1FMLiAKLTwvcD4KLQotPHA+Ci1KZWxseSBjYW4gYWN0IGFzIGEgc3RhbmQgYWxvbmUgbGlnaHR3ZWlnaHQgZW5naW5lIGZvciBydW5uaW5nIEpTVEwgCi1zY3JpcHRzIHdoaWNoIGNhbiBiZSBydW4gZnJvbSB0aGUgY29tbWFuZCBsaW5lIG9yIGZyb20gQW50IG9yIHRoYXQgY2FuIGJlIGVhc2lseSAKLWVtYmVkZGVkIGludG8gU09BUCBzZXJ2aWNlcywgU2VydmxldCBlbmdpbmVzLCBKTVMgTWVzc2FnZUxpc3RlbmVycyBvciB5b3VyIG93biBzb2Z0d2FyZS4KLTwvcD4KLQotPHA+Ci1JbiBhZGRpdGlvbiBKZWxseSBhbGxvd3MgdGhlIEpTVEwgdGFncyB0byBiZSB1c2VkIHRvIGNyZWF0ZSB1bml0IHRlc3Rpbmcgc2NyaXB0cyAKLWZvciB3ZWIgYXBwbGljYXRpb25zIGFuZCB3ZWIgc2VydmljZXMuCi08L3A+Ci08L3NlY3Rpb24+Ci0KLQotPHNlY3Rpb24gbmFtZT0iQW50Ij4KLTxwPgotVGhlcmUgaXMgYSBKZWxseVRhc2sgZm9yIGNhbGxpbmcgSmVsbHkgZnJvbSAKLTxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYW50LyI+QW50PC9hPiAKLWFzIHdlbGwgYXMgYSBKZWxseSB0YWcgbGlicmFyeSBmb3IgdXNpbmcgYW55IEFudCBUYXNrcyBpbnNpZGUgYSBKZWxseSBzY3JpcHQhCi08L3A+Ci0KLTxwPgotSmVsbHkncyBzdXBwb3J0IHRoZSBKZXhsIGV4cHJlc3Npb24gbGFuZ3VhZ2Ugd2hpY2ggaXMgYSBzdXBlcnNldCBvZiB0aGUgZXhwcmVzc2lvbiBsYW5ndWFnZSBpbiBKU1RMIAotYW5kIEFudCdzIGV4cHJlc3Npb24gbGFuZ3VhZ2UsIG1lYW5zIHRoYXQgQW50IHByb3BlcnRpZXMgY2FuIGJlIHVzZWQgaW5zaWRlIEplbGx5IHNjcmlwdHMgc2VhbWxlc3NseQotd2hpbGUgYWxzbyB3b3JraW5nIHdpdGggYmVhbnMsIHByb3BlcnRpZXMsIGNvbGxlY3Rpb25zLCBtZXRob2QgY2FsbHMgZXRjLgotPC9wPgotCi08cD4KLVNvIEplbGx5IGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgbW9yZSBmbGV4aWJsZSBzY3JpcHRpbmcgYW5kIHByb2Nlc3NpbmcgZW5naW5lIGZvciBBbnQsIGtpbmRhIGxpa2UgCi1hIGNvbWJpbmF0aW9uIG9mIEFudCwgVmVsb2NpdHkgYW5kIEpTUC4KLTwvcD4KLTwvc2VjdGlvbj4KLQotCi08c2VjdGlvbiBuYW1lPSJYTUwgYW5kIFdlYiBTZXJ2aWNlcyI+Ci08cD4KLUplbGx5IGlzIGJhc2VkIG9uIGFuIFhNTCBldmVudCBwaXBlbGluZSBhcmNoaXRlY3R1cmUgKFNBWCksIGxpa2UgQ29jb29uLCByYXRoZXIgdGhhbiBiZWluZyBwdXJlbHkgdGV4dAotYmFzZWQgbGlrZSBKU1AgYW5kIFZlbG9jaXR5LiBUaGlzIG1lYW5zIHRoYXQgSmVsbHkgdGFncyBjYW4gY29uc3VtZSBYTUwgZXZlbnRzIGFuZCBlbWl0IHRoZW0uIEVhY2gKLUplbGx5IFRhZyBjYW4gdGhlbiBhY3QgYXMgYW4gWE1MIHNvdXJjZSwgcmVzdWx0LCBmaWx0ZXIgb3IgdHJhbnNmb3JtYXRpb24uCi08L3A+Ci0KLTxwPgotQWxzbyBiZWNhdXNlIEplbGx5IHdvcmtzIG9uIGFuIFhNTCBldmVudCBwaXBlbGluZSwgWE1MIGNhbiBiZSBwcm9jZXNzZWQgdmVyeSBlZmZpY2llbnRseSB3aXRob3V0IHJlZHVuZGFudAotcnVudGltZSBwYXJzaW5nLiAKLU9uY2UgYSBKZWxseSBzY3JpcHQgaXMgcGFyc2VkLCBpdCBjYW4gYmUgY2FjaGVkIHNvIHRoYXQgd2hlbmV2ZXIgaXQgaXMgcnVuLCBubyBYTUwgcGFyc2luZyBpcyB1c3VhbGx5IG5lY2Vzc2FyeSBvZiB0aGUgaW5wdXQgb3IgdGhlIG91dHB1dC4KLTwvcD4KLQotPHA+Ci1JbiBhZGRpdGlvbiB0aGVyZSBpcyBhIHRhZyBsaWJyYXJ5IGNhbGxlZCB0aGUgSmVsbHkgU3R5bGVzaGVldCBMaWJyYXJ5ICgKLTxhIGhyZWY9ImxpYnMvanNsL3RhZ3MuaHRtbCI+SlNMPC9hPikgZm9yCi1wZXJmb3JtaW5nIFhTTFQtc3R5bGUgZGVjbGFyYXRpdmUgcHJvY2Vzc2luZyBvZiBYTUwgZG9jdW1lbnRzIHVzaW5nIGEgcGF0dGVybiBtYXRjaCBhcHByb2FjaC4KLTwvcD4KLQotPHA+Ci1Vc2luZyB0aGUgZHluYW1pYyB0YWcgY3JlYXRpb24gZmVhdHVyZXMgb2YgdGhlIDxpPmRlZmluZTwvaT4gdGFnIGxpYnJhcnkgd2UgY2FuIGVhc2lseSBzY3JpcHQgU09BUCBzZXJ2aWNlcyB1c2luZwotYSBzaW1wbGUgdGFnIGJhc2VkIG1hY3JvIGxhbmd1YWdlLiAKLTwvcD4KLQotPHA+Ci1Gb3IgZXhhbXBsZSB0aGUgZm9sbG93aW5nIHBpZWNlIG9mIEplbGx5IHNjcmlwdCBjb3VsZCBldmFsdWF0ZSBpdHMgZHluYW1pYyAKLWJvZHkgKHdoaWNoIGNhbiBjb250YWluIGFueSBKZWxseSB0YWdzLCBKU1RMIG9yIEFudCB0YXNrcykgdGhlbiBjb252ZXJ0IHRoZSBib2R5IGludG8gdGhlIGNvcnJlY3QgU09BUCBtZXNzYWdlLCBjYWxsIGEgU09BUCBzZXJ2aWNlCi10aGVuIGZvcm1hdCB0aGUgcmVzdWx0cyBuZWF0bHkgYXMgWE1MLgotPC9wPgotCi08c291cmNlPgotJmx0O2JhYmVsZmlzaDp0cmFuc2xhdGUgZnJvbT0iZW4iIHRvPSJmciImZ3Q7Ci0gIFdlbGNvbWUgJHt1c2VyLm5hbWV9IHRvIEplbGx5IQotJmx0Oy9iYWJlbGZpc2g6dHJhbnNsYXRlJmd0OwotPC9zb3VyY2U+Ci0KLTxwPgotQSBKZWxseSBzY3JpcHQgaXMgYW4gWE1MIGRvY3VtZW50LCB3aGljaCBtZWFucyB0aGF0IEplbGx5IGNhbiBwcm9jZXNzIGl0c2VsZi4KLUFsbCBvZiB0aGVzZSB0aGluZ3MgbWFrZSBKZWxseSBhIGdvb2QgY2hvaWNlIGZvciBmb3Igd29ya2luZyB3aXRoIFhNTCBhbmQgV2ViIFNlcnZpY2VzLgotPC9wPgotCi08L3NlY3Rpb24+Ci0KLQotPHNlY3Rpb24gbmFtZT0iT3RoZXIgdXNlcyI+Ci08cD4KLVdlIGhvcGUgSmVsbHkgY2FuIGJlIGJvdGggZ2VuZXJpYyBhbmQgcG93ZXJmdWwgWE1MIHByb2Nlc3NpbmcgYW5kIHRyYW5zZm9ybWF0aW9uIGVuZ2luZSwgCi1hIHdlYiBhbmQgWE1MIGJhc2VkIHNjcmlwdGluZyBlbmdpbmUgYXMgd2VsbCBhcyBhIHVuaXQgdGVzdGluZyBmcmFtZXdvcmsgZm9yIAotdGVzdGluZyB3ZWIgYXBwbGljYXRpb25zIGFuZCB3ZWIgc2VydmljZXMuCi08L3A+Ci0KLTxwPgotQ3VycmVudGx5IEplbGx5IGlzIGJlaW5nIHVzZWQgaW5zaWRlIDxhIGhyZWY9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnLyI+TWF2ZW48L2E+Ci10byBwcm92aWRlIG1vcmUgZmxleGlibGUgYW5kIHBvd2VyZnVsIGJ1aWxkIG1lY2hhbmlzbSB3aGlsZSBzdGlsbCBwcmVzZXJ2aW5nIGludmVzdG1lbnQgaW4gQW50IHRhc2tzLgotPC9wPgotCi08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uIG5hbWU9IkpTVEwgUmVmZXJlbmNlcyI+Ci0gIDx1bD4KLSAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qc3AvanN0bC8xLjEvZG9jcy90bGRkb2NzL2luZGV4Lmh0bWwiPkpTVEwgVGFnIHJlZmVyZW5jZTwvYT48L2xpPgotICAgIDxsaT48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pzcC9qc3RsLzEuMS9kb2NzL2FwaS9pbmRleC5odG1sIj5KU1RMIEFQSTwvYT48L2xpPgotICAgIDxsaT48YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhZ2xpYnMvZG9jL3N0YW5kYXJkLWRvYy9pbnRyby5odG1sIj5BcGFjaGUgSlNUTCBJbXBsZW1lbnRhdGlvbjwvYT48L2xpPgotICA8L3VsPgotPC9zZWN0aW9uPgotCi08L2JvZHk+Ci08L2RvY3VtZW50PgotCmRpZmYgLS1naXQgYS94ZG9jcy9pcmMueG1sIGIveGRvY3MvaXJjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU2YWY1Yy4uMDAwMDAwMAotLS0gYS94ZG9jcy9pcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZG9jdW1lbnQ+Ci0KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPklSQzwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0ianN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLQotICA8Ym9keT4KLQotICAgIDxzZWN0aW9uIG5hbWU9IklSQyI+Ci0KLSAgICAgIDxwPgotICAgICAgVGhlIENvZGVIYXVzIHJ1bnMgYW4gSVJDIHNlcnZlciB0byBzdXBwb3J0IHRoZSBpbnRlcmFjdGl2ZQotICAgICAgZWZmb3J0cyBvZiBwcm9qZWN0IG1lbWJlcnMuCi0gICAgICA8L3A+Ci0KLSAgICAgIDxwPgotICAgICAgVG8gYWNjZXNzIHRoZSBJUkMgc2VydmVyLCBwb2ludCBhbiBhcHByb3ByaWF0ZSBJUkMgY2xpZW50IGF0OgotICAgICAgPC9wPgotCi0gICAgICA8YmxvY2txdW90ZT4KLSAgICAgICAgICAgIHNlcnZlcjogPGI+aXJjLmNvZGVoYXVzLm9yZzwvYj4KLSAgICAgICAgICAgICAgcG9ydDogPGI+NjY2NzwvYj4KLSAgICAgIDwvYmxvY2txdW90ZT4KLQotICAgICAgPHA+Ci0gICAgICBJZiB5b3UgaGF2ZSA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnLyI+TW96aWxsYTwvYT4gaW5zdGFsbGVkIHlvdSBjYW4gcG9pbnQgeW91ciBicm93c2VyIGF0Ci0gICAgICA8YSBocmVmPSJpcmM6Ly9pcmMuY29kZWhhdXMub3JnOjY2NjcvI2plbGx5Ij4jamVsbHk8L2E+LgotICAgICAgPC9wPgotCi0gICAgICA8cD4KLSAgICAgIFlvdSBtYXkgZmluZCBmb2xrcyBoYW5naW5nIG91dCBpbiBlaXRoZXIgPGNvZGU+PGI+I2plbGx5PC9iPjwvY29kZT4KLSAgICAgIG9yIDxjb2RlPjxiPiNtYXZlbjwvYj48L2NvZGU+LgotICAgICAgPC9wPgotCi0gICAgICA8IS0tIFBMOiBzYWRseSBkaXNhYmxlZCBhcmNoaXZlcy4uLgotICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iTG9ncyI+Ci0gICAgICAgIDxwPgotICAgICAgICBNYW55IG9mIHRoZSBjaGFubmVscyBob3N0ZWQgYnkgVGhlIFdlcmtlbiBDb21wYW55IGFyZSBhcmNoaXZlZAotICAgICAgICBhbmQgYXZhaWxhYmxlIHRocm91Z2ggdGhlIAotICAgICAgICA8YSBocmVmPSJodHRwOi8vaXJjLndlcmtlbi5jb20vY2hhbm5lbHMvIj5XZXJrZW4gSVJDIEFyY2hpdmVzPC9hPi4KLSAgICAgICAgPC9wPgotCi0gICAgICAgIDxwPgotICAgICAgICA8YSBocmVmPSJodHRwOi8vaXJjLndlcmtlbi5jb20vY2hhbm5lbHMvamVsbHkvIj4jamVsbHkgYXJjaGl2ZTwvYT4KLSAgICAgICAgPC9wPgotICAgICAgPC9zdWJzZWN0aW9uPgotICAgICAgLS0+Ci0KLSAgICA8L3NlY3Rpb24+Ci0gICAgCi0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS94ZG9jcy9qZWxseWRvYy54bWwgYi94ZG9jcy9qZWxseWRvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3OGRjYWQuLjAwMDAwMDAKLS0tIGEveGRvY3MvamVsbHlkb2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5BIEd1aWRlIFRvIEplbGx5RG9jPC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJjb21tb25zLWRldkBqYWthcnRhLmFwYWNoZS5vcmciPkpha2FydGEgQ29tbW9ucyBEZXZlbG9wbWVudCBUZWFtPC9hdXRob3I+Ci0gIDwvcHJvcGVydGllcz4KLQotICAgIDxib2R5PgotICAgICAgICA8c2VjdGlvbiBuYW1lPSdJbnRyb2R1Y3Rpb24nPgotICAgICAgICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQnV0IFdoYXQgSXMgSmVsbHlEb2M/Ij4gCi0gICAgICAgICAgICAgICAgPHA+Ci08c3Ryb25nPkplbGx5RG9jPC9zdHJvbmc+IGdlbmVyYXRlcyBkb2N1bWVudGF0aW9uIGZvciA8c3Ryb25nPkplbGx5PC9zdHJvbmc+IAotdGFnIGxpYnJhcmllcyBmcm9tIHRoZWlyIGphdmFkb2MuIEFuIGV4YW1wbGUgb2YgSmVsbHlEb2MgZ2VuZXJhdGVkIGNvbnRlbnQgY2FuIGJlIHZpZXdlZCAKLTxhIGhyZWY9J2h0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9qZWxseS9saWJzL2JldHdpeHQvdGFncy5odG1sJz5oZXJlPC9hPi4KLSAgICAgICAgICAgIDwvcD4KLSAgICAgICAgPC9zdWJzZWN0aW9uPgotICAgICAgICAgICAgPHN1YnNlY3Rpb24gbmFtZT0nU28gV2hhdCBJcyBUaGUgRG9jdW1lbnQ/Jz4KLSAgICAgICAgICAgICAgICA8cD4KLVRoaXMgZG9jdW1lbnQgaXMgYSBicmllZiAoYW5kIG5vbi1ub3JtYXRpdmUpIAotZ3VpZGUgd3JpdHRlbiBieSBkZXZlbG9wZXJzIHVzaW5nIEplbGx5RG9jIHRvIGRvY3VtZW50IHRoZWlyIHRhZyBsaWJyYXJpZXMgYW5kIGlzCi1haW1lZCBhdCBoZWxwaW5nIGRldmVsb3BlcnMgdXNlIEplbGx5RG9jLiBQbGVhc2UgaGVscCB0byBpbXByb3ZlIHRoaXMgcmVzb3VyY2UKLWJ5IDxhIGhyZWY9J2h0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9wYXRjaGVzLmh0bWwnPmNvbnRyaWJ1dGluZyBwYXRjaGVzPC9hPi4KLSAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgICA8cD4KLTxzdHJvbmc+Tm90ZTwvc3Ryb25nPiB0aGF0IHRoaXMgZG9jdW1lbnQgaXMgYmFzZWQgb24gdGhlIG1hdmVuIGJ1aWxkIHNjcmlwdCB1c2VkIGJ5Ci10aGUgSmFrYXJ0YSBDb21tb25zIEplbGx5IGJ1aWxkLiBEZXRhaWxzIG1heSB2YXJ5IGZvciBvdGhlciBidWlsZHMuCi0gICAgICAgICAgICA8L3A+Ci0gICAgICAgIDwvc3Vic2VjdGlvbj4KLSAgICA8L3NlY3Rpb24+Ci0gICAgICAgIDxzZWN0aW9uIG5hbWU9J0FuIEFuYXRvbXkgT2YgQSBUYWcgTGlicmFyeSBEZXNjcmlwdGlvbic+Ci0gICAgICAgICAgICA8cD4KLVRoZSBjb250ZW50IGdlbmVyYXRlZCBieSBKZWxseURvYyBjYW4gYmUgZGl2aWRlZCBpbnRvIGRpZmZlcmVudCBzZWN0aW9ucy4gVGhlc2Ugc2VjdGlvbnMKLWFyZSB0aGVuIGFycmFuZ2VkIGludG8gdGhlIGRvY3VtZW50IHByZXNlbnRlZCB0byB0aGUgdXNlci4gVW5kZXJzdGFuZGluZyB3aGVyZSBlYWNoCi1vZiB0aGVzZSBzZWN0aW9ucyBjb21lcyBmcm9tIGlzIGtleSB0byB3cml0aW5nIGphdmFkb2NzIGZvciB0YWcgbGlicmFyaWVzIGFpbWVkIGF0IHVzZQotYnkgSmVsbHlEb2MuCi0gICAgICAgIDwvcD4KLSAgICAgICAgICAgIDxzdWJzZWN0aW9uIG5hbWU9J1RhZyBMaWJyYXJ5IFNob3J0IERlc2NyaXB0aW9uJz4KLSAgICAgICAgICAgICAgICA8cD4KLVRoaXMgaXMgbm90IHN0cmljdGx5IHBhcnQgb2YgdGhlIG1haW4gSmVsbHlEb2MgZ2VuZXJhdGVkIGRvY3VtZW50IGJ1dCBpdCBpcyByZWxhdGVkCi0oYW5kIHRoaXMgc2VlbXMgbGlrZSBhIGdvb2QgcGxhY2UgdG8gZGlzY3VzcyBpdCkuIFRoaXMgYXBwZWFycyBpbiB0aGUgZ2VuZXJhdGVkIG92ZXJ2aWV3Ci1kb2N1bWVudCBhcyB0aGUgY29udGVudCBwYXJhZ3JhcGguCi0gICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICAgICAgPHA+Ci1UaGlzIGlzIHRha2VuIGZyb20gdGhlIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDs8L2NvZGU+IHRhZyBpbiB0aGUgPGNvZGU+cHJvamVjdC54bWw8L2NvZGU+Ci1mb3IgdGhlIHRhZyBsaWJyYXJ5LgotICAgICAgICAgICAgPC9wPgotICAgICAgICA8L3N1YnNlY3Rpb24+Ci0gICAgICAgICAgICA8c3Vic2VjdGlvbiBuYW1lPSdUYWcgTGlicmFyeSBMb25nIERlc2NyaXB0aW9uJz4KLSAgICAgICAgICAgICAgICA8cD4KLVRoaXMgYXBwZWFycyBpbiB0aGUgbWFpbiBnZW5lcmF0ZWQgSmVsbHlEb2MgY29udGVudCBhcyB0aGUgZGVzY3JpcHRpb24gYXNzb2NpYXRlZCB3aXRoCi10aGUgbGlicmFyeSBpbiB0aGUgbGlicmFyeSB0YWJsZSBhbmQgYWxzbyB3aXRoaW4gdGhlIGRlc2NyaXB0aXZlIHN1YnNlY3Rpb24gYmVsb3cuCi0gICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICAgICAgPHA+Ci1UaGlzIGlzIHRoZSBjb250ZW50cyBvZiB0aGUgYm9keSBvZiB0aGUgPGNvZGU+cGFja2FnZS5odG1sPC9jb2RlPiBmaWxlIGZvciB0aGUgcGFja2FnZQotY29udGFpbmluZyB0aGUgdGFnIGxpYnJhcnkuCi0gICAgICAgICAgICA8L3A+Ci0gICAgICAgIDwvc3Vic2VjdGlvbj4KLSAgICAgICAgICAgIDxzdWJzZWN0aW9uIG5hbWU9J1RhZyBEZXNjcmlwdGlvbic+Ci0gICAgICAgICAgICAgICAgPHA+Ci1UaGlzIGFwcGVhcnMgaW4gdGhlIG1haW4gZ2VuZXJhdGVkIEplbGx5RG9jIGNvbnRlbnQgYXMgdGhlIGRlc2NyaXB0aW9uIGFzc29jaWF0ZWQgd2l0aAotdGhlIHRhZyBpbiB0aGUgdGFncyB0YWJsZSBhbmQgYWxzbyB3aXRoaW4gdGhlIGRlc2NyaXB0aXZlIHN1YnNlY3Rpb24gZm9yIHRoZSB0YWcuCi0gICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICAgICAgPHA+Ci1UaGlzIGlzIHRoZSBjb250ZW50cyBvZiB0aGUgY2xhc3MgbGV2ZWwgamF2YWRvY3MgZm9yIHRoZSBjbGFzcyBpbXBsZW1lbnRpbmcgdGhlIGNsYXNzLgotICAgICAgICAgICAgPC9wPgotICAgICAgICA8L3N1YnNlY3Rpb24+ICAgIAotICAgICAgICAgICAgPHN1YnNlY3Rpb24gbmFtZT0nQXR0cmlidXRlIERlc2NyaXB0aW9uJz4KLSAgICAgICAgICAgICAgICA8cD4KLVRoaXMgYXBwZWFycyBpbiB0aGUgbWFpbiBnZW5lcmF0ZWQgSmVsbHlEb2MgY29udGVudCBhcyB0aGUgZGVzY3JpcHRpb24gYXNzb2NpYXRlZCB3aXRoCi10aGUgYXR0cmlidXRlIGluIHRoZSB0YWcgYXR0cmlidXRlcyB0YWJsZS4KLSAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgICA8cD4KLVRoaXMgaXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBqYXZhZG9jcyBmb3IgdGhlIHNldHRlciBwcm9wZXJ0eSBtYXBwZWQgdG8gdGhlIGF0dHJpYnV0ZS4KLU5vdGUgdGhhdCB0aGlzIGluY2x1ZGVzIHRoZSBjb250ZW50cyBvZiB0aGUgPGNvZGU+QHJldHVybjwvY29kZT4gdGFnIGFuZCBzbyBjYXJlCi1pcyBuZWVkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGdlbmVyYXRlZCBvdXRwdXQgc2NhbnMuCi0gICAgICAgICAgICA8L3A+Ci0gICAgICAgIDwvc3Vic2VjdGlvbj4gICAgICAgICAKLSAgICA8L3NlY3Rpb24+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+Ci0KZGlmZiAtLWdpdCBhL3hkb2NzL2plbGx5c3dpbmcueG1sIGIveGRvY3MvamVsbHlzd2luZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNjI1YmEuLjAwMDAwMDAKLS0tIGEveGRvY3MvamVsbHlzd2luZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPkplbGx5U3dpbmc8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0KLSAgPGJvZHk+Ci0gICAgPHNlY3Rpb24gbmFtZT0iSmVsbHlTd2luZyI+IAotICAgICAgPHA+Ci0gICAgICAgIEplbGx5U3dpbmcgaXMgYSBzaW1wbGUgSmVsbHkgbGlicmFyeSB3aGljaCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgU3dpbmcgdXNlciBpbnRlcmZhY2VzLgotICAgICAgICBJdCBhbGxvd3MgWE1MIGRvY3VtZW50cyAoSmVsbHkgc2NyaXB0cykgdG8gYmUgdXNlZCB0byBkZWZpbmUgdGhlIGxheW91dCBhbmQgcmVuZGVyaW5nIG9mIFN3aW5nIAotICAgICAgICBmcm9udCBlbmRzIHdoaWNoIGF2b2lkcyBsb3RzIG9mIG11bmRhbmUgSmF2YSBjb2RpbmcsIHVzaW5nIG1hcmt1cCB0byBkZWZpbmUgdGhlIHZpZXcgCi0gICAgICAgIG9mIHlvdXIgZnJvbnQgZW5kIGFuZCBhbGxvd2luZyB5b3UgdG8gYmluZCB0byBKYXZhIGNvZGUgZm9yIHRoZSBidXNpbmVzcyBvYmplY3RzIGFuZCBtb2RlbHMuIAotICAgICAgPC9wPgotICAgICAgPHA+Ci0gICAgICAgIFRoaXMgbWVjaGFuaXNtIHVzZXMgc2VwZXJhdGlvbiBvZiBjb25jZXJucyBhbmQgTVZDIGlkZWFzIGZyb20gd2ViIGFwcGxpY2F0aW9ucywgYWxsb3dpbmcgdGhlIHJlbmRlcmluZwotICAgICAgICBvZiB5b3VyIFN3aW5nIGZyb250IGVuZCB0byBiZSBlYXNpbHkgdHJhbnNmb3JtZWQgKHNpbmNlIGl0cyBYTUwpIGludG8gZGlmZmVyZW50IHN0eWxlcyB3aGlsZSBsZWF2aW5nIHlvdXIKLSAgICAgICAgbW9kZWwgYW5kIGJ1c2luZXNzIG9iamVjdHMgdW50b3VjaGVkLiBJdCBhbHNvIGFsbG93cyBkaWZmZXJlbnQgdmlld3MgdG8gYmUgY29uc3RydWN0ZWQgaW5kZXBlbmRlbnRseSBvZiB5b3VyIG1vZGVscy4KLSAgICAgIDwvcD4KLSAgICAgIDxwPgotICAgICAgICBUaGVyZSBpcyBhbiBleGFtcGxlIEplbGx5U3dpbmcgc2NyaXB0Ci0gICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jdnMuYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9qYWthcnRhLWNvbW1vbnMtc2FuZGJveC9qZWxseS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvc3dpbmcvZXhhbXBsZS5qZWxseT9yZXY9SEVBRCI+aGVyZTwvYT4KLSAgICAgIDwvcD4KLSAgICAgIDxwPgotICAgICAgICBUbyBydW4gdGhlIGV4YW1wbGUgdHlwZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgKGZyb20gd2l0aGluIHRoZSA8Y29kZT5qZWxseS10YWdzL3N3aW5nPC9jb2RlPgotICAgICAgICBkaXJlY3RvcnkpIGFuZCB0aGVuIHlvdSBzaG91bGQgc2VlIGEgZnVsbCBTd2luZyB1c2VyIGludGVyZmFjZSAKLSAgICAgICAgYXBwZWFyIHdpdGggcHVsbCBkb3duIG1lbnVzLCBhIHNwbGl0dGVyIHBhbmUsIGEgZm9ybSwgZW50cnkgZmllbGRzLCBidXR0b25zIGFuZCBhIHRhYmxlLgotICAgICAgPC9wPgotICAgICAgPHNvdXJjZT4KLSAgICBtYXZlbiBkZW1vOnN3aW5nCi0gICAgICA8L3NvdXJjZT4KLSAgICAgIDxwPgotICAgICAgICBUaGlzIGV4YW1wbGUgZXZlbiBzaG93cyB0aGF0IHNpbXBsZSBhY3Rpb25zIGNhbiBiZSBjb2RlZCBpbiBKZWxseSBzY3JpcHQgdG9vISBUaG91Z2ggdHlwaWNhbGx5IG1vc3QKLSAgICAgICAgY29tcGxleCBsb2dpYyBhbmQgbW9kZWxzIChzdWNoIGFzIFRhYmxlTW9kZWwsIFRyZWVNb2RlbCkgc2hvdWxkIGJlIHdyaXR0ZW4gaW4gSmF2YSBjb2RlLgotICAgICAgICBUaGVuIEplbGx5IHNjcmlwdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgdGhlIHZpZXcgYW5kIGJpbmQgaW4gdGhlIG1vZGVscy4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gICAgCi0gICAgPHNlY3Rpb24gbmFtZT0iSmVsbHlSdW5uZXIiPiAKLSAgICAgIDxwPgotICAgICAgICBKZWxseVJ1bm5lciBpcyBhIHNpbXBsZSBleGFtcGxlIFN3aW5nIHVzZXIgaW50ZXJmYWNlIHdyaXR0ZW4gd2l0aCBKZWxseVN3aW5nLgotICAgICAgICBZb3UgY2FuIHZpZXcgdGhlIHNvdXJjZSB0byBpdAotICAgICAgICA8YSBocmVmPSJodHRwOi8vY3ZzLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvamFrYXJ0YS1jb21tb25zLXNhbmRib3gvamVsbHkvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3N3aW5nL3J1bi5qZWxseT9yZXY9SEVBRCI+aGVyZTwvYT4KLSAgICAgIDwvcD4KLSAgICAgIDxwPgotICAgICAgICBJZiB5b3UgaW52b2tlIGl0IHZpYSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgeW91IHdpbGwgZ2V0IGEgc21hbGwgU3dpbmcgVUkgdGhhdCBhbGxvd3MgeW91IHRvCi0gICAgICAgIGNob29zZSBKZWxseSBzY3JpcHRzIHRvIGludm9rZSwgd2l0aGluIHRoZSBjdXJyZW50IEpWTS4gQWdhaW4gcnVuIHRoaXMgd2l0aGluIHRoZQotICAgICAgICA8Y29kZT5qZWxseS10YWdzL3N3aW5nPC9jb2RlPiBkaXJlY3RvcnkuCi0gICAgICA8L3A+Ci0gICAgICA8c291cmNlPgotICAgIG1hdmVuIGplbGx5OnJ1bm5lcgotICAgICAgPC9zb3VyY2U+Ci0gICAgICA8cD4KLSAgICAgICAgVGhpcyBtYWtlcyBkZXZlbG9waW5nIEplbGx5IHNjcmlwdHMgYW5kIEplbGx5U3dpbmcgc2NyaXB0cyBpbiBwYXJ0aWN1bGFyLCBtdWNoIG1vcmUgUkFELWxpa2UuCi0gICAgICAgIFlvdSBjYW4ga2VlcCBKZWxseVJ1bm5lciBvcGVuLCBlZGl0IGEgSmVsbHkgc2NyaXB0IGFuZCBqdXN0IGhpdCB0aGUgJ1J1bicgYnV0dG9uIGFuZCB0aGUKLSAgICAgICAgc2NyaXB0IGV4ZWN1dGVzIGluc3RhbnRhbmVvdXNseSwgdGhlcmUncyBubyB3YWl0aW5nIGZvciBhIEpWTSB0byBzdGFydHVwLgotICAgICAgPC9wPgotICAgIDwvc2VjdGlvbj4KLSAgICAKLSAgICA8c2VjdGlvbiBuYW1lPSJDb21wYXJpbmcgSmVsbHlTd2luZyB3aXRoIEphdmEgY29kZSBmb3IgU3dpbmciPiAKLSAgICAgIDxwPgotICAgICAgICBUaGVyZSdzIGEgc2ltcGxlIGRlbW8gd3JpdHRlbiBieSBPdHRvIHZvbiBXYWNodGVyIHdoaWNoIGRlbW9uc3RyYXRlcyBob3cgSmVsbHkgY2FuIGJlIHVzZWQKLSAgICAgICAgZm9yIHRlbXBsYXRpbmcgSFRNTC4KLSAgICAgIDwvcD4KLSAgICAgIDxwPgotICAgICAgICBUaGUgZGVtbyB3YXMgb3JpZ25hbGx5IHdyaXR0ZW4gaW4KLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL2N2cy5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2pha2FydGEtY29tbW9ucy1zYW5kYm94L2plbGx5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9kZW1vcy9Ib21lcGFnZUJ1aWxkZXIuamF2YT9yZXY9SEVBRCI+SmF2YSBjb2RlPC9hPgotICAgICAgICAgCi0gICAgICAgIHRvIGltcGxlbWVudCBhIHNpbXBsZSBTd2luZyBVSQotICAgICAgICBBcyBhbiBleHBlcmltZW50IHRoZSBzYW1lIFN3aW5nIHVzZXIgaW50ZXJmYWNlIGhhcyBiZWVuIHdyaXR0ZW4gCi0gICAgICAgPGEgaHJlZj0iaHR0cDovL2N2cy5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2pha2FydGEtY29tbW9ucy1zYW5kYm94L2plbGx5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9kZW1vcy9ob21lcGFnZUJ1aWxkZXIuamVsbHk/cmV2PUhFQUQiPmFzIGEgSmVsbHlTY3JpcHQ8L2E+Ci0gICAgICAgIGFzIHdlbGwuCi0gICAgICAgIFdoaWxlIHRoaXMgaXMgYSBmYWlybHkgc2ltcGxlIFN3aW5nIFVJIGFuZCBub3QgYSBwYXJ0aWN1bGFybHkgZ3JlYXQgZXhhbXBsZSBvZiB0aGUgcG93ZXIgb2YgSmVsbHlTd2luZywKLSAgICAgICAgaXQgZG9lcyBoaWdobGlnaHQgdGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gYXBwcmFjaGVzLgotICAgICAgPC9wPgotICAgIDwvc2VjdGlvbj4KLSAgICAKLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KLQpkaWZmIC0tZ2l0IGEveGRvY3MvamVsbHlzd3QueG1sIGIveGRvY3MvamVsbHlzd3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDU2N2FlLi4wMDAwMDAwCi0tLSBhL3hkb2NzL2plbGx5c3d0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+SmVsbHlTV1Q8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0KLSAgPGJvZHk+Ci0gICAgPHNlY3Rpb24gbmFtZT0iSmVsbHlTV1QiPiAKLSAgICAgIDxwPgotICAgICAgICBKZWxseVNXVCBpcyBhIHNpbXBsZSBKZWxseSBsaWJyYXJ5IHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBTV1QgdXNlciBpbnRlcmZhY2VzLgotICAgICAgICBJdCBhbGxvd3MgWE1MIGRvY3VtZW50cyAoSmVsbHkgc2NyaXB0cykgdG8gYmUgdXNlZCB0byBkZWZpbmUgdGhlIGxheW91dCBhbmQgcmVuZGVyaW5nIG9mIFNXVAotICAgICAgICBmcm9udCBlbmRzIHdoaWNoIGF2b2lkcyBsb3RzIG9mIG11bmRhbmUgSmF2YSBjb2RpbmcsIHVzaW5nIG1hcmt1cCB0byBkZWZpbmUgdGhlIHZpZXcgCi0gICAgICAgIG9mIHlvdXIgZnJvbnQgZW5kIGFuZCBhbGxvd2luZyB5b3UgdG8gYmluZCB0byBKYXZhIGNvZGUgZm9yIHRoZSBidXNpbmVzcyBvYmplY3RzIGFuZCBtb2RlbHMuIAotICAgICAgPC9wPgotICAgICAgPHA+Ci0gICAgICAgIFRoaXMgbWVjaGFuaXNtIHVzZXMgc2VwZXJhdGlvbiBvZiBjb25jZXJucyBhbmQgTVZDIGlkZWFzIGZyb20gd2ViIGFwcGxpY2F0aW9ucywgYWxsb3dpbmcgdGhlIHJlbmRlcmluZwotICAgICAgICBvZiB5b3VyIFNXVCBmcm9udCBlbmQgdG8gYmUgZWFzaWx5IHRyYW5zZm9ybWVkIChzaW5jZSBpdHMgWE1MKSBpbnRvIGRpZmZlcmVudCBzdHlsZXMgd2hpbGUgbGVhdmluZyB5b3VyCi0gICAgICAgIG1vZGVsIGFuZCBidXNpbmVzcyBvYmplY3RzIHVudG91Y2hlZC4gSXQgYWxzbyBhbGxvd3MgZGlmZmVyZW50IHZpZXdzIHRvIGJlIGNvbnN0cnVjdGVkIGluZGVwZW5kZW50bHkgb2YgeW91ciBtb2RlbHMuCi0gICAgICA8L3A+Ci0gICAgICA8cD4KLSAgICAgICAgVGhlcmUgaXMgYW4gZXhhbXBsZSBKZWxseVNXVCBzY3JpcHQKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL2N2cy5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2pha2FydGEtY29tbW9ucy9qZWxseS9qZWxseS10YWdzL3N3dC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9zd3QvZXhhbXBsZS5qZWxseT9yZXY9SEVBRCI+aGVyZTwvYT4KLSAgICAgIDwvcD4KLSAgICAgIDxwPgotICAgICAgICBUbyB0cnkgcnVubmluZyB0aGUgZXhhbXBsZSwgY2QgaW50byB0aGUgPGk+W2plbGx5LWhvbWVdL2plbGx5LXRhZ3Mvc3d0PC9pPiBkaXJlY3RvcnkgCi0gICAgICAgIGFuZCB0eXBlIHRoZSBmb2xsb3dpbmcgY29tbWFuZCwgeW91IHNob3VsZCBzZWUgYSBmdWxsIFNXVCB1c2VyIGludGVyZmFjZSAKLSAgICAgICAgYXBwZWFyIHdpdGggcHVsbCBkb3duIG1lbnVzLCBhIHNpbXBsZSBmb3JtLCBhIHRhYmxlLCB0b29sYmFyIGJ1dHRvbnMsIHRvb2x0aXAgZXRjLgotICAgICAgPC9wPgotICAgICAgPHNvdXJjZT5tYXZlbiBkZW1vPC9zb3VyY2U+Ci0gICAgPC9zZWN0aW9uPgotICAgIAotICAgIDxzZWN0aW9uIG5hbWU9IlJ1bm5pbmcgU1dUIj4gCi0gICAgICA8cD4KLSAgICAgICAgUGxlYXNlIGJlIGF3YXJlIHRoYXQgU1dUIHVzZXMgSk5JIGFuZCBzbyByZXF1aXJlcyBhIHJ1bnRpbWUgbGlicmFyeSB0byBiZSBvbiB5b3VyIFBBVEggZm9yIGFueSBTV1QgYXBwbGljYXRpb24gdG8gcnVuLgotICAgICAgICBZb3UgY2FuIHJlZmVyIHRvIHRoaXMgPGEgaHJlZj0iaHR0cDovL2VjbGlwc2V3aWtpLnN3aWtpLm5ldC8yNiI+RkFRPC9hPiBlbnRyeSBmb3IgbW9yZSBkZXRhaWxzLgotICAgICAgPC9wPgotICAgICAgPHA+Ci0gICAgICAgIEZvciBleGFtcGxlIG9uIG15IHdpbmRvd3MgbGFwdG9wIEkgY29waWVkIHRoZSA8aT5zd3Qtd2luMzItMjExNi5kbGw8L2k+IGZyb20gRWNsaXBzZSBpbnRvIG15IFBBVEggYmVmb3JlIHJ1bm5pbmcgdGhlIGV4YW1wbGVzLgotICAgICAgPC9wPgotICAgIDwvc2VjdGlvbj4KLSAgICAKLSAgICA8c2VjdGlvbiBuYW1lPSJVc2VmdWwgU1dUIExpbmtzIj4gCi0gICAgICAgIDx1bD4KLSAgICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb2N1bWVudGF0aW9uL2h0bWwvcGx1Z2lucy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MuaXN2L2RvYy9yZWZlcmVuY2UvYXBpL2luZGV4Lmh0bWwiPlNXVCBKYXZhZG9jPC9hPiAKLSAgICAgICAgaXMgdmVyeSBoYW5keS4gSXRzIG1vc3RseSB0aGUgd2lkZ2V0cyBwYWNrYWdlIHRoYXRzIG9mIG1vc3QgaW50ZXJlc3QuCi0gICAgICA8L2xpPgotICAgICAgPGxpPgotICAgICAgICBUaGlzIDxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNld2lraS5zd2lraS5uZXQvMiI+U1dUIFdpa2k8L2E+IGhhcyBsb3RzIG9mIGdvb2QgZXhhbXBsZXMgYW5kIGRvY3VtZW50YXRpb24uCi0gICAgICA8L2xpPgotICAgICAgPGxpPgotICAgICAgICAgIFRoaXMgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9wbGF0Zm9ybS1zd3QtaG9tZS9kZXYuaHRtbCI+cGFnZTwvYT4gYWxzbyBoYXMgYSBsaXN0IG9mIGxvdHMgb2YgbGl0dGxlIGV4YW1wbGUgU1dUIGFwcGxpY2F0aW9ucy4KLSAgICAgIDwvbGk+Ci0gICAgICAgIDwvdWw+Ci0gICAgPC9zZWN0aW9uPgotICAgIAotICA8L2JvZHk+Ci08L2RvY3VtZW50PgotCmRpZmYgLS1naXQgYS94ZG9jcy9qZWxseXVuaXQueG1sIGIveGRvY3MvamVsbHl1bml0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQyZTAxNy4uMDAwMDAwMAotLS0gYS94ZG9jcy9qZWxseXVuaXQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+SmVsbHlVbml0PC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotICAgIDxzZWN0aW9uIG5hbWU9IkplbGx5VW5pdCI+IAotICAgICAgPHA+Ci0gICAgICAgIEplbGx5VW5pdCBpcyBhIEplbGx5IGJhc2VkIEpVbml0IHRlc3RpbmcgbWVjaGFuaXNtLiAKLSAgICAgICAgVGhpcyBhbGxvd3MgSmVsbHkgc2NyaXB0cyB0byBiZSB1c2VkIHRvIHBlcmZvcm0gdW5pdCB0ZXN0aW5nIHdoaWNoIGNhbiBiZSBwYXJ0aWN1bGFybHkgdXNlZnVsCi0gICAgICAgIGlmIHlvdSB3aXNoIHRvIHRlc3QgWE1MLCBYUGF0aCwgU1FMLCBIVFRQLCBKTVMgb3IgU09BUCBpbnRlcmFjdGlvbnMuCi0gICAgICA8L3A+Ci0gICAgICA8cD4KLSAgICAgICAgSmVsbHlVbml0IHdvcmtzIGJ5IHVzaW5nIHRoZSA8YSBocmVmPSJsaWJzL2p1bml0L3RhZ3MuaHRtbCI+SlVuaXQgbGlicmFyeSA8L2E+IGluIGEgSmVsbHkgc2NyaXB0Ci0gICAgICAgIHRvIGNyZWF0ZSBKVW5pdCBUZXN0U3VpdGUgYW5kIFRlc3RDYXNlIG9iamVjdHMuIAotICAgICAgICBUaGVyZSBhcmUgYWxsIHRoZSB1c3VhbCBKVW5pdCBhc3NlcnRpb24gdGVzdHMgYXZhaWxhYmxlIHN1Y2ggYXMgJmx0O2Fzc2VydCZndDsgCi0gICAgICAgICZsdDthc3NlcnRFcXVhbHMmZ3Q7IGFuZCAmbHQ7ZmFpbCZndDsuIFlvdSBjYW4gdXNlIGJvdGggSmV4bCBhbmQgWFBhdGggZXhwcmVzc2lvbnMgaW4gdGhlIAotICAgICAgICAmbHQ7YXNzZXJ0Jmd0OyB0YWcgdmlhIGVpdGhlciB0aGUgPGk+dGVzdDwvaT4gb3IgdGhlIDxpPnhwYXRoPC9pPiBhdHRyaWJ1dGVzLgotICAgICAgPC9wPgotICAgICAgPHA+Ci0gICAgICAgIEluc2lkZSB0aGVzZSB0ZXN0IHNjcmlwdHMgeW91IGNhbiB1c2UgdGhlIGZ1bGwgcmFuZ2Ugb2YgSmVsbHkgdGFncyBzdWNoIGFzIG5hdmlnYXRpbmcgb3ZlcgotICAgICAgICBYTUwgdGVzdCBkYXRhIGNyZWF0aW5nIG11bHRpcGxlIHRlc3QgY2FzZXMgYmFzZWQgb24gc2FtcGxlIGRhdGEsIHBlcmZvcm1pbmcgU1FMIG9wZXJhdGlvbnMsIFNPQVAgY2FsbHMsIAotICAgICAgICBIVFRQIG9yIEpNUyByZXF1ZXN0cyBldGMuIAotICAgICAgPC9wPgotICAgICAgPHA+Ci0gICAgICAgIFlvdSBjYW4gYWxzbyB1c2UgQW50IEZpbGVTZXRzIGFuZCB0aGUgJmx0O2ZpbGVTY2FubmVyJmd0OyB0YWcgdG8gaXRlcmF0ZSBvdmVyIGNvbGxlY3Rpb25zIG9mIAotICAgICAgICBKZWxseSBzY3JpcHRzIG9yIFhNTCBkYXRhIGZpbGVzIGFuZCB1c2UgdGhpcyBkYXRhIHRvIGRlZmluZSBuZXcgdGVzdCBjYXNlcy4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gICAgCi0gICAgPHNlY3Rpb24gbmFtZT0iRXhhbXBsZXMiPiAKLSAgICAgIDxwPgotICAgICAgICBUaGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlIEplbGx5VW5pdCBzY3JpcHQKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL2N2cy5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2pha2FydGEtY29tbW9ucy9qZWxseS9qZWxseS10YWdzL2p1bml0L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L3N1aXRlLmplbGx5P3Jldj1IRUFEIj5oZXJlPC9hPgotICAgICAgPC9wPgotICAgICAgPHA+Ci0gICAgICAgIEFuIGV4YW1wbGUgZGVtb25zdHJhdGluZyB0aGUgdXNlIG9mIHRoZSA8YSBocmVmPSJsaWJzL2JldHdpeHQvdGFncy5odG1sIj5CZXR3aXh0PC9hPiBsaWJyYXJ5IGlzIAotICAgICAgICA8YSBocmVmPSJodHRwOi8vY3ZzLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvamFrYXJ0YS1jb21tb25zL2plbGx5L2plbGx5LXRhZ3MvYmV0d2l4dC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvYmV0d2l4dC9zdWl0ZS5qZWxseT9yZXY9SEVBRCI+aGVyZTwvYT4KLSAgICAgICAgYWxvbmcgd2l0aCBhIGNvbW1vbiBzaGFyZWQgdGVzdCBzY3JpcHQKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL2N2cy5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2pha2FydGEtY29tbW9ucy9qZWxseS9qZWxseS10YWdzL2JldHdpeHQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2JldHdpeHQvY29tbW9uLmplbGx5P3Jldj1IRUFEIj5oZXJlPC9hPgotICAgICAgPC9wPgotICAgICAgPHA+Ci0gICAgICAgICAgVGhlIDxhIGhyZWY9ImxpYnMvdmFsaWRhdGUvdGFncy5odG1sIj52YWxpZGF0ZTwvYT4gbGlicmFyeSBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIFhNTCB2YWxpZGF0aW9uIGluc2lkZSBKZWxseVVuaXQuCi0gICAgICAgICAgRm9yIGV4YW1wbGUgdGhlcmUncyBhbiBleGFtcGxlIEplbGx5VW5pdCBzY3JpcHQgdmFsaWRhdGluZyBYTUwgCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2N2cy5hcGFjaGUub3JnL3ZpZXdjdnMvamFrYXJ0YS1jb21tb25zL2plbGx5L2plbGx5LXRhZ3MvdmFsaWRhdGUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3MvdmFsaWRhdGUvc3VpdGUuamVsbHk/cmV2PUhFQUQiPmhlcmU8L2E+Ci0gICAgICA8L3A+Ci0gICAgPC9zZWN0aW9uPgotCi0gICAgPHNlY3Rpb24gbmFtZT0iTW9jayBUYWdzIj4gCi0gICAgICA8cD4KLSAgICAgICAgSW4gdW5pdCB0ZXN0aW5nIHNjZW5hcmlvcyBpdHMgb2Z0ZW4gdXNlZnVsIHRvIHVzZSAKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL2MyLmNvbS9jZ2kvd2lraT9Nb2NrT2JqZWN0Ij5Nb2NrIE9iamVjdHM8L2E+IHRvIHRlc3QgYXBwbGljYXRpb24gbG9naWMgYW5kIHN0dWIgdGhlIGJlaGF2aW91cgotICAgICAgICBvZiBvdGhlciBzZXJ2aWNlCi0gICAgICA8L3A+Ci0gICAgICA8cD4KLSAgICAgICAgSmVsbHlVbml0IHN1cHBvcnRzIGEgZmVhdHVyZSBjYWxsZWQgPGk+TW9jayBUYWdzPC9pPiB3aGljaCBhcmUgdmVyeSBzaW1pbGFyIHRvIE1vY2sgT2JqZWN0cy4gCi0gICAgICAgIE1vY2sgVGFncyB3ZXJlIGludmVudGVkIGJ5IGJ5IEpvZSBXYWxuZXMuCi0gICAgICA8L3A+Ci0gICAgICA8cD4KLSAgICAgICAgRXNzZW50aWFsbHkgdGhlIHRlY2huaXF1ZSBpcyB0byBtb2NrLCBvciBzdHViIHRoZSBiZWhhdmlvdXIgb2YgSmVsbHkgdGFncyBzbyB0aGF0IHRoZXkgZ2l2ZSB0aGUgcmVzdWx0cyB0aGF0IHlvdSBleHBlY3QKLSAgICAgICAgZnJvbSBzZXJ2aWNlcy4KLSAgICAgICAgRm9yIGV4YW1wbGUgaW1hZ2luZSB5b3UgaGFkIGEgSmVsbHkgc2NyaXB0IHdpdGggdGFncyB3aGljaCB3b3JrZWQgd2l0aCBkYXRhYmFzZXMgb3Igd2ViIHNlcnZpY2VzLgotICAgICAgICBZb3UgY291bGQgdXNlIG1vY2sgdGFncyB0byBzdHViIHdoYXQgdGhlIHRhZ3MgYXJlIG1lYW50IHRvIGRvLCB0byB0ZXN0IHlvdXIgc2NyaXB0IGludm9rZXMgdGhlbSBjb3JyZWN0bHkKLSAgICAgICAgd2l0aG91dCByZXF1aXJpbmcgdGhlIHVuZGVybHlpbmcgc2VydmljZXMKLSAgICAgIDwvcD4KLSAgICAgIDxwPgotICAgICAgICBUaGVyZSdzIGFuIGFuZCBleGFtcGxlIG9mIHVzaW5nIE1vY2sgVGFncyB2aWEgdGhlIDxhIGhyZWY9ImxpYnMvZGVmaW5lL3RhZ3MuaHRtbCI+ZGVmaW5lPC9hPiBsaWJyYXJ5IAotICAgICAgICA8YSBocmVmPSJodHRwOi8vY3ZzLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvamFrYXJ0YS1jb21tb25zL2plbGx5L2plbGx5LXRhZ3MvZGVmaW5lL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL21vY2svc3VpdGUuamVsbHk/cmV2PUhFQUQiPmhlcmU8L2E+Ci0gICAgICAgIHdoaWNoIGNyZWF0ZXMgdGhlIG1vY2sgdGFncywgaW5zaWRlIGEgSmVsbHlVbml0IHRlc3QgY2FzZSBhbmQgdGhlbiBpbnZva2VzIHRoaXMgZXhhbXBsZSAKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL2N2cy5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2pha2FydGEtY29tbW9ucy9qZWxseS9qZWxseS10YWdzL2RlZmluZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9tb2NrL3NlcnZpY2UuamVsbHk/cmV2PUhFQUQiPnNlcnZpY2U8L2E+Ci0gICAgICAgIHVzaW5nIHRoZSBtb2NrIHRhZ3MgcmF0aGVyIHRoYW4gdGhlIHVuZGVybHlpbmcgU1FMIGFuZCB3ZWIgc2VydmljZSB0YWdzLgotICAgICAgICBSdW5uaW5nIHRoZSBzYW1lIHNlcnZpY2UgZnJvbSBvdXRzaWRlIG9mIHRoZSBNb2NrIFRhZ3MgSmVsbHlVbml0IHRlc3QgY2FzZSB3b3VsZCB1c2UgdGhlIHJlYWwgdGFnIGltcGxlbWVudGF0aW9ucy4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gICAgCi0KLSAgICA8c2VjdGlvbiBuYW1lPSJJbnRlZ3JhdGlvbiB3aXRoIFRlc3RSdW5uZXJzIj4gCi0gICAgICA8cD4KLSAgICAgICAgVG8gaW50ZWdyYXRlIGNsZWFubHkgaW5zaWRlIEpVbml0IFRlc3RSdW5uZXIgZnJhbWV3b3JrcyB0aGVyZSBpcyBhIGhlbHBlciBjbGFzcywKLSAgICAgICAgPGEgaHJlZj0ibGlicy9qdW5pdC9hcGlkb2NzL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2p1bml0L0plbGx5VGVzdFN1aXRlLmh0bWwiPkplbGx5VGVzdFN1aXRlPC9hPgotICAgICAgICB3aGljaCB5b3UgY2FuIGRlcml2ZSBmcm9tCi0gICAgICAgIHRvIHByb2R1Y2UgYSBzaW5nbGUgSmF2YSBjbGFzcyB3aGljaCBoYXMgYSBzdGF0aWMgPGk+c3VpdGUoKTwvaT4gbWV0aG9kIHRvIGNyZWF0ZSBhIFRlc3RTdWl0ZSBvYmplY3QgCi0gICAgICAgIGNvbnRhaW5pbmcgYWxsIHRoZSB0ZXN0IGNhc2VzIGNyZWF0ZWQgYnkgdGhlIEplbGx5VW5pdCBmaWxlcy4KLSAgICAgICAgVGhlcmUgaXMgYW4gCi0gICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jdnMuYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9qYWthcnRhLWNvbW1vbnMvamVsbHkvamVsbHktdGFncy9qdW5pdC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvanVuaXQvVGVzdEpVbml0LmphdmE/cmV2PUhFQUQiPmV4YW1wbGU8L2E+Ci0gICAgICAgIG9mIHRoaXMgaW4gYWN0aW9uLgotICAgICAgPC9wPgotICAgICAgPHA+U28gaWYgeW91IGhhZCBhIHRlc3Qgc3VpdGUgZGVmaW5lZCBpbiBhIGplbGx5IHNjcmlwdCA8YT5zdWl0ZS5qZWxseTwvYT4gaW4gYSBwYWNrYWdlIGNvbS5hY21lLmZvbwotICAgICAgICAgIHRoZW4geW91IGNvdWxkIGNyZWF0ZSBhIGNsYXNzLCBjYXBhYmxlIG9mIGJlaW5nIHJhbiBpbnNpZGUgYW55IEpVbml0IHRlc3QgcnVubmVyIGZyYW1ld29yayBhcyBmb2xsb3dzCi0gICAgICA8L3A+Ci08c291cmNlPgotcGFja2FnZSBjb20uYWNtZS5mb287Ci0gICAgICAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnRhZ3MuanVuaXQuSmVsbHlUZXN0U3VpdGU7Ci0KLS8qKiAKLSAqIEEgaGVscGVyIGNsYXNzIHRvIHJ1biBqZWxseSB0ZXN0IGNhc2VzIGluIGEgSlVuaXQgVGVzdFJ1bm5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdEZvbyBleHRlbmRzIEplbGx5VGVzdFN1aXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVUZXN0U3VpdGUoVGVzdEZvby5jbGFzcywgInN1aXRlLmplbGx5Iik7ICAgICAgICAKLSAgICB9Ci19Ci08L3NvdXJjZT4KLSAgICA8L3NlY3Rpb24+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+Ci0KZGlmZiAtLWdpdCBhL3hkb2NzL25hdmlnYXRpb24ueG1sIGIveGRvY3MvbmF2aWdhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMjM2YTIuLjAwMDAwMDAKLS0tIGEveGRvY3MvbmF2aWdhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhRE9DVFlQRSBvcmcuYXBhY2hlLmNvbW1vbnMubWVudXMgU1lTVEVNICcuLi8uLi9jb21tb25zLWJ1aWxkL21lbnVzL21lbnVzLmR0ZCc+Ci08cHJvamVjdCBuYW1lPSJKZWxseSI+Ci0KLSAgPHRpdGxlPkplbGx5PC90aXRsZT4KLQotICA8Ym9keT4KLSAgICA8bWVudSBuYW1lPSJKZWxseSI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgICAgICAgICAgaHJlZj0iL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkZBUSIgICAgICAgICAgICAgICAgICAgICBocmVmPSIvZmFxLmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkdldHRpbmcgU3RhcnRlZCIgICAgICAgICBocmVmPSIvZ2V0dGluZ3N0YXJ0ZWQuaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iVHV0b3JpYWwiICAgICAgICAgICAgICAgIGhyZWY9Ii90dXRvcmlhbC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJEZXRhaWwiICAgICAgICAgICAgICAgICAgaHJlZj0iL292ZXJ2aWV3Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkplbGx5RG9jIiAgICAgICAgICAgICAgICAgIGhyZWY9Ii9qZWxseWRvYy5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCIgICAgICAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9jb21tb25zLWplbGx5L2Rpc3RyaWJ1dGlvbnMvIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJUYWcgUmVmZXJlbmNlIiBocmVmPSIvdGFnLXJlZmVyZW5jZS9pbmRleC5odG1sIiBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkFsbCB0YWdzIiBocmVmPSIvdGFnLXJlZmVyZW5jZS9hbGwuaHRtbCIgY29sbGFwc2U9InRydWUiPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iYW50OmFudCIgICAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9hbnRfYW50Lmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImFudDpmaWxlU2Nhbm5lciIgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvYW50X2ZpbGVTY2FubmVyLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImFudDpzZXRQcm9wZXJ0eSIgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvYW50X3NldFByb3BlcnR5Lmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImFudGxyOmFudGxyIiAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvYW50bHJfYW50bHIuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iYW50bHI6Z3JhbW1hciIgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9hbnRscl9ncmFtbWFyLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImJlYW46YmVhbiIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJiZWFuOmJlYW5Qcm9wZXJ0eSIgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iYmVhbjpiZWFuZGVmIiAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImJlYW5zaGVsbDpzY3JpcHQiICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJiZXR3aXh0OmludHJvc3BlY3RvciIgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iYmV0d2l4dDpwYXJzZSIgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImJzZjpzY3JpcHQiICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJkZWZpbmU6YXR0cmlidXRlIiAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iZGVmaW5lOmJlYW4iICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImRlZmluZTpjbGFzc0xvYWRlciIgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJkZWZpbmU6ZHluYUJlYW4iICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iZGVmaW5lOmV4dGVuZCIgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImRlZmluZTppbnZva2UiICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJkZWZpbmU6aW52b2tlQm9keSIgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iZGVmaW5lOmplbGx5QmVhbiIgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImRlZmluZTpzY3JpcHQiICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJkZWZpbmU6c3VwZXIiICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iZGVmaW5lOnRhZyIgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImRlZmluZTp0YWdsaWIiICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJkeW5hYmVhbjpkeW5hYmVhbiIgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iZHluYWJlYW46ZHluYWNsYXNzIiAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImR5bmFiZWFuOnByb3BlcnR5IiAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJkeW5hYmVhbjpzZXQiICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iZW1haWw6ZW1haWwiICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImZtdDpidW5kbGUiICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJmbXQ6Zm9ybWF0RGF0ZSIgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iZm10Om1lc3NhZ2UiICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImZtdDpwYXJhbSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJmbXQ6c2V0QnVuZGxlIiAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iZm10OnNldExvY2FsZSIgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImZtdDpzZXRUaW1lWm9uZSIgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJmbXQ6dGltZVpvbmUiICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iaHRtbDpwYXJzZSIgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9Imh0dHA6Ym9keSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJodHRwOmRlbGV0ZSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJodHRwOmdldCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJodHRwOmhlYWQiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iaHR0cDpoZWFkZXIiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iaHR0cDptdWx0aXBhcnRQb3N0IiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9Imh0dHA6b3B0aW9ucyIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJodHRwOnBhcmFtZXRlciIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJodHRwOnBhcnQiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iaHR0cDpwb3N0IiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9Imh0dHA6cHV0IiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9Imh0dHA6c2Vzc2lvbiIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJpbnRlcmFjdGlvbjphc2siICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iamF4bWU6Z2VuZXJhdG9yIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImpheG1lOm1hcnNoYWxsIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImpheG1lOnVubWFyc2hhbGwiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iamV0dHk6ZGVsZXRlUmVxdWVzdCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqZXR0eTpnZXRSZXF1ZXN0IiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImpldHR5Omh0dHBDb250ZXh0IiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImpldHR5OmplbGx5UmVzb3VyY2VIYW5kbGVyIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImpldHR5OmpldHR5SHR0cFNlcnZlciIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqZXR0eTpub3RGb3VuZEhhbmRsZXIiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iamV0dHk6cG9zdFJlcXVlc3QiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iamV0dHk6cHV0UmVxdWVzdCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqZXR0eTpyZWFsbSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqZXR0eTpyZXNvdXJjZUhhbmRsZXIiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iamV0dHk6cmVzcG9uc2VCb2R5IiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImpldHR5OnJlc3BvbnNlQ29kZSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqZXR0eTpyZXNwb25zZUhlYWRlciIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqZXR0eTpzZWN1cml0eUhhbmRsZXIiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iamV0dHk6c29ja2V0TGlzdGVuZXIiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iamZhY2U6YWN0aW9uIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImpmYWNlOmFwcGxpY2F0aW9uV2luZG93IiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImpmYWNlOmNvbnRyaWJ1dGlvbkl0ZW0iICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iamZhY2U6ZG91YmxlQ2xpY2tMaXN0ZW5lciIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqZmFjZTpmaWVsZEVkaXRvciIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqZmFjZTptZW51TWFuYWdlciIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqZmFjZTpwcmVmZXJlbmNlRGlhbG9nIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImpmYWNlOnByZWZlcmVuY2VQYWdlIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImpmYWNlOnNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqZmFjZTp2aWV3ZXIiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iamZhY2U6d2l6YXJkRGlhbG9nIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImpmYWNlOndpemFyZFBhZ2UiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iam1zOmNvbm5lY3Rpb24iICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iam1zOmRlc3RpbmF0aW9uIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImptczptYXBFbnRyeSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqbXM6bWFwTWVzc2FnZSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqbXM6bWVzc2FnZSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqbXM6b2JqZWN0TWVzc2FnZSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqbXM6b25NZXNzYWdlIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9Imptczpwcm9wZXJ0eSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqbXM6cmVjZWl2ZSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqbXM6c2VuZCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqbXM6c3RvcFdhdGNoIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImptczpzdWJzY3JpYmUiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iam1zOnRleHRNZXNzYWdlIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImpteDpvcGVyYXRpb24iICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0iam14OnJlZ2lzdGVyIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImpteDpzZXJ2ZXIiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ianNsOmFwcGx5VGVtcGxhdGVzIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImpzbDpzdHlsZSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqc2w6c3R5bGVzaGVldCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqc2w6dGVtcGxhdGUiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ianVuaXQ6YXNzZXJ0IiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9Imp1bml0OmFzc2VydEVxdWFscyIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqdW5pdDphc3NlcnRUaHJvd3MiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ianVuaXQ6Y2FzZSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqdW5pdDpmYWlsIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9Imp1bml0OnJ1biIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJqdW5pdDpzdWl0ZSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJsb2c6ZGVidWciICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ibG9nOmVycm9yIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9ImxvZzpmYXRhbCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJsb2c6aW5mbyIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJsb2c6dHJhY2UiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ibG9nOndhcm4iICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ib2piOmJyb2tlciIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJvamI6c3RvcmUiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0icXVhcnR6OmNyb25UcmlnZ2VyIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InF1YXJ0ejpqb2IiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0icXVhcnR6OndhaXRGb3JTY2hlZHVsZXIiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0icmVnZXhwOmNvbnRhaW5zIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InJlZ2V4cDptYXRjaCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJzb2FwOmludm9rZSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJzb2FwOmludm9rZVJhdyIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJzcWw6ZGF0ZVBhcmFtIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InNxbDpkcml2ZXIiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ic3FsOnBhcmFtIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InNxbDpxdWVyeSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJzcWw6cmVzdWx0U2V0IiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InNxbDpyb3ciICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ic3FsOnNldERhdGFTb3VyY2UiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ic3FsOnRyYW5zYWN0aW9uIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InNxbDp1cGRhdGUiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ic3dpbmc6YWN0aW9uIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InN3aW5nOmJvcmRlckFsaWduIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InN3aW5nOmJvcmRlckxheW91dCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJzd2luZzpidXR0b25Hcm91cCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJzd2luZzpjb21wb25lbnQiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ic3dpbmc6Y29uc3RyYWludCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJzd2luZzpkaWFsb2ciICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ic3dpbmc6ZW1wdHlCb3JkZXIiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ic3dpbmc6ZXRjaGVkQm9yZGVyIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InN3aW5nOmZvY3VzTGlzdGVuZXIiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ic3dpbmc6Zm9udCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJzd2luZzpnYmMiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ic3dpbmc6Z3JpZEJhZ0xheW91dCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJzd2luZzprZXlMaXN0ZW5lciIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJzd2luZzp0YWJsZUxheW91dCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJzd2luZzp0YWJsZU1vZGVsIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InN3aW5nOnRhYmxlTW9kZWxDb2x1bW4iICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ic3dpbmc6dGQiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ic3dpbmc6dGl0bGVkQm9yZGVyIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InN3aW5nOnRyIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InN3aW5nOndpbmRvd0xpc3RlbmVyIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InN3dDpHQyIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJzd3Q6Y29sb3IiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ic3d0OmRpYWxvZyIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJzd3Q6Zm9udCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJzd3Q6aW1hZ2UiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ic3d0OmxheW91dCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJzd3Q6bGF5b3V0RGF0YSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJzd3Q6bWVudSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJzd3Q6b25FdmVudCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJzd3Q6c3d0SGVscGVyIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InN3dDp3aWRnZXQiICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJ0aHJlYWRzOmdyb3VwIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InRocmVhZHM6aW50ZXJydXB0IiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InRocmVhZHM6am9pbiIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJ0aHJlYWRzOm11dGV4IiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InRocmVhZHM6bm90aWZ5IiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InRocmVhZHM6c2xlZXAiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0idGhyZWFkczpzeW5jaHJvbml6ZSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJ0aHJlYWRzOnRocmVhZCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJ0aHJlYWRzOndhaXQiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0idGhyZWFkczp3YWl0Rm9yIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InV0aWw6YXZhaWxhYmxlIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InV0aWw6ZmlsZSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJ1dGlsOmxvYWRUZXh0IiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InV0aWw6cHJvcGVydGllcyIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJ1dGlsOnJlcGxhY2UiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0idXRpbDpzbGVlcCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJ1dGlsOnNvcnQiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0idXRpbDp0b2tlbml6ZSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJ2YWxpZGF0ZTphc3NlcnRWYWxpZCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJ2YWxpZGF0ZTp2YWxpZGF0ZSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJ2YWxpZGF0ZTp2ZXJpZmllciIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJ2ZWxvY2l0eTptZXJnZSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJ4bWw6YXR0cmlidXRlIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InhtbDpjb21tZW50IiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InhtbDpjb3B5IiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InhtbDpjb3B5T2YiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ieG1sOmRvY1R5cGUiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ieG1sOmVsZW1lbnQiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ieG1sOmV4cHIiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ieG1sOmZvckVhY2giICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ieG1sOmlmIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InhtbDpwYXJhbSIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJ4bWw6cGFyc2UiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ieG1sOnNldCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJ4bWw6c29ydCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgICA8aXRlbSBuYW1lPSJ4bWw6dHJhbnNmb3JtIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InhtbHVuaXQ6YWN0dWFsIiAgICAgICAgICAgICAgICAgICBocmVmPSIvdGFnLXJlZmVyZW5jZS9leGFtcGxlLmh0bWwiLz4KLQkgICAgICAgIDxpdGVtIG5hbWU9InhtbHVuaXQ6YXNzZXJ0RG9jdW1lbnRzRXF1YWwiICAgICAgICAgICAgICAgICAgIGhyZWY9Ii90YWctcmVmZXJlbmNlL2V4YW1wbGUuaHRtbCIvPgotCSAgICAgICAgPGl0ZW0gbmFtZT0ieG1sdW5pdDpleHBlY3RlZCIgICAgICAgICAgICAgICAgICAgaHJlZj0iL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS5odG1sIi8+Ci0JICAgICAgPC9pdGVtPgotCSAgICAgIDxpdGVtIG5hbWU9IkFudCIgaHJlZj0iL3RhZy1yZWZlcmVuY2UvYW50Lmh0bWwiLz4KLQkgICAgICA8aXRlbSBuYW1lPSJBbnRsciIgaHJlZj0iL3RhZy1yZWZlcmVuY2UvYW50bHIuaHRtbCIvPgotCSAgICAgIDxpdGVtIG5hbWU9IkJlYW4iIGhyZWY9Ii90YWctcmVmZXJlbmNlL2JlYW4uaHRtbCIvPgotCSAgICAgIDxpdGVtIG5hbWU9IkJlYW5TaGVsbCIgaHJlZj0iL3RhZy1yZWZlcmVuY2UvYmVhbnNoZWxsLmh0bWwiLz4KLQkgICAgICA8aXRlbSBuYW1lPSJCZXR3aXh0IiBocmVmPSIvdGFnLXJlZmVyZW5jZS9iZXR3aXh0Lmh0bWwiLz4KLQkgICAgICA8aXRlbSBuYW1lPSJCU0YiIGhyZWY9Ii90YWctcmVmZXJlbmNlL2JzZi5odG1sIi8+Ci0JICAgICAgPGl0ZW0gbmFtZT0iRGVmaW5lIiBocmVmPSIvdGFnLXJlZmVyZW5jZS9kZWZpbmUuaHRtbCIvPgotCSAgICAgIDxpdGVtIG5hbWU9IkR5bmFCZWFuIiBocmVmPSIvdGFnLXJlZmVyZW5jZS9keW5hYmVhbi5odG1sIi8+Ci0JICAgICAgPGl0ZW0gbmFtZT0iRW1haWwiIGhyZWY9Ii90YWctcmVmZXJlbmNlL2VtYWlsLmh0bWwiLz4KLQkgICAgICA8aXRlbSBuYW1lPSJGb3JtYXQiIGhyZWY9Ii90YWctcmVmZXJlbmNlL2ZtdC5odG1sIi8+Ci0JICAgICAgPGl0ZW0gbmFtZT0iSFRNTCIgaHJlZj0iL3RhZy1yZWZlcmVuY2UvaHRtbC5odG1sIi8+Ci0JICAgICAgPGl0ZW0gbmFtZT0iSFRUUCIgaHJlZj0iL3RhZy1yZWZlcmVuY2UvaHR0cC5odG1sIi8+Ci0JICAgICAgPGl0ZW0gbmFtZT0iSW50ZXJhY3Rpb24iIGhyZWY9Ii90YWctcmVmZXJlbmNlL2ludGVyYWN0aW9uLmh0bWwiLz4KLQkgICAgICA8aXRlbSBuYW1lPSJKYXhNZSIgaHJlZj0iL3RhZy1yZWZlcmVuY2UvamF4bWUuaHRtbCIvPgotCSAgICAgIDxpdGVtIG5hbWU9IkpldHR5IiBocmVmPSIvdGFnLXJlZmVyZW5jZS9qZXR0eS5odG1sIi8+Ci0JICAgICAgPGl0ZW0gbmFtZT0iSkZhY2UiIGhyZWY9Ii90YWctcmVmZXJlbmNlL2pmYWNlLmh0bWwiLz4KLQkgICAgICA8aXRlbSBuYW1lPSJKTVMiIGhyZWY9Ii90YWctcmVmZXJlbmNlL2ptcy5odG1sIi8+Ci0JICAgICAgPGl0ZW0gbmFtZT0iSk1YIiBocmVmPSIvdGFnLXJlZmVyZW5jZS9qbXguaHRtbCIvPgotCSAgICAgIDxpdGVtIG5hbWU9IkpVbml0IiBocmVmPSIvdGFnLXJlZmVyZW5jZS9qdW5pdC5odG1sIi8+Ci0JICAgICAgPGl0ZW0gbmFtZT0iTG9nIiBocmVmPSIvdGFnLXJlZmVyZW5jZS9sb2cuaHRtbCIvPgotCSAgICAgIDxpdGVtIG5hbWU9Ik9KQiIgaHJlZj0iL3RhZy1yZWZlcmVuY2Uvb2piLmh0bWwiLz4KLQkgICAgICA8aXRlbSBuYW1lPSJRdWFydHoiIGhyZWY9Ii90YWctcmVmZXJlbmNlL3F1YXJ0ei5odG1sIi8+Ci0JICAgICAgPGl0ZW0gbmFtZT0iUmVnZXhwIiBocmVmPSIvdGFnLXJlZmVyZW5jZS9yZWdleHAuaHRtbCIvPgotCSAgICAgIDxpdGVtIG5hbWU9IlNPQVAiIGhyZWY9Ii90YWctcmVmZXJlbmNlL3NvYXAuaHRtbCIvPgotCSAgICAgIDxpdGVtIG5hbWU9IlNRTCIgaHJlZj0iL3RhZy1yZWZlcmVuY2Uvc3FsLmh0bWwiLz4KLQkgICAgICA8aXRlbSBuYW1lPSJTd2luZyIgaHJlZj0iL3RhZy1yZWZlcmVuY2Uvc3dpbmcuaHRtbCIvPgotCSAgICAgIDxpdGVtIG5hbWU9IlNXVCIgaHJlZj0iL3RhZy1yZWZlcmVuY2Uvc3d0Lmh0bWwiLz4KLQkgICAgICA8aXRlbSBuYW1lPSJUaHJlYWRzIiBocmVmPSIvdGFnLXJlZmVyZW5jZS90aHJlYWRzLmh0bWwiLz4KLQkgICAgICA8aXRlbSBuYW1lPSJVdGlsaXR5IiBocmVmPSIvdGFnLXJlZmVyZW5jZS91dGlsLmh0bWwiLz4KLQkgICAgICA8aXRlbSBuYW1lPSJWYWxpZGF0ZSIgaHJlZj0iL3RhZy1yZWZlcmVuY2UvdmFsaWRhdGUuaHRtbCIvPgotCSAgICAgIDxpdGVtIG5hbWU9IlZlbG9jaXR5IiBocmVmPSIvdGFnLXJlZmVyZW5jZS92ZWxvY2l0eS5odG1sIi8+Ci0JICAgICAgPGl0ZW0gbmFtZT0iWE1MIiBocmVmPSIvdGFnLXJlZmVyZW5jZS94bWwuaHRtbCIvPgotCSAgICAgIDxpdGVtIG5hbWU9IlhNTFVuaXQiIGhyZWY9Ii90YWctcmVmZXJlbmNlL3htbHVuaXQuaHRtbCIvPgotICAgICAgPC9pdGVtPgotICAgIDwvbWVudT4KLSAgICA8bWVudSBuYW1lPSJDb21tdW5pdHkiPgotICAgICAgPCEtLSA8aXRlbSBuYW1lPSJOZXdzIEJsb2ciICAgICAgICAgICAgICAgaHJlZj0iaHR0cDovL2Jsb2dzLndlcmtlbi5jb20vcHJvamVjdHMvamVsbHkvIi8+LS0+Ci0gICAgICA8aXRlbSBuYW1lPSJJUkMiICAgICAgICAgICAgICAgICAgICAgIGhyZWY9Ii9pcmMuaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iUG93ZXJlZCBCeSIgICAgICAgICAgICAgIGhyZWY9Ii9wb3dlcmVkLmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IlRvIERvIExpc3QiICAgICAgICAgICAgICBocmVmPSIvdG9kby5odG1sIi8+Ci0gICAgPC9tZW51PgotICAgIDxtZW51IG5hbWU9IkZlYXR1cmVzIj4KLSAgICAgIDxpdGVtIG5hbWU9IkplbGx5VW5pdCIgICAgICAgICAgICAgICBocmVmPSIvamVsbHl1bml0Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkplbGx5U3dpbmciICAgICAgICAgICAgICBocmVmPSIvbGlicy9zd2luZy9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJKZWxseVNXVCIgICAgICAgICAgICAgICAgaHJlZj0iL2plbGx5c3d0Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IlhNTCBQaXBlbGluZSIgICAgICAgICAgICBocmVmPSIvcGlwZWxpbmUuaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iQ29yZSBUYWdzIiAgICAgICAgICAgICAgIGhyZWY9Ii90YWdzLmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IlRhZyBMaWJyYXJpZXMiICAgICAgICAgICBocmVmPSIvbGlicy9pbmRleC5odG1sIi8+Ci0gICAgPC9tZW51PgotICAgICZjb21tb24tbWVudXM7Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ZG9jcy9vdmVydmlldy54bWwgYi94ZG9jcy9vdmVydmlldy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzOTEwYzAuLjAwMDAwMDAKLS0tIGEveGRvY3Mvb3ZlcnZpZXcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotCi0gPHByb3BlcnRpZXM+Ci0gIDx0aXRsZT5KZWxseSBPdmVydmlldzwvdGl0bGU+Ci0gIDxhdXRob3IgZW1haWw9ImpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYXV0aG9yPgotIDwvcHJvcGVydGllcz4KLQotPGJvZHk+Ci0KLTxzZWN0aW9uIG5hbWU9IkplbGx5IE92ZXJ2aWV3Ij4KLQotPHA+SmVsbHkgaXMgYW4gWE1MIGJhc2VkIHNjcmlwdGluZyBlbmdpbmUuIFRoZSBiYXNpYyBpZGVhIGlzIHRoYXQgWE1MIAotZWxlbWVudHMgY2FuIGJlIGJvdW5kIHRvIGEgSmF2YSA8aT5UYWc8L2k+IHdoaWNoIGlzIGEgSmF2YSBiZWFuIHRoYXQgcGVyZm9ybXMgCi1zb21lIGZ1bmN0aW9uLiBIZXJlJ3MgYW4gZXhhbXBsZSBhY3Rpb248L3A+Ci0KLTxzb3VyY2U+Ci1wdWJsaWMgY2xhc3MgRm9vVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7ICAgIAotICAgIHByaXZhdGUgaW50IGNvdW50OwotICAgIHB1YmxpYyB2b2lkIHNldENvdW50KGludCBjb3VudCkgewotICAgICAgICB0aGlzLmNvdW50ID0gY291bnQ7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGRvVGFnKFhNTE91dHB1dCBvdXRwdXQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgJmx0OyBjb3VudDsgaSsrICkgewotICAgICAgICAgICAgLy8gZXZhbHVhdGUgYm9keQotICAgICAgICAgICAgZ2V0Qm9keSgpLnJ1biggY29udGV4dCwgb3V0cHV0ICk7Ci0gICAgICAgIH0KLSAgICB9Ci19PC9zb3VyY2U+Ci0KLTxwPlRoZW4gaW4gYSBKZWxseSBzY3JpcHQgdGhpcyB0YWcgY291bGQgYmUgdXNlZCBhcyBmb2xsb3dzOi08L3A+Ci0KLTxzb3VyY2U+Ci0mbHQ7Zjpmb28gY291bnQ9JnF1b3Q7MTIzJnF1b3Q7Jmd0OwotICAgIHNvbWV0aGluZy4uLgotJmx0Oy9mOmZvbyZndDs8L3NvdXJjZT4KLQotPHA+SmVsbHkgaXMgdG90YWxseSBleHRlbmRhYmxlIAotdmlhIGN1c3RvbSBhY3Rpb25zIChpbiBhIHNpbWlsYXIgd2F5IHRvIEpTUCBjdXN0b20gdGFncykgYXMgd2VsbCBhcyBjbGVhbmx5IGludGVncmF0aW5nIHdpdGggc2NyaXB0aW5nIAotbGFuZ3VhZ2VzIHN1Y2ggYXMgSmV4bCwgVmVsb2NpdHksIHBudXRzLCBiZWFuc2hlbGwgYW5kIHZpYSBCU0YgKEJlYW4gU2NyaXB0aW5nIEZyYW1ld29yaykgCi1sYW5ndWFnZXMgbGlrZSBKYXZhU2NyaXB0ICZhbXA7IEpQeXRob248L3A+Ci0KLTxwPkFsc28gbm90aWNlIHRoYXQgSmVsbHkgdXNlcyBhbiA8aT5YTUxPdXRwdXQ8L2k+IGNsYXNzIHdoaWNoIGV4dGVuZHMgU0FYIENvbnRlbnRIYW5kbGVyCi10byBvdXRwdXQgWE1MIGV2ZW50cy4KLVRoaXMgbWFrZXMgSmVsbHkgaWRlYWwgZm9yIFhNTCBjb250ZW50IGdlbmVyYXRpb24sIFNPQVAgc2NyaXB0aW5nIG9yIGR5bmFtaWMgd2ViIHNpdGUgZ2VuZXJhdGlvbi4KLUEgc2luZ2xlIEplbGx5IHRhZyBjYW4gcHJvZHVjZSwgY29uc3VtZSwgZmlsdGVyIG9yIHRyYW5zZm9ybSBYTUwgZXZlbnRzLiBUaGlzIGxlYWRzIHRvIGEgcG93ZXJmdWwKLVhNTCBwaXBlbGluZSBlbmdpbmUgc2ltaWxhciBpbiBzb21lIHdheXMgdG8gQ29jb29uLgotPC9wPgotCi08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uIG5hbWU9IkJhY2tncm91bmQiPgotCi08cD5JdCBzZWVtcyBxdWl0ZSBjb21tb24gdGhlc2UgZGF5cyB0byBkZWZpbmUgY3VzdG9tIFhNTCBsYW5ndWFnZXMgdG8gcGVyZm9ybSAKLXNvbWUga2luZCBvZiBwcm9jZXNzaW5nLiBIZXJlIGFyZSBhIGZldyBleGFtcGxlczwvcD4KLQotPHVsPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9hbnQvIj5BbnQ8L2E+PC9saT4KLSAgPGxpPlhTTFQ8L2xpPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXBpcGVsaW5lLyI+WE1MIFBpcGVsaW5lIGxhbmd1YWdlPC9hPjwvbGk+Ci0gIDxsaT5KU1RMIGFuZCBKU1AgY3VzdG9tIHRhZ3M8L2xpPgotICA8bGk+TGF0a2EsICBBbnRFYXRlciAmYW1wOyBvdGhlciBzaW1pbGFyIFhNTCBiYXNlZCB1bml0IHRlc3RpbmcgZnJhbWV3b3JrczwvbGk+Ci0gIDxsaT5jb21tb25zLXdvcmtmbG93PC9saT4KLTwvdWw+Ci0KLTxwPlNvIHRoZSBtb3RpdmF0aW9uIGJlaGluZCBKZWxseSB3YXMgdG8gY3JlYXRlIGEgc2ltcGxlIFhNTCBiYXNlZCBwcm9jZXNzaW5nIAotZW5naW5lIHRoYXQgY291bGQgYmUgZXh0ZW5kZWQgdG8gc3VwcG9ydCB2YXJpb3VzIGN1c3RvbSBhY3Rpb25zLiBBIGZ1bGx5IAotcXVhbGlmaWVkIFhNTCBlbGVtZW50IG5hbWUgY2FuIGJlIG1hcHBlZCB0byBhIEphdmEgQmVhbiAob3IgRHluYUJlYW4pLCB0aGUgCi1hdHRyaWJ1dGVzIG1hcCB0byBiZWFuIHByb3BlcnRpZXMsIG9uY2UgdGhlIGJlYW4gaXMgY29uc3RydWN0ZWQgYW5kIHRoZSAKLXByb3BlcnRpZXMgc2V0IGl0IGlzIGV4ZWN1dGVkIHZpYSB0aGUgVGFnIGludGVyZmFjZXMgZG9UYWcoKSBtZXRob2QuIFNvIGN1c3RvbSAKLWFjdGlvbnMgY2FuIHBlcmZvcm0gYWxsIGtpbmRzIG9mIHByb2Nlc3NpbmcgZnJvbSBsb3dlciBsZXZlbCBsb29waW5nLCAKLWNvbmRpdGlvbmFsIGxvZ2ljIGFuZCBleHByZXNzaW9uIGV2YWx1YXRpb25zIHRvIGhpZ2hlciBsZXZlbCBhY3Rpb25zIGxpa2UgcG9zdCAKLXByb2Nlc3NpbmcgdGhlaXIgYm9kaWVzLCBtYWtpbmcgCi1hIEhUVFAsIFNPQVAgb3IgSk1TIGNhbGwsIHF1ZXJ5aW5nIFNRTCBkYXRhYmFzZXMgZXRjLjwvcD4KLQotPC9zZWN0aW9uPgotCi08c2VjdGlvbiBuYW1lPSJDb21wYXJpc29ucyI+Ci0KLTxwPlRvIHRyeSBnaXZlIHlvdSBhIGJldHRlciBmZWVsIGZvciB3aGF0IEplbGx5IGlzLCB3ZSdsbCBjb21wYXJlIGFuZCBjb250cmFzdCAKLUplbGx5IHdpdGggb3RoZXIgc2NyaXB0aW5nIGVuZ2luZXMgYW5kIHRlbXBsYXRpbmcgdGVjaG5vbG9naWVzLjwvcD4KLQotPHNlY3Rpb24gbmFtZT0iSmVsbHkgdmVyc3VzIEpTUCI+Ci0KLTxwPlNpbWlsYXJpdGllczwvcD4KLTx1bD4KLSAgPGxpPkplbGx5IHVzZXMgdGhlIGNvbmNlcHQgb2YgY3VzdG9tIHRhZyBsaWJyYXJpZXMgZnJvbSBKU1AgYW5kIGZvbGxvd3MgbWFueSAKLSAgb2YgdGhlIGxlc3NvbnMgbGVhcm50IGZyb20gdGhlIEpTVEwgKEpTUCBTdGFuZGFyZCBUYWcgTGlicmFyeSkuIEluZGVlZCBKU1RMIAotICBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBKZWxseS48L2xpPgotPC91bD4KLQotPHA+RGlmZmVyZW5jZXM8L3A+Ci08dWw+Ci0gIDxsaT5KZWxseSBoYXMgbm8gZGVwZW5kZW5jeSBvbiBTZXJ2bGV0cyBvciBKU1Agc28gSmVsbHkgY2FuIGJlIHJ1biBmcm9tIHRoZSAKLSAgY29tbWFuZCBsaW5lLCBpbnNpZGUgQW50LCBpbnNpZGUgYW4gYXBwbGV0IG9yIGFueXdoZXJlIHRoYXQgSmF2YSBjb2RlIGNhbiBiZSAKLSAgcmFuLjwvbGk+Ci0gIDxsaT5KZWxseSB0YWdzIGFyZSBtdWNoIHNpbXBsZXIgdG8gd3JpdGUgYW5kIHVzZSB0aGFuIEpTUCB0YWdzLiBCZWNhdXNlIEpTUCAKLSAgbXVzdCBzdXBwb3J0IHNjcmlwdGxldHMgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzc3VlcywgdGhleSBhcmUgCi0gIGltcGxlbWVudGVkICdpbnNpZGUgb3V0JyB3aXRoIDMgZGlmZmVyZW50IGludGVyZmFjZXMgKFRhZywgQm9keVRhZywgCi0gIEl0ZXJhdGlvblRhZykgdG8gaW1wbGVtZW50IGJhc2VkIG9uIHRoZSBraW5kIG9mIHRhZyB5b3UgYXJlIHdyaXRpbmcsIHRvZ2V0aGVyIAotICB3aXRoIGEgZmFpcmx5IGNvbXBsZXggc2V0IG9mIGV2ZW50LWJhc2VkIG1ldGhvZHMgdGhhdCBhcmUgY2FsbGVkIGJ5IHRoZSBwYWdlIAotICBjb250YWluZXIuIEplbGx5IHRhZ3MgYXJlIHZlcnkgZWFzeSAtIGp1c3QgZGVyaXZlIGZyb20gVGFnU3VwcG9ydCBhbmQgCi0gIGltcGxlbWVudCB0aGUgZG9UYWcoKSBtZXRob2QuIFJlYWxseSBzaW1wbGUhPC9saT4KLSAgPGxpPkplbGx5IGlzIFhNTCBuYXRpdmUgYm90aCBhcyB0aGUgZm9ybWF0IG9mIHRoZSBzY3JpcHRzIGFuZCB0aGUgb3V0cHV0IAotICBmb3JtYXQsIHNvIGl0cyBpZGVhbCBmb3Igd29yayB3aXRoIFhNTCBhbmQgWE1MIGJhc2VkIGFwcGxpY2F0aW9ucyBhbmQgd2ViIAotICBzZXJ2aWNlczwvbGk+Ci0gIDxsaT5KZWxseSB0YWdzIGNhbiBwYXJzZSBhbmQgY29tcGlsZSB0aGVpciBib2RpZXMgZm9yIG1vcmUgb3B0aW1hbCBwZXJmb3JtYW5jZSAKLSAgYW5kIGVhc2llciB2YWxpZGF0aW9uLiBTbyBhIHRhZyBjYW4gaWdub3JlIHdoaXRlc3BhY2UsIGl0ZXJhdGUgb3ZlciBpdHMgYm9keSwgCi0gIHRyYW5zZm9ybSBpdHMgYm9keSBhdCBjb21waWxlIHRpbWUgZXRjLiBTbyBhIEplbGx5IHRhZyBjYW4gYmUgYSBzaW1wbGUgbWFjcm8sIHByZXByb2Nlc3NpbmcgCi0gIGl0cyBib2R5IGF0IGNvbXBpbGUgdGltZSwgc3VjaCBhcyB0byBidWlsZCBzbWFydCBIVE1MIGZvcm1zIG9yIHRvIG1ha2UgU09BUCAKLSAgbWFjcm9zIGV0Yy48L2xpPgotPC91bD4KLQotPC9zZWN0aW9uPgotCi08c2VjdGlvbiBuYW1lPSJKZWxseSB2ZXJzdXMgVmVsb2NpdHkiPgotCi08cD5WZWxvY2l0eSBjb3VsZCBhY3R1YWxseSBiZSB1c2VkIGluc2lkZSBKZWxseSB2aWEgY3VzdG9tIHRhZ3Mgd2hpY2ggc3VwcG9ydCAKLVZlbG9jaXR5IGV4cHJlc3Npb25zLCBkaXJlY3RpdmVzIGFuZCBzY3JpcHRzLiBIb3dldmVyIGhlcmUncyBhIGhlYWQgdG8gaGVhZCAKLWNvbXBhcmlzb24gYW55d2F5cy48L3A+Ci0KLTxwPlNpbWlsYXJpdGllczwvcD4KLTx1bD4KLSAgPGxpPkplbGx5IGFsbG93cyBKYXZhIG9iamVjdHMgdG8gYmUgbWFuaXB1bGF0ZWQgaW4gYSBKYXZhLWxpa2UgbWFubmVyIGp1c3QgCi0gIGxpa2UgVmVsb2NpdHkuPC9saT4KLSAgPGxpPkplbGx5IGNvdWxkIGhhdmUgYSA8aT5zdXJmYWNlIHN5bnRheDwvaT4gdGhhdCBsb29rcyBzaW1pbGFyIHRvIFZlbG9jaXR5LiAKLSAgaS5lLiBzb21lb25lIGNvdWxkIG1ha2UgYSBwYXJzZXIgb2YgSmVsbHkgdGhhdCBoYWQgYSBsb29rLWFuZC1mZWVsIG9mIFZlbG9jaXR5IAotICBmb3IgY29tbW9uIGRpcmVjdGl2ZXMgYW5kIGV4cHJlc3Npb25zLjwvbGk+Ci08L3VsPgotCi08cD5EaWZmZXJlbmNlczwvcD4KLTx1bD4KLSAgPGxpPkplbGx5IHByb3ZpZGVzIGFuIGV4dGVuc2libGUgdGFnIG1lY2hhbmlzbSB0byBwcm92aWRlIG1vcmUgcG93ZXJmdWwgCi0gIHNjcmlwdGluZyBzdWNoIGFzIGJ5IHN1cHBvcnRpbmcgSlNUTCwgWE1MLCBYUGF0aCwgWFNMVCwgU1FMIG9yIFNPQVAgc2VydmljZSAKLSAgc2NyaXB0aW5nLiBJbiBlc3NlbmNlLCBKZWxseSB1c2VzIFhNTCB0YWdzIHRvIGRlbm90ZSAnZGlyZWN0aXZlcycuPC9saT4KLSAgPGxpPkplbGx5IGhhcyBpbnRlZ3JhdGVkIHN1cHBvcnQgZm9yIG90aGVyIHNjcmlwdGluZyBsYW5ndWFnZXMgc3VjaCBhcyAKLSAgSmF2YVNjcmlwdCwgTmV0UmV4eCwgSnl0aG9uIGV0Yy48L2xpPgotPC91bD4KLQotPC9zZWN0aW9uPgotCi0KLTxzZWN0aW9uIG5hbWU9IkplbGx5IHZlcnN1cyBBbnQiPgotCi08cD4KLUFudCBpcyBhIHRydWx5IGF3ZXNvbWUgYnVpbGQgc3lzdGVtIHdoaWNoIGhhcyBhbHdheXMgcmVzaXN0ZWQgJ3NjcmlwdGluZycuIAotSmVsbHkgaGFzIG5ldmVyIHRyaWVkIHRvIGJlIGEgYnVpbGQgc3lzdGVtIGJ1dCBpbnN0ZWFkIGhhcyBqdXN0IGZvY3Vzc2VkIG9uICdzY3JpcHRpbmcnLgotSG93ZXZlciBKZWxseSBpcyBhIGxvdCBsaWtlIEFudCBpbiBtYW55IHdheXMuIAotPC9wPgotPHA+Ci1UaGUgdHdvIGNhbiB3b3JrIGhhbmQgaW4gaGFuZCB0b2dldGhlciB2ZXJ5IG5pY2VseS4gCi1KZWxseSBjb3VsZCBiZSB0aG91Z2h0IG9mIGFzIGEgc2NyaXB0aW5nIHBsdWdpbiBmb3IgQW50LiAKLUplbGx5IGNhbiBiZSBjYWxsZWQgZnJvbSBpbnNpZGUgQW50IGFzIGFuIEFudCBUYXNrLCB0aGVuIHRoZSBKZWxseSBzY3JpcHQgY2FuIHNjcmlwdCBvdGhlciBBbnQgdGFza3MsCi1hY2Nlc3MgQW50IHByb3BlcnRpZXMgYW5kIHVzZSBhbGwgb3RoZXIgSmVsbHkgdGFncyBzdWNoIGFzIGZvciBsb2dpYywgbG9vcGluZywgd29ya2luZyB3aXRoIGJlYW5zLCBYUGF0aCwgU1FMIGV0Yy4KLTwvcD4KLQotPHA+U2ltaWxhcml0aWVzPC9wPgotPHVsPgotICA8bGk+Qm90aCB1c2UgYW4gWE1MIGZvcm1hdCBmb3IgdGhlIHNjcmlwdCB3aXRoIGFuIGV4cHJlc3Npb24gbGFuZ3VhZ2UgbGlrZSAke2Zvby5iYXJ9PC9saT4KLSAgPGxpPlhNTCBlbGVtZW50cyBhcmUgbWFwcGVkIHRvIGEgSmF2YSBvYmplY3QsIHNvIGl0cyBlYXN5IHRvIGV4dGVuZCBib3RoIEFudCBhbmQgSmVsbHkgd2l0aCBzaW1wbGUgSmF2YSBjb2RlLjwvbGk+Ci08L3VsPgotCi08cD5EaWZmZXJlbmNlczwvcD4KLTx1bD4KLSAgPGxpPkplbGx5IGhhcyBmdWxsIHN1cHBvcnQgZm9yIHBsdWdnYWJsZSBleHByZXNzaW9uIGxhbmd1YWdlcy4gVGhlIGRlZmF1bHQgZXhwcmVzc2lvbiBsYW5ndWFnZSBpcyBhIHN1cGVyc2V0IG9mIHRoZSBvbmUKLSAgICAgIHVzZWQgaW4gSlNQLCBKU1RMIGFuZCBKU0Ygd2hpY2ggc3VwcG9ydHMgY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMsIG5hdmlnYXRpbmcgYmVhbiBwcm9wZXJ0aWVzLCAKLSAgICAgIGFuZCB3b3JraW5nIHdpdGggTWFwcywgQ29sbGVjdGlvbnMsIExpc3RzLCBhcnJheXMgZXRjLiAKLSAgICAgIEpleGwgaXMgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gd2hpY2ggYWRkcyBzb21lIFZlbG9jaXR5LWxpa2UgZW5oYW5jZW1lbnRzIGxpa2UgbWV0aG9kIGNhbGxzIG9uIGJlYW5zIGV0Yy4KLSAgICAgIEplbGx5IHN1cHBvcnRzIG90aGVyIGV4cHJlc3Npb24gYW5kIHNjcmlwdGluZyBsYW5ndWFnZXMgbGlrZSBWZWxvY2l0eSwgYmVhbnNoZWxsLCBKYXZhU2NyaXB0LCBKeXRob24sIHBudXRzLCBCU0YgZXRjIGluIHNlcGFyYXRlIHRhZyBsaWJyYXJpZXMKLSAgPC9saT4KLSAgPGxpPkplbGx5IGhhcyBuYXRpdmUgWE1MIHN1cHBvcnQuIEplbGx5IGNhbiBwYXJzZSBYTUwgYW5kIHByb2Nlc3MgaXQgdXNpbmcgWFBhdGggZXhwcmVzc2lvbnMgKHZpYSB0aGUgSlNUTCB0YWdzKS4gCi0gICAgICBBbHNvIEplbGx5IHN1cHBvcnRzIGEgZGVjbGFyYXRpdmUgbW9kZWwgb2YgcHJvY2Vzc2luZyBYTUwgKHZpYSB0aGUgSlNMIHRhZ3MpIHdoaWNoIGlzIHNpbWlsYXIgdG8gWFNMVCAKLSAgICAgIGJ1dCBjYW4gdXNlIEplbGx5IHRhZ3MsIGJlYW5zIGFuZCBBbnQgdGFza3MgaW5zaWRlIHRoZSBYTUwgdGVtcGxhdGUgaW4gYSBzaW1pbGFyIHdheSB0byBEVlNMLjwvbGk+Ci0gIDxsaT4KLSAgICAgIEplbGx5IGhhcyBhIG11Y2ggbW9yZSBwb3dlcmZ1bCBjb2xsYWJvcmF0aW9uIG1lY2hhbmlzbSBmb3IgcGFzc2luZyBpbmZvcm1hdGlvbiBiZXR3ZWVuIHRhZ3MvdGFza3MuIAotICAgICAgSW4gSmVsbHkgdmFyaWFibGVzIGNhbiBiZSBhbnkgb2JqZWN0IHBsdXMgdmFyaWFibGUgc2NvcGVzIGNhbiBiZSBuZXN0ZWQgdG8gYWxsb3cgbmVzdGVkIHNjcmlwdHMgdG8gd29yayB0b2dldGhlciBuZWF0bHkuCi0gICAgICBBIHRhZy90YXNrIGNhbiBiZSBjdXN0b21pemVkIHdpdGggYmVhbnMgYXMgd2VsbCBhcyBiZWluZyBhYmxlIHRvIGNvbnN1bWUsIGVtaXQsIGZpbHRlciBhbmQgdHJhbnNmb3JtIFhNTC4KLSAgICAgIFNvIEplbGx5IHRhZ3MgY2FuIGJlIGNvbmZpZ3VyZWQgZnJvbSBhbmQgY2FuIGNvbGxhYm9yYXRlIHdpdGggYmVhbnMgYW5kIFhNTC4KLSAgPC9saT4KLSAgPGxpPkplbGx5IHN1cHBvcnRzIGR5bmFtaWMgdGFncy4gVGFncyBjYW4gYmUgZGVmaW5lZCBpbiBKZWxseSBzY3JpcHQgdG8gYXZvaWQgcmVwZXRpdGl2ZSB0eXBpbmcgCi0gICAgc3VjaCBhcyB0byB3cmFwIHVwIG1vc3Qgb2YgdGhlIGNvbXBsZXhpdHkgb2YgbWFraW5nIGEgU09BUCBjYWxsLiBTbyBKZWxseSBoYXMgYW4gaW50ZWdyYXRlZCB0YWcgYmFzZWQgbWFjcm8gZmFjaWxpdHkuCi0gIDwvbGk+Ci0gIDxsaT4KLSAgICAgIEplbGx5IHVzZXMgWE1MIG5hbWVzcGFjZXMgdG8gYWxsb3cgbG90cyBvZiBkaWZmZXJlbnQgdGFnIGxpYnJhcmllcyB0byB3b3JrIHRvZ2V0aGVyIHNlYW1sZXNzbHkgaW4gdGhlIHNhbWUgCi0gICAgICBYTUwgZG9jdW1lbnQuIFRoaXMgbWVhbnMgeW91IGNhbiBtaXggYW5kIG1hdGNoIEFudCB0YXNrcyB3aXRoIEpTVEwgYW5kIEplbGx5IHRhZyBsaWJyYXJpZXMuIAotICAgICAgQWxsIGNhbiB1c2UgdGhlaXIgb3duIGV4cHJlc3Npb24gbGFuZ3VhZ2VzLCBzbyBvbmUgc2NyaXB0IGNvdWxkIG1peCBhbmQgbWF0Y2ggdGhlIGV4cHJlc3Npb24gbGFuZ3VhZ2VzIAotICAgICAgZnJvbSBBbnQgYW5kIEpTVEwgYXMgd2VsbCBhcyBYUGF0aCBhbmQgSnl0aG9uLgotICA8L2xpPgotICA8bGk+VGhlcmUgaXMgYSBjbGVhciBkaWZmZXJlbmNlIG9mIGVtcGhhc2lzLiBBbnQgaXMgYSBidWlsZCBzeXN0ZW0sIEplbGx5IGlzIGEgc2NyaXB0aW5nIGVuZ2luZS4KLSAgPC9saT4KLTwvdWw+Ci0KLTwvc2VjdGlvbj4KLTwvc2VjdGlvbj4KLQotPHNlY3Rpb24gbmFtZT0iUG9zc2libGUgdXNlcyBmb3IgSmVsbHkiPgotCi08cD5KZWxseSBoYXMgdmFyaW91cyBwb3NzaWJsZSB1c2VzLiBIZXJlJ3MgYSBmZXcgdG8gdGhpbmsgYWJvdXQ8L3A+Ci08dWw+Ci0gIDxsaT5BbiBhZGRpdGlvbmFsIHRvb2wgZm9yIEFudCB1c2VycyB0byBwcm92aWRlIG1vcmUgZmxleGlibGUgQW50IHNjcmlwdGluZy4gCi0gICAgICBJbmRlZWQgSmVsbHkgaXMgYWxyZWFkeSB1c2VkIGluIE1hdmVuIHRvIHByb3ZpZGUgYSBtb3JlIGZsZXhpYmxlIGJ1aWxkIHN5c3RlbSAKLSAgICAgIHdoaWxlIHN0aWxsIHByZXNlcnZpbmcgZXhpc3RpbmcgaW52ZXN0bWVudCBpbiBBbnQgdGFza3MuCi0gIDwvbGk+Ci0gIDxsaT5IVFRQLCBKTVMsIFNPQVAsIFhNTCBhbmQgU1FMIGJhc2VkIHVuaXQgdGVzdGluZyBmcmFtZXdvcmsgc2ltaWxhciB0byBMYXRrYSBhbmQgQW50RWF0ZXI8L2xpPgotICA8bGk+U09BUCBzY3JpcHRpbmcgb3IgWE1MIHByb2Nlc3NpbmcgZW5naW5lPC9saT4KLSAgPGxpPlhNTCBvciBwYWdlIHRlbXBsYXRpbmcgc3lzdGVtLCBwb3NzaWJseSBhIEdlbmVyYXRvciBmb3IgQ29jb29uPC9saT4KLSAgPGxpPkFsdGVybmF0aXZlICh2ZXJ5IGxpZ2h0d2VpZ2h0KSBpbXBsZW1lbnRhdGlvbiBvZiBKU1RMIHRoYXQgY2FuIGJlIHJ1biBmcm9tIAotICAgICAgQW50IHRvIGdlbmVyYXRlIHN0YXRpYyBjb250ZW50PC9saT4KLSAgPGxpPkEgd29ya2Zsb3csIEVBSSBvciBpbnRlZ3JhdGlvbiwgbWF5YmUgaW50ZWdyYXRlZCBpbnRvIGNvbW1vbnMtd29ya2Zsb3c8L2xpPgotICA8bGk+Q29kZSBnZW5lcmF0aW9uIHN5c3RlbSwgbWF5YmUgYW4gZW5oYW5jZWQgc2NyaXB0aW5nIGVuZ2luZSBmb3IgWERvY2xldDwvbGk+Ci08L3VsPgotCi08L3NlY3Rpb24+Ci0KLQotPC9ib2R5PgotPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL3hkb2NzL3BpcGVsaW5lLnhtbCBiL3hkb2NzL3BpcGVsaW5lLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdhYjkzOC4uMDAwMDAwMAotLS0gYS94ZG9jcy9waXBlbGluZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZG9jdW1lbnQ+Ci0KLSA8cHJvcGVydGllcz4KLSAgPHRpdGxlPlhNTCBQaXBlbGluZXM8L3RpdGxlPgotICA8YXV0aG9yIGVtYWlsPSJqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2F1dGhvcj4KLSA8L3Byb3BlcnRpZXM+Ci0KLTxib2R5PgotCi08c2VjdGlvbiBuYW1lPSJYTUwgUGlwZWxpbmVzIj4KLQotPHA+Ci1SYXRoZXIgbGlrZSB0aGUgQ29jb29uIHByb2plY3QsIEplbGx5IGFsc28gc3VwcG9ydHMgdGhlIGNvbmNlcHQgb2YgPGk+WE1MIHBpcGVsaW5lczwvaT4uCi1UaGUgaWRlYSBpbiBhbiBYTUwgcGlwZWxpbmUgaXMgZm9yIFhNTCBldmVudHMgdG8gYmUgY3JlYXRlZCBieSBzb21lIGdlbmVyYXRvciBhbmQgdGhlbgotZmxvdyB0aHJvdWdoIG11bHRpcGxlIGZpbHRlcnMsIHRyYW5zZm9ybWVycyBvciBwcm9jZXNzb3JzIHRvIHNvbWUgdWx0aW1hdGUgb3V0cHV0LgotQ3VycmVudGx5IFhNTCBldmVudHMgYXJlIGltcGxlbWVudGVkIHZpYSA8YSBocmVmPSJodHRwOi8vc2F4LnNmLm5ldC8iPlNBWDwvYT4uIAotPC9wPgotCi0KLTxzdWJzZWN0aW9uIG5hbWU9IkEgSmVsbHkgc2NyaXB0IGlzIGEgY29tcGlsZWQgU0FYIHN0cmVhbSI+Ci08cD4KLUplbGx5IGNvbXBpbGVzIFhNTCBpbnRvIGEgPGEgaHJlZj0iYXBpZG9jcy9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvU2NyaXB0Lmh0bWwiPlNjcmlwdDwvYT4uCi1UaGlzIG1lY2hhbmlzbSB3b3JrcyBqdXN0IHRoZSBzYW1lIHdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIHRvdGFsbHkgc3RhdGljLCBwYXJ0aWFsbHkgZHluYW1pYywgCi13aXRoIGp1c3QgYSBmZXcgZHluYW1pYyBleHByZXNzaW9ucyBpbnNpZGUgaXQsIG9yIGl0cyB0b3RhbGx5IGR5bmFtaWMgdXNpbmcgWE1MIHBpcGVsaW5lcyBvciBpbnZva2luZyBTT0FQIHNlcnZpY2VzIGV0Yy4KLTwvcD4KLTxwPgotSmVsbHkgZWZmZWN0aXZlbHkgdHVybnMgWE1MIGludG8gYW4gZXhlY3V0YWJsZSBTY3JpcHQgdGhhdCB3aGVuIGl0cyBydW4gd2lsbCBvdXRwdXQgWE1MIGV2ZW50cy4gCi1TbyB0aGlzIGlzIGVmZmVjdGl2ZWx5IGEgZHluYW1pYyBYTUwgZXZlbnQgY2FjaGUuIFRoZSBTY3JpcHQgY2FuIGNvbnRhaW4gZHluYW1pYyBmcmFnbWVudHMuCi1UaGlzIG1lYW5zIHRoYXQgYXQgcnVudGltZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBwYXJzZSB0aGUgc2NyaXB0IGFzIHRoZSBjb21waWxlZCBTY3JpcHQgY2FuIGJlIGNhY2hlZCB3aGljaCBhdm9pZHMgdW5uZWNlc3NhcnkgCi1YTUwgcGFyc2VycyB3aGlsZSBzdGlsbCBrZWVwaW5nIGNvbnRlbnQgZHluYW1pYy4KLTwvcD4KLQotPC9zdWJzZWN0aW9uPgotICAgIAotPHN1YnNlY3Rpb24gbmFtZT0iVXNpbmcgVGFncyBhcyBzb3VyY2UsIGZpbHRlciwgdHJhbnNmb3JtYXRpb24gb3IgZGVzdGluYXRpb24gaW4gYSBwaXBlbGluZSI+Ci0KLTxwPgotRWFjaCBKZWxseSA8YSBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9UYWcuaHRtbCI+VGFnPC9hPiAKLWlzIGdpdmVuIGFuIDxhIGhyZWY9ImFwaWRvY3Mvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L1hNTE91dHB1dC5odG1sIj5YTUxPdXRwdXQ8L2E+IAotaW5zdGFuY2Ugd2hlbiBpdCBpcyBpbnZva2VkIHZpYSB0aGUgZG9UYWcoKSBtZXRob2QuIAotVGhlIFhNTE91dHB1dCBpbnN0YW5jZSBpcyBhIHNpbXBsZSBsaWdodHdlaWd0aHQgd3JhcHBlciBhcm91bmQgU0FYIAotQ29udGVudEhhbmRsZXIgYW5kIExleGljYWxIYW5kbGVyIGluc3RhbmNlcyBhbGxvd2luZyBhIFRhZyB0byB0YWtlIHBhcnQgaW4gYW55IAota2luZCBvZiBTQVggYmFzZWQgcHJvY2Vzc2luZyBvZiBYTUwgZXZlbnRzLgotPC9wPgotCi08cD4KLUEgSmVsbHkgVGFnIGNhbiBjaG9vc2UgaG93IHRvIGludm9rZSBpdHMgYm9keS4gU28gaXQgY291bGQgCi08L3A+Ci0KLTx1bD4KLSAgICA8bGk+Ci0gICAgICAgIG9wdGlvbmFsbHkgZXZhbHVhdGUgaXRzIGJvZHkgYmFzZWQgb24gc29tZSBjb25kaXRpb24KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgICAgbG9vcCBvdmVyIGl0cyBib2R5IHZpYSBzb21lIGl0ZXJhdGlvbgotICAgIDwvbGk+Ci0gICAgPGxpPgotICAgICAgICBwYXJzZSBpdHMgYm9keSBpbnRvIHNvbWUgRE9NIG1vZGVsIG9yIHR1cm4gdGhlIFhNTCBldmVudHMgaW50byBzb21lIGtpbmQgb2YgSmF2YSBvYmplY3RzIAotICAgICAgICBvciBvdGhlciBraW5kIG9mIGRhdGEgc3RydWN0dXJlCi0gICAgPC9saT4KLSAgICA8bGk+Ci0gICAgICAgIHBlcmZvcm0gc29tZSBhcmJpdHJhcnkgWE1MIGV2ZW50IHRyYW5zZm9ybWF0aW9uLCBsaWtlIFhTTFQgb3IgYXBwbHkgc29tZSBTQVggRmlsdGVyIGV0Yy4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgICAgb3V0cHV0IHRoZSBYTUwgZXZlbnRzIHRvIHNvbWUgZGVzdGluYXRpb24KLSAgICA8L2xpPgotPC91bD4KLQotPHA+Ci1UaGlzIG1lYW5zIHRoYXQgYnkgbmVzdGluZyBKZWxseSB0YWdzIHRvZ2V0aGVyIGl0cyBwb3NzaWJsZSB0byBjcmVhdGUgc2ltcGxlIG9yIGNvbXBsZXggWE1MIHBpcGVsaW5lcyAKLXdoaWNoIGNhbiBiZSBlYXNpbHkgaW50ZWdyYXRlZCB3aXRoIGV4cHJlc3Npb24gbGFuZ3VhZ2VzIChsaWtlIEpleGwgYW5kIFhQYXRoKSAKLW9yIHNjcmlwdGluZyBsYW5ndWFnZXMgKGxpa2UgSmF2YVNjcmlwdCwgSnl0aG9uIGV0YykgYXMgd2VsbCBhcyB1c2luZyBvdGhlciB0ZWNobm9sb2dpZXMgc3VjaCBhcwotPC9wPgotCi08dWw+Ci0gICAgPGxpPgotICAgICAgICBwYXJzaW5nIFhNTCwgdHJhbnNmb3JtaW5nIGl0IHdpdGggWFNMVCBvciB1c2luZyBYUGF0aCB2aWEgdGhlIDxhIGhyZWY9ImxpYnMveG1sL3RhZ3MuaHRtbCI+eG1sPC9hPiBsaWJyYXJ5Ci0gICAgPC9saT4KLSAgICA8bGk+Ci0gICAgICAgIHBhcnNpbmcgSFRNTCB2aWEgdGhlIDxhIGhyZWY9ImxpYnMvaHRtbC90YWdzLmh0bWwiPmh0bWw8L2E+IGxpYnJhcnkKLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgICAgcGVyZm9ybWluZyBYTUwgdmFsaWRhdGlvbiBhZ2FpbnN0IERURCwgWE1MIFNjaGVtYSBvciBSZWxheE5HIHVzaW5nIHRoZSA8YSBocmVmPSJsaWJzL3ZhbGlkYXRlL3RhZ3MuaHRtbCI+dmFsaWRhdGU8L2E+IGxpYnJhcnkKLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgICAgcGVyZm9ybWluZyBTT0FQIG9wZXJhdGlvbnMgdmlhIEFwYWNoZSBBeGlzIHdpdGggdGhlIDxhIGhyZWY9ImxpYnMvc29hcC90YWdzLmh0bWwiPnNvYXA8L2E+IGxpYnJhcnkKLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgICAgbWl4aW5nIGFuZCBtYXRjaGluZyB0aGUgcHJvY2Vzc2luZyBvZiBYTUwgaW4gcGlwZWxpbmVzIHdpdGggc3VwcG9ydCBmb3Igb3RoZXIgbGlicmFyaWVzIGxpa2UgCi0gICAgICAgIEFudCwgU1FMLCBIVFRQLCBKTVMgZXRjLgotICAgIDwvbGk+Ci08L3VsPgotCi08cD4KLUl0IHNob3VsZCBiZSBub3RlZCB0aGF0IGhpZ2hseSBjb21wbGV4LCB5ZXQgZWFzeSB0byB1c2UgWE1MIHBpcGVsaW5lcyBjYW4gYmUgY3JlYXRlZCBzaW5jZSB0aGUgCi1waXBlbGluZXMgZG9uJ3QgaGF2ZSB0byBiZSBsaW5lYXIuIEF0IGFueSBwb2ludCBpbiB0aGUgY2hhaW4sIGN1c3RvbSBsb2dpYyBjYW4gZGVjaWRlIHdoYXQgdG8gZG8gbmV4dC4KLTwvcD4KLQotPHNvdXJjZT48IVtDREFUQVsKLSAgPGo6aWYgdGVzdD0iJHtteUJlYW4uZm9vRW5hYmxlZCgndWsnKX0+Ci0gICAgPGo6ZmlsZSBuYW1lPSIke3VzZXJkaXJ9L3Jlc3VsdHMuaHRtbCI+Ci0gICAgICA8eDp0cmFuc2Zvcm0geHNsdD0iYXNIVE1MLnhzbCI+Ci0gICAgICAgIDxzb2FwOmludm9rZSBlbmRwb2ludD0iaHR0cDovL2NvbS5teXNlcnZlci8uLi4iPgotICAgICAgICAgIDx4OnRyYW5zZm9ybSB4c2x0PSJmb28ueHNsIj4KLSAgICAgICAgICAgIDx4OnBhcnNlIHhtbD0iJHtteUJlYW4uZ2V0U29tZVVSTCgpfSIvPgotICAgICAgICAgIDx4OnRyYW5zZm9ybT4KLSAgICAgICAgPC9zb2FwOmludm9rZT4KLSAgICAgIDwveDp0cmFuc2Zvcm0+Ci0gICAgPC9qOmZpbGU+Ci0gIDwvajppZj4gICAgICAgIAotXV0+Ci08L3NvdXJjZT4KLQotPC9zdWJzZWN0aW9uPi4KLQotCi08L3NlY3Rpb24+Ci0KLTwvYm9keT4KLQotPC9kb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ZG9jcy9wb3dlcmVkLnhtbCBiL3hkb2NzL3Bvd2VyZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMThiMjljLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3Bvd2VyZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZG9jdW1lbnQ+Ci0KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRpdGxlPlBvd2VyZWQgQnkgSmVsbHk8L3RpdGxlPgotICAgIDxhdXRob3IgZW1haWw9ImpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0KLSAgPGJvZHk+Ci0gICAgPHNlY3Rpb24gbmFtZT0iUG93ZXJlZCBCeSBKZWxseSI+Ci0gICAgICA8cD4KLSAgICAgICAgVGhpcyBwYWdlIGNvbnRhaW5zIGEgbGlzdCBvZiBrbm93biBwcm9qZWN0cyBzdWNjZXNzZnVsbHkgdXNpbmcKLSAgICAgICAgSmVsbHkuICBXZSB3b3VsZCBiZSB2ZXJ5IGludGVyZXN0ZWQgaWYgeW91IHdvdWxkIGRyb3AgdXMgYSBub3RlCi0gICAgICAgIGlmIHlvdSBhcmUgdXNpbmcgSmVsbHkgd2l0aCB5b3VyIHByb2plY3QgYW5kIHdvdWxkIGxpa2UgdG8gYmUKLSAgICAgICAgYWRkZWQgdG8gdGhpcyBsaXN0LgotICAgICAgPC9wPgotICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iUHJvamVjdHMgVXNpbmcgSmVsbHkiPgotICAgICAgPHRhYmxlPgotICAgICAgICA8dHI+PHRoPlByb2plY3Q8L3RoPjx0aD5PdmVydmlldzwvdGg+PC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vYWZ0LnNvdXJjZWZvcmdlLm5ldC8iPkFudGVhdGVyPC9hPjwvdGQ+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgQSB0ZXN0aW5nIGZyYW1ld29yayB3aGljaCBwcm92aWRlcyBhbiBlYXN5IHdheSB0byB3cml0ZSB0ZXN0cyBmb3IgY2hlY2tpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYSAKLSAgICAgICAgICAgIFdlYiBhcHBsaWNhdGlvbiBvciBvZiBhbiBYTUwgV2ViIHNlcnZpY2UuCi0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vZHJvb2xzLm9yZy8iPkRyb29sczwvYT48L3RkPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIEEgSmF2YSBydWxlcyBlbmdpbmUuCi0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vYmxpc3NlZC53ZXJrZW4uY29tLyI+Qmxpc3NlZDwvYT48L3RkPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIEEgSmF2YSBwcm9jZXNzIGFuZCBzdGF0ZSBmcmFtZXdvcmsuCi0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvbGF0a2EvIj5MYXRrYTwvYT48L3RkPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIEEgZnVuY3Rpb25hbCAoZW5kLXRvLWVuZCkgdGVzdGluZyB0b29sIGltcGxlbWVudGVkIGluIEphdmEsIGFuZCB1c2luZyBhbiBYTUwgc3ludGF4IHRvIAotICAgICAgICAgICAgZGVmaW5lIGEgc2VyaWVzIG9mIEhUVFAgKG9yIEhUVFBTKSByZXF1ZXN0cyBhbmQgYSBzZXQgb2YgdmFsaWRhdGlvbnMgdXNlZCB0byB2ZXJpZnkgdGhhdCAKLSAgICAgICAgICAgIHRoZSByZXF1ZXN0IHdhcyBwcm9jZXNzZWQgY29ycmVjdGx5LiAKLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnLyI+TWF2ZW48L2E+PC90ZD4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICBBIGphdmEgcHJvamVjdCBtYW5hZ2VtZW50IGFuZCBwcm9qZWN0IGNvbXByZWhlbnNpb24gdG9vbC4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9uYW5uaW5nLnNvdXJjZWZvcmdlLm5ldC8iPk5hbm5pbmc8L2E+PC90ZD4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICBBIHNpbXBsZSB5ZXQgc2NhbGVhYmxlIGFzcGVjdC1vcmllbnRlZCBmcmFtZXdvcmsgZm9yIEphdmEKLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9zZWVkbGluZy5zb3VyY2Vmb3JnZS5uZXQiPlNlZWRsaW5nPC9hPjwvdGQ+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgQSBnZW5lcmljIGFwcGxpY2F0aW9uIHBsYXRmb3JtIHRoYXQgZW5hYmxlcyBzdHJlYW1saW5lZCBkZXZlbG9wbWVudCBvZiBKYXZhIGFwcGxpY2F0aW9ucyBmcm9tIAotICAgICAgICAgICAgcmV1c2FibGUgY29tcG9uZW50cy4gSW4gcGFydGljdWxhciBKZWxseVVuaXQgYW5kIEplbGx5U3dpbmcgYXJlIHVzZWQgdG8gaW1wbGVtZW50IFN3aW5nIGJhc2VkCi0gICAgICAgICAgICB1bml0IHRlc3RpbmcuCi0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd2Vya2Zsb3cud2Vya2VuLmNvbS8iPldlcmtmbG93PC9hPjwvdGQ+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgQSBKYXZhIHdvcmtmbG93IHN5c3RlbS4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLSAgICA8L3N1YnNlY3Rpb24+Ci0gICAgPC9zZWN0aW9uPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEveGRvY3MvdGFnLXJlZmVyZW5jZS9hbGwueG1sIGIveGRvY3MvdGFnLXJlZmVyZW5jZS9hbGwueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjhkNDkwLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3RhZy1yZWZlcmVuY2UvYWxsLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotCi0gPHByb3BlcnRpZXM+Ci0gIDx0aXRsZT5KZWxseSBUYWcgUmVmZXJlbmNlPC90aXRsZT4KLSA8L3Byb3BlcnRpZXM+Ci0KLSAgPGJvZHk+Ci0KLSAgICA8c2VjdGlvbiBuYW1lPSJPdmVydmlldyI+Ci0gICAgICA8cD4KLSAgICAgICAgVGhpcyB0YWcgcmVmZXJlbmNlIGRldGFpbHMgYWxsIHRhZ3MgYXZhaWxhYmxlIGZvciBKZWxseSBhbG9uZyB3aXRoCi0gICAgICAgIGFuIGV4YW1wbGUgb2YgaXQncyB1c2FnZS4KLSAgICAgIDwvcD4KLSAgICAgIDxwPgotICAgICAgICA8IS0tICBpbnNlcnQgaGFucyBvciBvdGhlciBsaXN0IGhlcmUgLS0+Ci0gICAgICAgIFBsZWFzZSBzZWxlY3QgYSB0YWcgb24gdGhlIG5hdmlnYXRpb24gbGlzdCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGF0IHRhZy4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveGRvY3MvdGFnLXJlZmVyZW5jZS9hbnRfYW50LnhtbCBiL3hkb2NzL3RhZy1yZWZlcmVuY2UvYW50X2FudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmN2ZhZjkuLjAwMDAwMDAKLS0tIGEveGRvY3MvdGFnLXJlZmVyZW5jZS9hbnRfYW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotCi0gPHByb3BlcnRpZXM+Ci0gIDx0aXRsZT5KZWxseSBUYWcgUmVmZXJlbmNlIChhbnQ6YW50KTwvdGl0bGU+Ci0gIDxhdXRob3IgZW1haWw9ImRpb25AYXBhY2hlLm9yZyI+RGlvbiBHaWxsYXJkPC9hdXRob3I+Ci0gPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotCi0gICAgPHNlY3Rpb24gbmFtZT0iSG9tZSBQYWdlIj4KLSAgICAgIDxwPlNlZSAKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5L2xpYnMvYW50LyI+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5L2xpYnMvYW50LzwvYT4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0KLSAgICA8c2VjdGlvbiBuYW1lPSJEZXNjcmlwdGlvbiI+Ci0gICAgICA8cD4KLSAgICAgICAgVGhpcyB0YWcgcmVwcmVzZW50cyBhbGwgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9hbnR0YXNrc2xpc3QuaHRtbCI+QW50IHRhc2tzPC9hPiwgYW5kIAotICAgICAgICBjYW4gY3JlYXRlIGFueSA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIj5BbnQ8L2E+IHRhc2ssIHRhcmdldCBvciBkYXRhdHlwZSBkeW5hbWljYWxseSBmcm9tIHRoZQotICAgICAgICB0YWcgbmFtZSB5b3UgdXNlLCBlLmcuICZsdDtjb3B5Jmd0OwotICAgICAgPC9wPgotICAgICAgPHA+Ci0gICAgICAgIEFueSB0YWcgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gZGVmaW5lZCBpbiB0aGUgSmVsbHkgdGFnIGxpYnJhcnkgZm9yIEFudCwgYnV0IGRlZmluZWQgdG8gdGhlIEFudCBuYW1lc3BhY2UsCi0gICAgICAgIGlzIGFzc3VtZWQgdG8gYmUgYW4gQW50IHRhc2ssIHRhcmdldCBvciBkYXRhdHlwZS4gV2hlbiBKZWxseSB0cmllcyB0byBleGVjdXRlIHRoaXMgdW5rbm93biBBbnQgdGFnLCAKLSAgICAgICAgaXQgbG9va3MgZm9yIGEgcmVhbCBBbnQgZWxlbWVudCB0byBtYXRjaCB0aGUgdGFnIG5hbWUsIGFuZCBpZiBmb3VuZCwgbWF0Y2hlcyB0aGUgdGFnJ3MgYXR0cmlidXRlcyAKLSAgICAgICAgdG8gdGhlIEFudCBlbGVtZW50J3MgYXR0cmlidXRlcywgYXMgQW50IHdvdWxkLgotICAgICAgPC9wPgotICAgIDwvc2VjdGlvbj4KLQotICAgIDxzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPgotICAgICAgPHA+QXMgcGVyIHRoZSBhbnQgdGFzaywgdGFyZ2V0IG9yIGRhdGF0eXBlIHlvdSBhcmUgdXNpbmcuPC9wPgotICAgIDwvc2VjdGlvbj4KLSAgICAKLSAgICA8c2VjdGlvbiBuYW1lPSJOZXN0ZWQgRWxlbWVudHMiPgotICAgICAgPHA+QXMgcGVyIHRoZSBhbnQgdGFzaywgdGFyZ2V0IG9yIGRhdGF0eXBlIHlvdSBhcmUgdXNpbmcuPC9wPgotICAgIDwvc2VjdGlvbj4KLQotICAgIDxzZWN0aW9uIG5hbWU9IkV4YW1wbGVzIj4KLSAgICAgIDxwPgotICAgICAgICBZb3UgbmV2ZXIgY29kZSB0aGlzIHRhZyBkaXJlY3RseSwgaW5zdGVhZCB5b3UgdXNlIGl0IGJ5IGRlZmluaW5nIHRoZSBhbnQgdGFnIGxpYnJhcnkgbmFtZXNwYWNlIAotICAgICAgICBhbmQgdGhlIHVzaW5nIGFuIEFudCBlbGVtZW50LiBGb3IgZXhhbXBsZSwKLSAgICAgICAgdG8gdXNlIHRoZSA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL0NvcmVUYXNrcy9jb3B5Lmh0bWwiPkFudCBjb3B5IHRhc2s8L2E+IHlvdSB3b3VsZCBjb2RlIHNvbWV0aGluZyBzaW1pbGFyCi0gICAgICAgIHRvIHRoaXM6Ci0gICAgICA8L3A+Ci0gICAgICA8c291cmNlPjwhW0NEQVRBWwotPGplbGx5IHhtbG5zOmFudD0iamVsbHk6YW50Ij4KLSAgPGFudDpjb3B5IGZpbGU9Im15ZmlsZS50eHQiIHRvZmlsZT0ibXljb3B5LnR4dCIvPgotPGplbGx5PgotXV0+PC9zb3VyY2U+Ci0gICAgPC9zZWN0aW9uPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEveGRvY3MvdGFnLXJlZmVyZW5jZS9hbnRfZmlsZVNjYW5uZXIueG1sIGIveGRvY3MvdGFnLXJlZmVyZW5jZS9hbnRfZmlsZVNjYW5uZXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTU0N2E0Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3RhZy1yZWZlcmVuY2UvYW50X2ZpbGVTY2FubmVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotCi0gPHByb3BlcnRpZXM+Ci0gIDx0aXRsZT5KZWxseSBUYWcgUmVmZXJlbmNlIChhbnQ6ZmlsZVNjYW5uZXIpPC90aXRsZT4KLSAgPGF1dGhvciBlbWFpbD0iZGlvbkBhcGFjaGUub3JnIj5EaW9uIEdpbGxhcmQ8L2F1dGhvcj4KLSA8L3Byb3BlcnRpZXM+Ci0KLSAgPGJvZHk+Ci0KLSAgICA8c2VjdGlvbiBuYW1lPSJIb21lIFBhZ2UiPgotICAgICAgPHA+U2VlIAotICAgICAgICA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvamVsbHkvbGlicy9hbnQvIj5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvamVsbHkvbGlicy9hbnQvPC9hPgotICAgICAgPC9wPgotICAgIDwvc2VjdGlvbj4KLQotICAgIDxzZWN0aW9uIG5hbWU9IkRlc2NyaXB0aW9uIj4KLSAgICAgIDxwPgotICAgICAgICBUaGlzIHRhZyBjcmVhdGVzIGEgPGNvZGU+RmlsZVNjYW5uZXI8L2NvZGU+IG9iamVjdCBzbyB0aGF0IHlvdSBjYW4gbG9vcCBvdmVyIHRoZSBjb250ZW50cyBvZiBhbiBBbnQKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9Db3JlVHlwZXMvZmlsZXNldC5odG1sIj5maWxlc2V0PC9hPi4KLSAgICAgIDwvcD4KLSAgICAgIDxwPgotICAgICAgICBUaGUgPGNvZGU+RmlsZVNjYW5uZXI8L2NvZGU+IG9iamVjdCBoYXMgdGhlIGZvbGxvd2luZyB1c2VmdWwgbWV0aG9kczoKLSAgICAgICAgPHVsPgotICAgICAgICAgIDxsaT48Y29kZT5JdGVyYXRvciBpdGVyYXRvcigpPC9jb2RlPjogcmV0dXJucyBhbiBpdGVyYXRvciBvZiB0aGUgZmlsZXMgaW4gdGhlIG5lc3RlZCBmaWxlc2V0cy48L2xpPgotICAgICAgICAgIDxsaT48Y29kZT5JdGVyYXRvciBkaXJlY3RvcmllcygpPC9jb2RlPjogcmV0dXJucyBhbiBpdGVyYXRvciBvZiB0aGUgZGlyZWN0b3JpZXMgaW4gdGhlIG5lc3RlZCBmaWxlc2V0cy48L2xpPgotICAgICAgICAgIDxsaT48Y29kZT5ib29sZWFuIGhhc0ZpbGVzKCk8L2NvZGU+OiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGZpbGVzIGluIHRoZSBuZXN0ZWQgZmlsZXNldHMuLjwvbGk+Ci0gICAgICAgIDwvdWw+Ci0gICAgICA8L3A+Ci0gICAgPC9zZWN0aW9uPgotICAgIAotICAgIDxzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPgotICAgICAgPHRhYmxlPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRoPk5hbWU8L3RoPgotICAgICAgICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+Ci0gICAgICAgICAgPHRoPlJlcXVpcmVkPC90aD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD52YXI8L3RkPgotICAgICAgICAgIDx0ZD5UaGUgdmFyaWFibGUgbmFtZSBmb3IgdGhlIDxjb2RlPkZpbGVTY2FubmVyPC9jb2RlPiBvYmplY3Q8L3RkPgotICAgICAgICAgIDx0ZD5ZZXM8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLSAgICA8L3NlY3Rpb24+Ci0gICAgCi0gICAgPHNlY3Rpb24gbmFtZT0iTmVzdGVkIEVsZW1lbnRzIj4KLSAgICAgIDx0YWJsZT4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0aD5OYW1lPC90aD4KLSAgICAgICAgICA8dGg+RGVzY3JpcHRpb248L3RoPgotICAgICAgICAgIDx0aD5SZXF1aXJlZDwvdGg+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQ+ZmlsZXNldDwvdGQ+Ci0gICAgICAgICAgPHRkPkFueSB2YWxpZCBhbnQgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9Db3JlVHlwZXMvZmlsZXNldC5odG1sIj5maWxlc2V0PC9hPi48L3RkPgotICAgICAgICAgIDx0ZD5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgIDwvc2VjdGlvbj4KLQotICAgIDxzZWN0aW9uIG5hbWU9IkV4YW1wbGVzIj4KLSAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCi08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxuczphbnQ9ImplbGx5OmFudCI+Ci0gIDxhbnQ6ZmlsZVNjYW5uZXIgdmFyPSJwbHVnaW5Qcm9qZWN0cyI+Ci0gICAgPGFudDpmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSI+Ci0gICAgICA8YW50OmluY2x1ZGUgbmFtZT0iamVsbHktdGFncy8qL3Byb2plY3QueG1sIiAvPgotICAgIDwvYW50OmZpbGVzZXQ+Ci0gIDwvYW50OmZpbGVTY2FubmVyPgotCi0gIDxqOmZvckVhY2ggaXRlbXM9IiR7cGx1Z2luUHJvamVjdHMuaXRlcmF0b3IoKX0iIHZhcj0icGx1Z2luIj4KLSAgICA8IS0tIHByb2Nlc3MgdXNpbmcgJHtwbHVnaW59IHZhcmlhYmxlIC0tPgotICA8L2o6Zm9yRWFjaD4KLTwvajpqZWxseT4KLV1dPjwvc291cmNlPgotICAgIDwvc2VjdGlvbj4KLSAgICAKLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ZG9jcy90YWctcmVmZXJlbmNlL2FudF9zZXRQcm9wZXJ0eS54bWwgYi94ZG9jcy90YWctcmVmZXJlbmNlL2FudF9zZXRQcm9wZXJ0eS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNzUxODQuLjAwMDAwMDAKLS0tIGEveGRvY3MvdGFnLXJlZmVyZW5jZS9hbnRfc2V0UHJvcGVydHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZG9jdW1lbnQ+Ci0KLSA8cHJvcGVydGllcz4KLSAgPHRpdGxlPkplbGx5IFRhZyBSZWZlcmVuY2UgKGFudDpzZXRQcm9wZXJ0eSk8L3RpdGxlPgotIDwvcHJvcGVydGllcz4KLQotICA8Ym9keT4KLQotICAgIDxzZWN0aW9uIG5hbWU9IkhvbWUgUGFnZSI+Ci0gICAgICA8cD5TZWUgCi0gICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9qZWxseS9saWJzL2FudC8iPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9qZWxseS9saWJzL2FudC88L2E+Ci0gICAgICA8L3A+Ci0gICAgPC9zZWN0aW9uPgotCi0gICAgPHNlY3Rpb24gbmFtZT0iRGVzY3JpcHRpb24iPgotICAgICAgPHA+Ci0gICAgICAgIFRoaXMgdGFnIHNldHMgYW4gYXR0cmlidXRlIG9mIGFuIEFudCB0YXNrIG9yIGRhdGF0eXBlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBub3QgbnVsbC4gVGhpcyBpcyB2ZXJ5IHVzZWZ1bCBpbgotICAgICAgICBhbGxvd2luZyBhdHRyaWJ1dGVzIG9mIGFudCB0YXNrcyB0byBiZSBzZXQgY29uZGl0aW9uYWxseSB3aXRob3V0IHVnbHkgaWYvdGhlbi9lbHNlIGxvZ2ljLgotICAgICAgPC9wPgotICAgIDwvc2VjdGlvbj4KLSAgICAKLSAgICA8c2VjdGlvbiBuYW1lPSJBdHRyaWJ1dGVzIj4KLSAgICAgIDx0YWJsZT4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0aD5OYW1lPC90aD4KLSAgICAgICAgICA8dGg+RGVzY3JpcHRpb248L3RoPgotICAgICAgICAgIDx0aD5SZXF1aXJlZDwvdGg+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQ+bmFtZTwvdGQ+Ci0gICAgICAgICAgPHRkPlRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgb2YgdGhlIGFudCB0YXNrIHRvIHNldDwvdGQ+Ci0gICAgICAgICAgPHRkPlllczwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQ+dmFsdWU8L3RkPgotICAgICAgICAgIDx0ZD5UaGUgdmFsdWUgdG8gZ2l2ZSB0aGUgYXR0cmlidXRlIG9mIHRoZSBhbnQgdGFzazwvdGQ+Ci0gICAgICAgICAgPHRkPlllcy48L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkPmRlZmF1bHQ8L3RkPgotICAgICAgICAgIDx0ZD5UaGUgZGVmYXVsdCB2YWx1ZSB0byBnaXZlIHRoZSBhdHRyaWJ1dGUgb2YgdGhlIGFudCB0YXNrLCBpZiB0aGUgPGNvZGU+dmFsdWU8L2NvZGU+IHByb3ZpZGVkIGlzIG51bGwuPC90ZD4KLSAgICAgICAgICA8dGQ+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLSAgICA8L3NlY3Rpb24+Ci0gICAgCi0gICAgPHNlY3Rpb24gbmFtZT0iTmVzdGVkIEVsZW1lbnRzIj4KLSAgICAgIDxwPk5vbmU8L3A+Ci0gICAgPC9zZWN0aW9uPgotCi0gICAgPHNlY3Rpb24gbmFtZT0iRXhhbXBsZXMiPgotICAgICAgPHA+Ci0gICAgICAgIFRoaXMgdGFnIGlzIDxzdHJvbmc+YWx3YXlzPC9zdHJvbmc+IG5lc3RlZCBpbnNpZGUgb2YgYW5vdGhlciBBbnQgdGFzaywgdGFyZ2V0IG9yIGRhdGF0eXBlLgotICAgICAgPC9wPgotICAgICAgPHNvdXJjZT48IVtDREFUQVsKLTxqOmplbGx5IHhtbG5zOmo9ImplbGx5OmNvcmUiIHhtbG5zOmFudD0iamVsbHk6YW50Ij4KLSAgPGFudDpqYXZhYwotICAgIGRlc3RkaXI9IiR7bWF2ZW4uYnVpbGQuZGVzdH0iCi0gICAgZXhjbHVkZXM9IioqL3BhY2thZ2UuaHRtbCIKLSAgICBkZWJ1Zz0iJHttYXZlbi5jb21waWxlLmRlYnVnfSIKLSAgICBkZXByZWNhdGlvbj0iJHttYXZlbi5jb21waWxlLmRlcHJlY2F0aW9ufSIKLSAgICBvcHRpbWl6ZT0iJHttYXZlbi5jb21waWxlLm9wdGltaXplfSI+Ci0gIAotICAgIDxhbnQ6c2V0UHJvcGVydHkgbmFtZT0iZW5jb2RpbmciIHZhbHVlPSIke21hdmVuLmNvbXBpbGUuZW5jb2Rpbmd9IiAvPgotICAgICAgICAgIAotICAgIDxhbnQ6c2V0UHJvcGVydHkgbmFtZT0iZXhlY3V0YWJsZSIgdmFsdWU9IiR7bWF2ZW4uY29tcGlsZS5leGVjdXRhYmxlfSIgLz4KLQotICA8L2FudDpqYXZhYz4KLTwvajpqZWxseT4KLSAgICAgIF1dPjwvc291cmNlPgotICAgIAotICAgIDwvc2VjdGlvbj4KLSAgICAKLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ZG9jcy90YWctcmVmZXJlbmNlL2FudGxyX2FudGxyLnhtbCBiL3hkb2NzL3RhZy1yZWZlcmVuY2UvYW50bHJfYW50bHIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmMxMDBhLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3RhZy1yZWZlcmVuY2UvYW50bHJfYW50bHIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZG9jdW1lbnQ+Ci0KLSA8cHJvcGVydGllcz4KLSAgPHRpdGxlPkplbGx5IFRhZyBSZWZlcmVuY2UgKGFudGxyOmFudGxyKTwvdGl0bGU+Ci0gPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotCi0gICAgPHNlY3Rpb24gbmFtZT0iSG9tZSBQYWdlIj4KLSAgICAgIDxwPlNlZSAKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5L2xpYnMvYW50bHIvIj5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvamVsbHkvbGlicy9hbnRsci88L2E+Ci0gICAgICA8L3A+Ci0gICAgPC9zZWN0aW9uPgotCi0gICAgPHNlY3Rpb24gbmFtZT0iRGVzY3JpcHRpb24iPgotICAgICAgPHA+Ci0gICAgICAgIFRoaXMgdGFnIGdlbmVyYXRlcyBqYXZhIGNvZGUgYmFzZWQgb24gPGEgaHJlZj0iaHR0cDovL3d3dy5hbnRsci5vcmcvIj5BbnRscjwvYT4KLSAgICAgICAgZ3JhbW1hciBmaWxlcy4gCi0gICAgICA8L3A+Ci0gICAgICA8cD4KLSAgICAgICAgVGhlIGdyYW1tYXJzIHRvIGdlbmVyYXRlIGFyZSBzcGVjaWZpZWQgdXNpbmcgbmVzdGVkIDxhIGhyZWY9ImFudGxyX2dyYW1tYXIuaHRtbCI+Z3JhbW1hcjwvYT4KLSAgICAgICAgdGFncy4KLSAgICAgIDwvcD4KLSAgICAgIDxwPgotICAgICAgICA8c3Ryb25nPldhcm5pbmc8L3N0cm9uZz46IFRoZSBncmFtbWFyIGZpbGVzIG11c3QgYmUgcGxhY2VkIGluIHRoZSBkaXJlY3RvcnkKLSAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT5tYXZlbi5hbnRsci5zcmMuZGlyPC9jb2RlPiB2YXJpYWJsZS4gVGhpcyBoYXJkIGNvZGluZwotICAgICAgICBzaG91bGQgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgotICAgICAgPC9wPgotICAgIDwvc2VjdGlvbj4KLSAgICAKLSAgICA8c2VjdGlvbiBuYW1lPSJBdHRyaWJ1dGVzIj4KLSAgICAgIDx0YWJsZT4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0aD5OYW1lPC90aD4KLSAgICAgICAgICA8dGg+RGVzY3JpcHRpb248L3RoPgotICAgICAgICAgIDx0aD5SZXF1aXJlZDwvdGg+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQ+b3V0cHV0RGlyPC90ZD4KLSAgICAgICAgICA8dGQ+VGhlIGRpcmVjdG9yeSB0byBwbGFjZSBnZW5lcmF0ZWQgY29kZSBpbnRvLjwvdGQ+Ci0gICAgICAgICAgPHRkPlllczwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgIDwvc2VjdGlvbj4KLSAgICAKLSAgICA8c2VjdGlvbiBuYW1lPSJOZXN0ZWQgRWxlbWVudHMiPgotICAgICAgPHRhYmxlPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRoPk5hbWU8L3RoPgotICAgICAgICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+Ci0gICAgICAgICAgPHRoPlJlcXVpcmVkPC90aD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD5ncmFtbWFyPC90ZD4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICBUaGUgZmlsZSBuYW1lICh3aXRoaW4gPGNvZGU+bWF2ZW4uYW50bHIuc3JjLmRpcjwvY29kZT4pIHRvIHVzZQotICAgICAgICAgICAgaW4gY29kZSBnZW5lcmF0aW9uLgotICAgICAgICAgIC48L3RkPgotICAgICAgICAgIDx0ZD5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgIDwvc2VjdGlvbj4KLQotICAgIDxzZWN0aW9uIG5hbWU9IkV4YW1wbGVzIj4KLSAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCi08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxuczphbnRscj0iamVsbHk6YW50bHIiPgotICA8ajpzZXQgdmFyPSJtYXZlbi5hbnRsci5zcmMuZGlyIiB2YWx1ZT0iJHtiYXNlZGlyfS9ncmFtbWFycyIvPgotCi0gIDxhbnRscjphbnRsciBvdXRwdXREaXI9IiR7bWF2ZW4uYW50bHIudGFyZ2V0LmRpcn0iPgotICAgIDxhbnRscjpncmFtbWFyPmZpbGUxLmFudGxyPC9hbnRscjpncmFtbWFyPgotICA8L2FudGxyOmFudGxyPgotCi08L2o6amVsbHk+Ci0gICAgICBdXT48L3NvdXJjZT4KLSAgICA8L3NlY3Rpb24+Ci0gICAgCi0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveGRvY3MvdGFnLXJlZmVyZW5jZS9hbnRscl9ncmFtbWFyLnhtbCBiL3hkb2NzL3RhZy1yZWZlcmVuY2UvYW50bHJfZ3JhbW1hci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzQ2NWQuLjAwMDAwMDAKLS0tIGEveGRvY3MvdGFnLXJlZmVyZW5jZS9hbnRscl9ncmFtbWFyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotCi0gPHByb3BlcnRpZXM+Ci0gIDx0aXRsZT5KZWxseSBUYWcgUmVmZXJlbmNlICh0YWdsaWI6dGFnKTwvdGl0bGU+Ci0gPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotCi0gICAgPHNlY3Rpb24gbmFtZT0iSG9tZSBQYWdlIj4KLSAgICAgIDxwPlNlZSAKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5L2xpYnMvYW50bHIvIj5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvamVsbHkvbGlicy9hbnRsci88L2E+Ci0gICAgICA8L3A+Ci0gICAgPC9zZWN0aW9uPgotCi0gICAgPHNlY3Rpb24gbmFtZT0iRGVzY3JpcHRpb24iPgotICAgICAgPHA+Ci0gICAgICAgIFRoaXMgdGFnIHNwZWNpZmllcyBncmFtbWFycyB0byBhZGQgdG8gYW4gPGEgaHJlZj0iYW50bHJfYW50bHIuaHRtbCI+YW50bHI8L2E+IHRhZwotICAgICAgICBmb3IgaXQncyBwcm9jZXNzaW5nLgotICAgICAgPC9wPgotICAgICAgPHA+Ci0gICAgICAgIFRoZSBib2R5IG9mIHRoaXMgdGFnIG11c3QgYmUgYSBmaWxlIG5hbWUgdG8gYmUgZm91bmQgaW4gdGhlIHBhcmVudCB0YWcncyBzb3VyY2UgZGlyZWN0b3J5LgotICAgICAgPC9wPgotICAgIDwvc2VjdGlvbj4KLSAgICAKLSAgICA8c2VjdGlvbiBuYW1lPSJBdHRyaWJ1dGVzIj4KLSAgICAgIDxwPk5vbmU8L3A+Ci0gICAgPC9zZWN0aW9uPgotICAgIAotICAgIDxzZWN0aW9uIG5hbWU9Ik5lc3RlZCBFbGVtZW50cyI+Ci0gICAgICA8cD5Ob25lPC9wPgotICAgIDwvc2VjdGlvbj4KLQotICAgIDxzZWN0aW9uIG5hbWU9IkV4YW1wbGVzIj4KLSAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCi08ajpqZWxseSB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxuczphbnRscj0iamVsbHk6YW50bHIiPgotICA8ajpzZXQgdmFyPSJtYXZlbi5hbnRsci5zcmMuZGlyIiB2YWx1ZT0iJHtiYXNlZGlyfS9ncmFtbWFycyIvPgotCi0gIDxhbnRscjphbnRsciBvdXRwdXREaXI9IiR7bWF2ZW4uYW50bHIudGFyZ2V0LmRpcn0iPgotICAgIDxhbnRscjpncmFtbWFyPmZpbGUxLmFudGxyPC9hbnRscjpncmFtbWFyPgotICAgIDxhbnRscjpncmFtbWFyPmZpbGUyLmFudGxyPC9hbnRscjpncmFtbWFyPgotICA8L2FudGxyOmFudGxyPgotCi08L2o6amVsbHk+Ci0gICAgICBdXT48L3NvdXJjZT4KLSAgICA8L3NlY3Rpb24+Ci0gICAgCi0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveGRvY3MvdGFnLXJlZmVyZW5jZS9leGFtcGxlLnhtbCBiL3hkb2NzL3RhZy1yZWZlcmVuY2UvZXhhbXBsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYzEyYTkuLjAwMDAwMDAKLS0tIGEveGRvY3MvdGFnLXJlZmVyZW5jZS9leGFtcGxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotCi0gPHByb3BlcnRpZXM+Ci0gIDx0aXRsZT5KZWxseSBUYWcgUmVmZXJlbmNlICh0YWdsaWI6dGFnKTwvdGl0bGU+Ci0gPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotCi0gICAgPHNlY3Rpb24gbmFtZT0iSG9tZSBQYWdlIj4KLSAgICAgIDxwPlNlZSAKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5L2xpYnMveHh4LyI+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2plbGx5L2xpYnMveHh4LzwvYT4KLSAgICAgIDwvcD4KLSAgICA8L3NlY3Rpb24+Ci0KLSAgICA8c2VjdGlvbiBuYW1lPSJEZXNjcmlwdGlvbiI+Ci0gICAgICA8cD4KLSAgICAgICAgVGhpcyB0YWcgLi4uCi0gICAgICA8L3A+Ci0gICAgPC9zZWN0aW9uPgotICAgIAotICAgIDxzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPgotICAgICAgPHRhYmxlPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRoPk5hbWU8L3RoPgotICAgICAgICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+Ci0gICAgICAgICAgPHRoPlJlcXVpcmVkPC90aD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD4uLi48L3RkPgotICAgICAgICAgIDx0ZD4uLi48L3RkPgotICAgICAgICAgIDx0ZD4uLi48L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLSAgICA8L3NlY3Rpb24+Ci0gICAgCi0gICAgPHNlY3Rpb24gbmFtZT0iTmVzdGVkIEVsZW1lbnRzIj4KLSAgICAgIDx0YWJsZT4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0aD5OYW1lPC90aD4KLSAgICAgICAgICA8dGg+RGVzY3JpcHRpb248L3RoPgotICAgICAgICAgIDx0aD5SZXF1aXJlZDwvdGg+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQ+Li4uPC90ZD4KLSAgICAgICAgICA8dGQ+Li4uPC90ZD4KLSAgICAgICAgICA8dGQ+Li4uPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgPC9zZWN0aW9uPgotCi0gICAgPHNlY3Rpb24gbmFtZT0iRXhhbXBsZXMiPgotICAgICAgPHNvdXJjZT48IVtDREFUQVsKLS4uLgotICAgICAgXV0+PC9zb3VyY2U+Ci0gICAgPC9zZWN0aW9uPgotICAgIAotICA8L2JvZHk+Ci08L2RvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hkb2NzL3RhZy1yZWZlcmVuY2UvaW5kZXgueG1sIGIveGRvY3MvdGFnLXJlZmVyZW5jZS9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDhjNGIuLjAwMDAwMDAKLS0tIGEveGRvY3MvdGFnLXJlZmVyZW5jZS9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIAotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxkb2N1bWVudD4KLQotIDxwcm9wZXJ0aWVzPgotICA8dGl0bGU+SmVsbHkgVGFnIFJlZmVyZW5jZTwvdGl0bGU+Ci0gPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotCi0gICAgPHNlY3Rpb24gbmFtZT0iT3ZlcnZpZXciPgotICAgICAgPHA+Ci0gICAgICAgIFRoaXMgdGFnIHJlZmVyZW5jZSBkZXRhaWxzIGFsbCB0YWdzIGF2YWlsYWJsZSBmb3IgSmVsbHkgYWxvbmcgd2l0aAotICAgICAgICBhbiBleGFtcGxlIG9mIGl0J3MgdXNhZ2UuCi0gICAgICA8L3A+Ci0gICAgICA8cD4KLSAgICAgICAgPCEtLSAgaW5zZXJ0IGhhbnMgb3Igb3RoZXIgbGlzdCBoZXJlIC0tPgotICAgICAgICBQbGVhc2UgY2hvb3NlIGVpdGhlciA8c3Ryb25nPkFsbCBUYWdzPC9zdHJvbmc+IG9yIGFuIGluZGl2aWR1YWwgdGFnIGxpYnJhcnkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICA8L3A+Ci0gICAgPC9zZWN0aW9uPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hkb2NzL3RvZG8ueG1sIGIveGRvY3MvdG9kby54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjNjMjYuLjAwMDAwMDAKLS0tIGEveGRvY3MvdG9kby54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAKLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5UT0RPPC90aXRsZT4KLSAgICA8YXV0aG9yIGVtYWlsPSJqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2F1dGhvcj4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotICAgIDxzZWN0aW9uIG5hbWU9IlRPRE8iPiAKLSAgICAgIDxwPgotICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIGluCi0gICAgICAgIEplbGx5LiAgQ29udHJpYnV0aW9ucyBhcmUgd2VsY29tZSEuCi0gICAgICA8L3A+Ci0gICAgICAKLSAgICAgIAotICAgIDxzZWN0aW9uIG5hbWU9IkNvcmUgdGFza3MiPiAKLSAgICAgIDx1bD4KLSAgICAgICAgPGxpPkltcGxlbWVudGEgYSBNRVRBLUlORi9zZXJ2aWNlcyBtZWNoYW5pc20gZm9yIG1hcHBpbmcgSmVsbHkgbGlicmFyaWVzIHRvIG5hbWVzcGFjZSBVUklzCi0gICAgICAgICAgICBpbiBhIHNpbWlsYXIgd2F5IHRvIGhvdyB0aGUgY29tbW9ucy1kaXNjb3ZlcnkgYW5kIEpBWFAgbGlicmFyaWVzIHdvcmsuCi0gICAgICAgICAgICBUaGlzIHdvdWxkIGFsbG93IEplbGx5IGxpYnJhcmllcyB0byBiZSBkaXN0cmlidXRlZCBpbiBhIHNlbGYgY29udGFpbmVkIEpBUiB0aGVuIGp1c3QgcHV0Ci0gICAgICAgICAgICBvbiB0aGUgY2xhc3NwYXRoIGFuZCB0aGV5J2QgYmUgdXNhYmxlLiAgICAgICAgICAgICAgICAKLSAgICAgICAgPC9saT4KLSAgICAgICAgPGxpPgotICAgICAgICAgICAgSW1wbGVtZW50IGEgSkpBUi9NYXZlbiBtZWNoYW5pc20gc28gdGhhdCB1c2luZyBhIG5ldyBKZWxseSBsaWJyYXJ5IHZpYSBhIG5hbWVzcGFjZSBVUkkgd291bGQKLSAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgZG93bmxvYWQgdGhlIGphciBhbmQgaXRzIGRlcGVuZGVuY2llcyBmcm9tIHNvbWUgbG9jYWwvcmVtb3RlIHJlcG9zaXRvcnkuCi0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT5NYXliZSBhZGQgYSBTY29wZSBjbGFzcyB0byBtYWtlIGl0IGVhc2llciB0byBwbHVnaW4gY3VzdG9tIHNjb3BlcyBzdWNoIGFzIAotICAgICAgICAgICAgcmVxdWVzdCwgc2Vzc2lvbiwgYXBwbGljYWl0b24sIGluaXRQYXJhbXMsIHBhcmFtcywgdHJhbnNhdGlvbiBldGMuCi0gICAgICAgICAgICBJbiBhIHdvcmtmbG93IHNldHRpbmcgdGhpcyBjb3VsZCBhbHNvIGluY2x1ZGUgdHJhbnNpZW50IGFuZCBwZXJzaXN0ZW50IHNjb3BlcwotICAgICAgICA8L2xpPgotICAgICAgICA8bGk+V3JpdGUgYSBKZWxseVNlcnZsZXQgc28gdGhhdCBKZWxseSBjYW4gYmUgdXNlZCBhcyBhIHBhZ2UgdGVtcGxhdGluZyBzeXN0ZW0uCi0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT5JbXBsZW1lbnQgYSBIVE1MIHBhcnNlciBmb3IgSmVsbHksIHByb2JhYmx5IHVzaW5nIE5lY2tvSFRNTCBzbyB0aGF0IG5vbi1YTUwgY2FuIGJlIHBhcnNlZAotICAgICAgICAgICAgYW5kIHRhZ3Mgd2l0aCBwcmVmaXhlcyBjYW4gYmUgYm91bmQgdG8gSmVsbHkgdGFncy4KLSAgICAgICAgPC9saT4KLSAgICAgICAgPGxpPndyaXRlIGEgQ29jb29uIEplbGx5R2VuZXJhdG9yIHNvIHRoYXQgSmVsbHkgc2NyaXB0cyBjYW4gYmUgdXNlZCBlYXNpbHkgaW5zaWRlIENvY29vbjwvbGk+Ci0gICAgICAgIDxsaT5jb25zaWRlciBpbXBsZW1lbnRpbmcgYSBKZWxseSBEb2NsZXQgc28gdGhhdCBKZWxseSBjYW4gYmUgdXNlZCB0byBjb2RlIGdlbmVyYXRlCi0gICAgICAgICAgICBzdHVmZiBmcm9tIGphdmFkb2MgdGFncyBpbiBhIHNpbWlsYXIgd2F5IHRvIFhEb2NsZXQgYnV0IG1ha2luZyB1c2Ugb2YgdGhlIEpTVEwgdGFncyBhbmQKLSAgICAgICAgICAgIHRoZSBWZWxvY2l0eSBsaWtlIGV4cHJlc3Npb24gbGFuZ3VhZ2UgKEpleGwpIHdoaWNoIHdpbGwgYXZvaWQgdGhlIG5lZWQgdG8gdXNlIGh1Z2UgbnVtYmVycyAKLSAgICAgICAgICAgIG9mIHRhZ3MuICAgICAgICAgICAgICAgIAotICAgICAgICA8L2xpPgotICAgICAgICA8bGk+UmVuYW1lIHRoZSBEeW5hVGFnIGludGVyZmFjZSB0byBiZSBEeW5hbWljQXR0cmlidXRlcyBhbG9uZyB3aXRoIEpTUDEuMywgCi0gICAgICAgICAgICBhbHNvIGFkZCBhIG5hbWVzcGFjZSBVUkkgcGFyYW1ldGVyCi0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT5BZGQgc3VwcG9ydCBmb3IgbmFtZXNwYWNlIFVSSSB1c2UgaW5zaWRlIFhQYXRoIGV4cHJlc3Npb25zLjwvbGk+Ci0gICAgICAgIDxsaT5XaGVuIGRlZmluaW5nIG5ldyB0YWdzIHVzaW5nICZsdDtkZWZpbmU6dGFnJmd0Oywgd2Ugc2hvdWxkIGFsbG93IGF0dHJpYnV0ZXMgdG8gYmUgbmFtZWQsPGJyLz4KLSAgICAgICAgICAgIHNwZWNpZmllZCBhcyByZXF1aXJlZCwgc3BlY2lmeSB0aGUgb3B0aW9uYWwgY29uZGl0aW9ucyBhbmQgc28gZm9ydGggZm9yIHZhbGlkYXRpbmcgaW5zdGFuY2VzLjxici8+IAotICAgICAgICAgICAgSSBndWVzcyB0aGlzIGNvdWxkIGp1c3QgYmUgbm9ybWFsIHNjcmlwdCB0aG91Z2guCi0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT5UaGUgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LmltcGwgcGFja2FnZSBkb2Vzbid0IGhhdmUgYSBncmVhdCBuYW1lIC0gPGJyLz4KLSAgICAgICAgICAgIENhbiB3ZSB0aGluayBvZiBhIGJldHRlciBvbmU/IDxici8+Ci0gICAgICAgICAgICBBbHNvIHNvbWUgb2YgdGhlIGNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIGNvdWxkIG1heWJlIGRvIHdpdGggYSByZW5hbWU/IDxici8+Ci0gICAgICAgICAgICBTY3JpcHRCbG9jayBmb3IgZXhhbXBsZSAtIHNob3VsZCB3ZSBqdXN0IGNhbGwgaXQgYSBCbG9jayBvciBtYXliZSBhIENvbXBvc2l0ZVNjcmlwdD8KLSAgICAgICAgPC9saT4KLSAgICAgICAgPGxpPkFkZCBhbiBhZGFwdGVyIHRvIHJ1biBKU1AgdGFnIGxpYnJhcmllcyBpbnNpZGUgSmVsbHkgd2hlbiBKZWxseSBpcyB1c2VkIGluIGEgCi0gICAgICAgICAgICBTZXJ2bGV0IC8gSlNQIGVudmlyb25tZW50PwotICAgICAgICA8L2xpPgotICAgICAgICA8bGk+RG9jdW1lbnQgbXVjaCBtb3JlITwvbGk+Ci0gICAgICA8L3VsPgotICAgIDwvc2VjdGlvbj4KLSAgICAgIAotICAgIDxzZWN0aW9uIG5hbWU9IklkZWFzIGZvciBuZXcgdGFnIGxpYnJhcmllcyI+IAotICAgICAgPHVsPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgICBBbiBYU0QgdGFnIGxpYnJhcnkgdGhhdCBjYW4gYmUgdXNlZCB0byBwYXJzZSBYU0QgZG9jdW1lbnRzIGFuZCBjcmVhdGUgRHluYUJlYW5zIGZyb20gdGhlIGNvbXBsZXggdHlwZXMuCi08cHJlPgotJmx0O3hzZDplbGVtZW50IG5hbWU9Ik15RHluYW1pY0NsYXNzIiZndDsKLSAgJmx0O3hzZDpjb21wbGV4VHlwZSZndDsKLSAgICAgIC4uLgotICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKLSZsdDsveHNkOmVsZW1lbnQmZ3Q7PC9wcmU+Ci0KLSAgICAgICAgICAgIEFsc28gd2UgY291bGQgY29uc2lkZXIgdXNpbmcgY2xhc3MgbmFtZXMgb3IgWFNEIHR5cGUgbmFtZXMgdG8gZG8gY29udmVyc2lvbnMgb2YgdmFsdWVzLCBtYXliZSB1c2luZwotICAgICAgICAgICAgdGhlIENvbnZlcnRVdGlscyBjbGFzcyBpbiBiZWFudXRpbHMuCi0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT5jb25zaWRlIGEgdGFnIGxpYnJhcnkgd2hpY2ggaW1wbGVtZW50cyB0aGUgPGEgaHJlZj0iaHR0cDovL3N0eC5naW5nZXJhbGwuY3ovc3R4L2luZGV4Lmh0bWwiPlNUWDwvYT4KLSAgICAgICAgICAgIHNwZWNpZmljYXRpb24gZm9yIHRoZSBTQVggYmFzZWQgdHJhbnNmb3JtYXRpb24gb2YgWE1MLiBUaGlzIGlzIGtpbmRhIGxpa2UgWFBhdGggYW5kIFhTTFQgYnV0IGlzIGJhc2VkCi0gICAgICAgICAgICBwdXJlbHkgb24gYSBTQVggc3RyZWFtLiBNYXliZSB3ZSBjb3VsZCB3cmFwIDxhIGhyZWY9Imh0dHA6Ly93d3cub2Jxby5kZS9qb29zdCI+Sm9vc3Q8L2E+Ci0gICAgICAgICAgICBpbiBhIEplbGx5IHRhZyBsaWJyYXJ5Ci0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT5JbXBsZW1lbnQgYSBTY2hlbWF0cm9uIHRhZyBsaWJyYXJ5IGZvciB2YWxpZGluZyBYTUwgdXNpbmcgYSBwYXRoIGJhc2VkIGFwcHJvYWNoLCByYXRoZXIgdGhhbiBzY2hlbWEgYmFzZWQuPC9saT4KLSAgICAgICAgPGxpPgotICAgICAgICAgICAgUHJvdmlkZSBzdXBwb3J0IGZvciBydW5uaW5nIGEgcGllY2Ugb2YgSmVsbHkgc2NyaXB0IHJlbW90ZWx5LiBUaGlzIHdvdWxkIGJlIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgICB0ZXN0aW5nLiBNYXliZSBpbnRlZ3JhdGluZyBvciBlbmhhbmNpbmcgc29tZXRoaW5nIGxpa2UgCi0gICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3JlbW90ZWFudCI+cmFudDwvYT4KLSAgICAgICAgPC9saT4KLSAgICAgIDwvdWw+Ci0gICAgPC9zZWN0aW9uPgotCi0gICAgPHNlY3Rpb24gbmFtZT0iQ2hhbmdlcyB0byBleGlzdGluZyB0YWcgbGlicmFyaWVzIj4gCi0gICAgICA8dWw+Ci0gICAgICAgIDxsaT5BZGQgSlNMIHRlc3QgY2FzZXMgdG8gdGVzdCBmb3Igb3JkZXJpbmcgb2YgcGF0dGVybnMgYW5kIHRoYXQgdGhlIGNvcnJlY3Qgb3V0cHV0IGNvbWVzIG91dC48L2xpPgotICAgICAgPC91bD4KLSAgICA8L3NlY3Rpb24+Ci0KLSAgICA8c2VjdGlvbiBuYW1lPSJQb25kZXIgYWJvdXQiPiAKLSAgICAgIDxwPgotICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiB0aGluZ3MgdGhhdCBtaWdodCBiZSBnb29kIHRvIGFkZCB0byBKZWxseSwgbWF5YmUgYWZ0ZXIgbW9yZSB0aG91Z2h0LgotICAgICAgPC9wPgotICAgICAgPHVsPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgICBtYXliZSBjb25zaWRlciBhIHRhZyB3aGljaCB3aWxsIHN3aXRjaCB0aGUgZGVmYXVsdCBFTCB0byBYUGF0aDsgdGhlbiBYUGF0aCBhbmQgRUwgY2FuIGJlIHBlZXJzLiBUaGVuICR7Zm9vfQotICAgICAgICAgICAgY2FuIGJlIHVzZWQgYXMgYW4gWFBhdGggZXhwcmVzc2lvbiBhbnl3aGVyZQotICAgICAgICA8L2xpPgotICAgICAgICA8bGk+V2UgY291bGQgYXV0b2dlbmVyYXRlIFhNTCBTY2hlbWFzIG9yIFJlbGF4TkcgZG9jcyBmb3IgdGFnIGxpYnJhcmllcyB0byBoZWxwIHZhbGlkYXRlIHNjcmlwdHM8L2xpPgotICAgICAgICA8bGk+UGF0Y2ggVGFnTGlicmFyeSB0byBhbGlhcyBhbGwgJmx0O21peGVkQ2FzZSZndDsgdGFncyB0byAmbHQ7bWl4ZWQtY2FzZSZndDsgIHRhZ3M8L2xpPgotICAgICAgPC91bD4KLSAgICA8L3NlY3Rpb24+Ci0gICAgCi0gICAgPC9zZWN0aW9uPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgotCmRpZmYgLS1naXQgYS94ZG9jcy90dXRvcmlhbC54bWwgYi94ZG9jcy90dXRvcmlhbC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OWM3NWQuLjAwMDAwMDAKLS0tIGEveGRvY3MvdHV0b3JpYWwueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotCi0gPHByb3BlcnRpZXM+Ci0gIDx0aXRsZT5KZWxseSBUdXRvcmlhbDwvdGl0bGU+Ci0gIDxhdXRob3IgZW1haWw9InZvbndhb0B5YWhvby5jb20iPk90dG8gdm9uIFdhY2h0ZXI8L2F1dGhvcj4KLSA8L3Byb3BlcnRpZXM+Ci0KLTxib2R5PgotCi08c2VjdGlvbiBuYW1lPSJKZWxseSBUdXRvcmlhbCI+Ci0KLTxwPgotVGhlIGJlc3Qgd2F5IHRvIGdldCBhY3F1YWludGVkIHdpdGggSmVsbHksIGFuZCBnZXQgYW4gaWRlYSB3aGF0IGl0IGNhbiBiZQotdXNlZCBmb3IsIGlzIHRvIHNlZSBpdCBpbiBhY3Rpb24uIFNvIHlvdSB3YW50IHRvIGdldCBzdGFydGVkIGFzIHF1aWNrbHkgYXMKLXBvc3NpYmxlPyBMdWNraWx5IGZvciB5b3UgSmVsbHkgY29tZXMgd2l0aCBzZXZlcmFsIGRlbW9zIHRoYXQgY2FuIGJlIHJ1bgotZnJvbSB0aGUgY29tbWFuZCBsaW5lIHVzaW5nIE1hdmVuLgotPC9wPgotCi08cD4KLUlmIHlvdSBkb24ndCBoYXZlIE1hdmVuIGluc3RhbGxlZCwgeW91IHNob3VsZCBjaGVjayBvdXQgdGhlCi08YSBocmVmPSJnZXR0aW5nc3RhcnRlZC5odG1sIj5HZXR0aW5nIFN0YXJ0ZWQ8L2E+IGd1aWRlIGZpcnN0LgotPC9wPgotCi08cD4KLVRoZSBnb2FsIG9mIHRoZSB0dXRvcmlhbCBpcyB0byBndWlkZSB5b3UgdGhyb3VnaCBydW5uaW5nIHNvbWUgb2YgdGhlIEplbGx5Ci1kZW1vcyBhbmQgZ2l2ZSB5b3Ugc29tZSBpZGVhcyBvZiBvdGhlciBwb3RlbnRpYWwgdXNlcyBvZiBKZWxseSAoYW5kCi1ob3BlZnVsbHkgbWFrZSB5b3VyIGZpcnN0IGV4cGVyaWVuY2Ugd2l0aCBKZWxseSBlbmpveWFibGUgYW5kIGZ1bikuCi08L3A+Ci0KLTxwPgotT25jZSB5b3UgaGF2ZSB0cmllZCBhIGZldyBvZiBkZW1vcywgeW91IGNhbiBleHBsb3JlIEplbGx5IGZ1cnRoZXIgYnkgd3JpdGluZwotc29tZSBKZWxseSBzY3JpcHRzIG9uIHlvdXIgb3duLCBvciBieSBtb2RpZnlpbmcgc29tZSBvZiB0aGUgZGVtb3MgcHJvdmlkZWQuCi1Zb3UgbWF5IGFsc28gd2FudCB0byBkZWZpbmUgeW91ciBvd24gSmVsbHkgdGFnbGliLCBhbmQgaW4gc29tZSBjYXNlcwoteW91IG1heSB3YW50IHRvIGtub3cgaG93IHRvIGVtYmVkIEplbGx5IGludG8geW91ciBvd24gSmF2YSBwcm9ncmFtICh0dXRvcmlhbHMKLW9uIGhvdyB0byBkbyB0aGVzZSB0aGluZ3MgYXJlIGluIHRoZSB3b3JrcykuCi08L3A+Ci0KLTxwPgotVG8gc2VlIGEgbGlzdCBvZiB0aGUgSmVsbHkgZGVtb3MgdGhhdCB5b3UgY2FuIHJ1biwgdHlwZSAibWF2ZW4gLWciIGluIHRoZQotSmVsbHkgcm9vdCBkaXJlY3RvcnkgKHRoZXJlIHNob3VsZCBiZSBhIHByb2plY3QueG1sIGZpbGUgdGhlcmUpLiBBbW9uZyB0aGUKLW90aGVyIG1hdmVuIGdvYWxzLCB5b3Ugd2lsbCBzZWUgdGhlIHRoZSBkZW1vcyBhdmFpbGFibGUgdW5kZXIgdGhlICJkZW1vIgotZ29hbCAoaW5jaWRlbnRhbGx5LCBNYXZlbiBpcyBhIHByb2plY3QgYXV0b21hdGlvbiB0b29sIHRoYXQgdXNlcyBKZWxseSBhcwotaXRzIHhtbCBwcm9jZXNzaW5nIGVuZ2luZSwgYW5kIEplbGx5IGluIHR1cm4gdXNlcyBNYXZlbiBhcyBpdHMgYnVpbGQgdG9vbC4KLU5lYXQhKQotPC9wPgotCi08cD4KLVRoZSBmb2xsb3dpbmcgdHV0b3JpYWxzIGFyZSBjdXJyZW50bHkgYXZhaWxhYmxlOgotPC9wPgotPHVsPgotPGxpPgotPGEgaHJlZj0iI2plbGx5c3dpbmciPkplbGx5U3dpbmc8L2E+Ci08L2xpPgotPGxpPgotPGEgaHJlZj0iI2VtYmVkZGluZ2plbGx5Ij5FbWJlZGRpbmcgSmVsbHk8L2E+Ci08L2xpPgotPGxpPgotPGEgaHJlZj0iI2pzbCI+VHJhbnNmb3JtaW5nIFhNTCB3aXRoIEpTTDwvYT4KLTwvbGk+Ci08bGk+Ci08YSBocmVmPSIjaHRtbCI+UGFyc2luZyBIVE1MPC9hPgotPC9saT4KLTwvdWw+Ci08YnIvPgotCi08YSBuYW1lPSJqZWxseXN3aW5nIi8+Ci08c2VjdGlvbiBuYW1lPSJKZWxseVN3aW5nIj4KLQotCi08cD4KLVRoZSBKZWxseVN3aW5nIGRlbW8gc2hvd3MgaG93IHlvdSBjYW4gdXNlIEplbGx5ICh1c2luZyB0aGUgPGEgaHJlZj0ibGlicy9zd2luZy90YWdzLmh0bWwiPkplbGx5U3dpbmc8L2E+IGxpYnJhcnkpIHRvIGJ1aWxkIHRoZSBVSSBmb3IgYSBTd2luZyBqYXZhIHByb2dyYW0uCi08L3A+Ci0KLTxwPgotV2h5IHdvdWxkIHlvdSB3YW50IHRvIGRvIHRoaXM/IElmIHlvdSBoYXZlIGV2ZXIgd3JpdHRlbiBhIGxhcmdlIFN3aW5nCi1hcHBsaWNhdGlvbiwgeW91IHdpbGwgcHJvYmFibHkgYWdyZWUgdGhhdCBjb2RpbmcgYSBHVUkgaW4gamF2YSBjYW4gYmUgYSB0ZWRpb3VzIHRhc2suCi1KZWxseSBhbGxvd3MgeW91IHRvIGRlZmluZSB0aGUgVmlldyAoaW4gYW4gTVZDIGFwcHJvYWNoKQotaW4gWE1MIGFuZCBiaW5kIGl0IHRvIGEgTW9kZWwgYW5kIENvbnRyb2xsZXIgd3JpdHRlbiBpbiBKYXZhLiBPciB5b3UgY2FuCi1kZWZpbmUgYWN0aW9ucyAoQ29udHJvbGxlcikgZGlyZWN0bHkgaW4gSmVsbHkgYnkgdXNpbmcgdGhlICZsdDthY3Rpb24mZ3Q7IHRhZy4KLTwvcD4KLQotPHA+Ci1KZWxseSBpcyBhbHNvIGEgZ3JlYXQgd2F5IGZvciBhIGRlc2lnbmVyIHRvIHByb3RvdHlwZSBhIFVJIGFuZCBhdm9pZCB0aGUKLWxlYXJuaW5nIGN1cnZlIG9mIEphdmEuIEluIGZhY3QsIGEgZGVzaWduZXIgY291bGQgZGV2ZWxvcCBhIGZ1bGwtZmVhdHVyZWQKLWFwcGxpY2F0aW9uIHVzaW5nIGEgcmljaCBzZXQgb2YgZnVuY3Rpb25zIGFuZCBiZWFucyBleHBvc2VkIHZpYSBqZWxseSB0YWdzLgotPC9wPgotCi08cD4KLVRvIHJ1biB0aGUgc3dpbmcgZGVtbywgZ28gdG8gZGlyZWN0b3J5IGplbGx5LXRhZ3Mvc3dpbmcgYW5kICB0eXBlICJtYXZlbiBkZW1vOnN3aW5nIgotKFZpZXcgdGhlIDxhIGhyZWY9Imh0dHA6Ly9jdnMuYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9qYWthcnRhLWNvbW1vbnMvamVsbHkvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvZXhhbXBsZS5qZWxseT9yZXY9SEVBRCZhbXA7Y29udGVudC10eXBlPXRleHQvdm5kLnZpZXdjdnMtbWFya3VwIj5kZW1vIHNjcmlwdDwvYT4pLiBZb3Ugc2hvdWxkIHNlZSBhIHdpbmRvdyBvcGVuIHdpdGgKLXNvbWUgc3dpbmcgY29tcG9uZW50cy4gWW91IGNhbiB0ZXN0IHRoZSBhY3Rpb25zIGJ5IHNlbGVjdGluZyBhIG1lbnUgaXRlbSBvcgotcHJlc3NpbmcgdGhlIGJ1dHRvbi4gVGhlIGFjdGlvbnMgaW4gdGhpcyBkZW1vIHNpbXBseSBvdXRwdXQgYSBtZXNzYWdlIHRvIHRoZQotY29uc29sZS4gQSBtb3JlIHByYWN0aWNhbCBhY3Rpb24gY291bGQgYmUgdG8gaW52b2tlIGEgYmVhbiwgY2FsbCBhIHNjcmlwdAotdGhhdCBvcGVucyBhbm90aGVyIHdpbmRvdywgZXRjLgotPC9wPgotCi08cD4KLUlmIHlvdSBsb29rIGF0IHRoZSA8YSBocmVmPSJodHRwOi8vY3ZzLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvamFrYXJ0YS1jb21tb25zL2plbGx5L3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL3N3aW5nL2V4YW1wbGUuamVsbHk/cmV2PUhFQUQmYW1wO2NvbnRlbnQtdHlwZT10ZXh0L3ZuZC52aWV3Y3ZzLW1hcmt1cCI+amVsbHkgY29kZSBmb3IgdGhpcyBkZW1vPC9hPiwgeW91IHdpbGwgc2VlCi10aGF0IGJ1aWxkaW5nIGEgVUkgaXMgcHJldHR5IHNpbXBsZS4gRm9yIGV4YW1wbGUsIGEgbWVudSBiYXIgaXMgc2ltcGx5OgotPC9wPgotCi08c291cmNlPgotICAgICZsdDttZW51QmFyJmd0OwotICAgICAgJmx0O21lbnUgdGV4dD0iRmlsZSImZ3Q7Ci0gICAgICAgICZsdDttZW51SXRlbSZndDsKLSAgICAgICAgICAmbHQ7YWN0aW9uIG5hbWU9Ik5ldyImZ3Q7Ci0gICAgICAgICAgIC4uLiBzb21lIGFjdGlvbiAuLi4KLSAgICAgICAgICAmbHQ7L2FjdGlvbiZndDsKLSAgICAgICAgJmx0Oy9tZW51SXRlbSZndDsKLSAgICAgICZsdDsvbWVudSZndDsKLSAgICAgIC4uLiBtb3JlIG1lbnVzL21lbnUgaXRlbXMKLSAgICAmbHQ7L21lbnVCYXImZ3Q7Ci08L3NvdXJjZT4KLQotPHA+Ci1BcyB5b3UgY2FuIHNlZSwgbmVzdGVkIGVsZW1lbnRzIGFyZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHBhcmVudCBjb21wb25lbnRzCi0odW5saWtlIEphdmEsIHdoZXJlIHlvdSBoYXZlIHRvIGNhbGwgcGFyZW50LmFkZChjaGlsZCkgKS4KLTwvcD4KLQotPHA+Ci1Gb3IgdGhlIHRhYmxlLCB5b3UgY2FuIHNlZSB0aGF0IGl0IHdhcyBhZGRlZCB0byB0aGUgc2Nyb2xsUGFuZSB1c2luZyB0aGUKLSJuZXciIHRhZyAoZnJvbSB0aGUgamVsbHk6Y29yZSB0YWdsaWIpOgotPC9wPgotCi08c291cmNlPgotICAgICZsdDtzY3JvbGxQYW5lJmd0OwotICAgICAgJmx0O2o6bmV3IGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmplbGx5LnN3aW5nLk15VGFibGVNb2RlbCIgdmFyPSJ0YWJsZU1vZGVsIi8mZ3Q7Ci0gICAgICAmbHQ7dGFibGUgbW9kZWw9IiR7dGFibGVNb2RlbH0iLyZndDsKLSAgICAmbHQ7L3Njcm9sbFBhbmUmZ3Q7Ci08L3NvdXJjZT4KLQotPHA+Ci1UaGUgbmljZSB0aGluZyBhYm91dCB0aGlzIGlzIHRoYXQgYW55IGNvbXBvbmVudCAob3IgbW9kZWwgaW4gdGhpcyBjYXNlKSB0aGF0Ci1pcyBub3QgYXZhaWxhYmxlIGluIHRoZSBKZWxseVN3aW5nIHRhZ2xpYiBvciBpcyB0b28gY29tcGxleCB0byBleHByZXNzIHVzaW5nCi1KZWxseSwgY2FuIGJlIHdyaXR0ZW4gaW4gamF2YSBhbmQgYWRkZWQgYnkgdGhpcyBtZXRob2QuCi08L3A+Ci0KLQotPHN1YnNlY3Rpb24gbmFtZT0iSmVsbHkgUnVubmVyIj4KLQotPHA+Ci1UaGUgSmVsbHkgUnVubmVyIGlzIGEgSmVsbHlTd2luZyBpbnRlcmZhY2UgdGhhdCBsZXRzIHlvdSBydW4gb3RoZXIgSmVsbHkgc2NyaXB0cy4gSnVzdCBzZWxlY3QgYSBmaWxlIGluIHRoZSBmaWxlIGRpYWxvZyBhbmQgY2xpY2sgdGhlIFJ1biBTY3JpcHQgYnV0dG9uCi08L3A+Ci0KLTxwPgotVG8gc3RhcnQgdGhlIEplbGx5UnVubmVyIHR5cGUgIm1hdmVuIGplbGx5OnJ1bm5lciIgKFZpZXcgdGhlIDxhIGhyZWY9Imh0dHA6Ly9jdnMuYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9qYWthcnRhLWNvbW1vbnMvamVsbHkvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L3RhZ3Mvc3dpbmcvcnVuLmplbGx5P3Jldj1IRUFEJmFtcDtjb250ZW50LXR5cGU9dGV4dC92bmQudmlld2N2cy1tYXJrdXAiPmRlbW8gc291cmNlPC9hPikuCi08L3A+Ci0KLTwvc3Vic2VjdGlvbj4KLQotPHN1YnNlY3Rpb24gbmFtZT0iSG9tZXBhZ2UgQnVpbGRlciAoSmVsbHlTd2luZyBFZGl0aW9uKSI+Ci0KLTxwPgotVGhpcyBpcyBhIGdvb2QgY2hhbmNlIHRvIHVzZSB0aGUgSmVsbHkgUnVubmVyLiBGaW5kIEhvbWVwYWdlQnVpbGRlci5qZWxseSwgd2hpY2ggaXMgbG9jYXRlZCBpbiAvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2RlbW9zLyAoVmlldyB0aGUgPGEgaHJlZj0iaHR0cDovL2N2cy5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2pha2FydGEtY29tbW9ucy9qZWxseS9qZWxseS10YWdzL3N3aW5nL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS9kZW1vcy9ob21lcGFnZUJ1aWxkZXIuamVsbHk/cmV2PUhFQUQmYW1wO2NvbnRlbnQtdHlwZT10ZXh0L3ZuZC52aWV3Y3ZzLW1hcmt1cCI+ZGVtbyBzb3VyY2U8L2E+KS4KLTwvcD4KLQotPHA+Ci1BcyB5b3UgY2FuIHNlZSwgdGhlIEhvbWVwYWdlQnVpbGRlciBpcyBhIChtaW5pKSBmdWxseS1mdW5jdGlvbmFsIHN3aW5nIGFwcGxpY2F0aW9uLCBhbmQgaXQncyBlbnRpcmVseSB3cml0dGVuIGluIEplbGx5ISAgVGhpcyBleGFtcGxlIHVzZXMgSmVsbHkgb24gdHdvIGxldmVsczogMSkgRm9yIHRoZSBhY3R1YWwgYXBwbGljYXRpb24vVUkgYW5kIDIpIEFzIGEgdGVtcGxhdGluZyBlbmdpbmUgdG8gYnVpbGQgaG9tZXBhZ2VzLlRoaXMgc2hvd3MgaG93IHlvdSBjYW4gdXNlIGRpZmZlcmVudCB0YWdsaWJzIHRvZ2V0aGVyIHRvIGJ1aWxkIHNvcGhpc3RpY2F0ZWQgYXBwbGljYXRpb25zLgotPC9wPgotCi08cD4KLVNlZSB0aGUgc2VjdGlvbiBvbiBFbWJlZGRpbmcgSmVsbHkgdG8gZmluZCBvdXQgbW9yZSBhYm91dCB0aGUgSG9tZXBhZ2UgQnVpbGRlciBkZW1vLiBUaGlzIGlzIGFsc28gYSBnb29kIHdheSB0byBjb21wYXJlIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiAoSG9tZXBhZ2VCdWlsZGVyLmphdmEpIHdpdGggYSBKZWxseSBpbXBsZW1lbnRhdGlvbiAoSG9tZXBhZ2VCdWlsZGVyLmplbGx5KS4KLTwvcD4KLQotPC9zdWJzZWN0aW9uPgotCi08c3Vic2VjdGlvbiBuYW1lPSJPdGhlciBJZGVhcyBmb3IgSmVsbHlTd2luZyI+Ci0KLTx1bD4KLTxsaT4KLVlvdSBjb3VsZCB3cml0ZSBhIHRhZ2xpYiB0byBhbGxvdyB5b3UgdG8gYmluZCBkYXRhIHRvIHZhcmlvdXMgbW9kZWxzCi0oVHJlZU1vZGVsLCBUYWJsZU1vZGVsLCBldGMpIHVzaW5nIEplbGx5LgotPC9saT4KLTxsaT4KLVlvdSBjb3VsZCBhbGxvdyB0aGUgZW5kIHVzZXIgb2YgYW4gYXBwbGljYXRpb24gdG8gZWFzaWx5IGN1c3RvbWl6ZSAob3IgbG9jYWxpemUpIHRoZSBVSSwgYW5kIGV2ZW4gYWRkCi1jdXN0b20gYWN0aW9ucyBmcm9tIGEgbGlicmFyeSBvZiBwb3NzaWJsZSBhY3Rpb25zIQotPC9saT4KLTxsaT4KLVlvdSBjb3VsZCB5b3UgdXNlIEplbGx5U3dpbmcgaW1wbGVtZW50IGEgInRoaW4gY2xpZW50Iiwgc28gdGhhdCB0aGUgZW50aXJlIFVJIG9mIGFuIGFwcGxpY2F0aW9uCi1jYW4gYmUgZG93bmxvYWRlZCBmcm9tIGEgd2ViIHNlcnZlciBhdCBydW50aW1lLiBJbiBzb21lIGFwcGxpY2F0aW9ucywgdGhpcyB3b3VsZCBwcm92aWRlIGEgbG90IG9mIGZsZXhpYmlsaXR5LgotPC9saT4KLTwvdWw+Ci0KLTwvc3Vic2VjdGlvbj4KLQotPC9zZWN0aW9uPgotCi08YSBuYW1lPSJlbWJlZGRpbmdqZWxseSIvPgotPHNlY3Rpb24gbmFtZT0iRW1iZWRkaW5nIEplbGx5Ij4KLQotPHA+Ci1UaGVyZSBhcmUgY2FzZXMgd2hlcmUgeW91IG1heSB3YW50IHRvIGV4ZWN1dGUgSmVsbHkgc2NyaXB0cyBmcm9tIHdpdGhpbiBhIGphdmEgcHJvZ3JhbSAoYXMgb3Bwb3NlZCB0byBkb2luZyBpdCBmcm9tIE1hdmVuIG9yIHRoZSBjb21tYW5kIGxpbmUpLiBUaGlzIHR1dG9yaWFsIHByZXNlbnRzIGEgc2ltcGxlIGV4YW1wbGUgb2YgYSBwcm9ncmFtIHRoYXQgZG9lcyB0aGlzLgotPC9wPgotCi08cD4KLVRoaXMgZXhhbXBsZSBpcyBhbm90aGVyICJIb21lIFBhZ2UgQnVpbGRlciIuIFByZXZpb3VzbHksIHdlIHVzZWQgSmVsbHlTd2luZyB0byBjcmVhdGUgdGhlIEhvbWUgUGFnZSBCdWlsZGVyLiBUaGlzIHRpbWUgd2Ugd2lsbCBjcmVhdGUgdGhlIFN3aW5nIGNvbnRyb2xzIGluIEphdmEgYW5kIG9ubHkgdXNlIEplbGx5IHRvIG91dHB1dCB0aGUgSFRNTC4KLTwvcD4KLQotPHA+Ci1XaGVuIHlvdSBydW4gdGhlIHByb2dyYW0sIGl0IHdpbGwgb3BlbiBhIHdpbmRvdyB3aGVyZSB5b3UgY2FuIGNob29zZSBhIHRlbXBsYXRlLCBhbmQgc3BlY2lmeSBhIGZldyBwYXJhbXRlcnMuIFRoZW4geW91IHNpbXBseSBjbGljayBvbiAiYnVpbGQgcGFnZSIgYW5kIHZvaWxhLCB5b3VyIGhvbWUgcGFnZSBpcyBnZW5lcmF0ZWQgYnkgSmVsbHkuCi08L3A+Ci0KLTxwPgotVG8gcnVuIHRoZSBkZW1vIHR5cGUgIm1hdmVuIGRlbW86ZW1iZWQiIChWaWV3IHRoZSA8YSBocmVmPSJodHRwOi8vY3ZzLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvamFrYXJ0YS1jb21tb25zL2plbGx5L2plbGx5LXRhZ3Mvc3dpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2plbGx5L2RlbW9zL0hvbWVwYWdlQnVpbGRlci5qYXZhP3Jldj1IRUFEIj5kZW1vIHNvdXJjZTwvYT4pLgotPC9wPgotCi08cD4KLVRoZSBjb2RlIHRoYXQgYWN0dWFsbHkgcnVucyBKZWxseSBpcyB0aGUgZm9sbG93aW5nLgotPC9wPgotCi08c291cmNlPgotICAgIE91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSgiZGVtb3BhZ2UuaHRtbCIpOwotICAgIEplbGx5Q29udGV4dCBjb250ZXh0ID0gbmV3IEplbGx5Q29udGV4dCgpOwotCi0gICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoIm5hbWUiLG5hbWVGaWVsZC5nZXRUZXh0KCkpOwotICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKCJiYWNrZ3JvdW5kIixjb2xvckZpZWxkLmdldFRleHQoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoInVybCIsdXJsRmllbGQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAvLyBTZXQgdGhlIGhvYmJ5IGxpc3QKLSAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIEVudW1lcmF0aW9uIGVudW09IGxpc3RNb2RlbC5lbGVtZW50cygpOwotICAgICAgICB3aGlsZSAoZW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgdi5hZGQoZW51bS5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgfQotICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKCJob2JiaWVzIiwgdik7Ci0KLSAgICBYTUxPdXRwdXQgeG1sT3V0cHV0ID0gWE1MT3V0cHV0LmNyZWF0ZVhNTE91dHB1dChvdXRwdXQpOwotICAgIGNvbnRleHQucnVuU2NyaXB0KCJzcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvZGVtb3MvIit0ZW1wbGF0ZSksIHhtbE91dHB1dCk7Ci0gICAgICAgIHhtbE91dHB1dC5mbHVzaCgpOwotPC9zb3VyY2U+Ci0KLTxwPgotVGhlIEplbGx5IHRlbXBsYXRlIGxvb2tzIGxpa2UgdGhpczoKLTwvcD4KLQotPHNvdXJjZT4KLSAgICZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotICAgJmx0O2o6amVsbHkgdHJpbT0iZmFsc2UiIHhtbG5zOmo9ImplbGx5OmNvcmUiIHhtbG5zOng9ImplbGx5OnhtbCIgeG1sbnM6aHRtbD0iamVsbHk6aHRtbCImZ3Q7Ci0gICAgICZsdDtodG1sJmd0OwotICAgICAgICZsdDtoZWFkJmd0OwotICAgICAgICAgJmx0O3RpdGxlJmd0OyR7bmFtZX0ncyBQYWdlJmx0Oy90aXRsZSZndDsKLSAgICAgICAmbHQ7L2hlYWQmZ3Q7Ci0gICAgICAgJmx0O2JvZHkgYmdjb2xvcj0iJHtiYWNrZ3JvdW5kfSIgdGV4dD0iI0ZGRkZGRiImZ3Q7Ci0gICAgICAgICAmbHQ7aDEmZ3Q7JHtuYW1lfSdzIEhvbWVwYWdlJmx0Oy9oMSZndDsKLSAgICAgICAgICZsdDtpbWcgc3JjPSIke3VybH0iLyZndDsKLSAgICAgICAgICZsdDtoMiZndDtNeSBIb2JiaWVzJmx0Oy9oMiZndDsKLSAgICAgICAgICZsdDt1bCZndDsKLSAgICAgICAgICAgJmx0O2o6Zm9yRWFjaCBpdGVtcz0iJHtob2JiaWVzfSIgdmFyPSJpIiZndDsKLSAgICAgICAgICAgICAmbHQ7bGkmZ3Q7JHtpfSZsdDsvbGkmZ3Q7Ci0gICAgICAgICAgICZsdDsvajpmb3JFYWNoJmd0OwotICAgICAgICAgJmx0Oy91bCZndDsKLSAgICAgICAmbHQ7L2JvZHkmZ3Q7Ci0gICAgICZsdDsvaHRtbCZndDsKLSAgICZsdDsvajpqZWxseSZndDsKLTwvc291cmNlPgotCi08cD4KLUFzIHlvdSBjYW4gc2VlLCBpdCdzIHByZXR0eSBzdHJhaWdoZm9yd2FyZCB0byBjYWxsIGEgSmVsbHkgc2NyaXB0IHByb2dyYW1hdGljYWxseS4gRmlyc3QgeW91IG5lZWQgYSBjb250ZXh0IHRvIHJ1biB0aGUgc2NyaXB0IGluLiBZb3UgY2FuIHRoaW5rIG9mIHRoZSBjb250ZXh0IGFzIHRoZSAiZW52aXJvbm1lbnQiIGluIHdoaWNoIHRoZSBzY3JpcHQgcnVucy4gVGhlIHNjcmlwdCBjYW4gdXNlIGFuZCBtb2RpZnkgdmFyaWFibGVzIGluIHRoZSBjb250ZXh0IGhvd2V2ZXIgaXQgd2lzaGVzLiBUaGVuIHlvdSBuZWVkIGFuIFhNTCBvdXRwdXQgc3RyZWFtIHdoZXJlIHRoZSBvdXRwdXQgb2YgdGhlIHNjcmlwdCB3aWxsIGJlIHNlbnQuIEluIHNvbWUgY2FzZXMsIGxpa2UgdGhpcyBvbmUsIHRoZSBYTUwgb3V0cHV0IGlzIHRoZSBlc3NlbnRpYWwgcHJvZHVjdCBvZiB0aGUgc2NyaXB0LiBJbiBvdGhlciBjYXNlcywgaXQgbWF5IGp1c3QgYmUgYSAiYnlwcm9kdWN0IiBvZiBydW5uaW5nIHRoZSBzY3JpcHQsIHVzZWQgZm9yIGxvZ2dpbmcsIGV0Yy4gVGhpcyBpcyB0aGUgY2FzZSB3aGVuIHlvdSBhcmUgcnVubmluZyBhIG1hdmVuIGJ1aWxkLCBmb3IgZXhhbXBsZS4KLTwvcD4KLQotPHA+Ci1BZnRlciB5b3UgaGF2ZSBleHBsb3JlZCB0aGlzIGRlbW8gYW5kIGl0cyBpbXBsZW1lbnRhdGlvbiwgeW91IG1heSB3YW50IHRvIGNvbXBhcmUgaXQgd2l0aCB0aGUgc2FtZSBleGFtcGxlIGltcGxlbWVudGVkIHVzaW5nIHRoZSBKZWxseVN3aW5nIGxpYnJhcnksIGFib3ZlIChpZiB5b3UgaGF2ZW4ndCBhbHJlYWR5IGRvbmUgc28pLgotPC9wPgotCi08L3NlY3Rpb24+Ci0KLTxhIG5hbWU9ImpzbCIvPgotCi08c2VjdGlvbiBuYW1lPSJUcmFuc2Zvcm1pbmcgWE1MIFdpdGggSlNMIj4KLQotPHA+Ci1XaXRoIHRoZSA8YSBocmVmPSJsaWJzL2pzbC90YWdzLmh0bWwiPkpTTCB0YWcgbGlicmFyeTwvYT4sIHlvdSBjYW4gdHJhbnNmb3JtIFhNTCBkb2N1bWVudHMgaW4gYW4gWFNMVC1saWtlIG1hbm5lci4KLTwvcD4KLQotPHA+Ci1UbyBydW4gdGhlIGRlbW8gdHlwZSAibWF2ZW4gZGVtbzpqc2wiIChWaWV3IHRoZSA8YSBocmVmPSJodHRwOi8vY3ZzLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvamFrYXJ0YS1jb21tb25zL2plbGx5L2plbGx5LXRhZ3MvanNsL3NyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9qZWxseS90YWdzL2pzbC9leGFtcGxlLmplbGx5P3Jldj1IRUFEJmFtcDtjb250ZW50LXR5cGU9dGV4dC92bmQudmlld2N2cy1tYXJrdXAiPmRlbW8gc291cmNlPC9hPikuIFRoZSBkZW1vIHRyYW5zZm9ybXMgdGhlIGRlbW8gc291cmNlIGludG8gSFRNTCBhbmQgb3VwdXRzIGl0IHRvIHRoZSBjb21tYW5kIGxpbmUsIGxpa2UgdGhpczoKLTwvcD4KLQotPHNvdXJjZT4KLSAgICZsdDtodG1sJmd0OwotICAgICAmbHQ7Ym9keSZndDsKLSAgICAgICAmbHQ7aDEmZ3Q7T3V0cHV0Jmx0Oy9oMSZndDsKLSAgICAgICAmbHQ7c21hbGwmZ3Q7SmFtZXMgRWxzb24KLSAgICAgICAgICZsdDtoMiZndDtJIGFtIGEgdGl0bGUhJmx0Oy9oMiZndDsKLSAgICAgICAgICZsdDtzbWFsbCZndDtUd2FzIGEgZGFyaywgcmFpbnkgbmlnaHQuLi4mbHQ7L3NtYWxsJmd0OwotICAgICAgICAgJmx0O3AmZ3Q7ZGZqc2RmanNkZiZsdDsvcCZndDsKLSAgICAgICAgICZsdDtwJmd0O2Zkc2ZzZGZoZHNmZiBneXVmIHV5c2dmIGRzJmx0Oy9wJmd0OwotICAgICAgICZsdDsvc21hbGwmZ3Q7Ci0gICAgICZsdDsvYm9keSZndDsKLSAgICZsdDsvaHRtbCZndDsKLTwvc291cmNlPgotCi08cD4KLU9mIGNvdXJzZSwgdGhpcyBIVE1MIGNvdWxkIGp1c3QgYXMgZWFzbHkgYmUgZ29pbmcgdG8gYSBmaWxlIG9yIG91dCB0byBhIGJyb3dzZXIgaW4gYSBIVFRQIHJlc3BvbnNlLgotPC9wPgotCi08cD4KLUlmIHlvdSBsb29rIGF0IHRoZSA8YSBocmVmPSJsaWJzL2pzbC90YWdzLmh0bWwiPkpTTCB0YWcgbGlicmFyeTwvYT4gZG9jdW1lbnRhdGlvbiwgeW91J2xsIHNlZSB0aGF0IHRoZSBKU0wgdGFnbGliIGNvbnNpc3RzIG9mIGEgbWVyZSBmb3VyIHRhZ3M6IHN0eWxlLCB0ZW1wbGF0ZSwgc3R5bGVzaGVldCwgYW5kIGFwcGx5VGVtcGxhdGVzLiBTaW5jZSBtYW55IG9mIHRoZSBzdGFuZGFyZCBYU0xUIHRhZ3MgYXJlIGFscmVhZHkgcGFydCBvZiBvdGhlciBKZWxseSB0YWdsaWJzLCBzdWNoIGFzIGZvckVhY2ggYW5kIGNob29zZSwgdGhlc2UgYXJlIHRoZSBvbmx5IG90aGVycyB3ZSByZWFsbHkgbmVlZC4gTW9yZW92ZXIsIG11Y2ggb2YgdGhlIHBvd2VyIG9mIFhTTFQgY29tZXMgd2l0aCB1c2luZyBYUGF0aCBleHByZXNzaW9ucywgd2hpY2ggYXJlIG5hdGl2ZWx5IHN1cHBvcnRlZCBieSBKZWxseS4KLTwvcD4KLQotPHA+Ci1UaGVyZSBhcmUgbWFueSBnb29kIGJvb2tzIGFuZCB0dXRvcmlhbHMgb24gWFNMVCwgYW5kIHNpbmNlIHRoZSBjb25jZXB0cyBhcmUgdGhlIHNhbWUsIEkgd29uJ3Qgd2FzdGUgSmVsbHkgZG9jdW1lbnRhdGlvbiBzcGFjZSBhbmQgdGltZSBvbiB0aGlzIHN1YmplY3QuCi08L3A+Ci0KLQotPC9zZWN0aW9uPgotCi08YSBuYW1lPSJodG1sIi8+Ci08c2VjdGlvbiBuYW1lPSJQYXJzaW5nIEhUTUwiPgotCi08cD4KLVRoaXMgZGVtbyBkZW1vbnN0cmF0ZXMgdGhlIHVzZSB0aGUgaGFuZHkgcGFyc2UgdGFnIGluIHRoZSA8QSBIUkVGPSJsaWJzL2h0bWwvdGFncy5odG1sIj5IVE1MIHRhZyBsaWJyYXJ5PC9BPgotPC9wPgotCi08cD4KLVRvIHJ1biB0aGUgZGVtbyB0eXBlICJtYXZlbiBkZW1vOmh0bWwiIChWaWV3IHRoZSA8YSBocmVmPSJodHRwOi8vY3ZzLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvamFrYXJ0YS1jb21tb25zL2plbGx5L2plbGx5LXRhZ3MvaHRtbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2NvbW1vbnMvamVsbHkvdGFncy9odG1sL2V4YW1wbGUuamVsbHk/cmV2PUhFQUQmYW1wO2NvbnRlbnQtdHlwZT10ZXh0L3ZuZC52aWV3Y3ZzLW1hcmt1cCI+ZGVtbyBzb3VyY2U8L2E+KS4KLTwvcD4KLQotPHA+Ci1BcyB5b3UgY2FuIHNlZSBpbiB0aGUgZGVtbyBzY3JpcHQsIHBhcnNpbmcgYW4gSFRNTCBmaWxlIGlzIHNpbXBsZToKLTwvcD4KLQotPHNvdXJjZT4KLSAgICAmbHQ7aHRtbDpwYXJzZSB2YXI9ImRvYyIgaHRtbD0iaW5kZXguaHRtbCIvJmd0OwotPC9zb3VyY2U+Ci0KLTxwPgotT25jZSB5b3UgaGF2ZSBwYXJzZWQgdGhlIGRvY3VtZW50IHlvdSBjYW4gdHJlYXQgaXQgdGhlIHNhbWUgd2F5IGFzIGEgcGFyc2VkIFhNTCBkb2N1bWVudCwgaS5lLiBhcHBseWluZyBKU0wgdHJhbnNmb3JtYXRpb25zLCBxdWVyeWluZyB0aGUgZG9jdW1lbnQgd2l0aCBYUGF0aCBleHByZXNzaW9ucywgYW5kIHNvIG9uLgotPC9wPgotCi08L3NlY3Rpb24+Ci0KLTwvc2VjdGlvbj4KLQotPC9ib2R5PgotCi08L2RvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK